diff --git a/res/values/strings.xml b/res/values/strings.xml index 44d43c3b9c5..e2a5857cf11 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7123,6 +7123,9 @@ Delete + + Edit + Schedules @@ -7893,7 +7896,7 @@ %d others - + Allow text messages diff --git a/res/xml/zen_mode_event_rule_settings.xml b/res/xml/zen_mode_event_rule_settings.xml index c871fe16dc0..a70b46ce30f 100644 --- a/res/xml/zen_mode_event_rule_settings.xml +++ b/res/xml/zen_mode_event_rule_settings.xml @@ -17,12 +17,17 @@ + android:layout="@layout/settings_entity_header" + settings:allowDividerBelow="true" /> + + + android:layout="@layout/settings_entity_header" + settings:allowDividerBelow="true"/> + + createPreferenceControllers(Context context) { ZenServiceListing serviceListing = new ZenServiceListing(getContext(), CONFIG); diff --git a/src/com/android/settings/notification/ZenModeEventRuleSettings.java b/src/com/android/settings/notification/ZenModeEventRuleSettings.java index c11a6727b32..ee3ed1cbc40 100644 --- a/src/com/android/settings/notification/ZenModeEventRuleSettings.java +++ b/src/com/android/settings/notification/ZenModeEventRuleSettings.java @@ -27,6 +27,11 @@ import android.provider.Settings; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.EventInfo; +import androidx.preference.DropDownPreference; +import androidx.preference.Preference; +import androidx.preference.Preference.OnPreferenceChangeListener; +import androidx.preference.PreferenceScreen; + import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; @@ -38,11 +43,6 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; -import androidx.preference.DropDownPreference; -import androidx.preference.Preference; -import androidx.preference.Preference.OnPreferenceChangeListener; -import androidx.preference.PreferenceScreen; - public class ZenModeEventRuleSettings extends ZenModeRuleSettingsBase { private static final String KEY_CALENDAR = "calendar"; private static final String KEY_REPLY = "reply"; @@ -85,9 +85,12 @@ public class ZenModeEventRuleSettings extends ZenModeRuleSettingsBase { List controllers = new ArrayList<>(); mHeader = new ZenAutomaticRuleHeaderPreferenceController(context, this, getSettingsLifecycle()); + mActionButtons = new ZenRuleButtonsPreferenceController(context, this, + getSettingsLifecycle()); mSwitch = new ZenAutomaticRuleSwitchPreferenceController(context, this, getSettingsLifecycle()); controllers.add(mHeader); + controllers.add(mActionButtons); controllers.add(mSwitch); return controllers; } @@ -107,8 +110,16 @@ public class ZenModeEventRuleSettings extends ZenModeRuleSettingsBase { mEvent.calendarId = calendar.calendarId; } } - mCalendar.setEntries(entries.toArray(new CharSequence[entries.size()])); - mCalendar.setEntryValues(values.toArray(new CharSequence[values.size()])); + + CharSequence[] entriesArr = entries.toArray(new CharSequence[entries.size()]); + CharSequence[] valuesArr = values.toArray(new CharSequence[values.size()]); + if (!Objects.equals(mCalendar.getEntries(), entriesArr)) { + mCalendar.setEntries(entriesArr); + } + + if (!Objects.equals(mCalendar.getEntryValues(), valuesArr)) { + mCalendar.setEntryValues(valuesArr); + } } @Override @@ -159,8 +170,12 @@ public class ZenModeEventRuleSettings extends ZenModeRuleSettingsBase { @Override protected void updateControlsInternal() { - mCalendar.setValue(key(mEvent)); - mReply.setValue(Integer.toString(mEvent.reply)); + if (!Objects.equals(mCalendar.getValue(), key(mEvent))) { + mCalendar.setValue(key(mEvent)); + } + if (!Objects.equals(mReply.getValue(), Integer.toString(mEvent.reply))) { + mReply.setValue(Integer.toString(mEvent.reply)); + } } @Override @@ -233,7 +248,7 @@ public class ZenModeEventRuleSettings extends ZenModeRuleSettingsBase { private static String key(int userId, Long calendarId, String displayName) { return EventInfo.resolveUserId(userId) + ":" + (calendarId == null ? "" : calendarId) - + ":" + displayName; + + ":" + (displayName == null ? "" : displayName); } private static final Comparator CALENDAR_NAME = new Comparator() { diff --git a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java index 11b8084f73f..e573884181a 100644 --- a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java +++ b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java @@ -43,6 +43,7 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase { protected String mId; protected ZenAutomaticRuleHeaderPreferenceController mHeader; + protected ZenRuleButtonsPreferenceController mActionButtons; protected ZenAutomaticRuleSwitchPreferenceController mSwitch; abstract protected void onCreateInternal(); @@ -104,6 +105,10 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase { mHeader.onResume(mRule, mId); mHeader.displayPreference(screen); updatePreference(mHeader); + + mActionButtons.onResume(mRule, mId); + mActionButtons.displayPreference(screen); + updatePreference(mActionButtons); } private void updatePreference(AbstractPreferenceController controller) { @@ -147,7 +152,8 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase { private void toastAndFinish() { Toast.makeText(mContext, R.string.zen_mode_rule_not_found_text, Toast.LENGTH_SHORT) - .show(); + .show(); + getActivity().finish(); } diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java index 0b2e1bcc27d..8aa993f65cf 100644 --- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java +++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java @@ -199,10 +199,12 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase { List controllers = new ArrayList<>(); mHeader = new ZenAutomaticRuleHeaderPreferenceController(context, this, getSettingsLifecycle()); + mActionButtons = new ZenRuleButtonsPreferenceController(context, this, + getSettingsLifecycle()); mSwitch = new ZenAutomaticRuleSwitchPreferenceController(context, this, getSettingsLifecycle()); - controllers.add(mHeader); + controllers.add(mActionButtons); controllers.add(mSwitch); return controllers; } diff --git a/src/com/android/settings/notification/ZenModeSettingsBase.java b/src/com/android/settings/notification/ZenModeSettingsBase.java index 2aecae4cc0f..b9a14eec1ce 100644 --- a/src/com/android/settings/notification/ZenModeSettingsBase.java +++ b/src/com/android/settings/notification/ZenModeSettingsBase.java @@ -52,9 +52,14 @@ abstract public class ZenModeSettingsBase extends RestrictedDashboardFragment { } @Override - public void onCreate(Bundle icicle) { - mContext = getActivity(); + public void onAttach(Context context) { + super.onAttach(context); + mContext = context; mBackend = ZenModeBackend.getInstance(mContext); + } + + @Override + public void onCreate(Bundle icicle) { super.onCreate(icicle); updateZenMode(false /*fireChanged*/); } diff --git a/src/com/android/settings/notification/ZenRuleButtonsPreferenceController.java b/src/com/android/settings/notification/ZenRuleButtonsPreferenceController.java new file mode 100644 index 00000000000..1d43f6dde3e --- /dev/null +++ b/src/com/android/settings/notification/ZenRuleButtonsPreferenceController.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2018 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.app.AutomaticZenRule; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import androidx.fragment.app.Fragment; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceScreen; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.SubSettingLauncher; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.widget.ActionButtonsPreference; + +public class ZenRuleButtonsPreferenceController extends AbstractZenModePreferenceController + implements PreferenceControllerMixin { + public static final String KEY = "zen_action_buttons"; + + private AutomaticZenRule mRule; + private String mId; + private PreferenceFragmentCompat mFragment; + private ActionButtonsPreference mButtonsPref; + + + public ZenRuleButtonsPreferenceController(Context context, PreferenceFragmentCompat fragment, + Lifecycle lc) { + super(context, KEY, lc); + mFragment = fragment; + } + + + @Override + public boolean isAvailable() { + return mRule != null; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + if (isAvailable()) { + mButtonsPref = ((ActionButtonsPreference) screen.findPreference(KEY)) + .setButton1Text(R.string.zen_mode_rule_name_edit) + .setButton1Icon(R.drawable.ic_mode_edit) + .setButton1OnClickListener(new EditRuleNameClickListener()) + .setButton2Text(R.string.zen_mode_delete_rule_button) + .setButton2Icon(R.drawable.ic_settings_delete) + .setButton2OnClickListener(new DeleteRuleClickListener()); + } + } + + public class EditRuleNameClickListener implements View.OnClickListener { + public EditRuleNameClickListener() {} + + @Override + public void onClick(View v) { + ZenRuleNameDialog.show(mFragment, mRule.getName(), null, + new ZenRuleNameDialog.PositiveClickListener() { + @Override + public void onOk(String ruleName, Fragment parent) { + if (TextUtils.equals(ruleName, mRule.getName())) { + return; + } + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_ZEN_MODE_RULE_NAME_CHANGE_OK); + mRule.setName(ruleName); + mRule.setModified(true); + mBackend.updateZenRule(mId, mRule); + } + }); + } + } + + public class DeleteRuleClickListener implements View.OnClickListener { + public DeleteRuleClickListener() {} + + @Override + public void onClick(View v) { + ZenDeleteRuleDialog.show(mFragment, mRule.getName(), mId, + new ZenDeleteRuleDialog.PositiveClickListener() { + @Override + public void onOk(String id) { + Bundle bundle = new Bundle(); + bundle.putString(ZenModeAutomationSettings.DELETE, id); + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_ZEN_DELETE_RULE_OK); + new SubSettingLauncher(mContext) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + .setDestination(ZenModeAutomationSettings.class.getName()) + .setSourceMetricsCategory(MetricsProto.MetricsEvent + .NOTIFICATION_ZEN_MODE_AUTOMATION) + .setArguments(bundle) + .launch(); + } + }); + } + } + + protected void onResume(AutomaticZenRule rule, String id) { + mRule = rule; + mId = id; + } +}