diff --git a/res/values/strings.xml b/res/values/strings.xml index 4e6ea7ec824..e973d9acea8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7375,6 +7375,12 @@ When work profile is locked + + Show only new notifications on lock screen + + + After each unlock, remove existing notifications from the lock screen Notifications on lock screen diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml index 96a3f85a46a..27d5760992c 100644 --- a/res/xml/configure_notification_settings.xml +++ b/res/xml/configure_notification_settings.xml @@ -119,9 +119,16 @@ android:fragment="com.android.settings.notification.zen.ZenModeSettings" settings:controller="com.android.settings.notification.zen.ZenModePreferenceController" /> + diff --git a/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java b/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java new file mode 100644 index 00000000000..a37e29d2347 --- /dev/null +++ b/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java @@ -0,0 +1,71 @@ +/* + * 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 android.provider.Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS; + +import android.content.Context; +import android.provider.Settings; + +import androidx.annotation.VisibleForTesting; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; + +public class ShowOnlyUnseenNotificationsOnLockscreenPreferenceController + extends TogglePreferenceController { + + private static final int UNSET = 0; + @VisibleForTesting + static final int ON = 1; + @VisibleForTesting + static final int OFF = 2; + + public ShowOnlyUnseenNotificationsOnLockscreenPreferenceController( + Context context, + String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public boolean isChecked() { + return Settings.Secure.getInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, UNSET) == ON; + } + + @Override + public boolean setChecked(boolean isChecked) { + return Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, isChecked ? ON : OFF); + } + + @Override + public int getAvailabilityStatus() { + int setting = Settings.Secure.getInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, UNSET); + if (setting == UNSET) { + return CONDITIONALLY_UNAVAILABLE; + } else { + return AVAILABLE; + } + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_notifications; + } +} diff --git a/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java new file mode 100644 index 00000000000..cc26e542dc4 --- /dev/null +++ b/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java @@ -0,0 +1,122 @@ +/* + * 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 android.provider.Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS; + +import static com.android.settings.notification.ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.OFF; +import static com.android.settings.notification.ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.ON; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.admin.DevicePolicyManager; +import android.content.Context; +import android.provider.Settings; + +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private PreferenceScreen mScreen; + + private ShowOnlyUnseenNotificationsOnLockscreenPreferenceController mController; + private Preference mPreference; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + doReturn(mock(DevicePolicyManager.class)).when(mContext) + .getSystemService(Context.DEVICE_POLICY_SERVICE); + mController = new ShowOnlyUnseenNotificationsOnLockscreenPreferenceController(mContext, + "key"); + mPreference = new Preference(RuntimeEnvironment.application); + mPreference.setKey(mController.getPreferenceKey()); + when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference); + } + + @Test + public void display_configUnset_shouldNotDisplay() { + mController.displayPreference(mScreen); + assertThat(mPreference.isVisible()).isFalse(); + } + + @Test + public void display_configSet_showDisplay() { + Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF); + mController.displayPreference(mScreen); + assertThat(mPreference.isVisible()).isTrue(); + } + + @Test + public void isChecked_settingIsOff_shouldReturnFalse() { + Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF); + + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void isChecked_settingIsOn_shouldReturnTrue() { + Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, ON); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void setChecked_setFalse_disablesSetting() { + Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, ON); + + mController.setChecked(false); + int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, -1); + + assertThat(updatedValue).isEqualTo(OFF); + } + + @Test + public void setChecked_setTrue_enablesSetting() { + Settings.Secure.putInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF); + + mController.setChecked(true); + int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(), + LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, -1); + + assertThat(updatedValue).isEqualTo(ON); + } +}