Merge "Remove redundant setPendingIntentWhitelistDuration() calls." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
c1374208e3
@@ -762,14 +762,13 @@ public class Notification implements Parcelable
|
|||||||
public Bundle extras = new Bundle();
|
public Bundle extras = new Bundle();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All pending intents in the notification extras (notification extras, actions extras,
|
* All pending intents in the notification as the system needs to be able to access them but
|
||||||
* and remote input extras) as the system needs to be able to access them but touching
|
* touching the extras bundle in the system process is not safe because the bundle may contain
|
||||||
* the extras bundle in the system process is not safe because the bundle may contain
|
|
||||||
* custom parcelable objects.
|
* custom parcelable objects.
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public ArraySet<PendingIntent> extrasPendingIntents;
|
public ArraySet<PendingIntent> allPendingIntents;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link #extras} key: this is the title of the notification,
|
* {@link #extras} key: this is the title of the notification,
|
||||||
@@ -1569,7 +1568,7 @@ public class Notification implements Parcelable
|
|||||||
// intents in extras are always written as the last entry.
|
// intents in extras are always written as the last entry.
|
||||||
readFromParcelImpl(parcel);
|
readFromParcelImpl(parcel);
|
||||||
// Must be read last!
|
// Must be read last!
|
||||||
extrasPendingIntents = (ArraySet<PendingIntent>) parcel.readArraySet(null);
|
allPendingIntents = (ArraySet<PendingIntent>) parcel.readArraySet(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readFromParcelImpl(Parcel parcel)
|
private void readFromParcelImpl(Parcel parcel)
|
||||||
@@ -1727,8 +1726,8 @@ public class Notification implements Parcelable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ArrayUtils.isEmpty(extrasPendingIntents)) {
|
if (!ArrayUtils.isEmpty(allPendingIntents)) {
|
||||||
that.extrasPendingIntents = new ArraySet<>(extrasPendingIntents);
|
that.allPendingIntents = new ArraySet<>(allPendingIntents);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.actions != null) {
|
if (this.actions != null) {
|
||||||
@@ -1854,15 +1853,15 @@ public class Notification implements Parcelable
|
|||||||
// cannot look into the extras as there may be parcelables there that
|
// cannot look into the extras as there may be parcelables there that
|
||||||
// the platform does not know how to handle. To go around that we have
|
// the platform does not know how to handle. To go around that we have
|
||||||
// an explicit list of the pending intents in the extras bundle.
|
// an explicit list of the pending intents in the extras bundle.
|
||||||
final boolean collectPendingIntents = (extrasPendingIntents == null);
|
final boolean collectPendingIntents = (allPendingIntents == null);
|
||||||
if (collectPendingIntents) {
|
if (collectPendingIntents) {
|
||||||
PendingIntent.setOnMarshaledListener(
|
PendingIntent.setOnMarshaledListener(
|
||||||
(PendingIntent intent, Parcel out, int outFlags) -> {
|
(PendingIntent intent, Parcel out, int outFlags) -> {
|
||||||
if (parcel == out) {
|
if (parcel == out) {
|
||||||
if (extrasPendingIntents == null) {
|
if (allPendingIntents == null) {
|
||||||
extrasPendingIntents = new ArraySet<>();
|
allPendingIntents = new ArraySet<>();
|
||||||
}
|
}
|
||||||
extrasPendingIntents.add(intent);
|
allPendingIntents.add(intent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1871,7 +1870,7 @@ public class Notification implements Parcelable
|
|||||||
// want to intercept all pending events written to the pacel.
|
// want to intercept all pending events written to the pacel.
|
||||||
writeToParcelImpl(parcel, flags);
|
writeToParcelImpl(parcel, flags);
|
||||||
// Must be written last!
|
// Must be written last!
|
||||||
parcel.writeArraySet(extrasPendingIntents);
|
parcel.writeArraySet(allPendingIntents);
|
||||||
} finally {
|
} finally {
|
||||||
if (collectPendingIntents) {
|
if (collectPendingIntents) {
|
||||||
PendingIntent.setOnMarshaledListener(null);
|
PendingIntent.setOnMarshaledListener(null);
|
||||||
|
|||||||
@@ -2563,7 +2563,22 @@ public class NotificationManagerService extends SystemService {
|
|||||||
+ " id=" + id + " notification=" + notification);
|
+ " id=" + id + " notification=" + notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
markAsSentFromNotification(notification);
|
// Whitelist pending intents.
|
||||||
|
if (notification.allPendingIntents != null) {
|
||||||
|
final int intentCount = notification.allPendingIntents.size();
|
||||||
|
if (intentCount > 0) {
|
||||||
|
final ActivityManagerInternal am = LocalServices
|
||||||
|
.getService(ActivityManagerInternal.class);
|
||||||
|
final long duration = LocalServices.getService(
|
||||||
|
DeviceIdleController.LocalService.class).getNotificationWhitelistDuration();
|
||||||
|
for (int i = 0; i < intentCount; i++) {
|
||||||
|
PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i);
|
||||||
|
if (pendingIntent != null) {
|
||||||
|
am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(), duration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sanitize inputs
|
// Sanitize inputs
|
||||||
notification.priority = clamp(notification.priority, Notification.PRIORITY_MIN,
|
notification.priority = clamp(notification.priority, Notification.PRIORITY_MIN,
|
||||||
@@ -2579,40 +2594,6 @@ public class NotificationManagerService extends SystemService {
|
|||||||
idOut[0] = id;
|
idOut[0] = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void markAsSentFromNotification(Notification notification) {
|
|
||||||
final ActivityManagerInternal am = LocalServices.getService(ActivityManagerInternal.class);
|
|
||||||
final long duration = LocalServices.getService(DeviceIdleController.LocalService.class)
|
|
||||||
.getNotificationWhitelistDuration();
|
|
||||||
|
|
||||||
if (notification.contentIntent != null) {
|
|
||||||
am.setPendingIntentWhitelistDuration(notification.contentIntent.getTarget(), duration);
|
|
||||||
}
|
|
||||||
if (notification.deleteIntent != null) {
|
|
||||||
am.setPendingIntentWhitelistDuration(notification.deleteIntent.getTarget(), duration);
|
|
||||||
}
|
|
||||||
if (notification.fullScreenIntent != null) {
|
|
||||||
am.setPendingIntentWhitelistDuration(notification.fullScreenIntent.getTarget(),
|
|
||||||
duration);
|
|
||||||
}
|
|
||||||
if (notification.actions != null) {
|
|
||||||
for (Notification.Action action: notification.actions) {
|
|
||||||
if (action.actionIntent == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
am.setPendingIntentWhitelistDuration(action.actionIntent.getTarget(), duration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (notification.extrasPendingIntents != null) {
|
|
||||||
final int intentCount = notification.extrasPendingIntents.size();
|
|
||||||
for (int i = 0; i < intentCount; i++) {
|
|
||||||
PendingIntent pendingIntent = notification.extrasPendingIntents.valueAt(i);
|
|
||||||
if (pendingIntent != null) {
|
|
||||||
am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(), duration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class EnqueueNotificationRunnable implements Runnable {
|
private class EnqueueNotificationRunnable implements Runnable {
|
||||||
private final NotificationRecord r;
|
private final NotificationRecord r;
|
||||||
private final int userId;
|
private final int userId;
|
||||||
|
|||||||
Reference in New Issue
Block a user