[Media TTT] Displayed View Keeps Screen On

This CL ensures that the screen is kept on when the chipbar is
displayed. It acquires a wakelock with different levels and flags when
the screen is already on. This doesn't affect the screensaver mode.

Bug: 241929425.
Test: Ran adb commands when the screen is already on, and made sure that
the screen goes off after the view is removed. This was tested on
a phone and tablet devices.
Test: atest MediaTttChipControllerReceiver.
Test: atest TemporaryViewDisplayControllerTest.
Test: atest MediaTttSenderCoordinatorTest.

Change-Id: I2c471c435d297c074ee792c06c80112de24ac5f2
This commit is contained in:
Michael Mikhail
2022-11-08 22:25:18 +00:00
parent dcb12923fc
commit 203a6745aa
2 changed files with 31 additions and 15 deletions

View File

@@ -65,8 +65,7 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
height = WindowManager.LayoutParams.WRAP_CONTENT
type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
format = PixelFormat.TRANSLUCENT
setTrustedOverlay()
}
@@ -120,20 +119,27 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
// At this point, we're guaranteed to no longer be displaying a view.
// So, set up all our callbacks and inflate the view.
configurationController.addCallback(displayScaleListener)
// Wake the screen if necessary so the user will see the view. (Per b/239426653, we want
// the view to show over the dream state, so we should only wake up if the screen is
// completely off.)
if (!powerManager.isScreenOn) {
wakeLock = wakeLockBuilder
wakeLock = if (!powerManager.isScreenOn) {
// If the screen is off, fully wake it so the user can see the view.
wakeLockBuilder
.setTag(newInfo.windowTitle)
.setLevelsAndFlags(
PowerManager.FULL_WAKE_LOCK or
PowerManager.ACQUIRE_CAUSES_WAKEUP
PowerManager.FULL_WAKE_LOCK or
PowerManager.ACQUIRE_CAUSES_WAKEUP
)
.build()
wakeLock?.acquire(newInfo.wakeReason)
wakeReasonAcquired = newInfo.wakeReason
} else {
// Per b/239426653, we want the view to show over the dream state.
// If the screen is on, using screen bright level will leave screen on the dream
// state but ensure the screen will not go off before wake lock is released.
wakeLockBuilder
.setTag(newInfo.windowTitle)
.setLevelsAndFlags(PowerManager.SCREEN_BRIGHT_WAKE_LOCK)
.build()
}
wakeLock?.acquire(newInfo.wakeReason)
wakeReasonAcquired = newInfo.wakeReason
logger.logViewAddition(newInfo.windowTitle)
inflateAndUpdateView(newInfo)
}

View File

@@ -123,27 +123,37 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
}
@Test
fun displayView_screenOff_wakeLockAcquired() {
fun displayView_wakeLockAcquired() {
underTest.displayView(getState())
assertThat(fakeWakeLock.isHeld).isTrue()
}
@Test
fun displayView_screenAlreadyOn_wakeLockNotAcquired() {
fun displayView_screenAlreadyOn_wakeLockAcquired() {
whenever(powerManager.isScreenOn).thenReturn(true)
underTest.displayView(getState())
assertThat(fakeWakeLock.isHeld).isTrue()
}
@Test
fun displayView_wakeLockCanBeReleasedAfterTimeOut() {
underTest.displayView(getState())
assertThat(fakeWakeLock.isHeld).isTrue()
fakeClock.advanceTime(TIMEOUT_MS + 1)
assertThat(fakeWakeLock.isHeld).isFalse()
}
@Test
fun displayView_screenOff_wakeLockCanBeReleasedAfterTimeOut() {
fun displayView_removeView_wakeLockCanBeReleased() {
underTest.displayView(getState())
assertThat(fakeWakeLock.isHeld).isTrue()
fakeClock.advanceTime(TIMEOUT_MS + 1)
underTest.removeView("test reason")
assertThat(fakeWakeLock.isHeld).isFalse()
}