From 04a73fe3c0810075b6bf7ec6105baaa9bff4e667 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Thu, 1 May 2014 23:07:23 -0400 Subject: [PATCH] Zen mode settings fixes. - Fix wiring for the "At night" section. Remove fragile index-based logic by adding value support to DropDownPreference. - Actually refresh zen config if it changes. - Only show the enter zen dialog for user-initiated changes. Change-Id: Ic3a3b9864942fb3ebf18cd838339de2ff28f9394 --- .../notification/DropDownPreference.java | 20 ++++++-- .../notification/NotificationSettings.java | 24 +++++----- .../notification/ZenModeSettings.java | 46 +++++++++++-------- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/com/android/settings/notification/DropDownPreference.java b/src/com/android/settings/notification/DropDownPreference.java index 15452a10908..36ecf9546cd 100644 --- a/src/com/android/settings/notification/DropDownPreference.java +++ b/src/com/android/settings/notification/DropDownPreference.java @@ -26,10 +26,13 @@ import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.AdapterView.OnItemSelectedListener; +import java.util.ArrayList; + public class DropDownPreference extends Preference { private final Context mContext; private final ArrayAdapter mAdapter; private final Spinner mSpinner; + private final ArrayList mValues = new ArrayList(); private Callback mCallback; @@ -77,17 +80,26 @@ public class DropDownPreference extends Preference { } public void setSelectedItem(int position) { - if (mCallback != null && !mCallback.onItemSelected(position)) { + final Object value = mValues.get(position); + if (mCallback != null && !mCallback.onItemSelected(position, value)) { return; } mSpinner.setSelection(position); setSummary(mAdapter.getItem(position)); - final boolean disableDependents = position == 0; + final boolean disableDependents = value == null; notifyDependencyChange(disableDependents); } - public void addItem(int resId) { + public void setSelectedValue(Object value) { + final int i = mValues.indexOf(value); + if (i > -1) { + setSelectedItem(i); + } + } + + public void addItem(int resId, Object value) { mAdapter.add(mContext.getResources().getString(resId)); + mValues.add(value); } @Override @@ -105,6 +117,6 @@ public class DropDownPreference extends Preference { } public interface Callback { - boolean onItemSelected(int pos); + boolean onItemSelected(int pos, Object value); } } \ No newline at end of file diff --git a/src/com/android/settings/notification/NotificationSettings.java b/src/com/android/settings/notification/NotificationSettings.java index f2ed64cdc9e..d432bed504b 100644 --- a/src/com/android/settings/notification/NotificationSettings.java +++ b/src/com/android/settings/notification/NotificationSettings.java @@ -18,7 +18,6 @@ package com.android.settings.notification; import android.content.ContentResolver; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; import android.database.ContentObserver; import android.media.RingtoneManager; @@ -57,7 +56,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements private Preference mNotificationSoundPreference; private Preference mNotificationAccess; - private DropDownPreference mLockscreenNotifications; + private DropDownPreference mLockscreen; private TwoStatePreference mHeadsUp; private TwoStatePreference mNotificationPulse; @@ -112,20 +111,19 @@ public class NotificationSettings extends SettingsPreferenceFragment implements mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS); refreshNotificationListeners(); - mLockscreenNotifications - = (DropDownPreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS); - if (mLockscreenNotifications != null) { + mLockscreen = (DropDownPreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS); + if (mLockscreen != null) { if (!getDeviceLockscreenNotificationsEnabled()) { - root.removePreference(mLockscreenNotifications); + root.removePreference(mLockscreen); } else { - mLockscreenNotifications.addItem(R.string.lock_screen_notifications_summary_show); - mLockscreenNotifications.addItem(R.string.lock_screen_notifications_summary_hide); - final int pos = getLockscreenAllowPrivateNotifications() ? 0 : 1; - mLockscreenNotifications.setSelectedItem(pos); - mLockscreenNotifications.setCallback(new DropDownPreference.Callback() { + mLockscreen.addItem(R.string.lock_screen_notifications_summary_show, 1); + mLockscreen.addItem(R.string.lock_screen_notifications_summary_hide, 0); + final int val = getLockscreenAllowPrivateNotifications() ? 1 : 0; + mLockscreen.setSelectedValue(val); + mLockscreen.setCallback(new DropDownPreference.Callback() { @Override - public boolean onItemSelected(int pos) { - final int val = pos == 0 ? 1 : 0; + public boolean onItemSelected(int pos, Object value) { + final int val = (Integer) value; Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, val); return true; diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 4ce2351fa50..09544811f73 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -95,6 +95,7 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index private Preference mEntry; private Preference mConditionProviders; private AlertDialog mDialog; + private boolean mIgnoreNext; @Override public void onCreate(Bundle icicle) { @@ -111,6 +112,7 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); mSwitch = (SwitchPreference) root.findPreference(KEY_ZEN_MODE); + mSwitch.setOnPreferenceChangeListener(mSwitchListener); final PreferenceCategory general = (PreferenceCategory) root.findPreference(KEY_GENERAL); @@ -146,9 +148,9 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index mStarred.setEnabled(false); mStarred.setTitle(R.string.zen_mode_from); mStarred.setDropDownWidth(R.dimen.zen_mode_dropdown_width); - mStarred.addItem(R.string.zen_mode_from_anyone); - mStarred.addItem(R.string.zen_mode_from_starred); - mStarred.addItem(R.string.zen_mode_from_contacts); + mStarred.addItem(R.string.zen_mode_from_anyone, null); + mStarred.addItem(R.string.zen_mode_from_starred, null); + mStarred.addItem(R.string.zen_mode_from_contacts, null); general.addPreference(mStarred); final Preference alarmInfo = new Preference(mContext) { @@ -171,15 +173,14 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index mWhen.setKey(KEY_WHEN); mWhen.setTitle(R.string.zen_mode_when); mWhen.setDropDownWidth(R.dimen.zen_mode_dropdown_width); - mWhen.addItem(R.string.zen_mode_when_every_night); - mWhen.addItem(R.string.zen_mode_when_weeknights); - mWhen.addItem(R.string.zen_mode_when_never); + mWhen.addItem(R.string.zen_mode_when_every_night, ZenModeConfig.SLEEP_MODE_NIGHTS); + mWhen.addItem(R.string.zen_mode_when_weeknights, ZenModeConfig.SLEEP_MODE_WEEKNIGHTS); + mWhen.addItem(R.string.zen_mode_when_never, null); mWhen.setCallback(new DropDownPreference.Callback() { @Override - public boolean onItemSelected(int pos) { + public boolean onItemSelected(int pos, Object value) { if (mDisableListeners) return true; - final String mode = pos == 1 ? ZenModeConfig.SLEEP_MODE_NIGHTS : - pos == 2 ? ZenModeConfig.SLEEP_MODE_WEEKNIGHTS : null; + final String mode = (String) value; if (Objects.equals(mode, mConfig.sleepMode)) return true; if (DEBUG) Log.d(TAG, "onPrefChange sleepMode=" + mode); final ZenModeConfig newConfig = mConfig.copy(); @@ -210,6 +211,7 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index } }); auto.addPreference(mStart); + mStart.setDependency(mWhen.getKey()); mEnd = new TimePickerPreference(mContext, mgr); mEnd.setTitle(R.string.zen_mode_end_time); @@ -231,8 +233,6 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index } }); auto.addPreference(mEnd); - - mStart.setDependency(mWhen.getKey()); mEnd.setDependency(mWhen.getKey()); mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION); @@ -255,7 +255,6 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index } }); mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS); - refreshAutomationSection(); updateZenMode(); updateControls(); @@ -266,12 +265,11 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index mCalls.setChecked(mConfig.allowCalls); mMessages.setChecked(mConfig.allowMessages); mStarred.setSelectedItem(0); - mWhen.setSelectedItem( - ZenModeConfig.SLEEP_MODE_NIGHTS.equals(mConfig.sleepMode) ? 1 : - ZenModeConfig.SLEEP_MODE_WEEKNIGHTS.equals(mConfig.sleepMode) ? 2 : 0); + mWhen.setSelectedValue(mConfig.sleepMode); mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); mDisableListeners = false; + refreshAutomationSection(); } private void refreshAutomationSection() { @@ -323,7 +321,7 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index @Override public void onResume() { super.onResume(); - refreshAutomationSection(); + updateControls(); updateZenMode(); mSettingsObserver.register(); } @@ -335,18 +333,20 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index } private void updateZenMode() { - mSwitch.setOnPreferenceChangeListener(null); final boolean zenMode = Global.getInt(getContentResolver(), Global.ZEN_MODE, Global.ZEN_MODE_OFF) != Global.ZEN_MODE_OFF; - mSwitch.setChecked(zenMode); + if (mSwitch.isChecked() != zenMode) { + mSwitch.setChecked(zenMode); + mIgnoreNext = true; + } mSwitch.setTitle(zenMode ? R.string.zen_mode_option_on : R.string.zen_mode_option_off); - mSwitch.setOnPreferenceChangeListener(mSwitchListener); } private void updateZenModeConfig() { final ZenModeConfig config = getZenModeConfig(); if (Objects.equals(config, mConfig)) return; - if (DEBUG) Log.d(TAG, "updateZenModeConfig"); + mConfig = config; + if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); updateControls(); } @@ -421,6 +421,12 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final boolean isChecked = (Boolean) newValue; + if (DEBUG) Log.d(TAG, "onPreferenceChange isChecked=" + isChecked + + " mIgnoreNext=" + mIgnoreNext); + if (mIgnoreNext) { + mIgnoreNext = false; + return true; + } AsyncTask.execute(new Runnable() { @Override public void run() {