From b47b2c3f6af650441f8069b87d0d82549913f7c5 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Sat, 4 Apr 2015 15:43:37 -0400 Subject: Zen: Move zen mode preference to switch bar. - Add summary line support to SwitchBar. - Remove obsolete strings. - Wire up switchbar to zen mode w/ dialog prompt. - Remove obsolete callback pref helper. Bug: 20064962 Change-Id: Ifede00b5d43d441ccd94db96bd2796bc57d1a990 --- .../notification/ZenModeAutomationSettings.java | 21 +- .../notification/ZenModeConditionSelection.java | 3 +- .../notification/ZenModePrioritySettings.java | 6 +- .../settings/notification/ZenModeSettings.java | 225 +++++++++++---------- .../settings/notification/ZenModeSettingsBase.java | 49 +++-- src/com/android/settings/widget/SwitchBar.java | 34 +++- 6 files changed, 202 insertions(+), 136 deletions(-) (limited to 'src/com') diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java index 32ad3ce59..378643ebc 100644 --- a/src/com/android/settings/notification/ZenModeAutomationSettings.java +++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java @@ -118,7 +118,8 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase implements In removePreference(KEY_DOWNTIME); return; } - mDays = root.findPreference(KEY_DAYS); + final PreferenceCategory downtime = (PreferenceCategory) findPreference(KEY_DOWNTIME); + mDays = downtime.findPreference(KEY_DAYS); mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -168,7 +169,7 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase implements In return setZenModeConfig(newConfig); } }); - root.addPreference(mStart); + downtime.addPreference(mStart); mStart.setDependency(mDays.getKey()); mEnd = new TimePickerPreference(mContext, mgr); @@ -190,10 +191,10 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase implements In return setZenModeConfig(newConfig); } }); - root.addPreference(mEnd); + downtime.addPreference(mEnd); mEnd.setDependency(mDays.getKey()); - mDowntimeMode = (DropDownPreference) root.findPreference(KEY_DOWNTIME_MODE); + mDowntimeMode = (DropDownPreference) downtime.findPreference(KEY_DOWNTIME_MODE); mDowntimeMode.addItem(R.string.zen_mode_downtime_mode_priority, false); mDowntimeMode.addItem(R.string.zen_mode_downtime_mode_none, true); mDowntimeMode.setCallback(new DropDownPreference.Callback() { @@ -265,7 +266,17 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase implements In } @Override - protected void updateControls() { + protected void onZenModeConfigChanged() { + updateControls(); + } + + @Override + public void onResume() { + super.onResume(); + updateControls(); + } + + private void updateControls() { mDisableListeners = true; if (mDowntimeSupported) { updateDays(); diff --git a/src/com/android/settings/notification/ZenModeConditionSelection.java b/src/com/android/settings/notification/ZenModeConditionSelection.java index 87f55a332..9beea0a12 100644 --- a/src/com/android/settings/notification/ZenModeConditionSelection.java +++ b/src/com/android/settings/notification/ZenModeConditionSelection.java @@ -27,7 +27,6 @@ import android.os.UserHandle; import android.service.notification.Condition; import android.service.notification.IConditionListener; import android.service.notification.ZenModeConfig; -import android.text.TextUtils; import android.util.Log; import android.widget.CompoundButton; import android.widget.RadioButton; @@ -117,7 +116,7 @@ public class ZenModeConditionSelection extends RadioGroup { } } if (v != null) { - v.setText(!TextUtils.isEmpty(c.line1) ? c.line1 : c.summary); + v.setText(ZenModeSettings.computeConditionText(c)); v.setEnabled(c.state == Condition.STATE_TRUE); } mConditions.add(c); diff --git a/src/com/android/settings/notification/ZenModePrioritySettings.java b/src/com/android/settings/notification/ZenModePrioritySettings.java index 062c12a26..af74a46fc 100644 --- a/src/com/android/settings/notification/ZenModePrioritySettings.java +++ b/src/com/android/settings/notification/ZenModePrioritySettings.java @@ -132,7 +132,11 @@ public class ZenModePrioritySettings extends ZenModeSettingsBase implements Inde } @Override - protected void updateControls() { + protected void onZenModeConfigChanged() { + updateControls(); + } + + private void updateControls() { mDisableListeners = true; if (mCalls != null) { mCalls.setChecked(mConfig.allowCalls); diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 47d1f5dce..f519796b0 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -24,51 +24,87 @@ import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceScreen; import android.provider.Settings.Global; +import android.service.notification.Condition; +import android.text.TextUtils; +import android.util.Log; import android.util.SparseArray; import android.widget.ScrollView; +import android.widget.Switch; import com.android.internal.logging.MetricsLogger; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.SettingsActivity; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settings.widget.SwitchBar; import java.util.ArrayList; import java.util.List; -public class ZenModeSettings extends ZenModeSettingsBase implements Indexable { - private static final String KEY_ZEN_MODE = "zen_mode"; +public class ZenModeSettings extends ZenModeSettingsBase + implements Indexable, SwitchBar.OnSwitchChangeListener { private static final String KEY_PRIORITY_SETTINGS = "priority_settings"; private static final String KEY_AUTOMATION_SETTINGS = "automation_settings"; - private static final SettingPrefWithCallback PREF_ZEN_MODE = new SettingPrefWithCallback( - SettingPref.TYPE_GLOBAL, KEY_ZEN_MODE, Global.ZEN_MODE, Global.ZEN_MODE_OFF, - Global.ZEN_MODE_OFF, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, Global.ZEN_MODE_ALARMS, - Global.ZEN_MODE_NO_INTERRUPTIONS) { - protected String getCaption(Resources res, int value) { - switch (value) { - case Global.ZEN_MODE_NO_INTERRUPTIONS: - return res.getString(R.string.zen_mode_option_no_interruptions); - case Global.ZEN_MODE_ALARMS: - return res.getString(R.string.zen_mode_option_alarms); - case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: - return res.getString(R.string.zen_mode_option_important_interruptions); - default: - return res.getString(R.string.zen_mode_option_off); - } - } - }; - private Preference mPrioritySettings; private AlertDialog mDialog; + private SwitchBar mSwitchBar; + private boolean mShowing; - private static SparseArray allKeyTitles(Context context) { - final SparseArray rt = new SparseArray(); - rt.put(R.string.zen_mode_option_title, KEY_ZEN_MODE); - rt.put(R.string.zen_mode_priority_settings_title, KEY_PRIORITY_SETTINGS); - rt.put(R.string.zen_mode_automation_settings_title, KEY_AUTOMATION_SETTINGS); - return rt; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.zen_mode_settings); + final PreferenceScreen root = getPreferenceScreen(); + + mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS); + if (!isDowntimeSupported(mContext)) { + removePreference(KEY_AUTOMATION_SETTINGS); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + final SettingsActivity activity = (SettingsActivity) getActivity(); + mSwitchBar = activity.getSwitchBar(); + mSwitchBar.addOnSwitchChangeListener(this); + mSwitchBar.show(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mSwitchBar.removeOnSwitchChangeListener(this); + mSwitchBar.hide(); + } + + @Override + public void onResume() { + super.onResume(); + updateControls(); + mShowing = true; + } + + @Override + public void onPause() { + mShowing = false; + super.onPause(); + } + + @Override + public void onSwitchChanged(Switch switchView, boolean isChecked) { + if (DEBUG) Log.d(TAG, "onSwitchChanged " + isChecked + " mShowing=" + mShowing); + if (!mShowing) return; // not from the user + if (isChecked) { + setZenMode(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + showConditionSelection(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + } else { + setZenMode(Global.ZEN_MODE_OFF); + } } @Override @@ -78,36 +114,52 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable { @Override protected void onZenModeChanged() { - PREF_ZEN_MODE.update(mContext); + updateControls(); } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void onZenModeConfigChanged() { + updateControls(); + } - addPreferencesFromResource(R.xml.zen_mode_settings); - final PreferenceScreen root = getPreferenceScreen(); + private String computeZenModeCaption(int zenMode) { + switch (zenMode) { + case Global.ZEN_MODE_ALARMS: + return getString(R.string.zen_mode_option_alarms); + case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: + return getString(R.string.zen_mode_option_important_interruptions); + case Global.ZEN_MODE_NO_INTERRUPTIONS: + return getString(R.string.zen_mode_option_no_interruptions); + default: + return null; + } + } - PREF_ZEN_MODE.init(this); - PREF_ZEN_MODE.setCallback(new SettingPrefWithCallback.Callback() { - @Override - public void onSettingSelected(int value) { - if (value != Global.ZEN_MODE_OFF) { - showConditionSelection(value); - } - } - }); + private String computeExitConditionText() { + return mConfig == null || mConfig.exitCondition == null + ? getString(com.android.internal.R.string.zen_mode_forever) + : computeConditionText(mConfig.exitCondition); + } - mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS); - if (!isDowntimeSupported(mContext)) { - removePreference(KEY_AUTOMATION_SETTINGS); - } + public static String computeConditionText(Condition c) { + return !TextUtils.isEmpty(c.line1) ? c.line1 + : !TextUtils.isEmpty(c.summary) ? c.summary + : ""; + } - updateControls(); + private String computeZenModeSummaryLine() { + final String caption = computeZenModeCaption(mZenMode); + if (caption == null) return null; + final String conditionText = computeExitConditionText().toLowerCase(); + return getString(R.string.zen_mode_summary_combination, caption, conditionText); } - @Override - protected void updateControls() { + private void updateControls() { + if (mSwitchBar != null) { + final String summaryLine = computeZenModeSummaryLine(); + mSwitchBar.setChecked(summaryLine != null); + mSwitchBar.setSummary(summaryLine); + } updatePrioritySettingsSummary(); } @@ -128,7 +180,7 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable { return s; } - protected void showConditionSelection(final int newSettingsValue) { + protected void showConditionSelection(final int zenMode) { if (mDialog != null) return; final ZenModeConditionSelection zenModeConditionSelection = @@ -140,34 +192,41 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable { mDialog = null; } }; - final int oldSettingsValue = PREF_ZEN_MODE.getValue(mContext); ScrollView scrollView = new ScrollView(mContext); scrollView.addView(zenModeConditionSelection); mDialog = new AlertDialog.Builder(getActivity()) - .setTitle(PREF_ZEN_MODE.getCaption(getResources(), newSettingsValue)) + .setTitle(computeZenModeCaption(zenMode)) .setView(scrollView) .setPositiveButton(R.string.okay, positiveListener) .setNegativeButton(R.string.cancel_all_caps, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - cancelDialog(oldSettingsValue); + cancelDialog(); } }) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { - cancelDialog(oldSettingsValue); + cancelDialog(); } }).create(); mDialog.show(); } - protected void cancelDialog(int oldSettingsValue) { - // If not making a decision, reset drop down to current setting. - PREF_ZEN_MODE.setValueWithoutCallback(mContext, oldSettingsValue); + private void cancelDialog() { + if (DEBUG) Log.d(TAG, "cancelDialog"); + // If not making a decision, reset zen to off. + setZenMode(Global.ZEN_MODE_OFF); mDialog = null; } + private static SparseArray allKeyTitles(Context context) { + final SparseArray rt = new SparseArray(); + rt.put(R.string.zen_mode_priority_settings_title, KEY_PRIORITY_SETTINGS); + rt.put(R.string.zen_mode_automation_settings_title, KEY_AUTOMATION_SETTINGS); + return rt; + } + // Enable indexing of searchable data public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @@ -197,58 +256,4 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable { return rt; } }; - - private static class SettingPrefWithCallback extends SettingPref { - - private Callback mCallback; - private int mValue; - - public SettingPrefWithCallback(int type, String key, String setting, int def, - int... values) { - super(type, key, setting, def, values); - } - - public void setCallback(Callback callback) { - mCallback = callback; - } - - @Override - public void update(Context context) { - // Avoid callbacks from non-user changes. - mValue = getValue(context); - super.update(context); - } - - @Override - protected boolean setSetting(Context context, int value) { - if (value == mValue) return true; - mValue = value; - if (mCallback != null) { - mCallback.onSettingSelected(value); - } - return super.setSetting(context, value); - } - - @Override - public Preference init(SettingsPreferenceFragment settings) { - Preference ret = super.init(settings); - mValue = getValue(settings.getActivity()); - - return ret; - } - - public boolean setValueWithoutCallback(Context context, int value) { - // Set the current value ahead of time, this way we won't trigger a callback. - mValue = value; - return putInt(mType, context.getContentResolver(), mSetting, value); - } - - public int getValue(Context context) { - return getInt(mType, context.getContentResolver(), mSetting, mDefault); - } - - public interface Callback { - void onSettingSelected(int value); - } - } } diff --git a/src/com/android/settings/notification/ZenModeSettingsBase.java b/src/com/android/settings/notification/ZenModeSettingsBase.java index ec17d869d..5ef0da400 100644 --- a/src/com/android/settings/notification/ZenModeSettingsBase.java +++ b/src/com/android/settings/notification/ZenModeSettingsBase.java @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.ServiceManager; +import android.provider.Settings; import android.provider.Settings.Global; import android.service.notification.ZenModeConfig; import android.util.Log; @@ -41,23 +42,25 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment { protected Context mContext; protected ZenModeConfig mConfig; + protected int mZenMode; abstract protected void onZenModeChanged(); - abstract protected void updateControls(); + abstract protected void onZenModeConfigChanged(); @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); mContext = getActivity(); - mConfig = getZenModeConfig(); + updateZenMode(false /*fireChanged*/); + updateZenModeConfig(false /*fireChanged*/); if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); } @Override public void onResume() { super.onResume(); - mConfig = getZenModeConfig(); - updateControls(); + updateZenMode(true /*fireChanged*/); + updateZenModeConfig(true /*fireChanged*/); mSettingsObserver.register(); } @@ -67,6 +70,26 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment { mSettingsObserver.unregister(); } + private void updateZenMode(boolean fireChanged) { + final int zenMode = Settings.Global.getInt(getContentResolver(), Global.ZEN_MODE, mZenMode); + if (zenMode == mZenMode) return; + mZenMode = zenMode; + if (DEBUG) Log.d(TAG, "updateZenMode mZenMode=" + mZenMode); + if (fireChanged) { + onZenModeChanged(); + } + } + + private void updateZenModeConfig(boolean fireChanged) { + final ZenModeConfig config = getZenModeConfig(); + if (Objects.equals(config, mConfig)) return; + mConfig = config; + if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); + if (fireChanged) { + onZenModeConfigChanged(); + } + } + protected boolean setZenModeConfig(ZenModeConfig config) { final INotificationManager nm = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); @@ -75,7 +98,7 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment { if (success) { mConfig = config; if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); - updateControls(); + onZenModeConfigChanged(); } return success; } catch (Exception e) { @@ -84,19 +107,15 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment { } } + protected void setZenMode(int zenMode) { + Global.putInt(getContentResolver(), Global.ZEN_MODE, zenMode); + } + protected static boolean isDowntimeSupported(Context context) { return NotificationManager.from(context) .isSystemConditionProviderEnabled(ZenModeConfig.DOWNTIME_PATH); } - private void updateZenModeConfig() { - final ZenModeConfig config = getZenModeConfig(); - if (Objects.equals(config, mConfig)) return; - mConfig = config; - if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); - updateControls(); - } - private ZenModeConfig getZenModeConfig() { final INotificationManager nm = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); @@ -129,10 +148,10 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment { public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); if (ZEN_MODE_URI.equals(uri)) { - onZenModeChanged(); + updateZenMode(true /*fireChanged*/); } if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { - updateZenModeConfig(); + updateZenModeConfig(true /*fireChanged*/); } } } diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java index 606ceaa1e..094b95f99 100644 --- a/src/com/android/settings/widget/SwitchBar.java +++ b/src/com/android/settings/widget/SwitchBar.java @@ -20,15 +20,18 @@ import android.content.Context; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.style.TextAppearanceSpan; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.LinearLayout; - import android.widget.Switch; import android.widget.TextView; + import com.android.settings.R; import java.util.ArrayList; @@ -46,8 +49,12 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC void onSwitchChanged(Switch switchView, boolean isChecked); } + private final TextAppearanceSpan mSummarySpan; + private ToggleSwitch mSwitch; private TextView mTextView; + private String mLabel; + private String mSummary; private ArrayList mSwitchChangeListeners = new ArrayList(); @@ -78,7 +85,9 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC a.recycle(); mTextView = (TextView) findViewById(R.id.switch_text); - mTextView.setText(R.string.switch_off_text); + mLabel = getResources().getString(R.string.switch_off_text); + mSummarySpan = new TextAppearanceSpan(mContext, R.style.TextAppearance_Small_SwitchBar); + updateText(); ViewGroup.MarginLayoutParams lp = (MarginLayoutParams) mTextView.getLayoutParams(); lp.setMarginStart(switchBarMarginStart); @@ -103,7 +112,26 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC } public void setTextViewLabel(boolean isChecked) { - mTextView.setText(isChecked ? R.string.switch_on_text : R.string.switch_off_text); + mLabel = getResources() + .getString(isChecked ? R.string.switch_on_text : R.string.switch_off_text); + updateText(); + } + + public void setSummary(String summary) { + mSummary = summary; + updateText(); + } + + private void updateText() { + if (TextUtils.isEmpty(mSummary)) { + mTextView.setText(mLabel); + return; + } + final SpannableStringBuilder ssb = new SpannableStringBuilder(mLabel).append('\n'); + final int start = ssb.length(); + ssb.append(mSummary); + ssb.setSpan(mSummarySpan, start, ssb.length(), 0); + mTextView.setText(ssb); } public void setChecked(boolean checked) { -- cgit v1.2.3