Loading apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java 0 → 100644 +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); } } services/core/java/com/android/server/AppStateTracker.java→apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java +41 −23 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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); Loading @@ -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(); } Loading @@ -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. Loading @@ -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(); Loading @@ -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()) { Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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)) { Loading Loading @@ -1197,7 +1206,6 @@ public class AppStateTracker { /** * @return whether force all apps standby is enabled or not. * */ public boolean isForceAllAppsStandbyEnabled() { synchronized (mLock) { Loading Loading @@ -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); Loading Loading @@ -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); Loading apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading apex/jobscheduler/service/java/com/android/server/TEST_MAPPING +9 −0 Original line number Diff line number Diff line Loading @@ -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": [ Loading apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +6 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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(); Loading Loading @@ -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 Loading
apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java 0 → 100644 +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); } }
services/core/java/com/android/server/AppStateTracker.java→apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java +41 −23 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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); Loading @@ -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(); } Loading @@ -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. Loading @@ -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(); Loading @@ -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()) { Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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)) { Loading Loading @@ -1197,7 +1206,6 @@ public class AppStateTracker { /** * @return whether force all apps standby is enabled or not. * */ public boolean isForceAllAppsStandbyEnabled() { synchronized (mLock) { Loading Loading @@ -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); Loading Loading @@ -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); Loading
apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading
apex/jobscheduler/service/java/com/android/server/TEST_MAPPING +9 −0 Original line number Diff line number Diff line Loading @@ -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": [ Loading
apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +6 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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(); Loading Loading @@ -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