Merge "Remove redundant setPendingIntentWhitelistDuration() calls." into nyc-dev

This commit is contained in:
TreeHugger Robot
2016-06-28 20:45:37 +00:00
committed by Android (Google) Code Review
2 changed files with 27 additions and 47 deletions

View File

@@ -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);

View File

@@ -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;