From: Beverly Date: Mon, 26 Feb 2018 14:19:41 +0000 (-0500) Subject: Adding zen duration preference X-Git-Tag: android-x86-9.0-r1~76^2~2^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3f3c8acce75e6cfdd4131930a51a229253ebaecb;p=android-x86%2Fpackages-apps-Settings.git Adding zen duration preference Test: make ROBOTEST_FILTER=ZenModeDurationPreferenceControllerTest RunSettingsRoboTests -j40 Bug: 73741459 Change-Id: I55a75897045ef059dc872bf6403a62f46cedc417 --- diff --git a/res/values/strings.xml b/res/values/strings.xml index ab8c011123..c84853f8b4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6917,6 +6917,9 @@ Exceptions + + Duration + Allow sounds and vibrations from @@ -7038,6 +7041,21 @@ On + + Ask every time (unless turned on automatically) + + + Until you turn off (unless turned on automatically) + + + + 1 hour (unless turned on automatically) + %d hours (unless turned on automatically) + + + + %d minutes (unless turned on automatically) + 1 rule can turn on automatically diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml index 1f863c20b1..65fb7ab94a 100644 --- a/res/xml/zen_mode_settings.xml +++ b/res/xml/zen_mode_settings.xml @@ -31,6 +31,11 @@ android:title="@string/zen_mode_behavior_settings_title" android:fragment="com.android.settings.notification.ZenModeBehaviorSettings" /> + + + - new SettingsEnableZenModeDialog().show(mFragment, TAG)); + updateZenButtonOnClickListener(); } if (null == mZenButtonOff) { @@ -89,7 +88,34 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference case Settings.Global.ZEN_MODE_OFF: default: mZenButtonOff.setVisibility(View.GONE); + updateZenButtonOnClickListener(); mZenButtonOn.setVisibility(View.VISIBLE); } } + + private void updateZenButtonOnClickListener() { + int zenDuration = getZenDuration(); + switch (zenDuration) { + case Settings.Global.ZEN_DURATION_PROMPT: + mZenButtonOn.setOnClickListener(v -> { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_ZEN_TOGGLE_DND_BUTTON, false); + new SettingsEnableZenModeDialog().show(mFragment, TAG); + }); + break; + case Settings.Global.ZEN_DURATION_FOREVER: + mZenButtonOn.setOnClickListener(v -> { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_ZEN_TOGGLE_DND_BUTTON, false); + mBackend.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + }); + break; + default: + mZenButtonOn.setOnClickListener(v -> { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_ZEN_TOGGLE_DND_BUTTON, false); + mBackend.setZenModeForDuration(zenDuration); + }); + } + } } \ No newline at end of file diff --git a/src/com/android/settings/notification/ZenModeDurationPreferenceController.java b/src/com/android/settings/notification/ZenModeDurationPreferenceController.java new file mode 100644 index 0000000000..0cd0eb3d1b --- /dev/null +++ b/src/com/android/settings/notification/ZenModeDurationPreferenceController.java @@ -0,0 +1,86 @@ +/* + * 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.FragmentManager; +import android.content.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.core.lifecycle.Lifecycle; + +public class ZenModeDurationPreferenceController extends AbstractZenModePreferenceController + implements PreferenceControllerMixin, Preference.OnPreferenceClickListener { + + private static final String TAG = "ZenModeDurationDialog"; + protected static final String KEY = "zen_mode_duration_settings"; + private FragmentManager mFragment; + + public ZenModeDurationPreferenceController(Context context, Lifecycle lifecycle, FragmentManager + fragment) { + super(context, KEY, lifecycle); + mFragment = fragment; + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public String getPreferenceKey() { + return KEY; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + screen.findPreference(KEY).setOnPreferenceClickListener(this); + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + + String summary = ""; + int zenDuration = getZenDuration(); + if (zenDuration < 0) { + summary = mContext.getString(R.string.zen_mode_duration_summary_always_prompt); + } else if (zenDuration == 0) { + summary = mContext.getString(R.string.zen_mode_duration_summary_forever); + } else { + if (zenDuration >= 60) { + int hours = zenDuration / 60; + summary = mContext.getResources().getQuantityString( + R.plurals.zen_mode_duration_summary_time_hours, hours, hours); + } else { + summary = mContext.getResources().getString( + R.string.zen_mode_duration_summary_time_minutes, zenDuration); + } + } + + preference.setSummary(summary); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + new SettingsZenDurationDialog().show(mFragment, TAG); + return true; + } +} \ No newline at end of file diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 557d624896..b143b42449 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -65,6 +65,8 @@ public class ZenModeSettings extends ZenModeSettingsBase { List controllers = new ArrayList<>(); controllers.add(new ZenModeBehaviorPreferenceController(context, lifecycle)); controllers.add(new ZenModeBlockedEffectsPreferenceController(context, lifecycle)); + controllers.add(new ZenModeDurationPreferenceController(context, lifecycle, + fragmentManager)); controllers.add(new ZenModeAutomationPreferenceController(context)); controllers.add(new ZenModeButtonPreferenceController(context, lifecycle, fragmentManager)); controllers.add(new ZenModeSettingsFooterPreferenceController(context, lifecycle)); @@ -250,6 +252,7 @@ public class ZenModeSettings extends ZenModeSettingsBase { @Override public List getNonIndexableKeys(Context context) { List keys = super.getNonIndexableKeys(context); + keys.add(ZenModeDurationPreferenceController.KEY); keys.add(ZenModeButtonPreferenceController.KEY); return keys; } diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java new file mode 100644 index 0000000000..9a94e6c18a --- /dev/null +++ b/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java @@ -0,0 +1,111 @@ +/* + * 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 static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.FragmentManager; +import android.app.NotificationManager; +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowApplication; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +public class ZenModeDurationPreferenceControllerTest { + private ZenModeDurationPreferenceController mController; + + @Mock + private ZenModeBackend mBackend; + @Mock + private NotificationManager mNotificationManager; + @Mock + private Preference mockPref; + @Mock + private NotificationManager.Policy mPolicy; + @Mock + private PreferenceScreen mPreferenceScreen; + private ContentResolver mContentResolver; + private Context mContext; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + ShadowApplication shadowApplication = ShadowApplication.getInstance(); + shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager); + + mContext = shadowApplication.getApplicationContext(); + mContentResolver = RuntimeEnvironment.application.getContentResolver(); + mController = new ZenModeDurationPreferenceController(mContext, mock(Lifecycle.class), + mock(FragmentManager.class)); + when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy); + ReflectionHelpers.setField(mController, "mBackend", mBackend); + when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn( + mockPref); + mController.displayPreference(mPreferenceScreen); + } + + @Test + public void updateState_DurationForever() { + Settings.Global.putInt(mContentResolver, Settings.Global.ZEN_DURATION, + Settings.Global.ZEN_DURATION_FOREVER); + final Preference mockPref = mock(Preference.class); + mController.updateState(mockPref); + + verify(mockPref).setSummary(mContext.getString(R.string.zen_mode_duration_summary_forever)); + } + + @Test + public void updateState_DurationPrompt() { + Settings.Global.putInt(mContentResolver, Settings.Global.ZEN_DURATION, + Settings.Global.ZEN_DURATION_PROMPT); + final Preference mockPref = mock(Preference.class); + mController.updateState(mockPref); + + verify(mockPref).setSummary(mContext.getString( + R.string.zen_mode_duration_summary_always_prompt)); + } + + @Test + public void updateState_DurationCustom() { + int zenDuration = 45; + Settings.Global.putInt(mContentResolver, Settings.Global.ZEN_DURATION, + zenDuration); + final Preference mockPref = mock(Preference.class); + mController.updateState(mockPref); + + verify(mockPref).setSummary(mContext.getResources().getString( + R.string.zen_mode_duration_summary_time_minutes, zenDuration)); + } +} \ No newline at end of file