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

Commit 2a67ee89 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

The system can post notifications for any package

The platform is able to post notifications on behalf of
any app and muting the notifications for this app should
properly work by attributing the notification not to the
system but to the app on whose behalf the notication is
posted.

Test: manual

bug:34966823

Change-Id: I1dd022dee166b1c159e0ad68dd4876b510fc8a26
parent 78e1375a
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -3044,6 +3044,10 @@ public class NotificationManagerService extends SystemService {
            throw new IllegalArgumentException("null not allowed: pkg=" + pkg
                    + " id=" + id + " notification=" + notification);
        }

        // The system can post notifications for any package, let us resolve that.
        final int notificationUid = resolveNotificationUid(opPkg, callingUid, userId);

        // Fix the notification as best we can.
        try {
            final ApplicationInfo ai = mPackageManagerClient.getApplicationInfoAsUser(
@@ -3063,13 +3067,13 @@ public class NotificationManagerService extends SystemService {
            channelId = (new Notification.TvExtender(notification)).getChannel();
        }
        final NotificationChannel channel =  mRankingHelper.getNotificationChannelWithFallback(pkg,
                callingUid, channelId, false /* includeDeleted */);
                notificationUid, channelId, false /* includeDeleted */);
        final StatusBarNotification n = new StatusBarNotification(
                pkg, opPkg, id, tag, callingUid, callingPid, notification,
                pkg, opPkg, id, tag, notificationUid, callingPid, notification,
                user, null, System.currentTimeMillis());
        final NotificationRecord r = new NotificationRecord(getContext(), n, channel);

        if (!checkDisqualifyingFeatures(userId, callingUid, id,tag, r)) {
        if (!checkDisqualifyingFeatures(userId, notificationUid, id,tag, r)) {
            return;
        }

@@ -3095,6 +3099,19 @@ public class NotificationManagerService extends SystemService {
        idOut[0] = id;
    }

    private int resolveNotificationUid(String opPackageName, int callingUid, int userId) {
        // The system can post notifications on behalf of any package it wants
        if (isCallerSystem() && opPackageName != null && !"android".equals(opPackageName)) {
            try {
                return getContext().getPackageManager()
                        .getPackageUidAsUser(opPackageName, userId);
            } catch (NameNotFoundException e) {
                /* ignore */
            }
        }
        return callingUid;
    }

    /**
     * Checks if a notification can be posted. checks rate limiter, snooze helper, and blocking.
     *