Grant URI permissions to NotificationListenerServices when added. am: cd1aec744c

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

Change-Id: I5a77003ea0e9362a0581148bc4e57874ec88f82e
This commit is contained in:
Jeff DeCew
2020-08-24 16:03:35 +00:00
committed by Automerger Merge Worker

View File

@@ -9195,6 +9195,7 @@ public class NotificationManagerService extends SystemService {
final NotificationRankingUpdate update; final NotificationRankingUpdate update;
synchronized (mNotificationLock) { synchronized (mNotificationLock) {
update = makeRankingUpdateLocked(info); update = makeRankingUpdateLocked(info);
grantUriPermissionsForActiveNotificationsLocked(info);
} }
try { try {
listener.onListenerConnected(update); listener.onListenerConnected(update);
@@ -9297,13 +9298,8 @@ public class NotificationManagerService extends SystemService {
// This notification became invisible -> remove the old one. // This notification became invisible -> remove the old one.
if (oldSbnVisible && !sbnVisible) { if (oldSbnVisible && !sbnVisible) {
final StatusBarNotification oldSbnLightClone = oldSbn.cloneLight(); final StatusBarNotification oldSbnLightClone = oldSbn.cloneLight();
mHandler.post(new Runnable() { mHandler.post(() -> notifyRemoved(
@Override info, oldSbnLightClone, update, null, REASON_USER_STOPPED));
public void run() {
notifyRemoved(
info, oldSbnLightClone, update, null, REASON_USER_STOPPED);
}
});
continue; continue;
} }
@@ -9313,18 +9309,39 @@ public class NotificationManagerService extends SystemService {
updateUriPermissions(r, old, info.component.getPackageName(), targetUserId); updateUriPermissions(r, old, info.component.getPackageName(), targetUserId);
final StatusBarNotification sbnToPost = trimCache.ForListener(info); final StatusBarNotification sbnToPost = trimCache.ForListener(info);
mHandler.post(new Runnable() { mHandler.post(() -> notifyPosted(info, sbnToPost, update));
@Override
public void run() {
notifyPosted(info, sbnToPost, update);
}
});
} }
} catch (Exception e) { } catch (Exception e) {
Slog.e(TAG, "Could not notify listeners for " + r.getKey(), 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 * asynchronously notify all listeners about a removed notification
*/ */