Merge "Add internal API to PowerManager which allows napping when device is asleep." into tm-qpr-dev
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user