diff options
Diffstat (limited to 'src/com/android/settings/notification/ZenModeAutomationSettings.java')
-rw-r--r-- | src/com/android/settings/notification/ZenModeAutomationSettings.java | 456 |
1 files changed, 64 insertions, 392 deletions
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java index 378643e..09de7d1 100644 --- a/src/com/android/settings/notification/ZenModeAutomationSettings.java +++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java @@ -16,248 +16,76 @@ 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.content.Intent; 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.provider.Settings.Global; import android.service.notification.ZenModeConfig; -import android.text.format.DateFormat; +import android.service.notification.ZenModeConfig.ScheduleInfo; +import android.service.notification.ZenModeConfig.ZenRule; import android.util.Log; -import android.util.SparseArray; -import android.widget.TimePicker; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; 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; +public class ZenModeAutomationSettings extends ZenModeSettingsBase { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - mPM = mContext.getPackageManager(); + + setHasOptionsMenu(true); addPreferencesFromResource(R.xml.zen_mode_automation_settings); - final PreferenceScreen root = getPreferenceScreen(); + } - onCreateDowntimeSettings(root); + private void showRule(String ruleId, String ruleName) { + if (DEBUG) Log.d(TAG, "showRule " + ruleId + " name=" + ruleName); + mContext.startActivity(new Intent(ZenModeScheduleRuleSettings.ACTION) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + .putExtra(ZenModeScheduleRuleSettings.EXTRA_RULE_ID, ruleId)); + } - 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); + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.zen_mode_automation, menu); } - private void onCreateDowntimeSettings(PreferenceScreen root) { - mDowntimeSupported = isDowntimeSupported(mContext); - if (!mDowntimeSupported) { - removePreference(KEY_DOWNTIME); - return; + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.add) { + showAddRuleDialog(); + return true; } - final PreferenceCategory downtime = (PreferenceCategory) findPreference(KEY_DOWNTIME); - 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()); + return super.onOptionsItemSelected(item); + } - 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() { + private void showAddRuleDialog() { + new ZenRuleNameDialog(mContext, "", mConfig.getAutomaticRuleNames()) { @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; + public void onOk(String ruleName) { + final ScheduleInfo schedule = new ScheduleInfo(); + schedule.days = ZenModeConfig.ALL_DAYS; + schedule.startHour = 22; + schedule.endHour = 7; + final ZenRule rule = new ZenRule(); + rule.name = ruleName; + rule.enabled = true; + rule.zenMode = Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + rule.conditionId = ZenModeConfig.toScheduleConditionId(schedule); 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; + final String ruleId = newConfig.newRuleId(); + newConfig.automaticRules.put(ruleId, rule); + if (setZenModeConfig(newConfig)) { + showRule(ruleId, rule.name); } } - } - 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); + }.show(); } @Override @@ -277,188 +105,32 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase implements In } private 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(){ + final PreferenceScreen root = getPreferenceScreen(); + root.removeAll(); + + if (mConfig == null) return; + for (int i = 0; i < mConfig.automaticRules.size(); i++) { + final String id = mConfig.automaticRules.keyAt(i); + final ZenRule rule = mConfig.automaticRules.valueAt(i); + if (!ZenModeConfig.isValidScheduleConditionId(rule.conditionId)) continue; + final Preference p = new Preference(mContext); + p.setTitle(rule.name); + p.setSummary(rule.enabled ? R.string.switch_on_text : R.string.switch_off_text); + p.setPersistent(false); + p.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - final TimePickerFragment frag = new TimePickerFragment(); - frag.pref = TimePickerPreference.this; - frag.show(mgr, TimePickerPreference.class.getName()); + showRule(id, rule.name); return true; } }); + root.addPreference(p); } + } - 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); - } + @Override + protected int getMetricsCategory() { + return MetricsLogger.NOTIFICATION_ZEN_MODE_AUTOMATION; } + } |