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