diff options
5 files changed, 201 insertions, 20 deletions
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index a5b3a83..2cbe61f 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -62,6 +62,16 @@ android:layout_width="match_parent" android:layout_height="match_parent" > + <com.android.systemui.statusbar.policy.Clock + android:id="@+id/left_clock" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:singleLine="true" + android:paddingEnd="6dip" + android:gravity="center" + android:visibility="gone" + /> <com.android.systemui.statusbar.StatusBarIconView android:id="@+id/moreIcon" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="match_parent" @@ -97,4 +107,21 @@ </com.android.keyguard.AlphaOptimizedLinearLayout> </LinearLayout> + <com.android.keyguard.AlphaOptimizedLinearLayout + android:gravity="center" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="match_parent" + > + + <com.android.systemui.statusbar.policy.Clock + android:id="@+id/center_clock" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:singleLine="true" + android:gravity="center" + android:visibility="gone" + /> + </com.android.keyguard.AlphaOptimizedLinearLayout> </com.android.systemui.statusbar.phone.PhoneStatusBarView> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ClockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ClockController.java new file mode 100644 index 0000000..a993b6a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ClockController.java @@ -0,0 +1,137 @@ +package com.android.systemui.statusbar.phone; + +import com.android.systemui.FontSizeUtils; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.graphics.Color; +import android.os.Handler; +import android.view.View; +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.Clock; + +import cyanogenmod.providers.CMSettings; + +/** + * To control your...clock + */ +public class ClockController { + + public static final int STYLE_HIDE_CLOCK = 0; + public static final int STYLE_CLOCK_RIGHT = 1; + public static final int STYLE_CLOCK_CENTER = 2; + public static final int STYLE_CLOCK_LEFT = 3; + + private final IconMerger mNotificationIcons; + private final Context mContext; + private final SettingsObserver mSettingsObserver; + private Clock mRightClock, mCenterClock, mLeftClock, mActiveClock; + + private int mClockLocation; + private int mAmPmStyle; + private int mIconTint = Color.WHITE; + + class SettingsObserver extends ContentObserver { + SettingsObserver(Handler handler) { + super(handler); + } + + void observe() { + ContentResolver resolver = mContext.getContentResolver(); + resolver.registerContentObserver(CMSettings.System.getUriFor( + CMSettings.System.STATUS_BAR_AM_PM), false, this); + resolver.registerContentObserver(CMSettings.System.getUriFor( + CMSettings.System.STATUS_BAR_CLOCK), false, this); + updateSettings(); + } + + void unobserve() { + mContext.getContentResolver().unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange) { + updateSettings(); + } + } + + public ClockController(View statusBar, IconMerger notificationIcons, Handler handler) { + mRightClock = (Clock) statusBar.findViewById(R.id.clock); + mCenterClock = (Clock) statusBar.findViewById(R.id.center_clock); + mLeftClock = (Clock) statusBar.findViewById(R.id.left_clock); + mNotificationIcons = notificationIcons; + mContext = statusBar.getContext(); + + mActiveClock = mRightClock; + mSettingsObserver = new SettingsObserver(handler); + mSettingsObserver.observe(); + } + + private Clock getClockForCurrentLocation() { + Clock clockForAlignment; + switch (mClockLocation) { + case STYLE_CLOCK_CENTER: + clockForAlignment = mCenterClock; + break; + case STYLE_CLOCK_LEFT: + clockForAlignment = mLeftClock; + break; + case STYLE_CLOCK_RIGHT: + case STYLE_HIDE_CLOCK: + default: + clockForAlignment = mRightClock; + break; + } + return clockForAlignment; + } + + private void updateActiveClock() { + mActiveClock.setVisibility(View.GONE); + if (mClockLocation == STYLE_HIDE_CLOCK) { + return; + } + + mActiveClock = getClockForCurrentLocation(); + mActiveClock.setVisibility(View.VISIBLE); + mActiveClock.setAmPmStyle(mAmPmStyle); + + setClockAndDateStatus(); + setTextColor(mIconTint); + updateFontSize(); + } + + private void updateSettings() { + ContentResolver resolver = mContext.getContentResolver(); + mAmPmStyle = CMSettings.System.getInt(resolver, + CMSettings.System.STATUS_BAR_AM_PM, Clock.AM_PM_STYLE_GONE); + mClockLocation = CMSettings.System.getInt( + resolver, CMSettings.System.STATUS_BAR_CLOCK, STYLE_CLOCK_RIGHT); + updateActiveClock(); + } + + private void setClockAndDateStatus() { + if (mNotificationIcons != null) { + mNotificationIcons.setClockAndDateStatus(mClockLocation); + } + } + + public void setVisibility(boolean visible) { + if (mActiveClock != null) { + mActiveClock.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + + public void setTextColor(int iconTint) { + mIconTint = iconTint; + if (mActiveClock != null) { + mActiveClock.setTextColor(iconTint); + } + } + + public void updateFontSize() { + if (mActiveClock != null) { + FontSizeUtils.updateFontSize(mActiveClock, R.dimen.status_bar_clock_size); + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java index 50ead3d..5750372 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java @@ -22,12 +22,14 @@ import android.view.View; import android.widget.LinearLayout; import com.android.systemui.R; +import com.android.systemui.statusbar.policy.Clock; public class IconMerger extends LinearLayout { private static final String TAG = "IconMerger"; private static final boolean DEBUG = false; private int mIconSize; + private int mClockLocation; private View mMoreView; public IconMerger(Context context, AttributeSet attrs) { @@ -50,6 +52,10 @@ public class IconMerger extends LinearLayout { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // we need to constrain this to an integral multiple of our children int width = getMeasuredWidth(); + if (mClockLocation == ClockController.STYLE_CLOCK_CENTER) { + int totalWidth = getResources().getDisplayMetrics().widthPixels; + width = totalWidth / 2 - mIconSize * 2; + } setMeasuredDimension(width - (width % mIconSize), getMeasuredHeight()); } @@ -69,7 +75,14 @@ public class IconMerger extends LinearLayout { } final boolean overflowShown = (mMoreView.getVisibility() == View.VISIBLE); // let's assume we have one more slot if the more icon is already showing - if (overflowShown) visibleChildren --; + if (overflowShown) { + int totalWidth = getResources().getDisplayMetrics().widthPixels; + if ((mClockLocation != ClockController.STYLE_CLOCK_CENTER && + mClockLocation != ClockController.STYLE_CLOCK_LEFT) || + (visibleChildren > (totalWidth / mIconSize / 2 + 1))) { + visibleChildren--; + } + } final boolean moreRequired = visibleChildren * mIconSize > width; if (moreRequired != overflowShown) { post(new Runnable() { @@ -80,4 +93,9 @@ public class IconMerger extends LinearLayout { }); } } + + public void setClockAndDateStatus(int mode) { + mClockLocation = mode; + + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 7f73c8a..7ffbd65 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -24,6 +24,7 @@ import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; +import android.provider.Settings; import android.text.TextUtils; import android.util.ArraySet; import android.view.View; @@ -42,6 +43,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -74,7 +76,7 @@ public class StatusBarIconController implements Tunable { private View mNotificationIconArea; private ImageView mMoreIcon; private BatteryMeterView mBatteryMeterView; - private TextView mClock; + private ClockController mClockController; private int mIconSize; private int mIconHPadding; @@ -118,7 +120,6 @@ public class StatusBarIconController implements Tunable { mNotificationIcons.setOverflowIndicator(mMoreIcon); mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons); mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery); - mClock = (TextView) statusBar.findViewById(R.id.clock); mLinearOutSlowIn = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in); mFastOutSlowIn = AnimationUtils.loadInterpolator(mContext, @@ -126,6 +127,7 @@ public class StatusBarIconController implements Tunable { mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone); mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone); mHandler = new Handler(); + mClockController = new ClockController(statusBar, mNotificationIcons, mHandler); updateResources(); TunerService.get(mContext).addTunable(this, ICON_BLACKLIST); @@ -158,7 +160,7 @@ public class StatusBarIconController implements Tunable { com.android.internal.R.dimen.status_bar_icon_size); mIconHPadding = mContext.getResources().getDimensionPixelSize( R.dimen.status_bar_icon_padding); - FontSizeUtils.updateFontSize(mClock, R.dimen.status_bar_clock_size); + mClockController.updateFontSize(); } public void addSystemIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { @@ -262,7 +264,7 @@ public class StatusBarIconController implements Tunable { } public void setClockVisibility(boolean visible) { - mClock.setVisibility(visible ? View.VISIBLE : View.GONE); + mClockController.setVisibility(visible); } public void dump(PrintWriter pw) { @@ -391,7 +393,7 @@ public class StatusBarIconController implements Tunable { mSignalCluster.setIconTint(mIconTint, mDarkIntensity); mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint)); mBatteryMeterView.setDarkIntensity(mDarkIntensity); - mClock.setTextColor(mIconTint); + mClockController.setTextColor(mIconTint); applyNotificationIconsTint(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 080af37..0cc82dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -53,11 +53,11 @@ public class Clock extends TextView implements DemoMode { private SimpleDateFormat mClockFormat; private Locale mLocale; - private static final int AM_PM_STYLE_NORMAL = 0; - private static final int AM_PM_STYLE_SMALL = 1; - private static final int AM_PM_STYLE_GONE = 2; + public static final int AM_PM_STYLE_NORMAL = 0; + public static final int AM_PM_STYLE_SMALL = 1; + public static final int AM_PM_STYLE_GONE = 2; - private final int mAmPmStyle; + private int mAmPmStyle = AM_PM_STYLE_GONE; public Clock(Context context) { this(context, null); @@ -69,15 +69,6 @@ public class Clock extends TextView implements DemoMode { public Clock(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - TypedArray a = context.getTheme().obtainStyledAttributes( - attrs, - R.styleable.Clock, - 0, 0); - try { - mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_GONE); - } finally { - a.recycle(); - } } @Override @@ -139,7 +130,7 @@ public class Clock extends TextView implements DemoMode { }; final void updateClock() { - if (mDemoMode) return; + if (mDemoMode || mCalendar == null) return; mCalendar.setTimeInMillis(System.currentTimeMillis()); setText(getSmallTime()); } @@ -245,5 +236,11 @@ public class Clock extends TextView implements DemoMode { setText(getSmallTime()); } } + + public void setAmPmStyle(int style) { + mAmPmStyle = style; + mClockFormatString = ""; + updateClock(); + } } |