Loading core/java/android/provider/Settings.java +0 −9 Original line number Diff line number Diff line Loading @@ -9860,15 +9860,6 @@ public final class Settings { */ public static final String FORCED_APP_STANDBY_ENABLED = "forced_app_standby_enabled"; /** * Whether or not to enable Forced App Standby on small battery devices. * Type: int (0 for false, 1 for true) * Default: 0 * @hide */ public static final String FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED = "forced_app_standby_for_small_battery_enabled"; /** * Whether or not Network Watchlist feature is enabled. * Type: int (0 for false, 1 for true) Loading core/proto/android/server/forceappstandbytracker.proto +0 −9 Original line number Diff line number Diff line Loading @@ -41,13 +41,4 @@ message ForceAppStandbyTrackerProto { // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND. repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5; // Whether device is a small battery device optional bool is_small_battery_device = 6; // Whether force app standby for small battery device setting is enabled optional bool force_all_apps_standby_for_small_battery = 7; // Whether device is charging optional bool is_charging = 8; } core/tests/coretests/src/android/provider/SettingsBackupTest.java +0 −1 Original line number Diff line number Diff line Loading @@ -213,7 +213,6 @@ public class SettingsBackupTest { Settings.Global.FANCY_IME_ANIMATIONS, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, Settings.Global.FSTRIM_MANDATORY_INTERVAL, Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST, Settings.Global.GLOBAL_HTTP_PROXY_HOST, Loading services/core/java/com/android/server/ForceAppStandbyTracker.java +32 −132 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; import android.net.Uri; import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.Message; Loading Loading @@ -91,9 +89,6 @@ public class ForceAppStandbyTracker { private final MyHandler mHandler; @VisibleForTesting FeatureFlagsObserver mFlagsObserver; /** * Pair of (uid (not user-id), packageName) with OP_RUN_ANY_IN_BACKGROUND *not* allowed. */ Loading @@ -119,32 +114,13 @@ public class ForceAppStandbyTracker { boolean mStarted; @GuardedBy("mLock") boolean mIsCharging; boolean mForceAllAppsStandby; // True if device is in extreme battery saver mode @GuardedBy("mLock") boolean mBatterySaverEnabled; boolean mForcedAppStandbyEnabled; // True if the forced app standby feature is enabled /** * True if the forced app standby is currently enabled */ @GuardedBy("mLock") boolean mForceAllAppsStandby; /** * True if the forced app standby for small battery devices feature is enabled in settings */ @GuardedBy("mLock") boolean mForceAllAppStandbyForSmallBattery; /** * True if the forced app standby feature is enabled in settings */ @GuardedBy("mLock") boolean mForcedAppStandbyEnabled; @VisibleForTesting class FeatureFlagsObserver extends ContentObserver { FeatureFlagsObserver() { private class FeatureFlagObserver extends ContentObserver { FeatureFlagObserver() { super(null); } Loading @@ -152,9 +128,6 @@ public class ForceAppStandbyTracker { mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED), false, this); mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor( Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED), false, this); } boolean isForcedAppStandbyEnabled() { Loading @@ -162,14 +135,8 @@ public class ForceAppStandbyTracker { Settings.Global.FORCED_APP_STANDBY_ENABLED, 1) == 1; } boolean isForcedAppStandbyForSmallBatteryEnabled() { return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, 0) == 1; } @Override public void onChange(boolean selfChange, Uri uri) { if (Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED).equals(uri)) { public void onChange(boolean selfChange) { final boolean enabled = isForcedAppStandbyEnabled(); synchronized (mLock) { if (mForcedAppStandbyEnabled == enabled) { Loading @@ -181,24 +148,7 @@ public class ForceAppStandbyTracker { "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled); } } mHandler.notifyForcedAppStandbyFeatureFlagChanged(); } else if (Settings.Global.getUriFor( Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED).equals(uri)) { final boolean enabled = isForcedAppStandbyForSmallBatteryEnabled(); synchronized (mLock) { if (mForceAllAppStandbyForSmallBattery == enabled) { return; } mForceAllAppStandbyForSmallBattery = enabled; if (DEBUG) { Slog.d(TAG, "Forced app standby for small battery feature flag changed: " + mForceAllAppStandbyForSmallBattery); } updateForceAllAppStandbyState(); } } else { Slog.w(TAG, "Unexpected feature flag uri encountered: " + uri); } mHandler.notifyFeatureFlagChanged(); } } Loading Loading @@ -339,11 +289,9 @@ public class ForceAppStandbyTracker { mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager()); mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService()); mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal()); mFlagsObserver = new FeatureFlagsObserver(); mFlagsObserver.register(); mForcedAppStandbyEnabled = mFlagsObserver.isForcedAppStandbyEnabled(); mForceAllAppStandbyForSmallBattery = mFlagsObserver.isForcedAppStandbyForSmallBatteryEnabled(); final FeatureFlagObserver flagObserver = new FeatureFlagObserver(); flagObserver.register(); mForcedAppStandbyEnabled = flagObserver.isForcedAppStandbyEnabled(); try { mIActivityManager.registerUidObserver(new UidObserver(), Loading @@ -358,24 +306,16 @@ public class ForceAppStandbyTracker { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_REMOVED); filter.addAction(Intent.ACTION_BATTERY_CHANGED); mContext.registerReceiver(new MyReceiver(), filter); refreshForcedAppStandbyUidPackagesLocked(); mPowerManagerInternal.registerLowPowerModeObserver( ServiceType.FORCE_ALL_APPS_STANDBY, (state) -> { synchronized (mLock) { mBatterySaverEnabled = state.batterySaverEnabled; updateForceAllAppStandbyState(); } }); mBatterySaverEnabled = mPowerManagerInternal.getLowPowerState( ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled; (state) -> updateForceAllAppsStandby(state.batterySaverEnabled)); updateForceAllAppStandbyState(); updateForceAllAppsStandby(mPowerManagerInternal.getLowPowerState( ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled); } } Loading @@ -400,11 +340,6 @@ public class ForceAppStandbyTracker { return LocalServices.getService(PowerManagerInternal.class); } @VisibleForTesting boolean isSmallBatteryDevice() { return ActivityManager.isSmallBatteryDevice(); } /** * Update {@link #mRunAnyRestrictedPackages} with the current app ops state. */ Loading Loading @@ -434,23 +369,11 @@ public class ForceAppStandbyTracker { } } private void updateForceAllAppStandbyState() { synchronized (mLock) { if (mIsCharging) { toggleForceAllAppsStandbyLocked(false); } else if (mForceAllAppStandbyForSmallBattery && isSmallBatteryDevice()) { toggleForceAllAppsStandbyLocked(true); } else { toggleForceAllAppsStandbyLocked(mBatterySaverEnabled); } } } /** * Update {@link #mForceAllAppsStandby} and notifies the listeners. */ private void toggleForceAllAppsStandbyLocked(boolean enable) { void updateForceAllAppsStandby(boolean enable) { synchronized (mLock) { if (enable == mForceAllAppsStandby) { return; } Loading @@ -458,6 +381,7 @@ public class ForceAppStandbyTracker { mHandler.notifyForceAllAppsStandbyChanged(); } } private int findForcedAppStandbyUidPackageIndexLocked(int uid, @NonNull String packageName) { final int size = mRunAnyRestrictedPackages.size(); Loading Loading @@ -591,13 +515,6 @@ public class ForceAppStandbyTracker { if (userId > 0) { mHandler.doUserRemoved(userId); } } else if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); synchronized (mLock) { mIsCharging = (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL); } updateForceAllAppStandbyState(); } } } Loading @@ -616,7 +533,7 @@ public class ForceAppStandbyTracker { private static final int MSG_TEMP_WHITELIST_CHANGED = 5; private static final int MSG_FORCE_ALL_CHANGED = 6; private static final int MSG_USER_REMOVED = 7; private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8; private static final int MSG_FEATURE_FLAG_CHANGED = 8; public MyHandler(Looper looper) { super(looper); Loading Loading @@ -646,8 +563,8 @@ public class ForceAppStandbyTracker { obtainMessage(MSG_FORCE_ALL_CHANGED).sendToTarget(); } public void notifyForcedAppStandbyFeatureFlagChanged() { obtainMessage(MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED).sendToTarget(); public void notifyFeatureFlagChanged() { obtainMessage(MSG_FEATURE_FLAG_CHANGED).sendToTarget(); } public void doUserRemoved(int userId) { Loading Loading @@ -701,7 +618,7 @@ public class ForceAppStandbyTracker { l.onForceAllAppsStandbyChanged(sender); } return; case MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED: case MSG_FEATURE_FLAG_CHANGED: // Feature flag for forced app standby changed. final boolean unblockAlarms; synchronized (mLock) { Loading Loading @@ -924,18 +841,6 @@ public class ForceAppStandbyTracker { pw.print("Force all apps standby: "); pw.println(isForceAllAppsStandbyEnabled()); pw.print(indent); pw.print("Small Battery Device: "); pw.println(isSmallBatteryDevice()); pw.print(indent); pw.print("Force all apps standby for small battery device: "); pw.println(mForceAllAppStandbyForSmallBattery); pw.print(indent); pw.print("Charging: "); pw.println(mIsCharging); pw.print(indent); pw.print("Foreground uids: ["); Loading Loading @@ -975,11 +880,6 @@ public class ForceAppStandbyTracker { final long token = proto.start(fieldId); proto.write(ForceAppStandbyTrackerProto.FORCE_ALL_APPS_STANDBY, mForceAllAppsStandby); proto.write(ForceAppStandbyTrackerProto.IS_SMALL_BATTERY_DEVICE, isSmallBatteryDevice()); proto.write(ForceAppStandbyTrackerProto.FORCE_ALL_APPS_STANDBY_FOR_SMALL_BATTERY, mForceAllAppStandbyForSmallBattery); proto.write(ForceAppStandbyTrackerProto.IS_CHARGING, mIsCharging); for (int i = 0; i < mForegroundUids.size(); i++) { if (mForegroundUids.valueAt(i)) { Loading services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java +3 −46 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.PowerManager.ServiceType; Loading @@ -51,17 +50,13 @@ import android.os.PowerSaveState; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Global; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContentResolver; import android.util.ArraySet; import android.util.Pair; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.ForceAppStandbyTracker.Listener; import org.junit.Before; Loading Loading @@ -107,9 +102,6 @@ public class ForceAppStandbyTrackerTest { PowerManagerInternal injectPowerManagerInternal() { return mMockPowerManagerInternal; } @Override boolean isSmallBatteryDevice() { return mIsSmallBatteryDevice; }; } private static final int UID_1 = Process.FIRST_APPLICATION_UID + 1; Loading Loading @@ -145,11 +137,7 @@ public class ForceAppStandbyTrackerTest { private Consumer<PowerSaveState> mPowerSaveObserver; private BroadcastReceiver mReceiver; private MockContentResolver mMockContentResolver; private FakeSettingsProvider mFakeSettingsProvider; private boolean mPowerSaveMode; private boolean mIsSmallBatteryDevice; private final ArraySet<Pair<Integer, String>> mRestrictedPackages = new ArraySet(); Loading Loading @@ -186,6 +174,7 @@ public class ForceAppStandbyTrackerTest { } private void callStart(ForceAppStandbyTrackerTestable instance) throws RemoteException { // Set up functions that start() calls. when(mMockPowerManagerInternal.getLowPowerState(eq(ServiceType.FORCE_ALL_APPS_STANDBY))) .thenAnswer(inv -> getPowerSaveState()); Loading @@ -193,11 +182,6 @@ public class ForceAppStandbyTrackerTest { any(int[].class) )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>()); mMockContentResolver = new MockContentResolver(); mFakeSettingsProvider = new FakeSettingsProvider(); when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver); mMockContentResolver.addProvider(Settings.AUTHORITY, mFakeSettingsProvider); // Call start. instance.start(); Loading @@ -224,6 +208,7 @@ public class ForceAppStandbyTrackerTest { verify(mMockPowerManagerInternal).registerLowPowerModeObserver( eq(ServiceType.FORCE_ALL_APPS_STANDBY), powerSaveObserverCaptor.capture()); verify(mMockContext).registerReceiver( receiverCaptor.capture(), any(IntentFilter.class)); Loading @@ -236,7 +221,6 @@ public class ForceAppStandbyTrackerTest { assertNotNull(mAppOpsCallback); assertNotNull(mPowerSaveObserver); assertNotNull(mReceiver); assertNotNull(instance.mFlagsObserver); } private void setAppOps(int uid, String packageName, boolean restrict) throws RemoteException { Loading Loading @@ -838,33 +822,6 @@ public class ForceAppStandbyTrackerTest { assertTrue(instance.isRunAnyInBackgroundAppOpsAllowed(UID_10_2, PACKAGE_2)); } @Test public void testSmallBatteryAndCharging() throws Exception { // This is a small battery device mIsSmallBatteryDevice = true; final ForceAppStandbyTrackerTestable instance = newInstance(); callStart(instance); assertFalse(instance.isForceAllAppsStandbyEnabled()); // Setting/experiment for all app standby for small battery is enabled Global.putInt(mMockContentResolver, Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, 1); instance.mFlagsObserver.onChange(true, Global.getUriFor(Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED)); assertTrue(instance.isForceAllAppsStandbyEnabled()); // When battery is charging, force app standby is disabled Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING); mReceiver.onReceive(mMockContext, intent); assertFalse(instance.isForceAllAppsStandbyEnabled()); // When battery stops charging, force app standby is enabled intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_DISCHARGING); mReceiver.onReceive(mMockContext, intent); assertTrue(instance.isForceAllAppsStandbyEnabled()); } static int[] array(int... appIds) { Arrays.sort(appIds); return appIds; Loading Loading
core/java/android/provider/Settings.java +0 −9 Original line number Diff line number Diff line Loading @@ -9860,15 +9860,6 @@ public final class Settings { */ public static final String FORCED_APP_STANDBY_ENABLED = "forced_app_standby_enabled"; /** * Whether or not to enable Forced App Standby on small battery devices. * Type: int (0 for false, 1 for true) * Default: 0 * @hide */ public static final String FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED = "forced_app_standby_for_small_battery_enabled"; /** * Whether or not Network Watchlist feature is enabled. * Type: int (0 for false, 1 for true) Loading
core/proto/android/server/forceappstandbytracker.proto +0 −9 Original line number Diff line number Diff line Loading @@ -41,13 +41,4 @@ message ForceAppStandbyTrackerProto { // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND. repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5; // Whether device is a small battery device optional bool is_small_battery_device = 6; // Whether force app standby for small battery device setting is enabled optional bool force_all_apps_standby_for_small_battery = 7; // Whether device is charging optional bool is_charging = 8; }
core/tests/coretests/src/android/provider/SettingsBackupTest.java +0 −1 Original line number Diff line number Diff line Loading @@ -213,7 +213,6 @@ public class SettingsBackupTest { Settings.Global.FANCY_IME_ANIMATIONS, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, Settings.Global.FSTRIM_MANDATORY_INTERVAL, Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST, Settings.Global.GLOBAL_HTTP_PROXY_HOST, Loading
services/core/java/com/android/server/ForceAppStandbyTracker.java +32 −132 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; import android.net.Uri; import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.Message; Loading Loading @@ -91,9 +89,6 @@ public class ForceAppStandbyTracker { private final MyHandler mHandler; @VisibleForTesting FeatureFlagsObserver mFlagsObserver; /** * Pair of (uid (not user-id), packageName) with OP_RUN_ANY_IN_BACKGROUND *not* allowed. */ Loading @@ -119,32 +114,13 @@ public class ForceAppStandbyTracker { boolean mStarted; @GuardedBy("mLock") boolean mIsCharging; boolean mForceAllAppsStandby; // True if device is in extreme battery saver mode @GuardedBy("mLock") boolean mBatterySaverEnabled; boolean mForcedAppStandbyEnabled; // True if the forced app standby feature is enabled /** * True if the forced app standby is currently enabled */ @GuardedBy("mLock") boolean mForceAllAppsStandby; /** * True if the forced app standby for small battery devices feature is enabled in settings */ @GuardedBy("mLock") boolean mForceAllAppStandbyForSmallBattery; /** * True if the forced app standby feature is enabled in settings */ @GuardedBy("mLock") boolean mForcedAppStandbyEnabled; @VisibleForTesting class FeatureFlagsObserver extends ContentObserver { FeatureFlagsObserver() { private class FeatureFlagObserver extends ContentObserver { FeatureFlagObserver() { super(null); } Loading @@ -152,9 +128,6 @@ public class ForceAppStandbyTracker { mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED), false, this); mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor( Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED), false, this); } boolean isForcedAppStandbyEnabled() { Loading @@ -162,14 +135,8 @@ public class ForceAppStandbyTracker { Settings.Global.FORCED_APP_STANDBY_ENABLED, 1) == 1; } boolean isForcedAppStandbyForSmallBatteryEnabled() { return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, 0) == 1; } @Override public void onChange(boolean selfChange, Uri uri) { if (Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED).equals(uri)) { public void onChange(boolean selfChange) { final boolean enabled = isForcedAppStandbyEnabled(); synchronized (mLock) { if (mForcedAppStandbyEnabled == enabled) { Loading @@ -181,24 +148,7 @@ public class ForceAppStandbyTracker { "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled); } } mHandler.notifyForcedAppStandbyFeatureFlagChanged(); } else if (Settings.Global.getUriFor( Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED).equals(uri)) { final boolean enabled = isForcedAppStandbyForSmallBatteryEnabled(); synchronized (mLock) { if (mForceAllAppStandbyForSmallBattery == enabled) { return; } mForceAllAppStandbyForSmallBattery = enabled; if (DEBUG) { Slog.d(TAG, "Forced app standby for small battery feature flag changed: " + mForceAllAppStandbyForSmallBattery); } updateForceAllAppStandbyState(); } } else { Slog.w(TAG, "Unexpected feature flag uri encountered: " + uri); } mHandler.notifyFeatureFlagChanged(); } } Loading Loading @@ -339,11 +289,9 @@ public class ForceAppStandbyTracker { mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager()); mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService()); mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal()); mFlagsObserver = new FeatureFlagsObserver(); mFlagsObserver.register(); mForcedAppStandbyEnabled = mFlagsObserver.isForcedAppStandbyEnabled(); mForceAllAppStandbyForSmallBattery = mFlagsObserver.isForcedAppStandbyForSmallBatteryEnabled(); final FeatureFlagObserver flagObserver = new FeatureFlagObserver(); flagObserver.register(); mForcedAppStandbyEnabled = flagObserver.isForcedAppStandbyEnabled(); try { mIActivityManager.registerUidObserver(new UidObserver(), Loading @@ -358,24 +306,16 @@ public class ForceAppStandbyTracker { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_REMOVED); filter.addAction(Intent.ACTION_BATTERY_CHANGED); mContext.registerReceiver(new MyReceiver(), filter); refreshForcedAppStandbyUidPackagesLocked(); mPowerManagerInternal.registerLowPowerModeObserver( ServiceType.FORCE_ALL_APPS_STANDBY, (state) -> { synchronized (mLock) { mBatterySaverEnabled = state.batterySaverEnabled; updateForceAllAppStandbyState(); } }); mBatterySaverEnabled = mPowerManagerInternal.getLowPowerState( ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled; (state) -> updateForceAllAppsStandby(state.batterySaverEnabled)); updateForceAllAppStandbyState(); updateForceAllAppsStandby(mPowerManagerInternal.getLowPowerState( ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled); } } Loading @@ -400,11 +340,6 @@ public class ForceAppStandbyTracker { return LocalServices.getService(PowerManagerInternal.class); } @VisibleForTesting boolean isSmallBatteryDevice() { return ActivityManager.isSmallBatteryDevice(); } /** * Update {@link #mRunAnyRestrictedPackages} with the current app ops state. */ Loading Loading @@ -434,23 +369,11 @@ public class ForceAppStandbyTracker { } } private void updateForceAllAppStandbyState() { synchronized (mLock) { if (mIsCharging) { toggleForceAllAppsStandbyLocked(false); } else if (mForceAllAppStandbyForSmallBattery && isSmallBatteryDevice()) { toggleForceAllAppsStandbyLocked(true); } else { toggleForceAllAppsStandbyLocked(mBatterySaverEnabled); } } } /** * Update {@link #mForceAllAppsStandby} and notifies the listeners. */ private void toggleForceAllAppsStandbyLocked(boolean enable) { void updateForceAllAppsStandby(boolean enable) { synchronized (mLock) { if (enable == mForceAllAppsStandby) { return; } Loading @@ -458,6 +381,7 @@ public class ForceAppStandbyTracker { mHandler.notifyForceAllAppsStandbyChanged(); } } private int findForcedAppStandbyUidPackageIndexLocked(int uid, @NonNull String packageName) { final int size = mRunAnyRestrictedPackages.size(); Loading Loading @@ -591,13 +515,6 @@ public class ForceAppStandbyTracker { if (userId > 0) { mHandler.doUserRemoved(userId); } } else if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); synchronized (mLock) { mIsCharging = (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL); } updateForceAllAppStandbyState(); } } } Loading @@ -616,7 +533,7 @@ public class ForceAppStandbyTracker { private static final int MSG_TEMP_WHITELIST_CHANGED = 5; private static final int MSG_FORCE_ALL_CHANGED = 6; private static final int MSG_USER_REMOVED = 7; private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8; private static final int MSG_FEATURE_FLAG_CHANGED = 8; public MyHandler(Looper looper) { super(looper); Loading Loading @@ -646,8 +563,8 @@ public class ForceAppStandbyTracker { obtainMessage(MSG_FORCE_ALL_CHANGED).sendToTarget(); } public void notifyForcedAppStandbyFeatureFlagChanged() { obtainMessage(MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED).sendToTarget(); public void notifyFeatureFlagChanged() { obtainMessage(MSG_FEATURE_FLAG_CHANGED).sendToTarget(); } public void doUserRemoved(int userId) { Loading Loading @@ -701,7 +618,7 @@ public class ForceAppStandbyTracker { l.onForceAllAppsStandbyChanged(sender); } return; case MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED: case MSG_FEATURE_FLAG_CHANGED: // Feature flag for forced app standby changed. final boolean unblockAlarms; synchronized (mLock) { Loading Loading @@ -924,18 +841,6 @@ public class ForceAppStandbyTracker { pw.print("Force all apps standby: "); pw.println(isForceAllAppsStandbyEnabled()); pw.print(indent); pw.print("Small Battery Device: "); pw.println(isSmallBatteryDevice()); pw.print(indent); pw.print("Force all apps standby for small battery device: "); pw.println(mForceAllAppStandbyForSmallBattery); pw.print(indent); pw.print("Charging: "); pw.println(mIsCharging); pw.print(indent); pw.print("Foreground uids: ["); Loading Loading @@ -975,11 +880,6 @@ public class ForceAppStandbyTracker { final long token = proto.start(fieldId); proto.write(ForceAppStandbyTrackerProto.FORCE_ALL_APPS_STANDBY, mForceAllAppsStandby); proto.write(ForceAppStandbyTrackerProto.IS_SMALL_BATTERY_DEVICE, isSmallBatteryDevice()); proto.write(ForceAppStandbyTrackerProto.FORCE_ALL_APPS_STANDBY_FOR_SMALL_BATTERY, mForceAllAppStandbyForSmallBattery); proto.write(ForceAppStandbyTrackerProto.IS_CHARGING, mIsCharging); for (int i = 0; i < mForegroundUids.size(); i++) { if (mForegroundUids.valueAt(i)) { Loading
services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java +3 −46 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.PowerManager.ServiceType; Loading @@ -51,17 +50,13 @@ import android.os.PowerSaveState; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Global; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContentResolver; import android.util.ArraySet; import android.util.Pair; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.ForceAppStandbyTracker.Listener; import org.junit.Before; Loading Loading @@ -107,9 +102,6 @@ public class ForceAppStandbyTrackerTest { PowerManagerInternal injectPowerManagerInternal() { return mMockPowerManagerInternal; } @Override boolean isSmallBatteryDevice() { return mIsSmallBatteryDevice; }; } private static final int UID_1 = Process.FIRST_APPLICATION_UID + 1; Loading Loading @@ -145,11 +137,7 @@ public class ForceAppStandbyTrackerTest { private Consumer<PowerSaveState> mPowerSaveObserver; private BroadcastReceiver mReceiver; private MockContentResolver mMockContentResolver; private FakeSettingsProvider mFakeSettingsProvider; private boolean mPowerSaveMode; private boolean mIsSmallBatteryDevice; private final ArraySet<Pair<Integer, String>> mRestrictedPackages = new ArraySet(); Loading Loading @@ -186,6 +174,7 @@ public class ForceAppStandbyTrackerTest { } private void callStart(ForceAppStandbyTrackerTestable instance) throws RemoteException { // Set up functions that start() calls. when(mMockPowerManagerInternal.getLowPowerState(eq(ServiceType.FORCE_ALL_APPS_STANDBY))) .thenAnswer(inv -> getPowerSaveState()); Loading @@ -193,11 +182,6 @@ public class ForceAppStandbyTrackerTest { any(int[].class) )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>()); mMockContentResolver = new MockContentResolver(); mFakeSettingsProvider = new FakeSettingsProvider(); when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver); mMockContentResolver.addProvider(Settings.AUTHORITY, mFakeSettingsProvider); // Call start. instance.start(); Loading @@ -224,6 +208,7 @@ public class ForceAppStandbyTrackerTest { verify(mMockPowerManagerInternal).registerLowPowerModeObserver( eq(ServiceType.FORCE_ALL_APPS_STANDBY), powerSaveObserverCaptor.capture()); verify(mMockContext).registerReceiver( receiverCaptor.capture(), any(IntentFilter.class)); Loading @@ -236,7 +221,6 @@ public class ForceAppStandbyTrackerTest { assertNotNull(mAppOpsCallback); assertNotNull(mPowerSaveObserver); assertNotNull(mReceiver); assertNotNull(instance.mFlagsObserver); } private void setAppOps(int uid, String packageName, boolean restrict) throws RemoteException { Loading Loading @@ -838,33 +822,6 @@ public class ForceAppStandbyTrackerTest { assertTrue(instance.isRunAnyInBackgroundAppOpsAllowed(UID_10_2, PACKAGE_2)); } @Test public void testSmallBatteryAndCharging() throws Exception { // This is a small battery device mIsSmallBatteryDevice = true; final ForceAppStandbyTrackerTestable instance = newInstance(); callStart(instance); assertFalse(instance.isForceAllAppsStandbyEnabled()); // Setting/experiment for all app standby for small battery is enabled Global.putInt(mMockContentResolver, Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, 1); instance.mFlagsObserver.onChange(true, Global.getUriFor(Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED)); assertTrue(instance.isForceAllAppsStandbyEnabled()); // When battery is charging, force app standby is disabled Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING); mReceiver.onReceive(mMockContext, intent); assertFalse(instance.isForceAllAppsStandbyEnabled()); // When battery stops charging, force app standby is enabled intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_DISCHARGING); mReceiver.onReceive(mMockContext, intent); assertTrue(instance.isForceAllAppsStandbyEnabled()); } static int[] array(int... appIds) { Arrays.sort(appIds); return appIds; Loading