diff options
author | Julia Reynolds <juliacr@google.com> | 2017-10-26 11:30:31 -0400 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-11-02 04:46:04 +0000 |
commit | de00b62099ee500ad010aab3d35022e2fc96d02a (patch) | |
tree | eec548fe5c02bfc0eba5f1aa432955a60a6ee2ce | |
parent | d4ecffae67fa0dea03c581ca26f76b87a14be763 (diff) | |
download | base-de00b62099ee500ad010aab3d35022e2fc96d02a.tar.gz |
Allow dnd access for secondary users
Test: runtest systemui-notification
Change-Id: Ie63b767bcd25b7b3e7cac08afcf3351adc97263f
Merged-In: Ie63b767bcd25b7b3e7cac08afcf3351adc97263f
Fixes: 68060759
(cherry picked from commit ee611537e935ca419b4333cc82c9dee5d2e7a92d)
3 files changed, 86 insertions, 9 deletions
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 08821bebd57e..0c80deaba910 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -135,6 +135,7 @@ interface INotificationManager void setNotificationPolicy(String pkg, in NotificationManager.Policy policy); boolean isNotificationPolicyAccessGrantedForPackage(String pkg); void setNotificationPolicyAccessGranted(String pkg, boolean granted); + void setNotificationPolicyAccessGrantedForUser(String pkg, int userId, boolean granted); AutomaticZenRule getAutomaticZenRule(String id); List<ZenModeConfig.ZenRule> getZenRules(); String addAutomaticZenRule(in AutomaticZenRule automaticZenRule); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 842ee9135e33..566e5f52625e 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1196,7 +1196,6 @@ public class NotificationManagerService extends SystemService { mAccessibilityManager = am; } - // TODO: All tests should use this init instead of the one-off setters above. @VisibleForTesting void init(Looper looper, IPackageManager packageManager, @@ -2764,19 +2763,25 @@ public class NotificationManagerService extends SystemService { @Override public void setNotificationPolicyAccessGranted(String pkg, boolean granted) throws RemoteException { + setNotificationPolicyAccessGrantedForUser( + pkg, getCallingUserHandle().getIdentifier(), granted); + } + + @Override + public void setNotificationPolicyAccessGrantedForUser( + String pkg, int userId, boolean granted) { checkCallerIsSystemOrShell(); final long identity = Binder.clearCallingIdentity(); try { if (!mActivityManager.isLowRamDevice()) { mConditionProviders.setPackageOrComponentEnabled( - pkg, getCallingUserHandle().getIdentifier(), true, granted); + pkg, userId, true, granted); getContext().sendBroadcastAsUser(new Intent( NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED) .setPackage(pkg) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), - getCallingUserHandle(), null); - + UserHandle.of(userId), null); savePolicyFile(); } } finally { @@ -2871,11 +2876,10 @@ public class NotificationManagerService extends SystemService { userId, true, granted); getContext().sendBroadcastAsUser(new Intent( - NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED) - + NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED) .setPackage(listener.getPackageName()) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), - getCallingUserHandle(), null); + UserHandle.of(userId), null); savePolicyFile(); } @@ -2901,7 +2905,7 @@ public class NotificationManagerService extends SystemService { NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED) .setPackage(assistant.getPackageName()) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), - getCallingUserHandle(), null); + UserHandle.of(userId), null); savePolicyFile(); } diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java index 7ea42daa617b..0c3f2d508e07 100644 --- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -24,6 +24,7 @@ import static android.content.pm.PackageManager.PERMISSION_DENIED; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; @@ -38,6 +39,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -67,6 +69,7 @@ import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; +import android.testing.TestableContext; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import android.util.ArrayMap; @@ -108,7 +111,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { private IPackageManager mPackageManager; @Mock private PackageManager mPackageManagerClient; - private Context mContext = getContext(); + private TestableContext mContext = spy(getContext()); private final String PKG = mContext.getPackageName(); private TestableLooper mTestableLooper; @Mock @@ -169,12 +172,14 @@ public class NotificationManagerServiceTest extends NotificationTestCase { mTestableLooper = TestableLooper.get(this); mHandler = mNotificationManagerService.new WorkerHandler(mTestableLooper.getLooper()); // MockPackageManager - default returns ApplicationInfo with matching calling UID + mContext.setMockPackageManager(mPackageManagerClient); final ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = mUid; when(mPackageManager.getApplicationInfo(anyString(), anyInt(), anyInt())) .thenReturn(applicationInfo); when(mPackageManagerClient.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) .thenReturn(applicationInfo); + when(mPackageManagerClient.getPackageUidAsUser(any(), anyInt())).thenReturn(mUid); final LightsManager mockLightsManager = mock(LightsManager.class); when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class)); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); @@ -222,6 +227,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { mBinderService.createNotificationChannels( PKG, new ParceledListSlice(Arrays.asList(mTestNotificationChannel))); + assertNotNull(mBinderService.getNotificationChannel(PKG, TEST_CHANNEL_ID)); } @After @@ -1311,6 +1317,72 @@ public class NotificationManagerServiceTest extends NotificationTestCase { } @Test + public void testSetListenerAccessForUser() throws Exception { + UserHandle user = UserHandle.of(10); + ComponentName c = ComponentName.unflattenFromString("package/Component"); + try { + mBinderService.setNotificationListenerAccessGrantedForUser( + c, user.getIdentifier(), true); + } catch (SecurityException e) { + if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { + throw e; + } + } + + verify(mContext, times(1)).sendBroadcastAsUser(any(), eq(user), any()); + verify(mListeners, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), true, true); + verify(mConditionProviders, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), false, true); + verify(mAssistants, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + } + + @Test + public void testSetAssistantAccessForUser() throws Exception { + UserHandle user = UserHandle.of(10); + ComponentName c = ComponentName.unflattenFromString("package/Component"); + try { + mBinderService.setNotificationAssistantAccessGrantedForUser( + c, user.getIdentifier(), true); + } catch (SecurityException e) { + if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { + throw e; + } + } + + verify(mContext, times(1)).sendBroadcastAsUser(any(), eq(user), any()); + verify(mAssistants, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), true, true); + verify(mConditionProviders, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), false, true); + verify(mListeners, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + } + + @Test + public void testSetDndAccessForUser() throws Exception { + UserHandle user = UserHandle.of(10); + ComponentName c = ComponentName.unflattenFromString("package/Component"); + try { + mBinderService.setNotificationPolicyAccessGrantedForUser( + c.getPackageName(), user.getIdentifier(), true); + } catch (SecurityException e) { + if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { + throw e; + } + } + + verify(mContext, times(1)).sendBroadcastAsUser(any(), eq(user), any()); + verify(mConditionProviders, times(1)).setPackageOrComponentEnabled( + c.getPackageName(), user.getIdentifier(), true, true); + verify(mAssistants, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + verify(mListeners, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + } + + @Test public void testSetListenerAccess() throws Exception { ComponentName c = ComponentName.unflattenFromString("package/Component"); try { |