diff options
2 files changed, 41 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 4772fccfec9d..a7606339b7d9 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5694,7 +5694,7 @@ public class NotificationManagerService extends SystemService {                      + " trying to post for invalid pkg " + pkg + " in user " + incomingUserId);          } -        checkRestrictedCategories(notification); +        checkRestrictedCategories(pkg, notification);          // Fix the notification as best we can.          try { @@ -8537,7 +8537,7 @@ public class NotificationManagerService extends SystemService {       * Check if the notification is of a category type that is restricted to system use only,       * if so throw SecurityException       */ -    private void checkRestrictedCategories(final Notification notification) { +    private void checkRestrictedCategories(final String pkg, final Notification notification) {          try {              if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) {                  return; @@ -8547,10 +8547,24 @@ public class NotificationManagerService extends SystemService {                      + "restrictions check thus the check will be done anyway");          }          if (Notification.CATEGORY_CAR_EMERGENCY.equals(notification.category) -                || Notification.CATEGORY_CAR_WARNING.equals(notification.category) -                || Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) { +                || Notification.CATEGORY_CAR_WARNING.equals(notification.category)) {                      checkCallerIsSystem();          } + +        if (Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) { +            checkCallerIsSystemOrSUW(pkg); +        } +    } + +    private void checkCallerIsSystemOrSUW(final String pkg) { + +        final PackageManagerInternal pmi = LocalServices.getService( +                PackageManagerInternal.class); +        String suwPkg =  pmi.getSetupWizardPackageName(); +        if (suwPkg != null && suwPkg.equals(pkg)) { +            return; +        } +        checkCallerIsSystem();      }      @VisibleForTesting diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index adf5a89eef00..1d783532374b 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -111,6 +111,7 @@ import android.content.pm.ApplicationInfo;  import android.content.pm.IPackageManager;  import android.content.pm.LauncherApps;  import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal;  import android.content.pm.ParceledListSlice;  import android.content.pm.ShortcutInfo;  import android.content.pm.ShortcutServiceInternal; @@ -243,6 +244,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {      Resources mResources;      @Mock      RankingHandler mRankingHandler; +    @Mock +    protected PackageManagerInternal mPackageManagerInternal;      private static final int MAX_POST_DELAY = 1000; @@ -1187,6 +1190,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {      }      @Test +    public void testEnqueuedRestrictedNotifications_asSuwApp() throws Exception { +        LocalServices.removeServiceForTest(PackageManagerInternal.class); +        LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); +        when(mPackageManagerInternal.getSetupWizardPackageName()).thenReturn(PKG); + +        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) +                .thenReturn(true); + +        final StatusBarNotification sbn = +                generateNotificationRecord(mTestNotificationChannel, 0, "", false).getSbn(); +        sbn.getNotification().category = Notification.CATEGORY_CAR_INFORMATION; +        mBinderService.enqueueNotificationWithTag(PKG, PKG, +                "testEnqueuedRestrictedNotifications_asSuwApp", +                sbn.getId(), sbn.getNotification(), sbn.getUserId()); + +        waitForIdle(); +        assertEquals(1, mBinderService.getActiveNotifications(PKG).length); +    } + +    @Test      public void testBlockedNotifications_blockedByAssistant() throws Exception {          when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);          when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true);  |