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

Commit 4845efb6 authored by Robert Horvath's avatar Robert Horvath
Browse files

Add TestApi wakelock flag to have system acquire wakelock

Allows CTS tests to test power restrictions that disable wakelocks
without the system suspending (since system-wakelocks are exempt).

Bug: 190822356
Test: atest LowPowerStandbyTest
Change-Id: I91f44ae93480be992151d845175606fb66ecb127
parent 287a3a7b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1714,6 +1714,7 @@ package android.os {

  public final class PowerManager {
    field public static final String ACTION_ENHANCED_DISCHARGE_PREDICTION_CHANGED = "android.os.action.ENHANCED_DISCHARGE_PREDICTION_CHANGED";
    field @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public static final int SYSTEM_WAKELOCK = -2147483648; // 0x80000000
  }

  public class Process {
+11 −0
Original line number Diff line number Diff line
@@ -215,6 +215,17 @@ public final class PowerManager {
     */
    public static final int UNIMPORTANT_FOR_LOGGING = 0x40000000;

    /**
     * Wake lock flag: This wake lock should be held by the system.
     *
     * <p>Meant to allow tests to keep the device awake even when power restrictions are active.
     *
     * @hide
     */
    @TestApi
    @RequiresPermission(android.Manifest.permission.DEVICE_POWER)
    public static final int SYSTEM_WAKELOCK = 0x80000000;

    /**
     * Flag for {@link WakeLock#release WakeLock.release(int)}: Defer releasing a
     * {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor
+2 −0
Original line number Diff line number Diff line
@@ -211,6 +211,8 @@ message WakeLockProto {
        // When this wake lock is released, poke the user activity timer
        // so the screen stays on for a little longer.
        optional bool is_on_after_release = 2;
        // The wakelock is held by the system server on request by another app.
        optional bool system_wakelock = 3;
    }

    optional .android.os.WakeLockLevelEnum lock_level = 1;
+21 −2
Original line number Diff line number Diff line
@@ -5155,6 +5155,8 @@ public final class PowerManagerService extends SystemService
                    (mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP)!=0);
            proto.write(WakeLockProto.WakeLockFlagsProto.IS_ON_AFTER_RELEASE,
                    (mFlags & PowerManager.ON_AFTER_RELEASE)!=0);
            proto.write(WakeLockProto.WakeLockFlagsProto.SYSTEM_WAKELOCK,
                    (mFlags & PowerManager.SYSTEM_WAKELOCK) != 0);
            proto.end(wakeLockFlagsToken);

            proto.write(WakeLockProto.IS_DISABLED, mDisabled);
@@ -5201,6 +5203,9 @@ public final class PowerManagerService extends SystemService
            if ((mFlags & PowerManager.ON_AFTER_RELEASE) != 0) {
                result += " ON_AFTER_RELEASE";
            }
            if ((mFlags & PowerManager.SYSTEM_WAKELOCK) != 0) {
                result += " SYSTEM_WAKELOCK";
            }
            return result;
        }
    }
@@ -5362,8 +5367,22 @@ public final class PowerManagerService extends SystemService
                ws = null;
            }

            final int uid = Binder.getCallingUid();
            final int pid = Binder.getCallingPid();
            int uid = Binder.getCallingUid();
            int pid = Binder.getCallingPid();

            if ((flags & PowerManager.SYSTEM_WAKELOCK) != 0) {
                mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
                        null);
                WorkSource workSource = new WorkSource(Binder.getCallingUid(), packageName);
                if (ws != null && !ws.isEmpty()) {
                    workSource.add(ws);
                }
                ws = workSource;

                uid = Process.myUid();
                pid = Process.myPid();
            }

            final long ident = Binder.clearCallingIdentity();
            try {
                acquireWakeLockInternal(lock, displayId, flags, tag, packageName, ws, historyTag,
+7 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ final class WakeLockLog {
     */
    private static final int FLAG_ON_AFTER_RELEASE = 0x8;
    private static final int FLAG_ACQUIRE_CAUSES_WAKEUP = 0x10;
    private static final int FLAG_SYSTEM_WAKELOCK = 0x20;

    private static final int MASK_LOWER_6_BITS = 0x3F;
    private static final int MASK_LOWER_7_BITS = 0x7F;
@@ -296,6 +297,9 @@ final class WakeLockLog {
        if ((flags & PowerManager.ON_AFTER_RELEASE) != 0) {
            newFlags |= FLAG_ON_AFTER_RELEASE;
        }
        if ((flags & PowerManager.SYSTEM_WAKELOCK) != 0) {
            newFlags |= FLAG_SYSTEM_WAKELOCK;
        }
        return newFlags;
    }

@@ -455,6 +459,9 @@ final class WakeLockLog {
            if ((flags & FLAG_ACQUIRE_CAUSES_WAKEUP) == FLAG_ACQUIRE_CAUSES_WAKEUP) {
                sb.append(",acq-causes-wake");
            }
            if ((flags & FLAG_SYSTEM_WAKELOCK) == FLAG_SYSTEM_WAKELOCK) {
                sb.append(",system-wakelock");
            }
        }
    }

Loading