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

Commit 3118ac44 authored by Yuri Lin's avatar Yuri Lin
Browse files

Output FGS notification permission state to log.

This field is populated on creation of the ServiceRecord as well as whenever the ServiceRecord is asked to post or update a notification.

Confirmed manually via statsd_testdrive, by turning on and off app notification permissions and then using play store app installs to trigger foreground services.

Bug: 194833441
Bug: 214065327
Test: TreeHugger, statsd_testdrive
Change-Id: I9fcf9950dfb93114f96eb11eaa73b89c98ae5ed3
parent 09655e94
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -6794,7 +6794,8 @@ public final class ActiveServices {
                r.mFgsNotificationShown,
                durationMs,
                r.mStartForegroundCount,
                ActivityManagerUtils.hashComponentNameForAtom(r.shortInstanceName));
                ActivityManagerUtils.hashComponentNameForAtom(r.shortInstanceName),
                r.mFgsHasNotificationPermission);
    }

    boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
+23 −1
Original line number Diff line number Diff line
@@ -175,7 +175,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
    // FGS notification was shown before the FGS finishes, or it wasn't deferred in the first place.
    boolean mFgsNotificationShown;
    // Whether FGS package has permissions to show notifications.
    // TODO(b/194833441): Output this field to logs in ActiveServices#logFGSStateChangeLocked.
    boolean mFgsHasNotificationPermission;

    // allow the service becomes foreground service? Service started from background may not be
@@ -593,6 +592,10 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
        userId = UserHandle.getUserId(appInfo.uid);
        createdFromFg = callerIsFg;
        updateKeepWarmLocked();
        // initialize notification permission state; this'll be updated whenever there's an attempt
        // to post or update a notification, but that doesn't cover the time before the first
        // notification
        updateFgsHasNotificationPermission();
    }

    public ServiceState getTracker() {
@@ -950,6 +953,25 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
        return lastStartId;
    }

    private void updateFgsHasNotificationPermission() {
        // Do asynchronous communication with notification manager to avoid deadlocks.
        final String localPackageName = packageName;
        final int appUid = appInfo.uid;

        ams.mHandler.post(new Runnable() {
            public void run() {
                NotificationManagerInternal nm = LocalServices.getService(
                        NotificationManagerInternal.class);
                if (nm == null) {
                    return;
                }
                // Record whether the package has permission to notify the user
                mFgsHasNotificationPermission = nm.areNotificationsEnabledForPackage(
                        localPackageName, appUid);
            }
        });
    }

    public void postNotification() {
        if (isForeground && foregroundNoti != null && app != null) {
            final int appUid = appInfo.uid;