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

Commit 8a865d9b authored by Hui Yu's avatar Hui Yu
Browse files

Apply restriction at startForegroundService() call.

Apply FGS background startForeground() restriction at
Context.startForegroundService() call (the startServiceLocked()
method with fgRequired flag), this is earlier than later
apply restriction at Service.startForeground() call so the service will
not start at all if Context.startForegroundService() and mAllowStartForeground
 is false.

Bug: 157473819
Test: atest atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java

Change-Id: Id5c69d697e845376f49b5071e09fdb971d0a4255
parent 8fd758e5
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -494,6 +494,13 @@ public final class ActiveServices {

        ServiceRecord r = res.record;

        if (allowBackgroundActivityStarts) {
            r.allowBgActivityStartsOnServiceStart();
        }

        setFgsRestrictionLocked(callingPackage, callingPid, callingUid, service, r,
                allowBackgroundActivityStarts);

        if (!mAm.mUserController.exists(r.userId)) {
            Slog.w(TAG, "Trying to start service with non-existent user! " + r.userId);
            return null;
@@ -516,6 +523,21 @@ public final class ActiveServices {
            forcedStandby = true;
        }

        if (fgRequired) {
            if (!r.mAllowStartForeground) {
                if (!r.mLoggedInfoAllowStartForeground) {
                    Slog.wtf(TAG, "Background started FGS " + r.mInfoAllowStartForeground);
                    r.mLoggedInfoAllowStartForeground = true;
                }
                if (mAm.mConstants.mFlagFgsStartRestrictionEnabled) {
                    Slog.w(TAG, "startForegroundService() not allowed due to "
                                    + " mAllowStartForeground false: service "
                                    + r.shortInstanceName);
                    forcedStandby = true;
                }
            }
        }

        // If this is a direct-to-foreground start, make sure it is allowed as per the app op.
        boolean forceSilentAbort = false;
        if (fgRequired) {
@@ -688,14 +710,7 @@ public final class ActiveServices {
                        "Not potential delay (user " + r.userId + " not started): " + r);
            }
        }

        if (allowBackgroundActivityStarts) {
            r.allowBgActivityStartsOnServiceStart();
        }
        ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting);

        setFgsRestrictionLocked(callingPackage, callingPid,
                callingUid, service, r, allowBackgroundActivityStarts);
        return cmp;
    }