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

Commit d60c5044 authored by Alexander Roederer's avatar Alexander Roederer
Browse files

Move lifetime extension sysui notify into Runnable

Moves the call to System UI to alert it that a notification has been
lifetime extended due to cancelation into the
CancelNotificationRunnable, so that it shares the same lock event as the
cancel notification call. This should ensure the flag value is in sync,
avoiding hard to debug bugs.

Bug: 332568399
Test: atest NotificationManagerServiceTest, build+flash
Flag: ACONFIG android.app.lifetime_extension_refactor STAGING
Change-Id: I157ecaaf3ac6523519c814bcb1966e9a3b67e6b6
parent 16ee847f
Loading
Loading
Loading
Loading
+18 −34
Original line number Diff line number Diff line
@@ -1320,7 +1320,7 @@ public class NotificationManagerService extends SystemService {
                // Notifications that have been interacted with should no longer be lifetime
                // extended.
                if (lifetimeExtensionRefactor()) {
                    // Enqueue a cancellation; this cancellation should only work if
                    // This cancellation should only work if
                    // the notification still has FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
                    // We wait for 200 milliseconds before posting the cancel, to allow the app
                    // time to update the notification in response instead.
@@ -1337,7 +1337,7 @@ public class NotificationManagerService extends SystemService {
                                    FLAG_NO_DISMISS /*=mustNotHaveFlags*/,
                                    false /*=sendDelete*/,
                                    r.getUserId(),
                                    REASON_APP_CANCEL,
                                    REASON_CLICK,
                                    -1 /*=rank*/,
                                    -1 /*=count*/,
                                    null /*=listener*/,
@@ -1855,14 +1855,6 @@ public class NotificationManagerService extends SystemService {
                                FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB
                                        | FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY,
                                true, record.getUserId(), REASON_TIMEOUT, null);
                        // If cancellation will be prevented due to lifetime extension, we send an
                        // update to system UI.
                        final int packageImportance = getPackageImportanceWithIdentity(
                                record.getSbn().getPackageName());
                        synchronized (mNotificationLock) {
                            maybeNotifySystemUiListenerLifetimeExtendedLocked(record,
                                    record.getSbn().getPackageName(), packageImportance);
                        }
                    } else {
                        cancelNotification(record.getSbn().getUid(),
                                record.getSbn().getInitialPid(),
@@ -3673,15 +3665,6 @@ public class NotificationManagerService extends SystemService {
            if (lifetimeExtensionRefactor()) {
                // Also don't allow client apps to cancel lifetime extended notifs.
                mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
                // If cancellation will be prevented due to lifetime extension, we send an update to
                // system UI.
                NotificationRecord record = null;
                final int packageImportance = getPackageImportanceWithIdentity(pkg);
                synchronized (mNotificationLock) {
                    record = findNotificationLocked(pkg, tag, id, userId);
                    maybeNotifySystemUiListenerLifetimeExtendedLocked(record, pkg,
                            packageImportance);
                }
            }
            cancelNotificationInternal(pkg, opPkg, Binder.getCallingUid(), Binder.getCallingPid(),
@@ -4878,7 +4861,7 @@ public class NotificationManagerService extends SystemService {
                                    || isNotificationRecent(r.getUpdateTimeMs());
                            cancelNotificationFromListenerLocked(info, callingUid, callingPid,
                                    r.getSbn().getPackageName(), r.getSbn().getTag(),
                                    r.getSbn().getId(), userId, reason, packageImportance);
                                    r.getSbn().getId(), userId, reason);
                        }
                    } else {
                        for (NotificationRecord notificationRecord : mNotificationList) {
@@ -5018,14 +5001,10 @@ public class NotificationManagerService extends SystemService {
        @GuardedBy("mNotificationLock")
        private void cancelNotificationFromListenerLocked(ManagedServiceInfo info,
                int callingUid, int callingPid, String pkg, String tag, int id, int userId,
                int reason, int packageImportance) {
                int reason) {
            int mustNotHaveFlags = FLAG_ONGOING_EVENT;
            if (lifetimeExtensionRefactor()) {
                mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
                // If cancellation will be prevented due to lifetime extension, we send an update
                // to system UI.
                NotificationRecord record = findNotificationLocked(pkg, tag, id, userId);
                maybeNotifySystemUiListenerLifetimeExtendedLocked(record, pkg, packageImportance);
            }
            cancelNotification(callingUid, callingPid, pkg, tag, id, 0 /* mustHaveFlags */,
                    mustNotHaveFlags,
@@ -5168,13 +5147,7 @@ public class NotificationManagerService extends SystemService {
            final int callingUid = Binder.getCallingUid();
            final int callingPid = Binder.getCallingPid();
            final long identity = Binder.clearCallingIdentity();
            final int packageImportance;
            try {
                if (lifetimeExtensionRefactor()) {
                    packageImportance = getPackageImportanceWithIdentity(pkg);
                } else {
                    packageImportance = IMPORTANCE_NONE;
                }
                synchronized (mNotificationLock) {
                    final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
                    int cancelReason = REASON_LISTENER_CANCEL;
@@ -5187,7 +5160,7 @@ public class NotificationManagerService extends SystemService {
                                + " use cancelNotification(key) instead.");
                    } else {
                        cancelNotificationFromListenerLocked(info, callingUid, callingPid,
                                pkg, tag, id, info.userid, cancelReason, packageImportance);
                                pkg, tag, id, info.userid, cancelReason);
                    }
                }
            } finally {
@@ -8178,19 +8151,30 @@ public class NotificationManagerService extends SystemService {
                EventLogTags.writeNotificationCancel(mCallingUid, mCallingPid, mPkg, mId, mTag,
                        mUserId, mMustHaveFlags, mMustNotHaveFlags, mReason, listenerName);
            }
            int packageImportance = IMPORTANCE_NONE;
            if (lifetimeExtensionRefactor()) {
                packageImportance = getPackageImportanceWithIdentity(mPkg);
            }
            synchronized (mNotificationLock) {
                // Look for the notification, searching both the posted and enqueued lists.
                NotificationRecord r = findNotificationLocked(mPkg, mTag, mId, mUserId);
                if (r != null) {
                    // The notification was found, check if it should be removed.
                    // Ideally we'd do this in the caller of this method. However, that would
                    // require the caller to also find the notification.
                    if (mReason == REASON_CLICK) {
                        mUsageStats.registerClickedByUser(r);
                    }
                    // If cancellation will be prevented due to lifetime extension, we need to
                    // send an update to system UI. This must be checked before flags are checked.
                    // We do not want to send this update.
                    if (lifetimeExtensionRefactor() && mReason != REASON_CLICK) {
                        maybeNotifySystemUiListenerLifetimeExtendedLocked(r, mPkg,
                                packageImportance);
                    }
                    if ((mReason == REASON_LISTENER_CANCEL
                            && r.getNotification().isBubbleNotification())
                            || (mReason == REASON_CLICK && r.canBubble()