Merge "Add internal API to PowerManager which allows napping when device is asleep." into tm-qpr-dev

This commit is contained in:
Lucas Silva
2022-10-17 18:34:46 +00:00
committed by Android (Google) Code Review
6 changed files with 49 additions and 22 deletions

View File

@@ -335,4 +335,10 @@ public abstract class PowerManagerInternal {
/** Allows power button to intercept a power key button press. */ /** Allows power button to intercept a power key button press. */
public abstract boolean interceptPowerKeyDown(KeyEvent event); public abstract boolean interceptPowerKeyDown(KeyEvent event);
/**
* Internal version of {@link android.os.PowerManager#nap} which allows for napping while the
* device is not awake.
*/
public abstract void nap(long eventTime, boolean allowWake);
} }

View File

@@ -246,8 +246,8 @@ public final class DreamManagerService extends SystemService {
// Because napping could cause the screen to turn off immediately if the dream // Because napping could cause the screen to turn off immediately if the dream
// cannot be started, we keep one eye open and gently poke user activity. // cannot be started, we keep one eye open and gently poke user activity.
long time = SystemClock.uptimeMillis(); long time = SystemClock.uptimeMillis();
mPowerManager.userActivity(time, true /*noChangeLights*/); mPowerManager.userActivity(time, /* noChangeLights= */ true);
mPowerManager.nap(time); mPowerManagerInternal.nap(time, /* allowWake= */ true);
} }
private void requestAwakenInternal(String reason) { private void requestAwakenInternal(String reason) {
@@ -637,7 +637,7 @@ public final class DreamManagerService extends SystemService {
@Nullable FileDescriptor err, @Nullable FileDescriptor err,
@NonNull String[] args, @Nullable ShellCallback callback, @NonNull String[] args, @Nullable ShellCallback callback,
@NonNull ResultReceiver resultReceiver) throws RemoteException { @NonNull ResultReceiver resultReceiver) throws RemoteException {
new DreamShellCommand(DreamManagerService.this, mPowerManager) new DreamShellCommand(DreamManagerService.this)
.exec(this, in, out, err, args, callback, resultReceiver); .exec(this, in, out, err, args, callback, resultReceiver);
} }

View File

@@ -18,10 +18,8 @@ package com.android.server.dreams;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.os.Binder; import android.os.Binder;
import android.os.PowerManager;
import android.os.Process; import android.os.Process;
import android.os.ShellCommand; import android.os.ShellCommand;
import android.os.SystemClock;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Slog; import android.util.Slog;
@@ -34,11 +32,9 @@ public class DreamShellCommand extends ShellCommand {
private static final boolean DEBUG = true; private static final boolean DEBUG = true;
private static final String TAG = "DreamShellCommand"; private static final String TAG = "DreamShellCommand";
private final @NonNull DreamManagerService mService; private final @NonNull DreamManagerService mService;
private final @NonNull PowerManager mPowerManager;
DreamShellCommand(@NonNull DreamManagerService service, @NonNull PowerManager powerManager) { DreamShellCommand(@NonNull DreamManagerService service) {
mService = service; mService = service;
mPowerManager = powerManager;
} }
@Override @Override
@@ -67,8 +63,6 @@ public class DreamShellCommand extends ShellCommand {
} }
private int startDreaming() { private int startDreaming() {
mPowerManager.wakeUp(SystemClock.uptimeMillis(),
PowerManager.WAKE_REASON_PLUGGED_IN, "shell:cmd:android.service.dreams:DREAM");
mService.requestStartDreamFromShell(); mService.requestStartDreamFromShell();
return 0; return 0;
} }

View File

@@ -229,8 +229,8 @@ public class PowerGroup {
} }
} }
boolean dreamLocked(long eventTime, int uid) { boolean dreamLocked(long eventTime, int uid, boolean allowWake) {
if (eventTime < mLastWakeTime || mWakefulness != WAKEFULNESS_AWAKE) { if (eventTime < mLastWakeTime || (!allowWake && mWakefulness != WAKEFULNESS_AWAKE)) {
return false; return false;
} }

View File

@@ -1924,6 +1924,13 @@ public final class PowerManagerService extends SystemService
} }
} }
private void napInternal(long eventTime, int uid, boolean allowWake) {
synchronized (mLock) {
dreamPowerGroupLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP),
eventTime, uid, allowWake);
}
}
private void onUserAttention() { private void onUserAttention() {
synchronized (mLock) { synchronized (mLock) {
if (userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), if (userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP),
@@ -2039,7 +2046,8 @@ public final class PowerManagerService extends SystemService
} }
@GuardedBy("mLock") @GuardedBy("mLock")
private boolean dreamPowerGroupLocked(PowerGroup powerGroup, long eventTime, int uid) { private boolean dreamPowerGroupLocked(PowerGroup powerGroup, long eventTime, int uid,
boolean allowWake) {
if (DEBUG_SPEW) { if (DEBUG_SPEW) {
Slog.d(TAG, "dreamPowerGroup: groupId=" + powerGroup.getGroupId() + ", eventTime=" Slog.d(TAG, "dreamPowerGroup: groupId=" + powerGroup.getGroupId() + ", eventTime="
+ eventTime + ", uid=" + uid); + eventTime + ", uid=" + uid);
@@ -2047,7 +2055,7 @@ public final class PowerManagerService extends SystemService
if (!mBootCompleted || !mSystemReady) { if (!mBootCompleted || !mSystemReady) {
return false; return false;
} }
return powerGroup.dreamLocked(eventTime, uid); return powerGroup.dreamLocked(eventTime, uid, allowWake);
} }
@GuardedBy("mLock") @GuardedBy("mLock")
@@ -3099,7 +3107,8 @@ public final class PowerManagerService extends SystemService
changed = sleepPowerGroupLocked(powerGroup, time, changed = sleepPowerGroupLocked(powerGroup, time,
PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, Process.SYSTEM_UID); PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, Process.SYSTEM_UID);
} else if (shouldNapAtBedTimeLocked()) { } else if (shouldNapAtBedTimeLocked()) {
changed = dreamPowerGroupLocked(powerGroup, time, Process.SYSTEM_UID); changed = dreamPowerGroupLocked(powerGroup, time,
Process.SYSTEM_UID, /* allowWake= */ false);
} else { } else {
changed = dozePowerGroupLocked(powerGroup, time, changed = dozePowerGroupLocked(powerGroup, time,
PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, Process.SYSTEM_UID); PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, Process.SYSTEM_UID);
@@ -5716,10 +5725,7 @@ public final class PowerManagerService extends SystemService
final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid();
final long ident = Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity();
try { try {
synchronized (mLock) { napInternal(eventTime, uid, /* allowWake= */ false);
dreamPowerGroupLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP),
eventTime, uid);
}
} finally { } finally {
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
} }
@@ -6647,6 +6653,11 @@ public final class PowerManagerService extends SystemService
public boolean interceptPowerKeyDown(KeyEvent event) { public boolean interceptPowerKeyDown(KeyEvent event) {
return interceptPowerKeyDownInternal(event); return interceptPowerKeyDownInternal(event);
} }
@Override
public void nap(long eventTime, boolean allowWake) {
napInternal(eventTime, Process.SYSTEM_UID, allowWake);
}
} }
/** /**

View File

@@ -116,7 +116,7 @@ public class PowerGroupTest {
@Test @Test
public void testDreamPowerGroup() { public void testDreamPowerGroup() {
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
mPowerGroup.dreamLocked(TIMESTAMP1, UID); mPowerGroup.dreamLocked(TIMESTAMP1, UID, /* allowWake= */ false);
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
assertThat(mPowerGroup.isSandmanSummonedLocked()).isTrue(); assertThat(mPowerGroup.isSandmanSummonedLocked()).isTrue();
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID), verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
@@ -172,7 +172,7 @@ public class PowerGroupTest {
eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ isNull(), eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ isNull(),
/* details= */ isNull()); /* details= */ isNull());
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
assertThat(mPowerGroup.dreamLocked(TIMESTAMP2, UID)).isFalse(); assertThat(mPowerGroup.dreamLocked(TIMESTAMP2, UID, /* allowWake= */ false)).isFalse();
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
verify(mWakefulnessCallbackMock, never()).onWakefulnessChangedLocked( verify(mWakefulnessCallbackMock, never()).onWakefulnessChangedLocked(
eq(GROUP_ID), /* wakefulness= */ eq(WAKEFULNESS_DREAMING), eq(TIMESTAMP2), eq(GROUP_ID), /* wakefulness= */ eq(WAKEFULNESS_DREAMING), eq(TIMESTAMP2),
@@ -180,6 +180,22 @@ public class PowerGroupTest {
/* details= */ any()); /* details= */ any());
} }
@Test
public void testDreamPowerGroupWhenNotAwakeShouldWake() {
mPowerGroup.dozeLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_TIMEOUT);
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
eq(WAKEFULNESS_DOZING), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_TIMEOUT),
eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ isNull(),
/* details= */ isNull());
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
assertThat(mPowerGroup.dreamLocked(TIMESTAMP2, UID, /* allowWake= */ true)).isTrue();
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(
eq(GROUP_ID), /* wakefulness= */ eq(WAKEFULNESS_DREAMING), eq(TIMESTAMP2),
/* reason= */ anyInt(), eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ any(),
/* details= */ any());
}
@Test @Test
public void testLastWakeAndSleepTimeIsUpdated() { public void testLastWakeAndSleepTimeIsUpdated() {
assertThat(mPowerGroup.getLastWakeTimeLocked()).isEqualTo(TIMESTAMP_CREATE); assertThat(mPowerGroup.getLastWakeTimeLocked()).isEqualTo(TIMESTAMP_CREATE);
@@ -514,7 +530,7 @@ public class PowerGroupTest {
.setBatterySaverEnabled(batterySaverEnabled) .setBatterySaverEnabled(batterySaverEnabled)
.setBrightnessFactor(brightnessFactor) .setBrightnessFactor(brightnessFactor)
.build(); .build();
mPowerGroup.dreamLocked(TIMESTAMP1, UID); mPowerGroup.dreamLocked(TIMESTAMP1, UID, /* allowWake= */ false);
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
mPowerGroup.setWakeLockSummaryLocked(WAKE_LOCK_SCREEN_BRIGHT); mPowerGroup.setWakeLockSummaryLocked(WAKE_LOCK_SCREEN_BRIGHT);
mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS, mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,