From fe7c91bb6031622ca576454926db875c0c8ac0d8 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Thu, 13 Aug 2015 15:42:28 -0400 Subject: SysUI Tuner: Add clock seconds option Also do some cleanup to use new preference onAtached/DetachedFromActivity to make things simpler. Change-Id: I542684b453a6ac596cc0a5c22c989a44e7e688b7 --- packages/SystemUI/res/values/strings.xml | 5 ++ packages/SystemUI/res/xml/tuner_prefs.xml | 6 ++ .../android/systemui/statusbar/policy/Clock.java | 78 ++++++++++++++++++++-- .../android/systemui/tuner/StatusBarSwitch.java | 12 ++++ .../com/android/systemui/tuner/TunerFragment.java | 35 +--------- .../com/android/systemui/tuner/TunerSwitch.java | 39 +++++++++++ 6 files changed, 138 insertions(+), 37 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 045bc4afa838..9f7283454a36 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1132,4 +1132,9 @@ Application is not installed on your device + + Show clock seconds + + Show clock seconds in the status bar. May impact battery life. + diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml index 3a41c3c540bd..beb863c44925 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" /> + + + 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 61986adc1d65..896bd62f9969 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.Intent; 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.format.DateFormat; 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 @@ public class Clock extends TextView implements DemoMode { 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 @@ public class Clock extends TextView implements DemoMode { } finally { a.recycle(); } + TunerService.get(context).addTunable(this, CLOCK_SECONDS); } @Override @@ -105,6 +116,7 @@ public class Clock extends TextView implements DemoMode { // Make sure we update to the current time updateClock(); + updateShowSeconds(); } @Override @@ -143,6 +155,35 @@ public class Clock extends TextView implements DemoMode { 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 @@ public class Clock extends TextView implements DemoMode { 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 @@ public class Clock extends TextView implements DemoMode { 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 e5b550e82bdb..dcb0d8d0c498 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java @@ -37,6 +37,18 @@ public class StatusBarSwitch extends SwitchPreference implements Tunable { super(context, attrs); } + @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)) { diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java index 71b5de56444b..96ad756b4e94 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; 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 android.view.MenuItem; 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 @@ public class TunerFragment extends PreferenceFragment { getContext().getContentResolver().registerContentObserver( System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver); - registerPrefs(getPreferenceScreen()); MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, true); } @@ -117,36 +113,9 @@ public class TunerFragment extends PreferenceFragment { 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 000000000000..0740e0808529 --- /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; + } + +} -- cgit v1.2.3-59-g8ed1b