From 623a0e9f45c294ea7e714295f41ba2d8bcd7b32e Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Mon, 28 Apr 2014 14:29:33 -0400 Subject: Add zen-mode exit condition dialog to settings. Change-Id: I7e0f06e681d5c198ae23eaafaa4498939e6453d8 --- res/values/strings.xml | 3 + .../notification/ZenModeConditionSelection.java | 133 +++++++++++++++++++++ .../settings/notification/ZenModeSettings.java | 46 ++++++- 3 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/notification/ZenModeConditionSelection.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 99f6664..a21fcf4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5145,6 +5145,9 @@ On + + Until you turn this off + Block all interruptions except diff --git a/src/com/android/settings/notification/ZenModeConditionSelection.java b/src/com/android/settings/notification/ZenModeConditionSelection.java new file mode 100644 index 0000000..031d785 --- /dev/null +++ b/src/com/android/settings/notification/ZenModeConditionSelection.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.notification; + +import android.animation.LayoutTransition; +import android.app.INotificationManager; +import android.content.Context; +import android.net.Uri; +import android.os.Handler; +import android.os.Message; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.service.notification.Condition; +import android.service.notification.IConditionListener; +import android.util.Log; +import android.widget.CompoundButton; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import com.android.settings.R; + +public class ZenModeConditionSelection extends RadioGroup { + private static final String TAG = "ZenModeConditionSelection"; + private static final boolean DEBUG = true; + + private final INotificationManager mNoMan; + private final H mHandler = new H(); + private final Context mContext; + + public ZenModeConditionSelection(Context context) { + super(context); + mContext = context; + setLayoutTransition(new LayoutTransition()); + final int p = mContext.getResources().getDimensionPixelSize(R.dimen.content_margin_left); + setPadding(p, p, p, 0); + mNoMan = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + final RadioButton b = newRadioButton(null); + b.setText(R.string.zen_mode_default_option); + b.setChecked(true); + } + + private RadioButton newRadioButton(Object tag) { + final RadioButton button = new RadioButton(mContext); + button.setTag(tag); + button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + handleSubscribe((Uri)button.getTag()); + } + } + }); + addView(button); + return button; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + requestZenModeConditions(true); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + requestZenModeConditions(false); + } + + protected void requestZenModeConditions(boolean requested) { + if (DEBUG) Log.d(TAG, "requestZenModeConditions " + requested); + try { + mNoMan.requestZenModeConditions(mListener, requested); + } catch (RemoteException e) { + // noop + } + } + + protected void handleConditions(Condition[] conditions) { + for (final Condition c : conditions) { + RadioButton v = (RadioButton) findViewWithTag(c.id); + if (c.state == Condition.STATE_FALSE || c.state == Condition.STATE_UNKNOWN) { + if (v == null) { + v = newRadioButton(c.id); + } + } + if (v != null) { + v.setText(c.caption); + v.setEnabled(c.state == Condition.STATE_FALSE); + } + } + } + + protected void handleSubscribe(Uri id) { + if (DEBUG) Log.d(TAG, "handleSubscribe " + id); + try { + mNoMan.setZenModeCondition(id); + } catch (RemoteException e) { + // noop + } + } + + private final IConditionListener mListener = new IConditionListener.Stub() { + @Override + public void onConditionsReceived(Condition[] conditions) { + if (conditions == null || conditions.length == 0) return; + mHandler.obtainMessage(H.CONDITIONS, conditions).sendToTarget(); + } + }; + + private final class H extends Handler { + private static final int CONDITIONS = 1; + + @Override + public void handleMessage(Message msg) { + if (msg.what == CONDITIONS) handleConditions((Condition[])msg.obj); + } + } +} diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 26fa539..a5c720f 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -16,12 +16,14 @@ package com.android.settings.notification; +import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.app.INotificationManager; import android.app.TimePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Typeface; @@ -80,6 +82,7 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index private DropDownPreference mWhen; private TimePickerPreference mStart; private TimePickerPreference mEnd; + private AlertDialog mDialog; @Override public void onCreate(Bundle icicle) { @@ -292,6 +295,46 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index } } + protected void putZenModeSetting(int value) { + Global.putInt(getContentResolver(), Global.ZEN_MODE, value); + } + + protected ZenModeConditionSelection newConditionSelection() { + return new ZenModeConditionSelection(mContext); + } + + private final Runnable mHideDialog = new Runnable() { + @Override + public void run() { + if (mDialog != null) { + mDialog.dismiss(); + mDialog = null; + } + } + }; + + private final Runnable mShowDialog = new Runnable() { + @Override + public void run() { + mDialog = new AlertDialog.Builder(mContext) + .setTitle(R.string.zen_mode_settings_title) + .setView(newConditionSelection()) + .setNegativeButton(R.string.dlg_cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + putZenModeSetting(Global.ZEN_MODE_OFF); + } + }) + .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // noop + } + }) + .show(); + } + }; + private final OnPreferenceChangeListener mSwitchListener = new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -300,7 +343,8 @@ public class ZenModeSettings extends SettingsPreferenceFragment implements Index @Override public void run() { final int v = isChecked ? Global.ZEN_MODE_ON : Global.ZEN_MODE_OFF; - Global.putInt(getContentResolver(), Global.ZEN_MODE, v); + putZenModeSetting(v); + mHandler.post(isChecked ? mShowDialog : mHideDialog); } }); return true; -- cgit v1.1