Merge "Ignore wake up calls when lid closed" into udc-dev am: a15c48860b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23277497

Change-Id: I0bb614e2394ac041dda024e3c6937a164d5cc98f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Piotr Wilczyński
2023-05-25 09:46:34 +00:00
committed by Automerger Merge Worker
6 changed files with 60 additions and 3 deletions

View File

@@ -6009,6 +6009,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardDelegate.setSwitchingUser(switching); mKeyguardDelegate.setSwitchingUser(switching);
} }
@Override
@WindowManagerFuncs.LidState
public int getLidState() {
return mDefaultDisplayPolicy.getLidState();
}
@Override @Override
public void dumpDebug(ProtoOutputStream proto, long fieldId) { public void dumpDebug(ProtoOutputStream proto, long fieldId) {
final long token = proto.start(fieldId); final long token = proto.start(fieldId);

View File

@@ -218,6 +218,14 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* between it and the policy. * between it and the policy.
*/ */
public interface WindowManagerFuncs { public interface WindowManagerFuncs {
@IntDef(prefix = { "LID_" }, value = {
LID_ABSENT,
LID_CLOSED,
LID_OPEN,
})
@Retention(RetentionPolicy.SOURCE)
@interface LidState{}
public static final int LID_ABSENT = -1; public static final int LID_ABSENT = -1;
public static final int LID_CLOSED = 0; public static final int LID_CLOSED = 0;
public static final int LID_OPEN = 1; public static final int LID_OPEN = 1;
@@ -231,8 +239,9 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
public static final int CAMERA_LENS_COVERED = 1; public static final int CAMERA_LENS_COVERED = 1;
/** /**
* Returns a code that describes the current state of the lid switch. * Returns a {@link LidState} that describes the current state of the lid switch.
*/ */
@LidState
public int getLidState(); public int getLidState();
/** /**
@@ -282,7 +291,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
/** /**
* Convert the lid state to a human readable format. * Convert the lid state to a human readable format.
*/ */
static String lidStateToString(int lid) { static String lidStateToString(@LidState int lid) {
switch (lid) { switch (lid) {
case LID_ABSENT: case LID_ABSENT:
return "LID_ABSENT"; return "LID_ABSENT";
@@ -1241,4 +1250,11 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* @return {@code true} if the key will be handled globally. * @return {@code true} if the key will be handled globally.
*/ */
boolean isGlobalKey(int keyCode); boolean isGlobalKey(int keyCode);
/**
* Returns a {@link WindowManagerFuncs.LidState} that describes the current state of
* the lid switch.
*/
@WindowManagerFuncs.LidState
int getLidState();
} }

View File

@@ -33,6 +33,7 @@ import static android.os.PowerManagerInternal.isInteractive;
import static android.os.PowerManagerInternal.wakefulnessToString; import static android.os.PowerManagerInternal.wakefulnessToString;
import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.NonNull; import android.annotation.NonNull;
@@ -5733,6 +5734,11 @@ public final class PowerManagerService extends SystemService
@Override // Binder call @Override // Binder call
public void wakeUp(long eventTime, @WakeReason int reason, String details, public void wakeUp(long eventTime, @WakeReason int reason, String details,
String opPackageName) { String opPackageName) {
if (mPolicy.getLidState() == LID_CLOSED) {
Slog.d(TAG, "Ignoring wake up call due to the lid being closed");
return;
}
final long now = mClock.uptimeMillis(); final long now = mClock.uptimeMillis();
if (eventTime > now) { if (eventTime > now) {
Slog.e(TAG, "Event time " + eventTime + " cannot be newer than " + now); Slog.e(TAG, "Event time " + eventTime + " cannot be newer than " + now);

View File

@@ -225,6 +225,7 @@ public class DisplayPolicy {
/** Currently it can only be non-null when physical display switch happens. */ /** Currently it can only be non-null when physical display switch happens. */
private DecorInsets.Cache mCachedDecorInsets; private DecorInsets.Cache mCachedDecorInsets;
@WindowManagerFuncs.LidState
private volatile int mLidState = LID_ABSENT; private volatile int mLidState = LID_ABSENT;
private volatile int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; private volatile int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED;
private volatile boolean mHdmiPlugged; private volatile boolean mHdmiPlugged;
@@ -752,10 +753,11 @@ public class DisplayPolicy {
return mNavigationBarCanMove; return mNavigationBarCanMove;
} }
public void setLidState(int lidState) { public void setLidState(@WindowManagerFuncs.LidState int lidState) {
mLidState = lidState; mLidState = lidState;
} }
@WindowManagerFuncs.LidState
public int getLidState() { public int getLidState() {
return mLidState; return mLidState;
} }

View File

@@ -26,6 +26,9 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@@ -145,6 +148,7 @@ public class PowerManagerServiceTest {
@Mock private ActivityManagerInternal mActivityManagerInternalMock; @Mock private ActivityManagerInternal mActivityManagerInternalMock;
@Mock private AttentionManagerInternal mAttentionManagerInternalMock; @Mock private AttentionManagerInternal mAttentionManagerInternalMock;
@Mock private DreamManagerInternal mDreamManagerInternalMock; @Mock private DreamManagerInternal mDreamManagerInternalMock;
@Mock private WindowManagerPolicy mPolicyMock;
@Mock private PowerManagerService.NativeWrapper mNativeWrapperMock; @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock;
@Mock private Notifier mNotifierMock; @Mock private Notifier mNotifierMock;
@Mock private WirelessChargerDetector mWirelessChargerDetectorMock; @Mock private WirelessChargerDetector mWirelessChargerDetectorMock;
@@ -205,6 +209,7 @@ public class PowerManagerServiceTest {
.thenReturn(true); .thenReturn(true);
when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn(""); when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn("");
when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true); when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true);
when(mPolicyMock.getLidState()).thenReturn(LID_ABSENT);
addLocalServiceMock(LightsManager.class, mLightsManagerMock); addLocalServiceMock(LightsManager.class, mLightsManagerMock);
addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock); addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock);
@@ -212,6 +217,7 @@ public class PowerManagerServiceTest {
addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock); addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock); addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock);
addLocalServiceMock(DreamManagerInternal.class, mDreamManagerInternalMock); addLocalServiceMock(DreamManagerInternal.class, mDreamManagerInternalMock);
addLocalServiceMock(WindowManagerPolicy.class, mPolicyMock);
mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
mResourcesSpy = spy(mContextSpy.getResources()); mResourcesSpy = spy(mContextSpy.getResources());
@@ -678,6 +684,20 @@ public class PowerManagerServiceTest {
assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
} }
@Test
public void testWakefulnessAwake_ShouldNotWakeUpWhenLidClosed() {
when(mPolicyMock.getLidState()).thenReturn(LID_CLOSED);
createService();
startSystem();
forceSleep();
mService.getBinderServiceInstance().wakeUp(mClock.now(),
PowerManager.WAKE_REASON_POWER_BUTTON,
"testing IPowerManager.wakeUp()", "pkg.name");
assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
}
/** /**
* Tests a series of variants that control whether a device wakes-up when it is plugged in * Tests a series of variants that control whether a device wakes-up when it is plugged in
* or docked. * or docked.

View File

@@ -18,6 +18,8 @@ package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
@@ -354,4 +356,9 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
public boolean isGlobalKey(int keyCode) { public boolean isGlobalKey(int keyCode) {
return false; return false;
} }
@Override
public int getLidState() {
return LID_ABSENT;
}
} }