summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java22
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java23
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);