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

Commit 3f151d9d authored by Jeff DeCew's avatar Jeff DeCew Committed by Automerger Merge Worker
Browse files

Grant URI permissions to NotificationListenerServices when added. am: cd1aec74

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12434562

Change-Id: I5a77003ea0e9362a0581148bc4e57874ec88f82e
parents 788b3c7f cd1aec74
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -9195,6 +9195,7 @@ public class NotificationManagerService extends SystemService {
            final NotificationRankingUpdate update;
            synchronized (mNotificationLock) {
                update = makeRankingUpdateLocked(info);
                grantUriPermissionsForActiveNotificationsLocked(info);
            }
            try {
                listener.onListenerConnected(update);
@@ -9297,13 +9298,8 @@ public class NotificationManagerService extends SystemService {
                    // This notification became invisible -> remove the old one.
                    if (oldSbnVisible && !sbnVisible) {
                        final StatusBarNotification oldSbnLightClone = oldSbn.cloneLight();
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                notifyRemoved(
                                        info, oldSbnLightClone, update, null, REASON_USER_STOPPED);
                            }
                        });
                        mHandler.post(() -> notifyRemoved(
                                info, oldSbnLightClone, update, null, REASON_USER_STOPPED));
                        continue;
                    }

@@ -9313,18 +9309,39 @@ public class NotificationManagerService extends SystemService {
                    updateUriPermissions(r, old, info.component.getPackageName(), targetUserId);

                    final StatusBarNotification sbnToPost = trimCache.ForListener(info);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            notifyPosted(info, sbnToPost, update);
                        }
                    });
                    mHandler.post(() -> notifyPosted(info, sbnToPost, update));
                }
            } catch (Exception e) {
                Slog.e(TAG, "Could not notify listeners for " + r.getKey(), e);
            }
        }

        /**
         * Synchronously grant permissions to Uris for all active and visible notifications to the
         * NotificationListenerService provided.
         */
        @GuardedBy("mNotificationLock")
        private void grantUriPermissionsForActiveNotificationsLocked(ManagedServiceInfo info) {
            try {
                for (final NotificationRecord r : mNotificationList) {
                    // This notification isn't visible -> ignore.
                    if (!isVisibleToListener(r.getSbn(), info)) {
                        continue;
                    }
                    // If the notification is hidden, permissions are not required by the listener.
                    if (r.isHidden() && info.targetSdkVersion < Build.VERSION_CODES.P) {
                        continue;
                    }
                    // Grant access before listener is initialized
                    final int targetUserId = (info.userid == UserHandle.USER_ALL)
                            ? UserHandle.USER_SYSTEM : info.userid;
                    updateUriPermissions(r, null, info.component.getPackageName(), targetUserId);
                }
            } catch (Exception e) {
                Slog.e(TAG, "Could not grant Uri permissions to " + info.component, e);
            }
        }

        /**
         * asynchronously notify all listeners about a removed notification
         */