summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2015-04-03 15:11:33 -0400
committerJohn Spurlock <jspurlock@google.com>2015-04-03 16:27:45 -0400
commitd8b36835707edbeeb9c9fbc30eba855a0b6231c6 (patch)
tree8e5d7ca7123f3d43df67a41222c2b5c48c7ca6c9 /src/com/android
parent851532f37fa01930300bdbc951dcc311d066de02 (diff)
downloadpackages_apps_Settings-d8b36835707edbeeb9c9fbc30eba855a0b6231c6.tar.gz
packages_apps_Settings-d8b36835707edbeeb9c9fbc30eba855a0b6231c6.tar.bz2
packages_apps_Settings-d8b36835707edbeeb9c9fbc30eba855a0b6231c6.zip
Settings: Move downtime to new automation sub-settings page.
Bug: 20064962 Change-Id: I6238439bbd679c143fc986743a65ed64057f2755
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/settings/Settings.java1
-rw-r--r--src/com/android/settings/notification/ZenModeAutomationSettings.java453
-rw-r--r--src/com/android/settings/notification/ZenModeSettings.java371
-rw-r--r--src/com/android/settings/notification/ZenModeSettingsBase.java6
-rw-r--r--src/com/android/settings/search/Ranking.java2
-rw-r--r--src/com/android/settings/search/SearchIndexableResources.java8
6 files changed, 477 insertions, 364 deletions
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 4ed10268b..c9b5817c0 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -95,6 +95,7 @@ public class Settings extends SettingsActivity {
public static class PrintJobSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModeSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModePrioritySettingsActivity extends SettingsActivity { /* empty */ }
+ public static class ZenModeAutomationSettingsActivity extends SettingsActivity { /* empty */ }
public static class NotificationSettingsActivity extends SettingsActivity { /* empty */ }
public static class NotificationAppListActivity extends SettingsActivity { /* empty */ }
public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
new file mode 100644
index 000000000..32ad3ce59
--- /dev/null
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -0,0 +1,453 @@
+/*
+ * Copyright (C) 2015 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 static com.android.settings.notification.ZenModeDowntimeDaysSelection.DAYS;
+
+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.DialogInterface.OnDismissListener;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.ServiceManager;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.service.notification.Condition;
+import android.service.notification.ZenModeConfig;
+import android.text.format.DateFormat;
+import android.util.Log;
+import android.util.SparseArray;
+import android.widget.TimePicker;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.DropDownPreference;
+import com.android.settings.R;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Objects;
+
+public class ZenModeAutomationSettings extends ZenModeSettingsBase implements Indexable {
+ private static final String KEY_DOWNTIME = "downtime";
+ private static final String KEY_DAYS = "days";
+ private static final String KEY_START_TIME = "start_time";
+ private static final String KEY_END_TIME = "end_time";
+ private static final String KEY_DOWNTIME_MODE = "downtime_mode";
+
+ private static final String KEY_AUTOMATION = "automation";
+ private static final String KEY_ENTRY = "entry";
+ private static final String KEY_CONDITION_PROVIDERS = "manage_condition_providers";
+
+ private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE");
+
+ private PackageManager mPM;
+ private boolean mDisableListeners;
+ private boolean mDowntimeSupported;
+
+ private Preference mDays;
+ private TimePickerPreference mStart;
+ private TimePickerPreference mEnd;
+ private DropDownPreference mDowntimeMode;
+ private PreferenceCategory mAutomationCategory;
+ private Preference mEntry;
+ private Preference mConditionProviders;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ mPM = mContext.getPackageManager();
+
+ addPreferencesFromResource(R.xml.zen_mode_automation_settings);
+ final PreferenceScreen root = getPreferenceScreen();
+
+ onCreateDowntimeSettings(root);
+
+ mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION);
+ mEntry = findPreference(KEY_ENTRY);
+ mEntry.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.zen_mode_entry_conditions_title)
+ .setView(new ZenModeAutomaticConditionSelection(mContext))
+ .setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ refreshAutomationSection();
+ }
+ })
+ .setPositiveButton(R.string.dlg_ok, null)
+ .show();
+ return true;
+ }
+ });
+ mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS);
+ }
+
+ private void onCreateDowntimeSettings(PreferenceScreen root) {
+ mDowntimeSupported = isDowntimeSupported(mContext);
+ if (!mDowntimeSupported) {
+ removePreference(KEY_DOWNTIME);
+ return;
+ }
+ mDays = root.findPreference(KEY_DAYS);
+ mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.zen_mode_downtime_days)
+ .setView(new ZenModeDowntimeDaysSelection(mContext, mConfig.sleepMode) {
+ @Override
+ protected void onChanged(String mode) {
+ if (mDisableListeners) return;
+ if (Objects.equals(mode, mConfig.sleepMode)) return;
+ if (DEBUG) Log.d(TAG, "days.onChanged sleepMode=" + mode);
+ final ZenModeConfig newConfig = mConfig.copy();
+ newConfig.sleepMode = mode;
+ setZenModeConfig(newConfig);
+ }
+ })
+ .setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ updateDays();
+ }
+ })
+ .setPositiveButton(R.string.done_button, null)
+ .show();
+ return true;
+ }
+ });
+
+ final FragmentManager mgr = getFragmentManager();
+
+ mStart = new TimePickerPreference(mContext, mgr);
+ mStart.setKey(KEY_START_TIME);
+ mStart.setTitle(R.string.zen_mode_start_time);
+ mStart.setCallback(new TimePickerPreference.Callback() {
+ @Override
+ public boolean onSetTime(int hour, int minute) {
+ if (mDisableListeners) return true;
+ if (!ZenModeConfig.isValidHour(hour)) return false;
+ if (!ZenModeConfig.isValidMinute(minute)) return false;
+ if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) {
+ return true;
+ }
+ if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute);
+ final ZenModeConfig newConfig = mConfig.copy();
+ newConfig.sleepStartHour = hour;
+ newConfig.sleepStartMinute = minute;
+ return setZenModeConfig(newConfig);
+ }
+ });
+ root.addPreference(mStart);
+ mStart.setDependency(mDays.getKey());
+
+ mEnd = new TimePickerPreference(mContext, mgr);
+ mEnd.setKey(KEY_END_TIME);
+ mEnd.setTitle(R.string.zen_mode_end_time);
+ mEnd.setCallback(new TimePickerPreference.Callback() {
+ @Override
+ public boolean onSetTime(int hour, int minute) {
+ if (mDisableListeners) return true;
+ if (!ZenModeConfig.isValidHour(hour)) return false;
+ if (!ZenModeConfig.isValidMinute(minute)) return false;
+ if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) {
+ return true;
+ }
+ if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute);
+ final ZenModeConfig newConfig = mConfig.copy();
+ newConfig.sleepEndHour = hour;
+ newConfig.sleepEndMinute = minute;
+ return setZenModeConfig(newConfig);
+ }
+ });
+ root.addPreference(mEnd);
+ mEnd.setDependency(mDays.getKey());
+
+ mDowntimeMode = (DropDownPreference) root.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() {
+ @Override
+ public boolean onItemSelected(int pos, Object value) {
+ if (mDisableListeners) return true;
+ final boolean sleepNone = value instanceof Boolean ? ((Boolean) value) : false;
+ if (mConfig == null || mConfig.sleepNone == sleepNone) return false;
+ final ZenModeConfig newConfig = mConfig.copy();
+ newConfig.sleepNone = sleepNone;
+ if (DEBUG) Log.d(TAG, "onPrefChange sleepNone=" + sleepNone);
+ return setZenModeConfig(newConfig);
+ }
+ });
+ mDowntimeMode.setOrder(10); // sort at the bottom of the category
+ mDowntimeMode.setDependency(mDays.getKey());
+ }
+
+ private void updateDays() {
+ // Compute an ordered, delimited list of day names based on the persisted user config.
+ if (mConfig != null) {
+ final int[] days = ZenModeConfig.tryParseDays(mConfig.sleepMode);
+ if (days != null && days.length != 0) {
+ final StringBuilder sb = new StringBuilder();
+ final Calendar c = Calendar.getInstance();
+ for (int i = 0; i < DAYS.length; i++) {
+ final int day = DAYS[i];
+ for (int j = 0; j < days.length; j++) {
+ if (day == days[j]) {
+ c.set(Calendar.DAY_OF_WEEK, day);
+ if (sb.length() > 0) {
+ sb.append(mContext.getString(R.string.summary_divider_text));
+ }
+ sb.append(DAY_FORMAT.format(c.getTime()));
+ break;
+ }
+ }
+ }
+ if (sb.length() > 0) {
+ mDays.setSummary(sb);
+ mDays.notifyDependencyChange(false);
+ return;
+ }
+ }
+ }
+ mDays.setSummary(R.string.zen_mode_downtime_days_none);
+ mDays.notifyDependencyChange(true);
+ }
+
+ private void updateEndSummary() {
+ if (!mDowntimeSupported) return;
+ final int startMin = 60 * mConfig.sleepStartHour + mConfig.sleepStartMinute;
+ final int endMin = 60 * mConfig.sleepEndHour + mConfig.sleepEndMinute;
+ final boolean nextDay = startMin >= endMin;
+ final int summaryFormat;
+ if (mConfig.sleepNone) {
+ summaryFormat = nextDay ? R.string.zen_mode_end_time_none_next_day_summary_format
+ : R.string.zen_mode_end_time_none_same_day_summary_format;
+ } else {
+ summaryFormat = nextDay ? R.string.zen_mode_end_time_priority_next_day_summary_format
+ : 0;
+ }
+ mEnd.setSummaryFormat(summaryFormat);
+ }
+
+ @Override
+ protected void onZenModeChanged() {
+ // don't care
+ }
+
+ @Override
+ protected void updateControls() {
+ mDisableListeners = true;
+ if (mDowntimeSupported) {
+ updateDays();
+ mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute);
+ mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute);
+ mDowntimeMode.setSelectedValue(mConfig.sleepNone);
+ }
+ mDisableListeners = false;
+ refreshAutomationSection();
+ updateEndSummary();
+ }
+
+ @Override
+ protected int getMetricsCategory() {
+ return MetricsLogger.NOTIFICATION_ZEN_MODE_AUTOMATION;
+ }
+
+ private void refreshAutomationSection() {
+ if (mConditionProviders != null) {
+ final int total = ConditionProviderSettings.getProviderCount(mPM);
+ if (total == 0) {
+ getPreferenceScreen().removePreference(mAutomationCategory);
+ } else {
+ final int n = ConditionProviderSettings.getEnabledProviderCount(mContext);
+ if (n == 0) {
+ mConditionProviders.setSummary(getResources().getString(
+ R.string.manage_condition_providers_summary_zero));
+ } else {
+ mConditionProviders.setSummary(String.format(getResources().getQuantityString(
+ R.plurals.manage_condition_providers_summary_nonzero,
+ n, n)));
+ }
+ final String entrySummary = getEntryConditionSummary();
+ if (n == 0 || entrySummary == null) {
+ mEntry.setSummary(R.string.zen_mode_entry_conditions_summary_none);
+ } else {
+ mEntry.setSummary(entrySummary);
+ }
+ }
+ }
+ }
+
+ private String getEntryConditionSummary() {
+ final INotificationManager nm = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ try {
+ final Condition[] automatic = nm.getAutomaticZenModeConditions();
+ if (automatic == null || automatic.length == 0) {
+ return null;
+ }
+ final String divider = getString(R.string.summary_divider_text);
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < automatic.length; i++) {
+ if (i > 0) sb.append(divider);
+ sb.append(automatic[i].summary);
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ Log.w(TAG, "Error calling getAutomaticZenModeConditions", e);
+ return null;
+ }
+ }
+
+ private static SparseArray<String> allKeyTitles(Context context) {
+ final SparseArray<String> rt = new SparseArray<String>();
+ rt.put(R.string.zen_mode_downtime_category, KEY_DOWNTIME);
+ rt.put(R.string.zen_mode_downtime_days, KEY_DAYS);
+ rt.put(R.string.zen_mode_start_time, KEY_START_TIME);
+ rt.put(R.string.zen_mode_end_time, KEY_END_TIME);
+ rt.put(R.string.zen_mode_downtime_mode_title, KEY_DOWNTIME_MODE);
+ rt.put(R.string.zen_mode_automation_category, KEY_AUTOMATION);
+ rt.put(R.string.manage_condition_providers, KEY_CONDITION_PROVIDERS);
+ return rt;
+ }
+
+ // Enable indexing of searchable data
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+
+ @Override
+ public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+ final SparseArray<String> keyTitles = allKeyTitles(context);
+ final int N = keyTitles.size();
+ final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(N);
+ final Resources res = context.getResources();
+ for (int i = 0; i < N; i++) {
+ final SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.key = keyTitles.valueAt(i);
+ data.title = res.getString(keyTitles.keyAt(i));
+ data.screenTitle = res.getString(R.string.zen_mode_automation_settings_title);
+ result.add(data);
+ }
+ return result;
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ final ArrayList<String> rt = new ArrayList<String>();
+ if (!isDowntimeSupported(context)) {
+ rt.add(KEY_DOWNTIME);
+ rt.add(KEY_DAYS);
+ rt.add(KEY_START_TIME);
+ rt.add(KEY_END_TIME);
+ rt.add(KEY_DOWNTIME_MODE);
+ }
+ return rt;
+ }
+ };
+
+ private static class TimePickerPreference extends Preference {
+ private final Context mContext;
+
+ private int mSummaryFormat;
+ private int mHourOfDay;
+ private int mMinute;
+ private Callback mCallback;
+
+ public TimePickerPreference(Context context, final FragmentManager mgr) {
+ super(context);
+ mContext = context;
+ setPersistent(false);
+ setOnPreferenceClickListener(new OnPreferenceClickListener(){
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ final TimePickerFragment frag = new TimePickerFragment();
+ frag.pref = TimePickerPreference.this;
+ frag.show(mgr, TimePickerPreference.class.getName());
+ return true;
+ }
+ });
+ }
+
+ public void setCallback(Callback callback) {
+ mCallback = callback;
+ }
+
+ public void setSummaryFormat(int resId) {
+ mSummaryFormat = resId;
+ updateSummary();
+ }
+
+ public void setTime(int hourOfDay, int minute) {
+ if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return;
+ mHourOfDay = hourOfDay;
+ mMinute = minute;
+ updateSummary();
+ }
+
+ private void updateSummary() {
+ final Calendar c = Calendar.getInstance();
+ c.set(Calendar.HOUR_OF_DAY, mHourOfDay);
+ c.set(Calendar.MINUTE, mMinute);
+ String time = DateFormat.getTimeFormat(mContext).format(c.getTime());
+ if (mSummaryFormat != 0) {
+ time = mContext.getResources().getString(mSummaryFormat, time);
+ }
+ setSummary(time);
+ }
+
+ public static class TimePickerFragment extends DialogFragment implements
+ TimePickerDialog.OnTimeSetListener {
+ public TimePickerPreference pref;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0;
+ final Calendar c = Calendar.getInstance();
+ final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY);
+ final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE);
+ return new TimePickerDialog(getActivity(), this, hour, minute,
+ DateFormat.is24HourFormat(getActivity()));
+ }
+
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ if (pref != null) {
+ pref.setTime(hourOfDay, minute);
+ }
+ }
+ }
+
+ public interface Callback {
+ boolean onSetTime(int hour, int minute);
+ }
+ }
+}
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 053d2ef12..47d1f5dce 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -16,61 +16,31 @@
package com.android.settings.notification;
-import static com.android.settings.notification.ZenModeDowntimeDaysSelection.DAYS;
-
import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.app.INotificationManager;
-import android.app.NotificationManager;
-import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
-import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Bundle;
-import android.os.ServiceManager;
import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.provider.Settings.Global;
-import android.service.notification.Condition;
-import android.service.notification.ZenModeConfig;
-import android.text.format.DateFormat;
-import android.util.Log;
import android.util.SparseArray;
import android.widget.ScrollView;
-import android.widget.TimePicker;
import com.android.internal.logging.MetricsLogger;
-import com.android.settings.DropDownPreference;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.List;
-import java.util.Objects;
public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
private static final String KEY_ZEN_MODE = "zen_mode";
private static final String KEY_PRIORITY_SETTINGS = "priority_settings";
- private static final String KEY_DOWNTIME = "downtime";
- private static final String KEY_DAYS = "days";
- private static final String KEY_START_TIME = "start_time";
- private static final String KEY_END_TIME = "end_time";
- private static final String KEY_DOWNTIME_MODE = "downtime_mode";
-
- private static final String KEY_AUTOMATION = "automation";
- private static final String KEY_ENTRY = "entry";
- private static final String KEY_CONDITION_PROVIDERS = "manage_condition_providers";
+ 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,
@@ -90,35 +60,17 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
}
};
- private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE");
+ private Preference mPrioritySettings;
+ private AlertDialog mDialog;
private static SparseArray<String> allKeyTitles(Context context) {
final SparseArray<String> rt = new SparseArray<String>();
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_downtime_category, KEY_DOWNTIME);
- rt.put(R.string.zen_mode_downtime_days, KEY_DAYS);
- rt.put(R.string.zen_mode_start_time, KEY_START_TIME);
- rt.put(R.string.zen_mode_end_time, KEY_END_TIME);
- rt.put(R.string.zen_mode_downtime_mode_title, KEY_DOWNTIME_MODE);
- rt.put(R.string.zen_mode_automation_category, KEY_AUTOMATION);
- rt.put(R.string.manage_condition_providers, KEY_CONDITION_PROVIDERS);
+ rt.put(R.string.zen_mode_automation_settings_title, KEY_AUTOMATION_SETTINGS);
return rt;
}
- private PackageManager mPM;
- private boolean mDisableListeners;
- private boolean mDowntimeSupported;
- private Preference mPrioritySettings;
- private Preference mDays;
- private TimePickerPreference mStart;
- private TimePickerPreference mEnd;
- private DropDownPreference mDowntimeMode;
- private PreferenceCategory mAutomationCategory;
- private Preference mEntry;
- private Preference mConditionProviders;
- private AlertDialog mDialog;
-
@Override
protected int getMetricsCategory() {
return MetricsLogger.NOTIFICATION_ZEN_MODE;
@@ -132,7 +84,6 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mPM = mContext.getPackageManager();
addPreferencesFromResource(R.xml.zen_mode_settings);
final PreferenceScreen root = getPreferenceScreen();
@@ -148,188 +99,15 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
});
mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS);
-
- final PreferenceCategory downtime = (PreferenceCategory) root.findPreference(KEY_DOWNTIME);
- mDowntimeSupported = isDowntimeSupported(mContext);
- if (!mDowntimeSupported) {
- removePreference(KEY_DOWNTIME);
- } else {
- mDays = downtime.findPreference(KEY_DAYS);
- mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- new AlertDialog.Builder(mContext)
- .setTitle(R.string.zen_mode_downtime_days)
- .setView(new ZenModeDowntimeDaysSelection(mContext, mConfig.sleepMode) {
- @Override
- protected void onChanged(String mode) {
- if (mDisableListeners) return;
- if (Objects.equals(mode, mConfig.sleepMode)) return;
- if (DEBUG) Log.d(TAG, "days.onChanged sleepMode=" + mode);
- final ZenModeConfig newConfig = mConfig.copy();
- newConfig.sleepMode = mode;
- setZenModeConfig(newConfig);
- }
- })
- .setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- updateDays();
- }
- })
- .setPositiveButton(R.string.done_button, null)
- .show();
- return true;
- }
- });
-
- final FragmentManager mgr = getFragmentManager();
-
- mStart = new TimePickerPreference(mContext, mgr);
- mStart.setKey(KEY_START_TIME);
- mStart.setTitle(R.string.zen_mode_start_time);
- mStart.setCallback(new TimePickerPreference.Callback() {
- @Override
- public boolean onSetTime(int hour, int minute) {
- if (mDisableListeners) return true;
- if (!ZenModeConfig.isValidHour(hour)) return false;
- if (!ZenModeConfig.isValidMinute(minute)) return false;
- if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) {
- return true;
- }
- if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute);
- final ZenModeConfig newConfig = mConfig.copy();
- newConfig.sleepStartHour = hour;
- newConfig.sleepStartMinute = minute;
- return setZenModeConfig(newConfig);
- }
- });
- downtime.addPreference(mStart);
- mStart.setDependency(mDays.getKey());
-
- mEnd = new TimePickerPreference(mContext, mgr);
- mEnd.setKey(KEY_END_TIME);
- mEnd.setTitle(R.string.zen_mode_end_time);
- mEnd.setCallback(new TimePickerPreference.Callback() {
- @Override
- public boolean onSetTime(int hour, int minute) {
- if (mDisableListeners) return true;
- if (!ZenModeConfig.isValidHour(hour)) return false;
- if (!ZenModeConfig.isValidMinute(minute)) return false;
- if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) {
- return true;
- }
- if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute);
- final ZenModeConfig newConfig = mConfig.copy();
- newConfig.sleepEndHour = hour;
- newConfig.sleepEndMinute = minute;
- return setZenModeConfig(newConfig);
- }
- });
- downtime.addPreference(mEnd);
- mEnd.setDependency(mDays.getKey());
-
- 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() {
- @Override
- public boolean onItemSelected(int pos, Object value) {
- if (mDisableListeners) return true;
- final boolean sleepNone = value instanceof Boolean ? ((Boolean) value) : false;
- if (mConfig == null || mConfig.sleepNone == sleepNone) return false;
- final ZenModeConfig newConfig = mConfig.copy();
- newConfig.sleepNone = sleepNone;
- if (DEBUG) Log.d(TAG, "onPrefChange sleepNone=" + sleepNone);
- return setZenModeConfig(newConfig);
- }
- });
- mDowntimeMode.setOrder(10); // sort at the bottom of the category
- mDowntimeMode.setDependency(mDays.getKey());
+ if (!isDowntimeSupported(mContext)) {
+ removePreference(KEY_AUTOMATION_SETTINGS);
}
- mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION);
- mEntry = findPreference(KEY_ENTRY);
- mEntry.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- new AlertDialog.Builder(mContext)
- .setTitle(R.string.zen_mode_entry_conditions_title)
- .setView(new ZenModeAutomaticConditionSelection(mContext))
- .setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- refreshAutomationSection();
- }
- })
- .setPositiveButton(R.string.dlg_ok, null)
- .show();
- return true;
- }
- });
- mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS);
-
updateControls();
}
- private void updateDays() {
- if (mConfig != null) {
- final int[] days = ZenModeConfig.tryParseDays(mConfig.sleepMode);
- if (days != null && days.length != 0) {
- final StringBuilder sb = new StringBuilder();
- final Calendar c = Calendar.getInstance();
- for (int i = 0; i < DAYS.length; i++) {
- final int day = DAYS[i];
- for (int j = 0; j < days.length; j++) {
- if (day == days[j]) {
- c.set(Calendar.DAY_OF_WEEK, day);
- if (sb.length() > 0) {
- sb.append(mContext.getString(R.string.summary_divider_text));
- }
- sb.append(DAY_FORMAT.format(c.getTime()));
- break;
- }
- }
- }
- if (sb.length() > 0) {
- mDays.setSummary(sb);
- mDays.notifyDependencyChange(false);
- return;
- }
- }
- }
- mDays.setSummary(R.string.zen_mode_downtime_days_none);
- mDays.notifyDependencyChange(true);
- }
-
- private void updateEndSummary() {
- if (!mDowntimeSupported) return;
- final int startMin = 60 * mConfig.sleepStartHour + mConfig.sleepStartMinute;
- final int endMin = 60 * mConfig.sleepEndHour + mConfig.sleepEndMinute;
- final boolean nextDay = startMin >= endMin;
- final int summaryFormat;
- if (mConfig.sleepNone) {
- summaryFormat = nextDay ? R.string.zen_mode_end_time_none_next_day_summary_format
- : R.string.zen_mode_end_time_none_same_day_summary_format;
- } else {
- summaryFormat = nextDay ? R.string.zen_mode_end_time_priority_next_day_summary_format
- : 0;
- }
- mEnd.setSummaryFormat(summaryFormat);
- }
-
@Override
protected void updateControls() {
- mDisableListeners = true;
- if (mDowntimeSupported) {
- updateDays();
- mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute);
- mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute);
- mDowntimeMode.setSelectedValue(mConfig.sleepNone);
- }
- mDisableListeners = false;
- refreshAutomationSection();
- updateEndSummary();
updatePrioritySettingsSummary();
}
@@ -350,56 +128,6 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
return s;
}
- private void refreshAutomationSection() {
- if (mConditionProviders != null) {
- final int total = ConditionProviderSettings.getProviderCount(mPM);
- if (total == 0) {
- getPreferenceScreen().removePreference(mAutomationCategory);
- } else {
- final int n = ConditionProviderSettings.getEnabledProviderCount(mContext);
- if (n == 0) {
- mConditionProviders.setSummary(getResources().getString(
- R.string.manage_condition_providers_summary_zero));
- } else {
- mConditionProviders.setSummary(String.format(getResources().getQuantityString(
- R.plurals.manage_condition_providers_summary_nonzero,
- n, n)));
- }
- final String entrySummary = getEntryConditionSummary();
- if (n == 0 || entrySummary == null) {
- mEntry.setSummary(R.string.zen_mode_entry_conditions_summary_none);
- } else {
- mEntry.setSummary(entrySummary);
- }
- }
- }
- }
-
- private String getEntryConditionSummary() {
- final INotificationManager nm = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- try {
- final Condition[] automatic = nm.getAutomaticZenModeConditions();
- if (automatic == null || automatic.length == 0) {
- return null;
- }
- final String divider = getString(R.string.summary_divider_text);
- final StringBuilder sb = new StringBuilder();
- for (int i = 0; i < automatic.length; i++) {
- if (i > 0) sb.append(divider);
- sb.append(automatic[i].summary);
- }
- return sb.toString();
- } catch (Exception e) {
- Log.w(TAG, "Error calling getAutomaticZenModeConditions", e);
- return null;
- }
- }
-
- protected void putZenModeSetting(int value) {
- Global.putInt(getContentResolver(), Global.ZEN_MODE, value);
- }
-
protected void showConditionSelection(final int newSettingsValue) {
if (mDialog != null) return;
@@ -440,11 +168,6 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
mDialog = null;
}
- private static boolean isDowntimeSupported(Context context) {
- return NotificationManager.from(context)
- .isSystemConditionProviderEnabled(ZenModeConfig.DOWNTIME_PATH);
- }
-
// Enable indexing of searchable data
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@@ -469,11 +192,7 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
public List<String> getNonIndexableKeys(Context context) {
final ArrayList<String> rt = new ArrayList<String>();
if (!isDowntimeSupported(context)) {
- rt.add(KEY_DOWNTIME);
- rt.add(KEY_DAYS);
- rt.add(KEY_START_TIME);
- rt.add(KEY_END_TIME);
- rt.add(KEY_DOWNTIME_MODE);
+ rt.add(KEY_AUTOMATION_SETTINGS);
}
return rt;
}
@@ -532,80 +251,4 @@ public class ZenModeSettings extends ZenModeSettingsBase implements Indexable {
void onSettingSelected(int value);
}
}
-
- private static class TimePickerPreference extends Preference {
- private final Context mContext;
-
- private int mSummaryFormat;
- private int mHourOfDay;
- private int mMinute;
- private Callback mCallback;
-
- public TimePickerPreference(Context context, final FragmentManager mgr) {
- super(context);
- mContext = context;
- setPersistent(false);
- setOnPreferenceClickListener(new OnPreferenceClickListener(){
- @Override
- public boolean onPreferenceClick(Preference preference) {
- final TimePickerFragment frag = new TimePickerFragment();
- frag.pref = TimePickerPreference.this;
- frag.show(mgr, TimePickerPreference.class.getName());
- return true;
- }
- });
- }
-
- public void setCallback(Callback callback) {
- mCallback = callback;
- }
-
- public void setSummaryFormat(int resId) {
- mSummaryFormat = resId;
- updateSummary();
- }
-
- public void setTime(int hourOfDay, int minute) {
- if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return;
- mHourOfDay = hourOfDay;
- mMinute = minute;
- updateSummary();
- }
-
- private void updateSummary() {
- final Calendar c = Calendar.getInstance();
- c.set(Calendar.HOUR_OF_DAY, mHourOfDay);
- c.set(Calendar.MINUTE, mMinute);
- String time = DateFormat.getTimeFormat(mContext).format(c.getTime());
- if (mSummaryFormat != 0) {
- time = mContext.getResources().getString(mSummaryFormat, time);
- }
- setSummary(time);
- }
-
- public static class TimePickerFragment extends DialogFragment implements
- TimePickerDialog.OnTimeSetListener {
- public TimePickerPreference pref;
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0;
- final Calendar c = Calendar.getInstance();
- final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY);
- final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE);
- return new TimePickerDialog(getActivity(), this, hour, minute,
- DateFormat.is24HourFormat(getActivity()));
- }
-
- public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
- if (pref != null) {
- pref.setTime(hourOfDay, minute);
- }
- }
- }
-
- public interface Callback {
- boolean onSetTime(int hour, int minute);
- }
- }
}
diff --git a/src/com/android/settings/notification/ZenModeSettingsBase.java b/src/com/android/settings/notification/ZenModeSettingsBase.java
index d4369650e..ec17d869d 100644
--- a/src/com/android/settings/notification/ZenModeSettingsBase.java
+++ b/src/com/android/settings/notification/ZenModeSettingsBase.java
@@ -17,6 +17,7 @@
package com.android.settings.notification;
import android.app.INotificationManager;
+import android.app.NotificationManager;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
@@ -83,6 +84,11 @@ abstract public class ZenModeSettingsBase extends SettingsPreferenceFragment {
}
}
+ 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;
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index e4e5d129a..f37e1fcf9 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -42,6 +42,7 @@ import com.android.settings.location.ScanningSettings;
import com.android.settings.net.DataUsageMeteredSettings;
import com.android.settings.notification.NotificationSettings;
import com.android.settings.notification.OtherSoundSettings;
+import com.android.settings.notification.ZenModeAutomationSettings;
import com.android.settings.notification.ZenModePrioritySettings;
import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
@@ -125,6 +126,7 @@ public final class Ranking {
sRankMap.put(OtherSoundSettings.class.getName(), RANK_NOTIFICATIONS);
sRankMap.put(ZenModeSettings.class.getName(), RANK_NOTIFICATIONS);
sRankMap.put(ZenModePrioritySettings.class.getName(), RANK_NOTIFICATIONS);
+ sRankMap.put(ZenModeAutomationSettings.class.getName(), RANK_NOTIFICATIONS);
// Storage
sRankMap.put(Memory.class.getName(), RANK_STORAGE);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index d57a1f149..75d7d62c2 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -43,6 +43,7 @@ import com.android.settings.location.ScanningSettings;
import com.android.settings.net.DataUsageMeteredSettings;
import com.android.settings.notification.NotificationSettings;
import com.android.settings.notification.OtherSoundSettings;
+import com.android.settings.notification.ZenModeAutomationSettings;
import com.android.settings.notification.ZenModePrioritySettings;
import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
@@ -170,6 +171,13 @@ public final class SearchIndexableResources {
ZenModePrioritySettings.class.getName(),
R.drawable.ic_settings_notifications));
+ sResMap.put(ZenModeAutomationSettings.class.getName(),
+ new SearchIndexableResource(
+ Ranking.getRankForClassName(ZenModeAutomationSettings.class.getName()),
+ NO_DATA_RES_ID,
+ ZenModeAutomationSettings.class.getName(),
+ R.drawable.ic_settings_notifications));
+
sResMap.put(Memory.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(Memory.class.getName()),