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

Commit 2baa9ab4 authored by Nancy Zheng's avatar Nancy Zheng Committed by Android (Google) Code Review
Browse files

Merge "Add setting/experiment for small battery devices to have all forced app...

Merge "Add setting/experiment for small battery devices to have all forced app standby enabled except for when the device is charging."
parents 13e7ad1e 9a60382b
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -9851,6 +9851,15 @@ public final class Settings {
         */
         */
        public static final String FORCED_APP_STANDBY_ENABLED = "forced_app_standby_enabled";
        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.
         * Whether or not Network Watchlist feature is enabled.
         * Type: int (0 for false, 1 for true)
         * Type: int (0 for false, 1 for true)
+9 −0
Original line number Original line Diff line number Diff line
@@ -41,4 +41,13 @@ message ForceAppStandbyTrackerProto {


  // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
  // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
  repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5;
  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;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -212,6 +212,7 @@ public class SettingsBackupTest {
                    Settings.Global.FANCY_IME_ANIMATIONS,
                    Settings.Global.FANCY_IME_ANIMATIONS,
                    Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
                    Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
                    Settings.Global.FORCED_APP_STANDBY_ENABLED,
                    Settings.Global.FORCED_APP_STANDBY_ENABLED,
                    Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED,
                    Settings.Global.FSTRIM_MANDATORY_INTERVAL,
                    Settings.Global.FSTRIM_MANDATORY_INTERVAL,
                    Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
                    Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
                    Settings.Global.GLOBAL_HTTP_PROXY_HOST,
                    Settings.Global.GLOBAL_HTTP_PROXY_HOST,
+132 −32
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
@@ -89,6 +91,9 @@ public class ForceAppStandbyTracker {


    private final MyHandler mHandler;
    private final MyHandler mHandler;


    @VisibleForTesting
    FeatureFlagsObserver mFlagsObserver;

    /**
    /**
     * Pair of (uid (not user-id), packageName) with OP_RUN_ANY_IN_BACKGROUND *not* allowed.
     * Pair of (uid (not user-id), packageName) with OP_RUN_ANY_IN_BACKGROUND *not* allowed.
     */
     */
@@ -111,13 +116,32 @@ public class ForceAppStandbyTracker {
    boolean mStarted;
    boolean mStarted;


    @GuardedBy("mLock")
    @GuardedBy("mLock")
    boolean mForceAllAppsStandby;   // True if device is in extreme battery saver mode
    boolean mIsCharging;


    @GuardedBy("mLock")
    @GuardedBy("mLock")
    boolean mForcedAppStandbyEnabled;   // True if the forced app standby feature is enabled
    boolean mBatterySaverEnabled;


    private class FeatureFlagObserver extends ContentObserver {
    /**
        FeatureFlagObserver() {
     * 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() {
            super(null);
            super(null);
        }
        }


@@ -125,6 +149,9 @@ public class ForceAppStandbyTracker {
            mContext.getContentResolver().registerContentObserver(
            mContext.getContentResolver().registerContentObserver(
                    Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED),
                    Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED),
                    false, this);
                    false, this);

            mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor(
                    Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED), false, this);
        }
        }


        boolean isForcedAppStandbyEnabled() {
        boolean isForcedAppStandbyEnabled() {
@@ -132,8 +159,14 @@ public class ForceAppStandbyTracker {
                    Settings.Global.FORCED_APP_STANDBY_ENABLED, 1) == 1;
                    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
        @Override
        public void onChange(boolean selfChange) {
        public void onChange(boolean selfChange, Uri uri) {
            if (Settings.Global.getUriFor(Settings.Global.FORCED_APP_STANDBY_ENABLED).equals(uri)) {
                final boolean enabled = isForcedAppStandbyEnabled();
                final boolean enabled = isForcedAppStandbyEnabled();
                synchronized (mLock) {
                synchronized (mLock) {
                    if (mForcedAppStandbyEnabled == enabled) {
                    if (mForcedAppStandbyEnabled == enabled) {
@@ -145,7 +178,24 @@ public class ForceAppStandbyTracker {
                                "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled);
                                "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled);
                    }
                    }
                }
                }
            mHandler.notifyFeatureFlagChanged();
                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);
            }
        }
        }
    }
    }


@@ -286,9 +336,11 @@ public class ForceAppStandbyTracker {
            mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager());
            mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager());
            mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService());
            mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService());
            mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal());
            mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal());
            final FeatureFlagObserver flagObserver = new FeatureFlagObserver();
            mFlagsObserver = new FeatureFlagsObserver();
            flagObserver.register();
            mFlagsObserver.register();
            mForcedAppStandbyEnabled = flagObserver.isForcedAppStandbyEnabled();
            mForcedAppStandbyEnabled = mFlagsObserver.isForcedAppStandbyEnabled();
            mForceAllAppStandbyForSmallBattery =
                    mFlagsObserver.isForcedAppStandbyForSmallBatteryEnabled();


            try {
            try {
                mIActivityManager.registerUidObserver(new UidObserver(),
                mIActivityManager.registerUidObserver(new UidObserver(),
@@ -303,16 +355,24 @@ public class ForceAppStandbyTracker {


            IntentFilter filter = new IntentFilter();
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_USER_REMOVED);
            filter.addAction(Intent.ACTION_USER_REMOVED);
            filter.addAction(Intent.ACTION_BATTERY_CHANGED);
            mContext.registerReceiver(new MyReceiver(), filter);
            mContext.registerReceiver(new MyReceiver(), filter);


            refreshForcedAppStandbyUidPackagesLocked();
            refreshForcedAppStandbyUidPackagesLocked();


            mPowerManagerInternal.registerLowPowerModeObserver(
            mPowerManagerInternal.registerLowPowerModeObserver(
                    ServiceType.FORCE_ALL_APPS_STANDBY,
                    ServiceType.FORCE_ALL_APPS_STANDBY,
                    (state) -> updateForceAllAppsStandby(state.batterySaverEnabled));
                    (state) -> {
                        synchronized (mLock) {
                            mBatterySaverEnabled = state.batterySaverEnabled;
                            updateForceAllAppStandbyState();
                        }
                    });

            mBatterySaverEnabled = mPowerManagerInternal.getLowPowerState(
                    ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled;


            updateForceAllAppsStandby(mPowerManagerInternal.getLowPowerState(
            updateForceAllAppStandbyState();
                    ServiceType.FORCE_ALL_APPS_STANDBY).batterySaverEnabled);
        }
        }
    }
    }


@@ -337,6 +397,11 @@ public class ForceAppStandbyTracker {
        return LocalServices.getService(PowerManagerInternal.class);
        return LocalServices.getService(PowerManagerInternal.class);
    }
    }


    @VisibleForTesting
    boolean isSmallBatteryDevice() {
        return ActivityManager.isSmallBatteryDevice();
    }

    /**
    /**
     * Update {@link #mRunAnyRestrictedPackages} with the current app ops state.
     * Update {@link #mRunAnyRestrictedPackages} with the current app ops state.
     */
     */
@@ -366,11 +431,23 @@ 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.
     * Update {@link #mForceAllAppsStandby} and notifies the listeners.
     */
     */
    void updateForceAllAppsStandby(boolean enable) {
    private void toggleForceAllAppsStandbyLocked(boolean enable) {
        synchronized (mLock) {
        if (enable == mForceAllAppsStandby) {
        if (enable == mForceAllAppsStandby) {
            return;
            return;
        }
        }
@@ -378,7 +455,6 @@ public class ForceAppStandbyTracker {


        mHandler.notifyForceAllAppsStandbyChanged();
        mHandler.notifyForceAllAppsStandbyChanged();
    }
    }
    }


    private int findForcedAppStandbyUidPackageIndexLocked(int uid, @NonNull String packageName) {
    private int findForcedAppStandbyUidPackageIndexLocked(int uid, @NonNull String packageName) {
        final int size = mRunAnyRestrictedPackages.size();
        final int size = mRunAnyRestrictedPackages.size();
@@ -512,6 +588,13 @@ public class ForceAppStandbyTracker {
                if (userId > 0) {
                if (userId > 0) {
                    mHandler.doUserRemoved(userId);
                    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();
            }
            }
        }
        }
    }
    }
@@ -530,7 +613,7 @@ public class ForceAppStandbyTracker {
        private static final int MSG_TEMP_WHITELIST_CHANGED = 5;
        private static final int MSG_TEMP_WHITELIST_CHANGED = 5;
        private static final int MSG_FORCE_ALL_CHANGED = 6;
        private static final int MSG_FORCE_ALL_CHANGED = 6;
        private static final int MSG_USER_REMOVED = 7;
        private static final int MSG_USER_REMOVED = 7;
        private static final int MSG_FEATURE_FLAG_CHANGED = 8;
        private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8;


        public MyHandler(Looper looper) {
        public MyHandler(Looper looper) {
            super(looper);
            super(looper);
@@ -560,8 +643,8 @@ public class ForceAppStandbyTracker {
            obtainMessage(MSG_FORCE_ALL_CHANGED).sendToTarget();
            obtainMessage(MSG_FORCE_ALL_CHANGED).sendToTarget();
        }
        }


        public void notifyFeatureFlagChanged() {
        public void notifyForcedAppStandbyFeatureFlagChanged() {
            obtainMessage(MSG_FEATURE_FLAG_CHANGED).sendToTarget();
            obtainMessage(MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED).sendToTarget();
        }
        }


        public void doUserRemoved(int userId) {
        public void doUserRemoved(int userId) {
@@ -615,7 +698,7 @@ public class ForceAppStandbyTracker {
                        l.onForceAllAppsStandbyChanged(sender);
                        l.onForceAllAppsStandbyChanged(sender);
                    }
                    }
                    return;
                    return;
                case MSG_FEATURE_FLAG_CHANGED:
                case MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED:
                    // Feature flag for forced app standby changed.
                    // Feature flag for forced app standby changed.
                    final boolean unblockAlarms;
                    final boolean unblockAlarms;
                    synchronized (mLock) {
                    synchronized (mLock) {
@@ -838,6 +921,18 @@ public class ForceAppStandbyTracker {
            pw.print("Force all apps standby: ");
            pw.print("Force all apps standby: ");
            pw.println(isForceAllAppsStandbyEnabled());
            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(indent);
            pw.print("Foreground uids: [");
            pw.print("Foreground uids: [");


@@ -877,6 +972,11 @@ public class ForceAppStandbyTracker {
            final long token = proto.start(fieldId);
            final long token = proto.start(fieldId);


            proto.write(ForceAppStandbyTrackerProto.FORCE_ALL_APPS_STANDBY, mForceAllAppsStandby);
            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++) {
            for (int i = 0; i < mForegroundUids.size(); i++) {
                if (mForegroundUids.valueAt(i)) {
                if (mForegroundUids.valueAt(i)) {
+46 −3
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.PowerManager.ServiceType;
import android.os.PowerManager.ServiceType;
@@ -50,13 +51,17 @@ import android.os.PowerSaveState;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.support.test.filters.SmallTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Pair;


import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IAppOpsService;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.ForceAppStandbyTracker.Listener;
import com.android.server.ForceAppStandbyTracker.Listener;


import org.junit.Before;
import org.junit.Before;
@@ -102,6 +107,9 @@ public class ForceAppStandbyTrackerTest {
        PowerManagerInternal injectPowerManagerInternal() {
        PowerManagerInternal injectPowerManagerInternal() {
            return mMockPowerManagerInternal;
            return mMockPowerManagerInternal;
        }
        }

        @Override
        boolean isSmallBatteryDevice() { return mIsSmallBatteryDevice; };
    }
    }


    private static final int UID_1 = Process.FIRST_APPLICATION_UID + 1;
    private static final int UID_1 = Process.FIRST_APPLICATION_UID + 1;
@@ -137,7 +145,11 @@ public class ForceAppStandbyTrackerTest {
    private Consumer<PowerSaveState> mPowerSaveObserver;
    private Consumer<PowerSaveState> mPowerSaveObserver;
    private BroadcastReceiver mReceiver;
    private BroadcastReceiver mReceiver;


    private MockContentResolver mMockContentResolver;
    private FakeSettingsProvider mFakeSettingsProvider;

    private boolean mPowerSaveMode;
    private boolean mPowerSaveMode;
    private boolean mIsSmallBatteryDevice;


    private final ArraySet<Pair<Integer, String>> mRestrictedPackages = new ArraySet();
    private final ArraySet<Pair<Integer, String>> mRestrictedPackages = new ArraySet();


@@ -174,7 +186,6 @@ public class ForceAppStandbyTrackerTest {
    }
    }


    private void callStart(ForceAppStandbyTrackerTestable instance) throws RemoteException {
    private void callStart(ForceAppStandbyTrackerTestable instance) throws RemoteException {

        // Set up functions that start() calls.
        // Set up functions that start() calls.
        when(mMockPowerManagerInternal.getLowPowerState(eq(ServiceType.FORCE_ALL_APPS_STANDBY)))
        when(mMockPowerManagerInternal.getLowPowerState(eq(ServiceType.FORCE_ALL_APPS_STANDBY)))
                .thenAnswer(inv -> getPowerSaveState());
                .thenAnswer(inv -> getPowerSaveState());
@@ -182,6 +193,11 @@ public class ForceAppStandbyTrackerTest {
                any(int[].class)
                any(int[].class)
        )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>());
        )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>());


        mMockContentResolver = new MockContentResolver();
        mFakeSettingsProvider = new FakeSettingsProvider();
        when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver);
        mMockContentResolver.addProvider(Settings.AUTHORITY, mFakeSettingsProvider);

        // Call start.
        // Call start.
        instance.start();
        instance.start();


@@ -208,7 +224,6 @@ public class ForceAppStandbyTrackerTest {
        verify(mMockPowerManagerInternal).registerLowPowerModeObserver(
        verify(mMockPowerManagerInternal).registerLowPowerModeObserver(
                eq(ServiceType.FORCE_ALL_APPS_STANDBY),
                eq(ServiceType.FORCE_ALL_APPS_STANDBY),
                powerSaveObserverCaptor.capture());
                powerSaveObserverCaptor.capture());

        verify(mMockContext).registerReceiver(
        verify(mMockContext).registerReceiver(
                receiverCaptor.capture(), any(IntentFilter.class));
                receiverCaptor.capture(), any(IntentFilter.class));


@@ -221,6 +236,7 @@ public class ForceAppStandbyTrackerTest {
        assertNotNull(mAppOpsCallback);
        assertNotNull(mAppOpsCallback);
        assertNotNull(mPowerSaveObserver);
        assertNotNull(mPowerSaveObserver);
        assertNotNull(mReceiver);
        assertNotNull(mReceiver);
        assertNotNull(instance.mFlagsObserver);
    }
    }


    private void setAppOps(int uid, String packageName, boolean restrict) throws RemoteException {
    private void setAppOps(int uid, String packageName, boolean restrict) throws RemoteException {
@@ -822,6 +838,33 @@ public class ForceAppStandbyTrackerTest {
        assertTrue(instance.isRunAnyInBackgroundAppOpsAllowed(UID_10_2, PACKAGE_2));
        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) {
    static int[] array(int... appIds) {
        Arrays.sort(appIds);
        Arrays.sort(appIds);
        return appIds;
        return appIds;