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

Commit 1139944e authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

[DO NOT MERGE] 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: I4ebb2f5da1540557a8e7203b054a90ff967237f2
parent f5403816
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -2529,7 +2529,6 @@ public class NotificationManagerService extends SystemService {
        final int userId = ActivityManager.handleIncomingUser(callingPid,
                callingUid, incomingUserId, true, false, "enqueueNotification", pkg);
        final UserHandle user = new UserHandle(userId);

        // Fix the notification as best we can.
        try {
            final ApplicationInfo ai = getContext().getPackageManager().getApplicationInfoAsUser(
@@ -2543,13 +2542,16 @@ public class NotificationManagerService extends SystemService {

        mUsageStats.registerEnqueuedByApp(pkg);


        if (pkg == null || notification == null) {
            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);

        final StatusBarNotification n = new StatusBarNotification(
                pkg, opPkg, id, tag, callingUid, callingPid, 0, notification,
                pkg, opPkg, id, tag, notificationUid, callingPid, 0, notification,
                user);

        // Limit the number of notifications that any given package except the android
@@ -2619,6 +2621,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;
    }

    private class EnqueueNotificationRunnable implements Runnable {
        private final NotificationRecord r;
        private final int userId;