SysUI Tuner: Add clock seconds option
Also do some cleanup to use new preference
onAtached/DetachedFromActivity to make things simpler.
Change-Id: I542684b453a6ac596cc0a5c22c989a44e7e688b7
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 045bc4a..9f72834 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1132,4 +1132,9 @@
<!-- Displayed when user launches an app that was uninstalled [CHAR LIMIT=NONE] -->
<string name="activity_not_found">Application is not installed on your device</string>
+ <!-- Name of setting to show clock seconds [CHAR LIMIT=40] -->
+ <string name="clock_seconds">Show clock seconds</string>
+ <!-- Description of setting to show clock seconds [CHAR LIMIT=NONE] -->
+ <string name="clock_seconds_desc">Show clock seconds in the status bar. May impact battery life.</string>
+
</resources>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index 3a41c3c..beb863c 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -72,10 +72,16 @@
android:summary="@string/show_battery_percentage_summary"
android:persistent="false" />
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="clock_seconds"
+ android:title="@string/clock_seconds"
+ android:summary="@string/clock_seconds_desc" />
+
<Preference
android:key="demo_mode"
android:title="@string/demo_mode" />
+ <!-- Warning, this goes last. -->
<Preference
android:summary="@string/tuner_persistent_warning"
android:selectable="false" />
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 61986ad..896bd62 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -23,6 +23,8 @@
import android.content.IntentFilter;
import android.content.res.TypedArray;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
@@ -30,22 +32,28 @@
import android.text.style.CharacterStyle;
import android.text.style.RelativeSizeSpan;
import android.util.AttributeSet;
+import android.view.Display;
import android.widget.TextView;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
+import com.android.systemui.tuner.TunerService;
+import com.android.systemui.tuner.TunerService.Tunable;
+
+import libcore.icu.LocaleData;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
-import libcore.icu.LocaleData;
-
/**
* Digital clock for the status bar.
*/
-public class Clock extends TextView implements DemoMode {
+public class Clock extends TextView implements DemoMode, Tunable {
+
+ public static final String CLOCK_SECONDS = "clock_seconds";
+
private boolean mAttached;
private Calendar mCalendar;
private String mClockFormatString;
@@ -57,6 +65,8 @@
private static final int AM_PM_STYLE_GONE = 2;
private final int mAmPmStyle;
+ private boolean mShowSeconds;
+ private Handler mSecondsHandler;
public Clock(Context context) {
this(context, null);
@@ -77,6 +87,7 @@
} finally {
a.recycle();
}
+ TunerService.get(context).addTunable(this, CLOCK_SECONDS);
}
@Override
@@ -105,6 +116,7 @@
// Make sure we update to the current time
updateClock();
+ updateShowSeconds();
}
@Override
@@ -143,6 +155,35 @@
setText(getSmallTime());
}
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ mShowSeconds = newValue != null && Integer.parseInt(newValue) != 0;
+ updateShowSeconds();
+ }
+
+ private void updateShowSeconds() {
+ if (mShowSeconds) {
+ // Wait until we have a display to start trying to show seconds.
+ if (mSecondsHandler == null && getDisplay() != null) {
+ mSecondsHandler = new Handler();
+ if (getDisplay().getState() == Display.STATE_ON) {
+ mSecondsHandler.postAtTime(mSecondTick,
+ SystemClock.uptimeMillis() / 1000 * 1000 + 1000);
+ }
+ IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ mContext.registerReceiver(mScreenReceiver, filter);
+ }
+ } else {
+ if (mSecondsHandler != null) {
+ mContext.unregisterReceiver(mScreenReceiver);
+ mSecondsHandler.removeCallbacks(mSecondTick);
+ mSecondsHandler = null;
+ updateClock();
+ }
+ }
+ }
+
private final CharSequence getSmallTime() {
Context context = getContext();
boolean is24 = DateFormat.is24HourFormat(context, ActivityManager.getCurrentUser());
@@ -152,7 +193,9 @@
final char MAGIC2 = '\uEF01';
SimpleDateFormat sdf;
- String format = is24 ? d.timeFormat_Hm : d.timeFormat_hm;
+ String format = mShowSeconds
+ ? is24 ? d.timeFormat_Hms : d.timeFormat_hms
+ : is24 ? d.timeFormat_Hm : d.timeFormat_hm;
if (!format.equals(mClockFormatString)) {
/*
* Search for an unquoted "a" in the format string, so we can
@@ -244,5 +287,32 @@
setText(getSmallTime());
}
}
+
+ private final BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_SCREEN_OFF.equals(action)) {
+ if (mSecondsHandler != null) {
+ mSecondsHandler.removeCallbacks(mSecondTick);
+ }
+ } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
+ if (mSecondsHandler != null) {
+ mSecondsHandler.postAtTime(mSecondTick,
+ SystemClock.uptimeMillis() / 1000 * 1000 + 1000);
+ }
+ }
+ }
+ };
+
+ private final Runnable mSecondTick = new Runnable() {
+ @Override
+ public void run() {
+ if (mCalendar != null) {
+ updateClock();
+ }
+ mSecondsHandler.postAtTime(this, SystemClock.uptimeMillis() / 1000 * 1000 + 1000);
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
index e5b550e..dcb0d8d 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
@@ -38,6 +38,18 @@
}
@Override
+ protected void onAttachedToActivity() {
+ super.onAttachedToActivity();
+ TunerService.get(getContext()).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
+ }
+
+ @Override
+ protected void onDetachedFromActivity() {
+ TunerService.get(getContext()).removeTunable(this);
+ super.onDetachedFromActivity();
+ }
+
+ @Override
public void onTuningChanged(String key, String newValue) {
if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
return;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
index 71b5de5..96ad756 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
@@ -15,8 +15,6 @@
*/
package com.android.systemui.tuner;
-import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
-
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
@@ -29,7 +27,6 @@
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
-import android.preference.PreferenceGroup;
import android.preference.SwitchPreference;
import android.provider.Settings;
import android.provider.Settings.System;
@@ -39,8 +36,8 @@
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.tuner.TunerService.Tunable;
+
+import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
public class TunerFragment extends PreferenceFragment {
@@ -108,7 +105,6 @@
getContext().getContentResolver().registerContentObserver(
System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
- registerPrefs(getPreferenceScreen());
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, true);
}
@@ -117,36 +113,9 @@
super.onPause();
getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
- unregisterPrefs(getPreferenceScreen());
MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, false);
}
- private void registerPrefs(PreferenceGroup group) {
- TunerService tunerService = TunerService.get(getContext());
- final int N = group.getPreferenceCount();
- for (int i = 0; i < N; i++) {
- Preference pref = group.getPreference(i);
- if (pref instanceof StatusBarSwitch) {
- tunerService.addTunable((Tunable) pref, StatusBarIconController.ICON_BLACKLIST);
- } else if (pref instanceof PreferenceGroup) {
- registerPrefs((PreferenceGroup) pref);
- }
- }
- }
-
- private void unregisterPrefs(PreferenceGroup group) {
- TunerService tunerService = TunerService.get(getContext());
- final int N = group.getPreferenceCount();
- for (int i = 0; i < N; i++) {
- Preference pref = group.getPreference(i);
- if (pref instanceof Tunable) {
- tunerService.removeTunable((Tunable) pref);
- } else if (pref instanceof PreferenceGroup) {
- registerPrefs((PreferenceGroup) pref);
- }
- }
- }
-
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add(Menu.NONE, MENU_REMOVE, Menu.NONE, R.string.remove_from_settings);
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
new file mode 100644
index 0000000..0740e08
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
@@ -0,0 +1,39 @@
+package com.android.systemui.tuner;
+
+import android.content.Context;
+import android.preference.SwitchPreference;
+import android.provider.Settings;
+import android.util.AttributeSet;
+
+import com.android.systemui.tuner.TunerService.Tunable;
+
+public class TunerSwitch extends SwitchPreference implements Tunable {
+
+ public TunerSwitch(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onAttachedToActivity() {
+ super.onAttachedToActivity();
+ TunerService.get(getContext()).addTunable(this, getKey());
+ }
+
+ @Override
+ protected void onDetachedFromActivity() {
+ TunerService.get(getContext()).removeTunable(this);
+ super.onDetachedFromActivity();
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ setChecked(newValue != null && Integer.parseInt(newValue) != 0);
+ }
+
+ @Override
+ protected boolean persistBoolean(boolean value) {
+ Settings.Secure.putString(getContext().getContentResolver(), getKey(), value ? "1" : "0");
+ return true;
+ }
+
+}