Merge "Move logic from PMS#wakePowerGroupLocked() into PowerGroup#wakeUpLocked()." into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
abcfe41ed2
@@ -22,6 +22,8 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
|
|||||||
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
|
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
|
||||||
import static android.os.PowerManagerInternal.isInteractive;
|
import static android.os.PowerManagerInternal.isInteractive;
|
||||||
|
|
||||||
|
import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN;
|
||||||
|
import static com.android.server.power.PowerManagerService.TRACE_SCREEN_ON;
|
||||||
import static com.android.server.power.PowerManagerService.USER_ACTIVITY_SCREEN_BRIGHT;
|
import static com.android.server.power.PowerManagerService.USER_ACTIVITY_SCREEN_BRIGHT;
|
||||||
import static com.android.server.power.PowerManagerService.WAKE_LOCK_DOZE;
|
import static com.android.server.power.PowerManagerService.WAKE_LOCK_DOZE;
|
||||||
import static com.android.server.power.PowerManagerService.WAKE_LOCK_DRAW;
|
import static com.android.server.power.PowerManagerService.WAKE_LOCK_DRAW;
|
||||||
@@ -30,12 +32,14 @@ import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIG
|
|||||||
import android.hardware.display.DisplayManagerInternal;
|
import android.hardware.display.DisplayManagerInternal;
|
||||||
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
|
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.os.PowerManagerInternal;
|
||||||
import android.os.PowerSaveState;
|
import android.os.PowerSaveState;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.util.LatencyTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to store power related requests to every display in a
|
* Used to store power related requests to every display in a
|
||||||
@@ -197,6 +201,32 @@ public class PowerGroup {
|
|||||||
mIsSandmanSummoned = isSandmanSummoned;
|
mIsSandmanSummoned = isSandmanSummoned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wakeUpLocked(long eventTime, @PowerManager.WakeReason int reason, String details, int uid,
|
||||||
|
String opPackageName, int opUid, LatencyTracker latencyTracker) {
|
||||||
|
if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakePowerGroup" + mGroupId);
|
||||||
|
try {
|
||||||
|
Slog.i(TAG, "Waking up power group from "
|
||||||
|
+ PowerManagerInternal.wakefulnessToString(mWakefulness)
|
||||||
|
+ " (groupId=" + mGroupId
|
||||||
|
+ ", uid=" + uid
|
||||||
|
+ ", reason=" + PowerManager.wakeReasonToString(reason)
|
||||||
|
+ ", details=" + details
|
||||||
|
+ ")...");
|
||||||
|
Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, mGroupId);
|
||||||
|
// The instrument will be timed out automatically after 2 seconds.
|
||||||
|
latencyTracker.onActionStart(ACTION_TURN_ON_SCREEN, String.valueOf(mGroupId));
|
||||||
|
|
||||||
|
setWakefulnessLocked(WAKEFULNESS_AWAKE, eventTime, uid, reason, opUid,
|
||||||
|
opPackageName, details);
|
||||||
|
} finally {
|
||||||
|
Trace.traceEnd(Trace.TRACE_TAG_POWER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean dreamLocked(long eventTime, int uid) {
|
boolean dreamLocked(long eventTime, int uid) {
|
||||||
if (eventTime < mLastWakeTime || mWakefulness != WAKEFULNESS_AWAKE) {
|
if (eventTime < mLastWakeTime || mWakefulness != WAKEFULNESS_AWAKE) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ public final class PowerManagerService extends SystemService
|
|||||||
private static final String REASON_LOW_BATTERY = "shutdown,battery";
|
private static final String REASON_LOW_BATTERY = "shutdown,battery";
|
||||||
private static final String REASON_BATTERY_THERMAL_STATE = "shutdown,thermal,battery";
|
private static final String REASON_BATTERY_THERMAL_STATE = "shutdown,thermal,battery";
|
||||||
|
|
||||||
private static final String TRACE_SCREEN_ON = "Screen turning on";
|
static final String TRACE_SCREEN_ON = "Screen turning on";
|
||||||
|
|
||||||
/** If turning screen on takes more than this long, we show a warning on logcat. */
|
/** If turning screen on takes more than this long, we show a warning on logcat. */
|
||||||
private static final int SCREEN_ON_LATENCY_WARNING_MS = 200;
|
private static final int SCREEN_ON_LATENCY_WARNING_MS = 200;
|
||||||
@@ -1945,45 +1945,15 @@ public final class PowerManagerService extends SystemService
|
|||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private void wakePowerGroupLocked(final PowerGroup powerGroup, long eventTime,
|
private void wakePowerGroupLocked(final PowerGroup powerGroup, long eventTime,
|
||||||
@WakeReason int reason, String details, int uid, String opPackageName, int opUid) {
|
@WakeReason int reason, String details, int uid, String opPackageName, int opUid) {
|
||||||
final int groupId = powerGroup.getGroupId();
|
|
||||||
if (DEBUG_SPEW) {
|
if (DEBUG_SPEW) {
|
||||||
Slog.d(TAG, "wakePowerGroupLocked: eventTime=" + eventTime
|
Slog.d(TAG, "wakePowerGroupLocked: eventTime=" + eventTime
|
||||||
+ ", groupId=" + groupId + ", uid=" + uid);
|
+ ", groupId=" + powerGroup.getGroupId() + ", uid=" + uid);
|
||||||
}
|
}
|
||||||
|
if (mForceSuspendActive || !mSystemReady) {
|
||||||
if (eventTime < powerGroup.getLastSleepTimeLocked() || mForceSuspendActive
|
|
||||||
|| !mSystemReady) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
powerGroup.wakeUpLocked(eventTime, reason, details, uid, opPackageName, opUid,
|
||||||
final int currentWakefulness = powerGroup.getWakefulnessLocked();
|
LatencyTracker.getInstance(mContext));
|
||||||
if (currentWakefulness == WAKEFULNESS_AWAKE) {
|
|
||||||
if (!mBootCompleted && sQuiescent) {
|
|
||||||
mDirty |= DIRTY_QUIESCENT;
|
|
||||||
updatePowerStateLocked();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Trace.traceBegin(Trace.TRACE_TAG_POWER, "powerOnDisplay");
|
|
||||||
try {
|
|
||||||
Slog.i(TAG, "Waking up power group from "
|
|
||||||
+ PowerManagerInternal.wakefulnessToString(currentWakefulness)
|
|
||||||
+ " (groupId=" + groupId
|
|
||||||
+ ", uid=" + uid
|
|
||||||
+ ", reason=" + PowerManager.wakeReasonToString(reason)
|
|
||||||
+ ", details=" + details
|
|
||||||
+ ")...");
|
|
||||||
Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, groupId);
|
|
||||||
// The instrument will be timed out automatically after 2 seconds.
|
|
||||||
LatencyTracker.getInstance(mContext)
|
|
||||||
.onActionStart(ACTION_TURN_ON_SCREEN, String.valueOf(groupId));
|
|
||||||
|
|
||||||
powerGroup.setWakefulnessLocked(WAKEFULNESS_AWAKE, eventTime, uid, reason, opUid,
|
|
||||||
opPackageName, details);
|
|
||||||
} finally {
|
|
||||||
Trace.traceEnd(Trace.TRACE_TAG_POWER);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
@@ -5531,6 +5501,11 @@ public final class PowerManagerService extends SystemService
|
|||||||
final long ident = Binder.clearCallingIdentity();
|
final long ident = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
|
if (!mBootCompleted && sQuiescent) {
|
||||||
|
mDirty |= DIRTY_QUIESCENT;
|
||||||
|
updatePowerStateLocked();
|
||||||
|
return;
|
||||||
|
}
|
||||||
wakePowerGroupLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), eventTime,
|
wakePowerGroupLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), eventTime,
|
||||||
reason, details, uid, opPackageName, uid);
|
reason, details, uid, opPackageName, uid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ import static android.hardware.display.DisplayManagerInternal.DisplayPowerReques
|
|||||||
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_VR;
|
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_VR;
|
||||||
import static android.os.PowerManager.GO_TO_SLEEP_REASON_APPLICATION;
|
import static android.os.PowerManager.GO_TO_SLEEP_REASON_APPLICATION;
|
||||||
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN;
|
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN;
|
||||||
|
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DEVICE_FOLD;
|
||||||
import static android.os.PowerManager.GO_TO_SLEEP_REASON_TIMEOUT;
|
import static android.os.PowerManager.GO_TO_SLEEP_REASON_TIMEOUT;
|
||||||
import static android.os.PowerManager.WAKE_REASON_GESTURE;
|
import static android.os.PowerManager.WAKE_REASON_GESTURE;
|
||||||
|
import static android.os.PowerManager.WAKE_REASON_PLUGGED_IN;
|
||||||
import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
|
import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
|
||||||
import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
|
import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
|
||||||
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
|
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
|
||||||
@@ -37,9 +39,11 @@ import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIG
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.ArgumentMatchers.isNull;
|
import static org.mockito.ArgumentMatchers.isNull;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import android.hardware.display.DisplayManagerInternal;
|
import android.hardware.display.DisplayManagerInternal;
|
||||||
@@ -47,6 +51,10 @@ import android.os.PowerManager;
|
|||||||
import android.os.PowerSaveState;
|
import android.os.PowerSaveState;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
|
||||||
|
import com.android.internal.util.LatencyTracker;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
@@ -89,14 +97,89 @@ public class PowerGroupTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDreamPowerGroupTriggersOnWakefulnessChangedCallback() {
|
public void testWakePowerGroup() {
|
||||||
|
mPowerGroup.sleepLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_APPLICATION);
|
||||||
|
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
||||||
|
eq(WAKEFULNESS_ASLEEP), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_APPLICATION),
|
||||||
|
eq(UID), /* opUid= */anyInt(), /* opPackageName= */ isNull(), /* details= */
|
||||||
|
isNull());
|
||||||
|
String details = "wake PowerGroup1";
|
||||||
|
LatencyTracker latencyTracker = LatencyTracker.getInstance(
|
||||||
|
InstrumentationRegistry.getInstrumentation().getContext());
|
||||||
|
mPowerGroup.wakeUpLocked(TIMESTAMP2, WAKE_REASON_PLUGGED_IN, details, UID,
|
||||||
|
/* opPackageName= */ null, /* opUid= */ 0, latencyTracker);
|
||||||
|
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
||||||
|
eq(WAKEFULNESS_AWAKE), eq(TIMESTAMP2), eq(WAKE_REASON_PLUGGED_IN), eq(UID),
|
||||||
|
/* opUid= */ anyInt(), /* opPackageName= */ isNull(), eq(details));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDreamPowerGroup() {
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
|
||||||
mPowerGroup.dreamLocked(TIMESTAMP1, UID);
|
mPowerGroup.dreamLocked(TIMESTAMP1, UID);
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
|
||||||
|
assertThat(mPowerGroup.isSandmanSummonedLocked()).isTrue();
|
||||||
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
||||||
eq(WAKEFULNESS_DREAMING), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_APPLICATION),
|
eq(WAKEFULNESS_DREAMING), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_APPLICATION),
|
||||||
eq(UID), /* opUid= */anyInt(), /* opPackageName= */ isNull(), /* details= */
|
eq(UID), /* opUid= */anyInt(), /* opPackageName= */ isNull(), /* details= */
|
||||||
isNull());
|
isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDozePowerGroup() {
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
|
||||||
|
mPowerGroup.dozeLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_TIMEOUT);
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
|
||||||
|
assertThat(mPowerGroup.isSandmanSummonedLocked()).isTrue();
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDozePowerGroupWhenNonInteractiveHasNoEffect() {
|
||||||
|
mPowerGroup.sleepLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_TIMEOUT);
|
||||||
|
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
||||||
|
eq(WAKEFULNESS_ASLEEP), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_TIMEOUT),
|
||||||
|
eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ isNull(),
|
||||||
|
/* details= */ isNull());
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
|
||||||
|
assertThat(mPowerGroup.dozeLocked(TIMESTAMP2, UID, GO_TO_SLEEP_REASON_TIMEOUT)).isFalse();
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
|
||||||
|
verify(mWakefulnessCallbackMock, never()).onWakefulnessChangedLocked(
|
||||||
|
eq(GROUP_ID), eq(WAKEFULNESS_DOZING), eq(TIMESTAMP2), /* reason= */ anyInt(),
|
||||||
|
eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ any(), /* details= */ any());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSleepPowerGroup() {
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
|
||||||
|
mPowerGroup.sleepLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_DEVICE_FOLD);
|
||||||
|
assertThat(mPowerGroup.isSandmanSummonedLocked()).isTrue();
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
|
||||||
|
verify(mWakefulnessCallbackMock).onWakefulnessChangedLocked(eq(GROUP_ID),
|
||||||
|
eq(WAKEFULNESS_ASLEEP), eq(TIMESTAMP1), eq(GO_TO_SLEEP_REASON_DEVICE_FOLD),
|
||||||
|
eq(UID), /* opUid= */ anyInt(), /* opPackageName= */ isNull(),
|
||||||
|
/* details= */ isNull());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDreamPowerGroupWhenNotAwakeHasNoEffect() {
|
||||||
|
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)).isFalse();
|
||||||
|
assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
|
||||||
|
verify(mWakefulnessCallbackMock, never()).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);
|
||||||
|
|||||||
Reference in New Issue
Block a user