Merge "Remove theater-mode wake checks if screen is already on" into main
diff --git a/services/core/java/com/android/server/policy/WindowWakeUpPolicy.java b/services/core/java/com/android/server/policy/WindowWakeUpPolicy.java
index a790950..af1ad13 100644
--- a/services/core/java/com/android/server/policy/WindowWakeUpPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowWakeUpPolicy.java
@@ -34,7 +34,9 @@
import android.os.SystemClock;
import android.provider.Settings;
import android.util.Slog;
+import android.view.Display;
import android.view.KeyEvent;
+import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.Clock;
@@ -48,6 +50,7 @@
private final Context mContext;
private final PowerManager mPowerManager;
+ private final WindowManager mWindowManager;
private final Clock mClock;
private final boolean mAllowTheaterModeWakeFromKey;
@@ -68,6 +71,7 @@
WindowWakeUpPolicy(Context context, Clock clock) {
mContext = context;
mPowerManager = context.getSystemService(PowerManager.class);
+ mWindowManager = context.getSystemService(WindowManager.class);
mClock = clock;
final Resources res = context.getResources();
@@ -212,12 +216,23 @@
}
private boolean canWakeUp(boolean wakeInTheaterMode) {
+ if (supportInputWakeupDelegate() && isDefaultDisplayOn()) {
+ // If the default display is on, theater mode should not influence whether or not
+ // waking up is allowed. This is because the theater mode checks are there to block
+ // the display from being on in situations where the user may not want it to be
+ // on (so if the display is already on, no need to check for theater mode at all).
+ return true;
+ }
final boolean isTheaterModeEnabled =
Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0) == 1;
return wakeInTheaterMode || !isTheaterModeEnabled;
}
+ private boolean isDefaultDisplayOn() {
+ return Display.isOnState(mWindowManager.getDefaultDisplay().getState());
+ }
+
/** Wakes up {@link PowerManager}. */
private void wakeUp(long wakeTime, @WakeReason int reason, String details) {
mPowerManager.wakeUp(wakeTime, reason, "android.policy:" + details);
diff --git a/services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java b/services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java
index c3da903..7322e5a 100644
--- a/services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/WindowWakeUpPolicyTests.java
@@ -54,6 +54,8 @@
import android.os.PowerManager;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.Display;
+import android.view.WindowManager;
import androidx.test.InstrumentationRegistry;
@@ -82,6 +84,8 @@
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock PowerManager mPowerManager;
+ @Mock WindowManager mWindowManager;
+ @Mock Display mDefaultDisplay;
@Mock Clock mClock;
@Mock WindowWakeUpPolicyInternal.InputWakeUpDelegate mInputWakeUpDelegate;
@@ -96,7 +100,10 @@
mResourcesSpy = spy(mContextSpy.getResources());
when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(mPowerManager);
+ when(mContextSpy.getSystemService(WindowManager.class)).thenReturn(mWindowManager);
+ when(mWindowManager.getDefaultDisplay()).thenReturn(mDefaultDisplay);
LocalServices.removeServiceForTest(WindowWakeUpPolicyInternal.class);
+ setDefaultDisplayState(Display.STATE_OFF);
}
@Test
@@ -199,6 +206,19 @@
}
@Test
+ public void testTheaterModeChecksNotAppliedWhenScreenIsOn() {
+ mSetFlagsRule.enableFlags(FLAG_SUPPORT_INPUT_WAKEUP_DELEGATE);
+ setDefaultDisplayState(Display.STATE_ON);
+ setTheaterModeEnabled(true);
+ setBooleanRes(config_allowTheaterModeWakeFromMotion, false);
+ mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock);
+
+ mPolicy.wakeUpFromMotion(200L, SOURCE_TOUCHSCREEN, true);
+
+ verify(mPowerManager).wakeUp(200L, WAKE_REASON_WAKE_MOTION, "android.policy:MOTION");
+ }
+
+ @Test
public void testWakeUpFromMotion() {
runPowerManagerUpChecks(
() -> mPolicy.wakeUpFromMotion(mClock.uptimeMillis(), SOURCE_TOUCHSCREEN, true),
@@ -291,6 +311,7 @@
Mockito.reset(mPowerManager);
setBooleanRes(theatherModeWakeResId, true);
+ LocalServices.removeServiceForTest(WindowWakeUpPolicyInternal.class);
mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock);
setUptimeMillis(200);
assertWithMessage("Wake should happen in theater mode when config allows it.")
@@ -299,6 +320,7 @@
Mockito.reset(mPowerManager);
setBooleanRes(theatherModeWakeResId, false);
+ LocalServices.removeServiceForTest(WindowWakeUpPolicyInternal.class);
mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock);
setUptimeMillis(250);
assertWithMessage("Wake should not happen in theater mode when config disallows it.")
@@ -310,6 +332,7 @@
Mockito.reset(mPowerManager);
setBooleanRes(theatherModeWakeResId, true);
+ LocalServices.removeServiceForTest(WindowWakeUpPolicyInternal.class);
mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock);
setUptimeMillis(300);
assertWithMessage("Wake should happen when not in theater mode.")
@@ -318,6 +341,7 @@
Mockito.reset(mPowerManager);
setBooleanRes(theatherModeWakeResId, false);
+ LocalServices.removeServiceForTest(WindowWakeUpPolicyInternal.class);
mPolicy = new WindowWakeUpPolicy(mContextSpy, mClock);
setUptimeMillis(350);
assertWithMessage("Wake should happen when not in theater mode.")
@@ -351,4 +375,8 @@
when(mInputWakeUpDelegate.wakeUpFromKey(anyLong(), anyInt(), anyBoolean()))
.thenReturn(result);
}
+
+ private void setDefaultDisplayState(int displayState) {
+ when(mDefaultDisplay.getState()).thenReturn(displayState);
+ }
}