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

Commit 2de948bb authored by Christopher Tate's avatar Christopher Tate
Browse files

Don't defer FGS notification if it's already shown

Bug: 185523487
Test: atest CtsAppTestCases:android.app.cts.ServiceTest#testForegroundService_deferredExistingNotification
Change-Id: I081a3cc8862caf4d53dbd46be1b8b1d4e626ebc0
parent fbd8deba
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ import com.android.server.AppStateTracker;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.am.ActivityManagerService.ItemMatcher;
import com.android.server.notification.NotificationManagerInternal;
import com.android.server.uri.NeededUriGrants;
import com.android.server.wm.ActivityServiceConnectionsHolder;

@@ -1976,6 +1977,17 @@ public final class ActiveServices {
            // DeviceConfig element has been set
            showNow = isLegacyApp && mAm.mConstants.mFlagFgsNotificationDeferralApiGated;
        }
        if (!showNow) {
            // did we already show it?
            showNow = r.mFgsNotificationShown;
        }
        if (!showNow) {
            // Is the notification already showing for any reason?
            final NotificationManagerInternal nmi =
                    LocalServices.getService(NotificationManagerInternal.class);
            showNow = nmi.isNotificationShown(r.appInfo.packageName, null,
                    r.foregroundId, UserHandle.getUserId(uid));
        }
        if (!showNow) {
            // has the app forced deferral?
            if (!r.foregroundNoti.isForegroundDisplayForceDeferred()) {
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ public interface NotificationManagerInternal {
    void cancelNotification(String pkg, String basePkg, int callingUid, int callingPid,
            String tag, int id, int userId);

    /** is the given notification currently showing? */
    boolean isNotificationShown(String pkg, String tag, int notificationId, int userId);

    void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId);

    void onConversationRemoved(String pkg, int uid, Set<String> shortcuts);
+7 −0
Original line number Diff line number Diff line
@@ -6029,6 +6029,13 @@ public class NotificationManagerService extends SystemService {
            cancelNotificationInternal(pkg, opPkg, callingUid, callingPid, tag, id, userId);
        }

        @Override
        public boolean isNotificationShown(String pkg, String tag, int notificationId, int userId) {
            synchronized (mNotificationLock) {
                return findNotificationLocked(pkg, tag, notificationId, userId) != null;
            }
        }

        @Override
        public void removeForegroundServiceFlagFromNotification(String pkg, int notificationId,
                int userId) {