DateView.java revision 56018e577edada2721f4772bcec9274d043a06e7
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; 23503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.AttributeSet; 24fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.View; 25fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.ViewParent; 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 3456018e577edada2721f4772bcec9274d043a06e7Chris Wrenimport libcore.icu.ICU; 35503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 36d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungpublic class DateView extends TextView { 37503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato private static final String TAG = "DateView"; 38503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 39fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mAttachedToWindow; 40fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mWindowVisible; 41fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mUpdating; 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) 494519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { 50503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato updateClock(); 51503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 52503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 53503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato }; 54503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 55503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato public DateView(Context context, AttributeSet attrs) { 56503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super(context, attrs); 57503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 58503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 59503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 60503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected void onAttachedToWindow() { 61503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super.onAttachedToWindow(); 62fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mAttachedToWindow = true; 63fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 64503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 65503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 66503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 67503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected void onDetachedFromWindow() { 68503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super.onDetachedFromWindow(); 69fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mAttachedToWindow = false; 70fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 71fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 72fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato @Override 74fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato protected void onWindowVisibilityChanged(int visibility) { 75fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato super.onWindowVisibilityChanged(visibility); 76fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mWindowVisible = visibility == VISIBLE; 77fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 78fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 79fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 80fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato @Override 81fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato protected void onVisibilityChanged(View changedView, int visibility) { 82fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato super.onVisibilityChanged(changedView, visibility); 83fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 84503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 85503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 86503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 87503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected int getSuggestedMinimumWidth() { 88503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato // makes the large background bitmap not force us to full width 89503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato return 0; 90503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 91503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 92d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung protected void updateClock() { 9356018e577edada2721f4772bcec9274d043a06e7Chris Wren final String dateFormat = getContext().getString(R.string.system_ui_date_pattern); 9456018e577edada2721f4772bcec9274d043a06e7Chris Wren final Locale l = Locale.getDefault(); 9556018e577edada2721f4772bcec9274d043a06e7Chris Wren String fmt = ICU.getBestDateTimePattern(dateFormat, l.toString()); 9656018e577edada2721f4772bcec9274d043a06e7Chris Wren SimpleDateFormat sdf = new SimpleDateFormat(fmt, l); 9756018e577edada2721f4772bcec9274d043a06e7Chris Wren setText(sdf.format(new Date())); 98fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 99fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 100fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean isVisible() { 101fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato View v = this; 102fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato while (true) { 103fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (v.getVisibility() != VISIBLE) { 104fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato return false; 105fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 106fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato final ViewParent parent = v.getParent(); 107fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (parent instanceof View) { 108fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato v = (View)parent; 109fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } else { 110fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato return true; 111fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 112fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 113503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 114503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 115fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private void setUpdates() { 116fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato boolean update = mAttachedToWindow && mWindowVisible && isVisible(); 117503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato if (update != mUpdating) { 118503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mUpdating = update; 119503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato if (update) { 120503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato // Register for Intent broadcasts for the clock and battery 121503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato IntentFilter filter = new IntentFilter(); 122503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato filter.addAction(Intent.ACTION_TIME_TICK); 1234519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey filter.addAction(Intent.ACTION_TIME_CHANGED); 124503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 125503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mContext.registerReceiver(mIntentReceiver, filter, null, null); 126503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato updateClock(); 127503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } else { 128503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mContext.unregisterReceiver(mIntentReceiver); 129503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 130503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 131503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 132503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato} 133