OSDN Git Service

Use primary user's LOCK_SCREEN_SHOW_NOTIFICATIONS.
authorPavel Grafov <pgrafov@google.com>
Tue, 3 Jul 2018 19:31:42 +0000 (20:31 +0100)
committerandroid-build-team Robot <android-build-team-robot@google.com>
Tue, 17 Jul 2018 23:28:34 +0000 (23:28 +0000)
Only primary user can set LOCK_SCREEN_SHOW_NOTIFICATIONS,
profile can only set notifications to be redacted. When the
user changes notification settings for a work app, this class
is invoked from the profile, meaning it attempts to read
LOCK_SCREEN_SHOW_NOTIFICATIONS for the profile, which is not
there. As a result the function always returs 0 for work apps.

Bug: 111112011
Test: atest packages/apps/Settings/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java
Change-Id: Ifb50209ea8ea8fb6639f00ca8b7cf8a4295890ad
(cherry picked from commit f14de789f4cc7d145e6011e5a5562876e25c3f31)

src/com/android/settings/notification/VisibilityPreferenceController.java
tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java

index dac90ef..8dc802c 100644 (file)
@@ -147,8 +147,10 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro
     }
 
     private boolean getLockscreenNotificationsEnabled() {
-        return Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
+        final UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId());
+        final int primaryUserId = parentUser != null ? parentUser.id : UserHandle.myUserId();
+        return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, primaryUserId) != 0;
     }
 
     private boolean getLockscreenAllowPrivateNotifications() {
index e37c852..fbc2512 100644 (file)
@@ -209,6 +209,31 @@ public class VisibilityPreferenceControllerTest {
     }
 
     @Test
+    public void testUpdateState_noLockScreenNotificationsGloballyInProfile() {
+        final int primaryUserId = 2;
+        final UserInfo primaryUserInfo = new UserInfo(primaryUserId, "user 2", 0);
+        when(mUm.getProfileParent(anyInt())).thenReturn(primaryUserInfo);
+
+        Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, primaryUserId);
+
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        NotificationChannel channel = mock(NotificationChannel.class);
+        mController.onResume(appRow, channel, null, null);
+
+        RestrictedListPreference pref = mock(RestrictedListPreference.class);
+        mController.updateState(pref);
+
+        ArgumentCaptor<CharSequence[]> argumentCaptor =
+                ArgumentCaptor.forClass(CharSequence[].class);
+        verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
+        assertFalse(toStringList(argumentCaptor.getValue())
+                .contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
+        assertFalse(toStringList(argumentCaptor.getValue())
+                .contains(String.valueOf(VISIBILITY_PRIVATE)));
+    }
+
+    @Test
     public void testUpdateState_noPrivateLockScreenNotificationsGlobally() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1);