From b47b2c3f6af650441f8069b87d0d82549913f7c5 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Sat, 4 Apr 2015 15:43:37 -0400 Subject: [PATCH] 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 --- res/layout/switch_bar.xml | 2 + res/values/strings.xml | 18 +- res/values/styles.xml | 4 + res/xml/zen_mode_settings.xml | 6 - .../ZenModeAutomationSettings.java | 21 +- .../ZenModeConditionSelection.java | 3 +- .../notification/ZenModePrioritySettings.java | 6 +- .../notification/ZenModeSettings.java | 235 +++++++++--------- .../notification/ZenModeSettingsBase.java | 49 ++-- .../android/settings/widget/SwitchBar.java | 34 ++- 10 files changed, 219 insertions(+), 159 deletions(-) diff --git a/res/layout/switch_bar.xml b/res/layout/switch_bar.xml index 4d335181846..7136624f237 100644 --- a/res/layout/switch_bar.xml +++ b/res/layout/switch_bar.xml @@ -24,6 +24,8 @@ android:layout_width="0dp" android:layout_weight="1" android:layout_gravity="center_vertical" + android:maxLines="2" + android:ellipsize="end" android:textAppearance="@style/TextAppearance.Switch" android:textColor="?android:attr/textColorPrimary" android:textAlignment="viewStart" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 2c28beb9f54..c46b37a7135 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5692,20 +5692,17 @@ Automatic rules - - When calls and notifications arrive - - - Always interrupt - - Allow only priority interruptions + Priority only - Allow only alarms + Alarms only - Don\'t interrupt + No interruptions + + + %1$s %2$s Phone ringtone @@ -5875,9 +5872,6 @@ Done - - Until you turn this off - Downtime diff --git a/res/values/styles.xml b/res/values/styles.xml index 8d0b8859f0b..78a3572e0a9 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -350,4 +350,8 @@ @color/fingerprint_message_color + diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml index 1194d1b6de7..267727f69e3 100644 --- a/res/xml/zen_mode_settings.xml +++ b/res/xml/zen_mode_settings.xml @@ -19,12 +19,6 @@ android:key="zen_mode_settings" android:title="@string/zen_mode_settings_title" > - - - 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); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.zen_mode_settings); - final PreferenceScreen root = getPreferenceScreen(); - - 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); - } - } - }); - - mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS); - if (!isDowntimeSupported(mContext)) { - removePreference(KEY_AUTOMATION_SETTINGS); - } - updateControls(); } @Override - protected void updateControls() { + protected void onZenModeConfigChanged() { + updateControls(); + } + + 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; + } + } + + private String computeExitConditionText() { + return mConfig == null || mConfig.exitCondition == null + ? getString(com.android.internal.R.string.zen_mode_forever) + : computeConditionText(mConfig.exitCondition); + } + + public static String computeConditionText(Condition c) { + return !TextUtils.isEmpty(c.line1) ? c.line1 + : !TextUtils.isEmpty(c.summary) ? c.summary + : ""; + } + + 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); + } + + 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 ec17d869d6a..5ef0da400cf 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 606ceaa1e73..094b95f998c 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) {