DO NOT MERGE Allow the Car Setup Wizard appl to send CAR_INFORMATION notifications

Bug: 171739119
Test: atest NotificationManagerServiceTest NotificationManagerTest
Change-Id: I3a7eb3197e3bc1d239b87c0f50a7db3e8b17d63b
This commit is contained in:
Sandra Alfaro
2021-02-05 10:13:58 -08:00
parent f0bd7906d0
commit f9574845a6
2 changed files with 41 additions and 4 deletions

View File

@@ -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

View File

@@ -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);