1503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato/*
2503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Copyright (C) 2008 The Android Open Source Project
3503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
4503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * you may not use this file except in compliance with the License.
6503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * You may obtain a copy of the License at
7503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
8503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
10503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Unless required by applicable law or agreed to in writing, software
11503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * See the License for the specific language governing permissions and
14503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * limitations under the License.
15503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato */
16503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.policy;
18503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
19503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.BroadcastReceiver;
20503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.Context;
21503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.Intent;
22503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.IntentFilter;
233f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggiimport android.content.res.TypedArray;
24570f44b4ab083069f042d63948af0c1204a1ec20Elliott Hughesimport android.text.format.DateFormat;
25503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.AttributeSet;
264519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkeyimport android.widget.TextView;
27503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
28ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwoodimport com.android.systemui.R;
29ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwood
3056018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport java.text.SimpleDateFormat;
31503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport java.util.Date;
3256018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport java.util.Locale;
3356018e577edada2721f4772bcec9274d043a06e7Chris Wren
34d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungpublic class DateView extends TextView {
35503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    private static final String TAG = "DateView";
36503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
376e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette    private final Date mCurrentTime = new Date();
386e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette
396e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette    private SimpleDateFormat mDateFormat;
40b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler    private String mLastText;
413f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi    private String mDatePattern;
42503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
43503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
44503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        @Override
45503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        public void onReceive(Context context, Intent intent) {
464519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey            final String action = intent.getAction();
474519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey            if (Intent.ACTION_TIME_TICK.equals(action)
484519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey                    || Intent.ACTION_TIME_CHANGED.equals(action)
4946b369f09e7f0a9873a77312fdf49de937b97e69Jorge Ruesga                    || Intent.ACTION_TIMEZONE_CHANGED.equals(action)
5046b369f09e7f0a9873a77312fdf49de937b97e69Jorge Ruesga                    || Intent.ACTION_LOCALE_CHANGED.equals(action)) {
519f5664b87614d230e181cf0043396b55a38000c1Chet Haase                if (Intent.ACTION_LOCALE_CHANGED.equals(action)
529f5664b87614d230e181cf0043396b55a38000c1Chet Haase                        || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
53b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler                    // need to get a fresh date format
54b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler                    mDateFormat = null;
556e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette                }
56503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                updateClock();
57503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato            }
58503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
59503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    };
60503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
61503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    public DateView(Context context, AttributeSet attrs) {
62503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super(context, attrs);
633f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        TypedArray a = context.getTheme().obtainStyledAttributes(
643f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi                attrs,
653f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi                R.styleable.DateView,
663f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi                0, 0);
673f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi
683f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        try {
693f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            mDatePattern = a.getString(R.styleable.DateView_datePattern);
703f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        } finally {
713f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            a.recycle();
723f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
733f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (mDatePattern == null) {
743f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            mDatePattern = getContext().getString(R.string.system_ui_date_pattern);
753f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
76503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
77503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
78503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    @Override
79503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    protected void onAttachedToWindow() {
80503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super.onAttachedToWindow();
81209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
82b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        IntentFilter filter = new IntentFilter();
83b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        filter.addAction(Intent.ACTION_TIME_TICK);
84b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        filter.addAction(Intent.ACTION_TIME_CHANGED);
85b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
86b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
8701534780dfaf81c9f89a6e19fe2fe42cfdd01ff7John Spurlock        getContext().registerReceiver(mIntentReceiver, filter, null, null);
88fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
89b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        updateClock();
90fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    }
91fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
92fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    @Override
93b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler    protected void onDetachedFromWindow() {
94b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        super.onDetachedFromWindow();
95503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
96b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        mDateFormat = null; // reload the locale next time
9701534780dfaf81c9f89a6e19fe2fe42cfdd01ff7John Spurlock        getContext().unregisterReceiver(mIntentReceiver);
98503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
99503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
100d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    protected void updateClock() {
101b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        if (mDateFormat == null) {
1026e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette            final Locale l = Locale.getDefault();
1033f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            final String fmt = DateFormat.getBestDateTimePattern(l, mDatePattern);
1046e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette            mDateFormat = new SimpleDateFormat(fmt, l);
1056e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette        }
1066e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette
1076e9b0477f9a142c605f4cc98a544ce10725ee590Alan Viverette        mCurrentTime.setTime(System.currentTimeMillis());
108fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
109b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        final String text = mDateFormat.format(mCurrentTime);
110b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler        if (!text.equals(mLastText)) {
111b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler            setText(text);
112b478a71625235f554263324dbf0501f6b6c87520Daniel Sandler            mLastText = text;
113503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
114503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
115503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato}
116