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