Cancel NotificationTimeout alarms when canceling notification
If alarms with long timeouts are created, there is a risk of a crash in system_server because of alarm creation limit is reached: java.lang.IllegalStateException: Maximum limit of concurrent alarms 500 reached for uid: 1000, callingPackage: android To avoid this cancel alarms if Notifications are canceled. Suggested-by: Snild Dolkow <snild@sony.com> Bug: 186456631 Change-Id: I63343b9450fc817ec6a2f46329de346320463c46
This commit is contained in:
@@ -6850,7 +6850,7 @@ public class NotificationManagerService extends SystemService {
|
||||
.appendPath(record.getKey()).build())
|
||||
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
||||
.putExtra(EXTRA_KEY, record.getKey()),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
||||
mSystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(),
|
||||
pi);
|
||||
@@ -7713,6 +7713,21 @@ public class NotificationManagerService extends SystemService {
|
||||
int rank, int count, boolean wasPosted, String listenerName) {
|
||||
final String canceledKey = r.getKey();
|
||||
|
||||
// Get pending intent used to create alarm, use FLAG_NO_CREATE if PendingIntent
|
||||
// does not already exist, then null will be returned.
|
||||
final PendingIntent pi = PendingIntent.getBroadcast(getContext(),
|
||||
REQUEST_CODE_TIMEOUT,
|
||||
new Intent(ACTION_NOTIFICATION_TIMEOUT)
|
||||
.setData(new Uri.Builder().scheme(SCHEME_TIMEOUT)
|
||||
.appendPath(r.getKey()).build())
|
||||
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
|
||||
PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
// Cancel alarm corresponding to pi.
|
||||
if (pi != null) {
|
||||
mAlarmManager.cancel(pi);
|
||||
}
|
||||
|
||||
// Record caller.
|
||||
recordCallerLocked(r);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user