diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 4772fccfec9dc..a7606339b7d96 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 adf5a89eef003..1d783532374b0 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; @@ -1186,6 +1189,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(0, mBinderService.getActiveNotifications(PKG).length); } + @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);