diff options
author | Joe Onorato <joeo@android.com> | 2010-05-14 11:54:53 -0700 |
---|---|---|
committer | Joe Onorato <joeo@android.com> | 2010-06-02 14:48:42 -0700 |
commit | 263700df7ba34e70396d014d09a274d9ebbbf6ca (patch) | |
tree | 8b1d259cd4062c0b805f3f1aa373bb3b3e0f06bd | |
parent | 66d7d01ed91968f4ed2e2669fd306aa2af61cd16 (diff) | |
download | frameworks_base-263700df7ba34e70396d014d09a274d9ebbbf6ca.zip frameworks_base-263700df7ba34e70396d014d09a274d9ebbbf6ca.tar.gz frameworks_base-263700df7ba34e70396d014d09a274d9ebbbf6ca.tar.bz2 |
Clock
4 files changed, 204 insertions, 126 deletions
diff --git a/packages/StatusBarPhone/res/layout/status_bar.xml b/packages/StatusBarPhone/res/layout/status_bar.xml index 418d383..2a00274 100644 --- a/packages/StatusBarPhone/res/layout/status_bar.xml +++ b/packages/StatusBarPhone/res/layout/status_bar.xml @@ -47,6 +47,17 @@ android:paddingRight="6dip" android:gravity="center_vertical" android:orientation="horizontal"/> + + <com.android.policy.statusbar.phone.Clock + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:singleLine="true" + android:paddingRight="6dip" + android:textSize="16sp" + android:textStyle="bold" + android:gravity="center_vertical|left" + android:textColor="?android:attr/textColorPrimaryInverse" + /> </LinearLayout> <LinearLayout android:id="@+id/ticker" diff --git a/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/Clock.java b/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/Clock.java new file mode 100644 index 0000000..8ad1fb6 --- /dev/null +++ b/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/Clock.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.policy.statusbar.phone; + +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.text.format.DateFormat; +import android.text.style.RelativeSizeSpan; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; + +import com.android.internal.R; + +/** + * This widget display an analogic clock with two hands for hours and + * minutes. + */ +public class Clock extends TextView { + private final Handler mHandler = new Handler(); + private boolean mAttached; + private Calendar mCalendar; + private String mClockFormatString; + private SimpleDateFormat mClockFormat; + + public Clock(Context context) { + this(context, null); + } + + public Clock(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public Clock(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + if (!mAttached) { + mAttached = true; + IntentFilter filter = new IntentFilter(); + + filter.addAction(Intent.ACTION_TIME_TICK); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + + getContext().registerReceiver(mIntentReceiver, filter, null, mHandler); + } + + // NOTE: It's safe to do these after registering the receiver since the receiver always runs + // in the main thread, therefore the receiver can't run before this method returns. + + // The time zone may have changed while the receiver wasn't registered, so update the Time + mCalendar = Calendar.getInstance(TimeZone.getDefault()); + + // Make sure we update to the current time + updateClock(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mAttached) { + getContext().unregisterReceiver(mIntentReceiver); + mAttached = false; + } + } + + private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { + String tz = intent.getStringExtra("time-zone"); + mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz)); + if (mClockFormat != null) { + mClockFormat.setTimeZone(mCalendar.getTimeZone()); + } + } + updateClock(); + } + }; + + final void updateClock() { + mCalendar.setTimeInMillis(System.currentTimeMillis()); + setText(getSmallTime()); + } + + private final CharSequence getSmallTime() { + Context context = getContext(); + boolean b24 = DateFormat.is24HourFormat(context); + int res; + + if (b24) { + res = R.string.twenty_four_hour_time_format; + } else { + res = R.string.twelve_hour_time_format; + } + + final char MAGIC1 = '\uEF00'; + final char MAGIC2 = '\uEF01'; + + SimpleDateFormat sdf; + String format = context.getString(res); + if (!format.equals(mClockFormatString)) { + /* + * Search for an unquoted "a" in the format string, so we can + * add dummy characters around it to let us find it again after + * formatting and change its size. + */ + int a = -1; + boolean quoted = false; + for (int i = 0; i < format.length(); i++) { + char c = format.charAt(i); + + if (c == '\'') { + quoted = !quoted; + } + + if (!quoted && c == 'a') { + a = i; + break; + } + } + + if (a >= 0) { + // Move a back so any whitespace before the AM/PM is also in the alternate size. + final int b = a; + while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { + a--; + } + format = format.substring(0, a) + MAGIC1 + format.substring(a, b) + + "a" + MAGIC2 + format.substring(b + 1); + } + + mClockFormat = sdf = new SimpleDateFormat(format); + mClockFormatString = format; + } else { + sdf = mClockFormat; + } + String result = sdf.format(mCalendar.getTime()); + + int magic1 = result.indexOf(MAGIC1); + int magic2 = result.indexOf(MAGIC2); + + if (magic1 >= 0 && magic2 > magic1) { + SpannableStringBuilder formatted = new SpannableStringBuilder(result); + + formatted.setSpan(new RelativeSizeSpan(0.7f), magic1, magic2, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + + formatted.delete(magic2, magic2 + 1); + formatted.delete(magic1, magic1 + 1); + + return formatted; + } else { + return result; + } + } +} + diff --git a/services/java/com/android/server/status/StatusBarManagerService.java b/services/java/com/android/server/status/StatusBarManagerService.java index db0d2f8..ae5955b 100644 --- a/services/java/com/android/server/status/StatusBarManagerService.java +++ b/services/java/com/android/server/status/StatusBarManagerService.java @@ -183,9 +183,6 @@ public class StatusBarManagerService extends IStatusBarService.Stub } } - public void setIcon(String slot, CharSequence text) { - } - public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) { enforceStatusBar(); diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java index 1838eed..b90897b 100644 --- a/services/java/com/android/server/status/StatusBarPolicy.java +++ b/services/java/com/android/server/status/StatusBarPolicy.java @@ -72,10 +72,6 @@ import com.android.internal.telephony.cdma.EriInfo; import com.android.internal.telephony.cdma.TtyIntent; import com.android.server.am.BatteryStatsService; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.TimeZone; - /** * This class contains all of the policy about which icons are installed in the status * bar at boot time. In reality, it should go into the android.policy package, but @@ -100,11 +96,6 @@ public class StatusBarPolicy { private final Handler mHandler = new StatusBarHandler(); private final IBatteryStats mBatteryStats; - // clock - private Calendar mCalendar; - private String mClockFormatString; - private SimpleDateFormat mClockFormat; - // storage private StorageManager mStorageManager; @@ -321,26 +312,9 @@ public class StatusBarPolicy { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (action.equals(Intent.ACTION_TIME_TICK)) { - updateClock(); - } - else if (action.equals(Intent.ACTION_TIME_CHANGED)) { - updateClock(); - } - else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { + if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { updateBattery(intent); } - else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { - updateClock(); - } - else if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { - String tz = intent.getStringExtra("time-zone"); - mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz)); - if (mClockFormat != null) { - mClockFormat.setTimeZone(mCalendar.getTimeZone()); - } - updateClock(); - } else if (action.equals(Intent.ACTION_ALARM_CHANGED)) { updateAlarm(intent); } @@ -388,11 +362,6 @@ public class StatusBarPolicy { mSignalStrength = new SignalStrength(); mBatteryStats = BatteryStatsService.getService(); - // clock - mCalendar = Calendar.getInstance(TimeZone.getDefault()); - service.setIcon("clock", ""); - updateClock(); - // storage mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); mStorageManager.registerListener( @@ -472,14 +441,10 @@ public class StatusBarPolicy { IntentFilter filter = new IntentFilter(); // Register for Intent broadcasts for... - filter.addAction(Intent.ACTION_TIME_TICK); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_BATTERY_LOW); filter.addAction(Intent.ACTION_BATTERY_OKAY); filter.addAction(Intent.ACTION_POWER_CONNECTED); - filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_ALARM_CHANGED); filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); @@ -511,93 +476,6 @@ public class StatusBarPolicy { sInstance = new StatusBarPolicy(context, service); } - private final CharSequence getSmallTime() { - boolean b24 = DateFormat.is24HourFormat(mContext); - int res; - - if (b24) { - res = R.string.twenty_four_hour_time_format; - } else { - res = R.string.twelve_hour_time_format; - } - - final char MAGIC1 = '\uEF00'; - final char MAGIC2 = '\uEF01'; - - SimpleDateFormat sdf; - String format = mContext.getString(res); - if (!format.equals(mClockFormatString)) { - /* - * Search for an unquoted "a" in the format string, so we can - * add dummy characters around it to let us find it again after - * formatting and change its size. - */ - if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { - int a = -1; - boolean quoted = false; - for (int i = 0; i < format.length(); i++) { - char c = format.charAt(i); - - if (c == '\'') { - quoted = !quoted; - } - - if (!quoted && c == 'a') { - a = i; - break; - } - } - - if (a >= 0) { - // Move a back so any whitespace before the AM/PM is also in the alternate size. - final int b = a; - while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { - a--; - } - format = format.substring(0, a) + MAGIC1 + format.substring(a, b) - + "a" + MAGIC2 + format.substring(b + 1); - } - } - - mClockFormat = sdf = new SimpleDateFormat(format); - mClockFormatString = format; - } else { - sdf = mClockFormat; - } - String result = sdf.format(mCalendar.getTime()); - - if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { - int magic1 = result.indexOf(MAGIC1); - int magic2 = result.indexOf(MAGIC2); - - if (magic1 >= 0 && magic2 > magic1) { - SpannableStringBuilder formatted = new SpannableStringBuilder(result); - - if (AM_PM_STYLE == AM_PM_STYLE_GONE) { - formatted.delete(magic1, magic2+1); - } else { - if (AM_PM_STYLE == AM_PM_STYLE_SMALL) { - CharacterStyle style = new RelativeSizeSpan(0.7f); - formatted.setSpan(style, magic1, magic2, - Spannable.SPAN_EXCLUSIVE_INCLUSIVE); - } - - formatted.delete(magic2, magic2 + 1); - formatted.delete(magic1, magic1 + 1); - } - - return formatted; - } - } - - return result; - } - - private final void updateClock() { - mCalendar.setTimeInMillis(System.currentTimeMillis()); - mService.setIcon("clock", getSmallTime()); - } - private final void updateAlarm(Intent intent) { boolean alarmSet = intent.getBooleanExtra("alarmSet", false); mService.setIconVisibility("alarm_clock", alarmSet); |