Merge "Fix the toggle status for show sensitive content switches" into main
diff --git a/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java b/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java
index 038cedd..3231862 100644
--- a/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java
+++ b/src/com/android/settings/notification/LockScreenNotificationShowSensitiveController.java
@@ -81,6 +81,13 @@
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 @@
}
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 @@
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 9a29de2..1cc6290 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 @@
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 @@
@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