DateView.java revision ec9a50bccf6163302f41fcc410b7fe80258bb0ea
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; 230c953f68f54b5ff13b002f8e054537cafb29677eJoe Onoratoimport android.text.format.DateFormat; 24503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.AttributeSet; 25503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.Slog; 26503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.widget.TextView; 27503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.view.MotionEvent; 28fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.View; 29fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.view.ViewParent; 30503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 31ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwoodimport com.android.systemui.R; 32ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwood 33503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport java.util.Date; 34503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 35503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratopublic final class DateView extends TextView { 36503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato private static final String TAG = "DateView"; 37503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 38fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mAttachedToWindow; 39fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mWindowVisible; 40fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean mUpdating; 41503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 42503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 43503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 44503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato public void onReceive(Context context, Intent intent) { 45503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato String action = intent.getAction(); 46503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato if (action.equals(Intent.ACTION_TIME_TICK) 47503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato || action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { 48503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato updateClock(); 49503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 50503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 51503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato }; 52503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 53503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato public DateView(Context context, AttributeSet attrs) { 54503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super(context, attrs); 55503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 56503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 57503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 58503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected void onAttachedToWindow() { 59503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super.onAttachedToWindow(); 60fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mAttachedToWindow = true; 61fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 62503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 63503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 64503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 65503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected void onDetachedFromWindow() { 66503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato super.onDetachedFromWindow(); 67fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mAttachedToWindow = false; 68fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 69fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 70fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 71fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato @Override 72fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato protected void onWindowVisibilityChanged(int visibility) { 73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato super.onWindowVisibilityChanged(visibility); 74fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mWindowVisible = visibility == VISIBLE; 75fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 76fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 77fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 78fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato @Override 79fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato protected void onVisibilityChanged(View changedView, int visibility) { 80fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato super.onVisibilityChanged(changedView, visibility); 81fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato setUpdates(); 82503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 83503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 84503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato @Override 85503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato protected int getSuggestedMinimumWidth() { 86503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato // makes the large background bitmap not force us to full width 87503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato return 0; 88503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 89503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 90503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato private final void updateClock() { 910c953f68f54b5ff13b002f8e054537cafb29677eJoe Onorato final Context context = getContext(); 92503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato Date now = new Date(); 930c953f68f54b5ff13b002f8e054537cafb29677eJoe Onorato CharSequence dow = DateFormat.format("EEEE", now); 940c953f68f54b5ff13b002f8e054537cafb29677eJoe Onorato CharSequence date = DateFormat.getMediumDateFormat(getContext()).format(now); 95ec9a50bccf6163302f41fcc410b7fe80258bb0eaMike Lockwood setText(context.getString(R.string.status_bar_date_formatter, dow, date)); 96fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 97fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 98fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private boolean isVisible() { 99fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato View v = this; 100fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato while (true) { 101fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (v.getVisibility() != VISIBLE) { 102fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato return false; 103fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 104fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato final ViewParent parent = v.getParent(); 105fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (parent instanceof View) { 106fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato v = (View)parent; 107fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } else { 108fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato return true; 109fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 110fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 111503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 112503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 113fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private void setUpdates() { 114fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato boolean update = mAttachedToWindow && mWindowVisible && isVisible(); 115503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato if (update != mUpdating) { 116503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mUpdating = update; 117503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato if (update) { 118503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato // Register for Intent broadcasts for the clock and battery 119503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato IntentFilter filter = new IntentFilter(); 120503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato filter.addAction(Intent.ACTION_TIME_TICK); 121503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 122503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mContext.registerReceiver(mIntentReceiver, filter, null, null); 123503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato updateClock(); 124503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } else { 125503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato mContext.unregisterReceiver(mIntentReceiver); 126503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 127503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 128503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 129503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato} 130503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 131