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

Commit 0edd7233 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Another way to keep track number of foreground services in the device."...

Merge "Another way to keep track number of foreground services in the device." into tm-qpr-dev am: db77067d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19829751



Change-Id: I1e6af9cb6525217dc5b8b20225de7244526e1775
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents a8a396a9 db77067d
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -190,6 +190,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;

public final class ActiveServices {
@@ -220,6 +221,11 @@ public final class ActiveServices {
                    | ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
                    | ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION;

    // Keep track of number of foreground services and number of apps that have foreground
    // services in the device. This field is made to be directly accessed without holding AMS lock.
    static final AtomicReference<Pair<Integer, Integer>> sNumForegroundServices =
            new AtomicReference(new Pair<>(0, 0));

    // Foreground service is stopped for unknown reason.
    static final int FGS_STOP_REASON_UNKNOWN = 0;
    // Foreground service is stopped by app calling Service.stopForeground().
@@ -454,6 +460,7 @@ public final class ActiveServices {
        final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();

        final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>();

        boolean mActiveForegroundAppsChanged;

        static final int MSG_BG_START_TIMEOUT = 1;
@@ -2025,6 +2032,7 @@ public final class ActiveServices {
                        logFGSStateChangeLocked(r,
                                FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER,
                                0, FGS_STOP_REASON_UNKNOWN);
                        updateNumForegroundServicesLocked();
                    }
                    // Even if the service is already a FGS, we need to update the notification,
                    // so we need to call it again.
@@ -2116,6 +2124,7 @@ public final class ActiveServices {
                    mAm.updateLruProcessLocked(r.app, false, null);
                    updateServiceForegroundLocked(r.app.mServices, true);
                }
                updateNumForegroundServicesLocked();
            }
        }
    }
@@ -4784,6 +4793,7 @@ public final class ActiveServices {
        }

        smap.ensureNotStartingBackgroundLocked(r);
        updateNumForegroundServicesLocked();
    }

    private void dropFgsNotificationStateLocked(ServiceRecord r) {
@@ -6975,6 +6985,10 @@ public final class ActiveServices {
                fgsStopReasonToString(fgsStopReason));
    }

    private void updateNumForegroundServicesLocked() {
        sNumForegroundServices.set(mAm.mProcessList.getNumForegroundServices());
    }

    boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
            String callingPackage) {
        return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid,
+7 −5
Original line number Diff line number Diff line
@@ -814,12 +814,14 @@ public final class ProcessList {
                                                < LmkdStatsReporter.KILL_OCCURRED_MSG_SIZE) {
                                            return false;
                                        }
                                        Pair<Integer, Integer> temp = getNumForegroundServices();
                                        final int totalForegroundServices = temp.first;
                                        final int procsWithForegroundServices = temp.second;
                                        // Note: directly access
                                        // ActiveServices.sNumForegroundServices, do not try to
                                        // hold AMS lock here, otherwise it is a potential deadlock.
                                        Pair<Integer, Integer> foregroundServices =
                                                ActiveServices.sNumForegroundServices.get();
                                        LmkdStatsReporter.logKillOccurred(inputData,
                                                totalForegroundServices,
                                                procsWithForegroundServices);
                                                foregroundServices.first,
                                                foregroundServices.second);
                                        return true;
                                    case LMK_STATE_CHANGED:
                                        if (receivedLen