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

Commit ebe03fcb authored by Henrik Baard's avatar Henrik Baard
Browse files

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: default avatarSnild Dolkow <snild@sony.com>

Bug: 186456631
Change-Id: I63343b9450fc817ec6a2f46329de346320463c46
parent 9ef59ac9
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -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);