diff --git a/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java b/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java index 038ceddd4b5..3231862a237 100644 --- a/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java +++ b/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java @@ -81,6 +81,13 @@ public class LockScreenNotificationShowSensitiveController public LockScreenNotificationShowSensitiveController(@NonNull Context context, @NonNull String preferenceKey) { super(context, preferenceKey); + + // This prevents unexpected controller usages. + if (!KEY_SHOW_SENSITIVE.equals(preferenceKey) + && !KEY_SHOW_SENSITIVE_WORK_PROFILE.equals(preferenceKey)) { + throw new IllegalArgumentException("Invalid preference key: " + preferenceKey); + } + mContentResolver = context.getContentResolver(); mUserManager = context.getSystemService(UserManager.class); @@ -138,13 +145,18 @@ public class LockScreenNotificationShowSensitiveController } private int getUserId() { - return KEY_SHOW_SENSITIVE.equals(getPreferenceKey()) - ? UserHandle.myUserId() : mWorkProfileUserId; + return switch (getPreferenceKey()) { + case KEY_SHOW_SENSITIVE -> UserHandle.myUserId(); + case KEY_SHOW_SENSITIVE_WORK_PROFILE -> mWorkProfileUserId; + default -> throw new IllegalArgumentException( + "Invalid preference key: " + getPreferenceKey()); + }; } @Override public void updateState(@Nullable Preference preference) { if (preference == null) return; + super.updateState(preference); setChecked(showSensitiveContentWhenLocked()); preference.setVisible(isAvailable()); } @@ -195,7 +207,7 @@ public class LockScreenNotificationShowSensitiveController if (!isLockScreenSecure()) return true; if (getEnforcedAdmin(userId) != null) return false; return Settings.Secure.getIntForUser(mContext.getContentResolver(), - Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, ON, userId) == ON; + Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, ON, userId) != OFF; } @Override diff --git a/tests/robotests/src/com/android/settings/notification/LockScreenNotificationShowSensitiveControllerTest.java b/tests/robotests/src/com/android/settings/notification/LockScreenNotificationShowSensitiveControllerTest.java index 9a29de2c926..1cc62909848 100644 --- a/tests/robotests/src/com/android/settings/notification/LockScreenNotificationShowSensitiveControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/LockScreenNotificationShowSensitiveControllerTest.java @@ -131,6 +131,14 @@ public class LockScreenNotificationShowSensitiveControllerTest { assertThat(mWorkController.mWorkProfileUserId).isEqualTo(10); } + @Test(expected = IllegalArgumentException.class) + public void validatePreferenceId() { + new LockScreenNotificationShowSensitiveController( + mMockContext, + "Illegal Key" + ); + } + @Test public void getAvailabilityStatus_noSecureLockscreen() { when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); @@ -266,34 +274,58 @@ public class LockScreenNotificationShowSensitiveControllerTest { @Test public void isChecked() { + // Given: screen is secure when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + + // When: disable LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS + // then updateState, this mocks the mWorkController.mContentObserver.onChange() Settings.Secure.putIntForUser(mContext.getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, 0); + mController.updateState(mPreference); + // Then: the toggle is unchecked assertThat(mController.isChecked()).isFalse(); + assertThat(mPreference.isChecked()).isFalse(); + // When: enable LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS + // then updateState, this mocks the mWorkController.mContentObserver.onChange() Settings.Secure.putIntForUser(mContext.getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1, 0); + mController.updateState(mPreference); + // Then: the toggle is checked assertThat(mController.isChecked()).isTrue(); + assertThat(mPreference.isChecked()).isTrue(); } @Test public void isChecked_work() { + // Given: screen is secure when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + + // When: disable LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS for work profile + // then updateState, this mocks the mWorkController.mContentObserver.onChange() Settings.Secure.putIntForUser(mContext.getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, 10); + mWorkController.updateState(mWorkPreference); + // Then: the toggle is unchecked assertThat(mWorkController.isChecked()).isFalse(); + assertThat(mWorkPreference.isChecked()).isFalse(); + // When: enable LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS for work profile + // then updateState, this mocks the mWorkController.mContentObserver.onChange() Settings.Secure.putIntForUser(mContext.getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1, 10); + mWorkController.updateState(mWorkPreference); + // Then: the toggle is checked assertThat(mWorkController.isChecked()).isTrue(); + assertThat(mWorkPreference.isChecked()).isTrue(); } @Test