diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index cd3134b87eb..98d93a0cb4e 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1511,20 +1511,6 @@
- fr
-
-
- - @string/notification_polite_all_apps
- - @string/notification_polite_conversations
- - @string/notification_polite_disabled
-
-
-
-
- - 0
- - 1
- - 2
-
-
- @string/private_space_auto_lock_every_time
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0cf6ab11def..0666d430b8f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8683,14 +8683,6 @@
Cooldown
Use Cooldown
When you get many notifications within a short time span, your device will minimize sound interruptions and pop-ups on the screen. Calls, alarms, and priority conversations will still alert as notmal, and all delivered notifications are easy to find in the Shade.
- Apply cooldown to all notifications
- Gradually lower the notification volume when you get many successive notifications from the same app
- Apply cooldown to conversations
- Gradually lower the notification volume when you get many messages from the same chat within a short period of time
- Don\'t use notification cooldown
- Never lower notification volume, regardless of the amount of successive notifications from the same app
- Vibrate when unlocked
- Only vibrate when screen is unlocked
Apply to work profiles
Apply to work profile apps
diff --git a/res/xml/polite_notifications_settings.xml b/res/xml/polite_notifications_settings.xml
index a854a714e81..3baf88f6085 100644
--- a/res/xml/polite_notifications_settings.xml
+++ b/res/xml/polite_notifications_settings.xml
@@ -17,24 +17,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleController.java b/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleController.java
deleted file mode 100644
index dfdd64976b1..00000000000
--- a/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleController.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2023 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.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-
-import android.content.Context;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.server.notification.Flags;
-import com.android.settings.R;
-import com.android.settings.core.TogglePreferenceController;
-
-/**
- * Controls the toggle that determines whether notifications
- * should only vibrate (no sound) when the device is unlocked.
- */
-public class PoliteNotifVibrateUnlockedToggleController extends TogglePreferenceController {
-
- public PoliteNotifVibrateUnlockedToggleController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- }
-
- @Override
- public int getAvailabilityStatus() {
- // TODO: b/291897570 - remove this when the feature flag is removed!
- if (!Flags.politeNotifications() || !Flags.vibrateWhileUnlocked()) {
- return CONDITIONALLY_UNAVAILABLE;
- }
- return mContext.getSystemService(Vibrator.class).hasVibrator() ? AVAILABLE
- : UNSUPPORTED_ON_DEVICE;
- }
-
- @Override
- public boolean isChecked() {
- return Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, OFF) != OFF;
- }
-
- @Override
- public boolean setChecked(boolean isChecked) {
- return Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, (isChecked ? ON : OFF));
- }
-
- @Override
- public int getSliceHighlightMenuRes() {
- return R.string.menu_key_accessibility;
- }
-}
diff --git a/src/com/android/settings/notification/PoliteNotificationFilterController.java b/src/com/android/settings/notification/PoliteNotificationFilterController.java
deleted file mode 100644
index 8093f55acd5..00000000000
--- a/src/com/android/settings/notification/PoliteNotificationFilterController.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2023 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.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.util.Log;
-
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-
-import com.android.server.notification.Flags;
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.core.PreferenceControllerMixin;
-
-
-/**
- * Controls whether polite notifications are enabled and apply to all apps or just to conversations.
- */
-public class PoliteNotificationFilterController extends BasePreferenceController
- implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
- static final String TAG = "PoliteNotificationFilterController";
-
- private static final int POLITE_NOTIFICATIONS_ALL = 0;
- private static final int POLITE_NOTIFICATIONS_CONVERSATIONS = 1;
- private static final int POLITE_NOTIFICATIONS_DISABLED = 2;
-
- public PoliteNotificationFilterController(Context context, String key) {
- super(context, key);
- }
-
- @Override
- public int getAvailabilityStatus() {
- // TODO: b/291897570 - remove this when the feature flag is removed!
- return Flags.politeNotifications() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
- }
-
- @Override
- public void updateState(Preference preference) {
- super.updateState(preference);
- final ListPreference pref = (ListPreference) preference;
-
- if (isPoliteNotifDisabled()) {
- pref.setValue(Integer.toString(POLITE_NOTIFICATIONS_DISABLED));
- } else if (shouldApplyForAllApps()) {
- pref.setValue(Integer.toString(POLITE_NOTIFICATIONS_ALL));
- } else {
- pref.setValue(Integer.toString(POLITE_NOTIFICATIONS_CONVERSATIONS));
- }
- }
-
- @Override
- public CharSequence getSummary() {
- if (isPoliteNotifDisabled()) {
- return mContext.getString(R.string.notification_polite_disabled_summary);
- }
- if (shouldApplyForAllApps()) {
- return mContext.getString(R.string.notification_polite_all_apps_summary);
- } else {
- return mContext.getString(R.string.notification_polite_conversations_summary);
- }
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final int prefValue = Integer.parseInt((String) newValue);
- if (prefValue == POLITE_NOTIFICATIONS_ALL) {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, ON);
- } else if (prefValue == POLITE_NOTIFICATIONS_CONVERSATIONS) {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, OFF);
- } else if (prefValue == POLITE_NOTIFICATIONS_DISABLED) {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF);
- } else {
- Log.e(TAG, "Unexpected preference value: " + prefValue);
- }
- refreshSummary(preference);
- return true;
- }
-
- private boolean isPoliteNotifDisabled() {
- return Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON) == OFF;
- }
-
- private boolean shouldApplyForAllApps() {
- return Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, ON) != OFF;
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleControllerTest.java b/tests/robotests/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleControllerTest.java
deleted file mode 100644
index 4d546ec2b40..00000000000
--- a/tests/robotests/src/com/android/settings/notification/PoliteNotifVibrateUnlockedToggleControllerTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2023 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.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.Vibrator;
-import android.platform.test.flag.junit.SetFlagsRule;
-import android.provider.Settings;
-
-import com.android.server.notification.Flags;
-import com.android.settings.core.BasePreferenceController;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class PoliteNotifVibrateUnlockedToggleControllerTest {
-
- @Rule
- public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
-
- private static final String PREFERENCE_KEY = "preference_key";
-
- private PoliteNotifVibrateUnlockedToggleController mController;
- private Context mContext;
- @Mock
- private Vibrator mVibrator;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mController = new PoliteNotifVibrateUnlockedToggleController(mContext, PREFERENCE_KEY);
- when(mContext.getSystemService(Vibrator.class)).thenReturn(mVibrator);
- }
-
- @Test
- public void isAvailable_flagEnabled_vibrationSupported_shouldReturnTrue() {
- // TODO: b/291907312 - remove feature flags
- mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
- mSetFlagsRule.enableFlags(Flags.FLAG_VIBRATE_WHILE_UNLOCKED);
- when(mVibrator.hasVibrator()).thenReturn(true);
- assertThat(mController.isAvailable()).isTrue();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void isAvailable_flagEnabled_vibrationNotSupported_shouldReturnFalse() {
- // TODO: b/291907312 - remove feature flags
- mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
- mSetFlagsRule.enableFlags(Flags.FLAG_VIBRATE_WHILE_UNLOCKED);
- when(mVibrator.hasVibrator()).thenReturn(false);
- assertThat(mController.isAvailable()).isFalse();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void isAvailable_flagDisabled_shouldReturnFalse() {
- // TODO: b/291907312 - remove feature flags
- mSetFlagsRule.disableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
- mSetFlagsRule.enableFlags(Flags.FLAG_VIBRATE_WHILE_UNLOCKED);
- assertThat(mController.isAvailable()).isFalse();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void isChecked_vibrateEnabled_shouldReturnTrue() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, ON);
- assertThat(mController.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_vibrateDisabled_shouldReturnFalse() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, OFF);
- assertThat(mController.isChecked()).isFalse();
- }
-
- @Test
- public void setChecked_setTrue_shouldEnableVibrateSetting() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, OFF);
- mController.setChecked(true);
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, OFF)).isEqualTo(ON);
- }
-
- @Test
- public void setChecked_setFalse_shouldDisableVibrateSetting() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, ON);
- mController.setChecked(false);
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_VIBRATE_UNLOCKED, ON)).isEqualTo(OFF);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/PoliteNotificationFilterControllerTest.java b/tests/robotests/src/com/android/settings/notification/PoliteNotificationFilterControllerTest.java
deleted file mode 100644
index 646e927c02f..00000000000
--- a/tests/robotests/src/com/android/settings/notification/PoliteNotificationFilterControllerTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2023 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.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.platform.test.flag.junit.SetFlagsRule;
-import android.provider.Settings;
-
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.server.notification.Flags;
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class PoliteNotificationFilterControllerTest {
- @Rule
- public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
-
- private static final String PREFERENCE_KEY = "preference_key";
- private static final int POLITE_NOTIFICATIONS_ALL = 0;
- private static final int POLITE_NOTIFICATIONS_CONVERSATIONS = 1;
- private static final int POLITE_NOTIFICATIONS_DISABLED = 2;
-
- @Mock
- private PreferenceScreen mScreen;
-
- private PoliteNotificationFilterController mController;
- private Preference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
-
- mController = new PoliteNotificationFilterController(mContext, PREFERENCE_KEY);
- mPreference = new Preference(mContext);
- mPreference.setKey(mController.getPreferenceKey());
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
- }
-
- @Test
- public void isAvailable_flagEnabled_shouldReturnTrue() {
- // TODO: b/291907312 - remove feature flags
- mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
- assertThat(mController.isAvailable()).isTrue();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void isAvailable_flagDisabled_shouldReturnFalse() {
- // TODO: b/291907312 - remove feature flags
- mSetFlagsRule.disableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
- assertThat(mController.isAvailable()).isFalse();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void updateState_politeNotificationDisabled() {
- final ListPreference preference = mock(ListPreference.class);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF);
- mController.updateState(preference);
-
- verify(preference).setValue(Integer.toString(POLITE_NOTIFICATIONS_DISABLED));
- assertThat(mController.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.notification_polite_disabled_summary));
- }
-
- @Test
- public void updateState_politeNotificationEnabled_applyAllApps() {
- final ListPreference preference = mock(ListPreference.class);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, ON);
- mController.updateState(preference);
-
- verify(preference).setValue(Integer.toString(POLITE_NOTIFICATIONS_ALL));
- assertThat(mController.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.notification_polite_all_apps_summary));
- }
-
- @Test
- public void updateState_politeNotificationEnabled_applyOnlyConversations() {
- final ListPreference preference = mock(ListPreference.class);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON);
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, OFF);
- mController.updateState(preference);
-
- verify(preference).setValue(Integer.toString(POLITE_NOTIFICATIONS_CONVERSATIONS));
- assertThat(mController.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.notification_polite_conversations_summary));
- }
-
- @Test
- public void onPreferenceChanged_firstItemSelected_shouldEnableForAll() {
- mController.displayPreference(mScreen);
- mController.onPreferenceChange(mPreference, "0");
-
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF)).isEqualTo(ON);
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, OFF)).isEqualTo(ON);
- }
-
- @Test
- public void onPreferenceChanged_secondItemSelected_shouldEnableForConversationsOnly() {
- mController.displayPreference(mScreen);
- mController.onPreferenceChange(mPreference, "1");
-
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF)).isEqualTo(ON);
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ALL, OFF)).isEqualTo(OFF);
- }
-
- @Test
- public void onPreferenceChanged_thirdItemSelected_shouldDisable() {
- mController.displayPreference(mScreen);
- mController.onPreferenceChange(mPreference, "2");
-
- assertThat(Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF)).isEqualTo(OFF);
- }
-
-}