summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/res/layout/status_bar.xml27
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ClockController.java137
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java25
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();
+ }
}