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

Commit 54f5e733 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Moving AppStateTracker to apex directory"

parents 3ee646f2 e4b485fa
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server;

import android.annotation.NonNull;

/**
 * Tracks the forced-app-standby state for apps.
 */
public interface AppStateTracker {
    String TAG = "AppStateTracker";

    /**
     * Register a {@link ServiceStateListener} to listen for forced-app-standby changes that should
     * affect services.
     */
    void addServiceStateListener(@NonNull ServiceStateListener listener);

    /**
     * A listener to listen to forced-app-standby changes that should affect services.
     */
    interface ServiceStateListener {
        /**
         * Called when an app goes into forced app standby and its foreground
         * services need to be removed from that state.
         */
        void stopForegroundServicesForUidPackage(int uid, String packageName);
    }
}
+41 −23
Original line number Diff line number Diff line
@@ -73,8 +73,7 @@ import java.util.Objects;
 *
 * Test: atest com.android.server.AppStateTrackerTest
 */
public class AppStateTracker {
    private static final String TAG = "AppStateTracker";
public class AppStateTrackerImpl implements AppStateTracker {
    private static final boolean DEBUG = false;

    private final Object mLock = new Object();
@@ -164,6 +163,16 @@ public class AppStateTracker {
    @GuardedBy("mLock")
    boolean mForcedAppStandbyEnabled;

    @Override
    public void addServiceStateListener(@NonNull ServiceStateListener listener) {
        addListener(new Listener() {
            @Override
            public void stopForegroundServicesForUidPackage(int uid, String packageName) {
                listener.stopForegroundServicesForUidPackage(uid, packageName);
            }
        });
    }

    interface Stats {
        int UID_FG_STATE_CHANGED = 0;
        int UID_ACTIVE_STATE_CHANGED = 1;
@@ -253,11 +262,14 @@ public class AppStateTracker {
        }
    }

    public static abstract class Listener {
    /**
     * Listener for any state changes that affect any app's eligibility to run.
     */
    public abstract static class Listener {
        /**
         * This is called when the OP_RUN_ANY_IN_BACKGROUND appops changed for a package.
         */
        private void onRunAnyAppOpsChanged(AppStateTracker sender,
        private void onRunAnyAppOpsChanged(AppStateTrackerImpl sender,
                int uid, @NonNull String packageName) {
            updateJobsForUidPackage(uid, packageName, sender.isUidActive(uid));

@@ -278,14 +290,14 @@ public class AppStateTracker {
        /**
         * This is called when the foreground state changed for a UID.
         */
        private void onUidForegroundStateChanged(AppStateTracker sender, int uid) {
        private void onUidForegroundStateChanged(AppStateTrackerImpl sender, int uid) {
            onUidForeground(uid, sender.isUidInForeground(uid));
        }

        /**
         * This is called when the active/idle state changed for a UID.
         */
        private void onUidActiveStateChanged(AppStateTracker sender, int uid) {
        private void onUidActiveStateChanged(AppStateTrackerImpl sender, int uid) {
            final boolean isActive = sender.isUidActive(uid);

            updateJobsForUid(uid, isActive);
@@ -298,7 +310,7 @@ public class AppStateTracker {
        /**
         * This is called when an app-id(s) is removed from the power save whitelist.
         */
        private void onPowerSaveUnwhitelisted(AppStateTracker sender) {
        private void onPowerSaveUnwhitelisted(AppStateTrackerImpl sender) {
            updateAllJobs();
            unblockAllUnrestrictedAlarms();
        }
@@ -307,14 +319,14 @@ public class AppStateTracker {
         * This is called when the power save whitelist changes, excluding the
         * {@link #onPowerSaveUnwhitelisted} case.
         */
        private void onPowerSaveWhitelistedChanged(AppStateTracker sender) {
        private void onPowerSaveWhitelistedChanged(AppStateTrackerImpl sender) {
            updateAllJobs();
        }

        /**
         * This is called when the temp whitelist changes.
         */
        private void onTempPowerSaveWhitelistChanged(AppStateTracker sender) {
        private void onTempPowerSaveWhitelistChanged(AppStateTrackerImpl sender) {

            // TODO This case happens rather frequently; consider optimizing and update jobs
            // only for affected app-ids.
@@ -327,7 +339,7 @@ public class AppStateTracker {
        /**
         * This is called when the EXEMPT bucket is updated.
         */
        private void onExemptChanged(AppStateTracker sender) {
        private void onExemptChanged(AppStateTrackerImpl sender) {
            // This doesn't happen very often, so just re-evaluate all jobs / alarms.
            updateAllJobs();
            unblockAllUnrestrictedAlarms();
@@ -336,7 +348,7 @@ public class AppStateTracker {
        /**
         * This is called when the global "force all apps standby" flag changes.
         */
        private void onForceAllAppsStandbyChanged(AppStateTracker sender) {
        private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) {
            updateAllJobs();

            if (!sender.isForceAllAppsStandbyEnabled()) {
@@ -401,14 +413,12 @@ public class AppStateTracker {

        /**
         * Called when an ephemeral uid goes to the background, so its alarms need to be removed.
         *
         * @param uid
         */
        public void removeAlarmsForUid(int uid) {
        }
    }

    public AppStateTracker(Context context, Looper looper) {
    public AppStateTrackerImpl(Context context, Looper looper) {
        mContext = context;
        mHandler = new MyHandler(looper);
    }
@@ -751,7 +761,7 @@ public class AppStateTracker {
        private static final int MSG_ON_UID_GONE = 13;
        private static final int MSG_ON_UID_IDLE = 14;

        public MyHandler(Looper looper) {
        MyHandler(Looper looper) {
            super(looper);
        }

@@ -831,7 +841,7 @@ public class AppStateTracker {
                    return;
                }
            }
            final AppStateTracker sender = AppStateTracker.this;
            final AppStateTrackerImpl sender = AppStateTrackerImpl.this;

            long start = mStatLogger.getTime();
            switch (msg.what) {
@@ -1077,7 +1087,7 @@ public class AppStateTracker {
    // Public interface.

    /**
     * Register a new listener.
     * Register a listener to get callbacks when any state changes.
     */
    public void addListener(@NonNull Listener listener) {
        synchronized (mLock) {
@@ -1127,8 +1137,7 @@ public class AppStateTracker {
            if (ArrayUtils.contains(mPowerWhitelistedAllAppIds, appId)) {
                return false;
            }
            if (useTempWhitelistToo &&
                    ArrayUtils.contains(mTempWhitelistedAppIds, appId)) {
            if (useTempWhitelistToo && ArrayUtils.contains(mTempWhitelistedAppIds, appId)) {
                return false;
            }
            if (mForcedAppStandbyEnabled && isRunAnyRestrictedLocked(uid, packageName)) {
@@ -1197,7 +1206,6 @@ public class AppStateTracker {

    /**
     * @return whether force all apps standby is enabled or not.
     *
     */
    public boolean isForceAllAppsStandbyEnabled() {
        synchronized (mLock) {
@@ -1248,11 +1256,18 @@ public class AppStateTracker {
        }
    }

    /**
     * @deprecated use {@link #dump(IndentingPrintWriter)} instead.
     */
    @Deprecated
    public void dump(PrintWriter pw, String prefix) {
        dump(new IndentingPrintWriter(pw, "  ").setIndent(prefix));
    }

    /**
     * Dump the internal state to the given PrintWriter. Can be included in the dump
     * of a binder service to be output on the shell command "dumpsys".
     */
    public void dump(IndentingPrintWriter pw) {
        synchronized (mLock) {
            pw.println("Forced App Standby Feature enabled: " + mForcedAppStandbyEnabled);
@@ -1329,6 +1344,9 @@ public class AppStateTracker {
        pw.println("]");
    }

    /**
     * Proto version of {@link #dump(IndentingPrintWriter)}
     */
    public void dumpProto(ProtoOutputStream proto, long fieldId) {
        synchronized (mLock) {
            final long token = proto.start(fieldId);
+3 −3
Original line number Diff line number Diff line
@@ -286,7 +286,7 @@ public class DeviceIdleController extends SystemService
    private Intent mIdleIntent;
    private Intent mLightIdleIntent;
    private AnyMotionDetector mAnyMotionDetector;
    private final AppStateTracker mAppStateTracker;
    private final AppStateTrackerImpl mAppStateTracker;
    private boolean mLightEnabled;
    private boolean mDeepEnabled;
    private boolean mQuickDozeActivated;
@@ -1859,8 +1859,8 @@ public class DeviceIdleController extends SystemService
            return new AnyMotionDetector(getPowerManager(), handler, sm, callback, angleThreshold);
        }

        AppStateTracker getAppStateTracker(Context ctx, Looper looper) {
            return new AppStateTracker(ctx, looper);
        AppStateTrackerImpl getAppStateTracker(Context ctx, Looper looper) {
            return new AppStateTrackerImpl(ctx, looper);
        }

        ConnectivityManager getConnectivityManager() {
+9 −0
Original line number Diff line number Diff line
@@ -10,6 +10,15 @@
        {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
        {"exclude-annotation": "androidx.test.filters.FlakyTest"}
      ]
    },
    {
      "name": "FrameworksMockingServicesTests",
      "file_patterns": ["AppStateTrackerImpl\\.java"],
      "options": [
        {"include-filter": "com.android.server.AppStateTrackerTest"},
        {"include-annotation": "android.platform.test.annotations.Presubmit"},
        {"exclude-annotation": "androidx.test.filters.FlakyTest"}
      ]
    }
  ],
  "postsubmit": [
+6 −5
Original line number Diff line number Diff line
@@ -99,7 +99,8 @@ import com.android.internal.util.LocalLog;
import com.android.internal.util.StatLogger;
import com.android.server.AlarmManagerInternal;
import com.android.server.AppStateTracker;
import com.android.server.AppStateTracker.Listener;
import com.android.server.AppStateTrackerImpl;
import com.android.server.AppStateTrackerImpl.Listener;
import com.android.server.DeviceIdleInternal;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
@@ -286,7 +287,7 @@ public class AlarmManagerService extends SystemService {
    private final SparseArray<AlarmManager.AlarmClockInfo> mHandlerSparseAlarmClockArray =
            new SparseArray<>();

    private AppStateTracker mAppStateTracker;
    private AppStateTrackerImpl mAppStateTracker;
    private boolean mAppStandbyParole;

    /**
@@ -1593,7 +1594,8 @@ public class AlarmManagerService extends SystemService {
                        LocalServices.getService(AppStandbyInternal.class);
                appStandbyInternal.addListener(new AppStandbyTracker());

                mAppStateTracker = LocalServices.getService(AppStateTracker.class);
                mAppStateTracker =
                        (AppStateTrackerImpl) LocalServices.getService(AppStateTracker.class);
                mAppStateTracker.addListener(mForceAppStandbyListener);

                mClockReceiver.scheduleTimeTickEvent();
@@ -4393,8 +4395,7 @@ public class AlarmManagerService extends SystemService {
    /**
     * Tracking of app assignments to standby buckets
     */
    private final class AppStandbyTracker extends
            AppIdleStateChangeListener {
    private final class AppStandbyTracker extends AppIdleStateChangeListener {
        @Override
        public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId,
                boolean idle, int bucket, int reason) {
Loading