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

Commit 939bfbbe authored by Yanye Li's avatar Yanye Li
Browse files

Power: Add args for sleep/wakeup cmd to disable wakelock

PowerManagerService has a new flag to force wakelocks
to be disabled and we should be able to test it with
sleep/wakeup cmd as it will be a common suspend journey.

Add --disable-wakelocks arg to sleep cmd and
--restore-wakelocks arg to wakeup cmd for that. Former
will set the force flag to true before suspending and
latter will set the flag to false after resuming. It's
named as restore as it does not necessarily re-enable
wakelocks that are disabled by other features/flags.

Bug: 410932789
Test: Manually acquire a wakelock & verify these
      cmd power sleep --disable-wakelocks
      cmd power wakeup --restore-wakelocks
      cmd power wakeup 10000 --restore-wakelocks
Flag: EXEMPT test
Change-Id: Ia94aee3412380042b26d80d57bd2b660cfa12521
parent aefa923b
Loading
Loading
Loading
Loading
+44 −13
Original line number Diff line number Diff line
@@ -45,17 +45,10 @@ class PowerManagerShellCommand extends ShellCommand {

    private final Context mContext;
    private final PowerManagerService.BinderService mService;
    private final IAlarmListener mAlarmListener;
    private IAlarmManager mAlarmManager;

    private SparseArray<WakeLock> mProxWakelocks = new SparseArray<>();

    PowerManagerShellCommand(Context context, PowerManagerService.BinderService service) {
        mContext = context;
        mService = service;
        mAlarmManager =
            IAlarmManager.Stub.asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
        mAlarmListener = new IAlarmListener.Stub() {
    class PowerManagerShellCommandAlarmListener extends IAlarmListener.Stub {
            public boolean restoreWakelocks = false;
            @Override
            public void doAlarm(IAlarmCompleteListener callback) throws RemoteException {
                mService.wakeUp(
@@ -63,8 +56,23 @@ class PowerManagerShellCommand extends ShellCommand {
                        PowerManager.WAKE_REASON_APPLICATION,
                        "PowerManagerShellCommand",
                        mContext.getOpPackageName());
                if (restoreWakelocks) {
                    PowerManagerInternal pmInternal =
                            LocalServices.getService(PowerManagerInternal.class);
                    pmInternal.setForceDisableWakelocks(false);
                }
            }
        };
    }
    private final PowerManagerShellCommandAlarmListener mAlarmListener;

    private SparseArray<WakeLock> mProxWakelocks = new SparseArray<>();

    PowerManagerShellCommand(Context context, PowerManagerService.BinderService service) {
        mContext = context;
        mService = service;
        mAlarmManager =
            IAlarmManager.Stub.asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
        mAlarmListener = new PowerManagerShellCommandAlarmListener();
    }

    @Override
@@ -224,6 +232,11 @@ class PowerManagerShellCommand extends ShellCommand {
    }

    private int runSleep() {
        boolean disableWakelocks = "--disable-wakelocks".equals(getNextArg());
        if (disableWakelocks) {
            PowerManagerInternal pmInternal = LocalServices.getService(PowerManagerInternal.class);
            pmInternal.setForceDisableWakelocks(true);
        }
        try {
            mService.goToSleep(
                    SystemClock.uptimeMillis(),
@@ -239,7 +252,16 @@ class PowerManagerShellCommand extends ShellCommand {

    private int runWakeUp() {
        final PrintWriter pw = getOutPrintWriter();
        String delay = getNextArg();
        String delay = null;
        boolean restoreWakelocks = false;
        while (peekNextArg() != null) {
            String arg = getNextArg();
            if (arg.equals("--restore-wakelocks")) {
                restoreWakelocks = true;
            } else if (arg.chars().allMatch(Character::isDigit)) {
                delay = arg;
            }
        }
        if (delay == null) {
            try {
                mService.wakeUp(
@@ -251,6 +273,11 @@ class PowerManagerShellCommand extends ShellCommand {
                pw.println("Error: " + e);
                return -1;
            }
            if (restoreWakelocks) {
                PowerManagerInternal pmInternal =
                        LocalServices.getService(PowerManagerInternal.class);
                pmInternal.setForceDisableWakelocks(false);
            }
        } else {
            long delayMillis;
            try {
@@ -282,6 +309,7 @@ class PowerManagerShellCommand extends ShellCommand {
                }
                pw.println("Schedule an alarm to wakeup in " + delayMillis +
                        " ms, on behalf of " + callingPackage.getPackageName());
                mAlarmListener.restoreWakelocks = restoreWakelocks;
                mAlarmManager.set(callingPackage.getPackageName(),
                        AlarmManager.RTC_WAKEUP, wakeUpTime,
                        0, 0, AlarmManager.FLAG_PRIORITIZE,
@@ -321,11 +349,14 @@ class PowerManagerShellCommand extends ShellCommand {
        pw.println("    created by set-prox including their held status.");
        pw.println("  set-face-down-detector [true|false]");
        pw.println("    sets whether we use face down detector timeouts or not");
        pw.println("  sleep");
        pw.println("  sleep (--disable-wakelocks)");
        pw.println("    requests to sleep the device");
        pw.println("  wakeup <delay>");
        pw.println("      --disable-wakelocks: Force disable wakelocks before going to sleep.");
        pw.println("  wakeup (<delay>) (--restore-wakelocks)");
        pw.println("    requests to wake up the device. If a delay of milliseconds is specified,");
        pw.println("    alarm manager will schedule a wake up after the delay.");
        pw.println("      --restore-wakelocks: Restore force-disabled wakelocks after wakeup.");
        pw.println("        It will not restore wakelocks that are generically disabled.");

        pw.println();
        Intent.printIntentArgsHelp(pw , "");