Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9574845 authored by Sandra Alfaro's avatar Sandra Alfaro
Browse files

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

Bug: 171739119
Test: atest NotificationManagerServiceTest NotificationManagerTest
Change-Id: I3a7eb3197e3bc1d239b87c0f50a7db3e8b17d63b
parent f0bd7906
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -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
+23 −0
Original line number Diff line number Diff line
@@ -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);