Support KeyEvent.KEYCODE_ENTER on the keyguard

On the keyguard, when there's a keyEvent for KEYCODE_ENTER
on action up (not down):
  - If the notification shade is expanded, the notification
    shade will collapse.
  - If the notification shade is not expanded, the primary
    bouncer will show.

This also updates the logic for the menu and space keycodes to
show the above logic instead of generically collapsing the
notification shade in both cases (which would show the alternate
bouncer instead of the primary bouncer).

Test: `adb shell input keyevent KEYCODE_SPACE`, `KEYCODE_MENU`
and `KEYCODE_ENTER` will dismiss the lockscreen if there's no security,
else the primary bouncer will show. If the notification shade is
expanded on the lockscreen, these commands will collapse the shade.
Test: atest KeyguardKeyEventInteractorTest
Fixes: 270883077

Change-Id: I716f0d3e777abde4a93dee06bacddeef587f6d6f
This commit is contained in:
Beverly
2023-08-15 14:59:29 +00:00
committed by Beverly Tai
parent 31573d4d00
commit 5919cb74ac
2 changed files with 85 additions and 33 deletions

View File

@@ -54,7 +54,11 @@ constructor(
if (event.handleAction()) {
when (event.keyCode) {
KeyEvent.KEYCODE_MENU -> return dispatchMenuKeyEvent()
KeyEvent.KEYCODE_SPACE -> return dispatchSpaceEvent()
KeyEvent.KEYCODE_SPACE,
KeyEvent.KEYCODE_ENTER ->
if (isDeviceInteractive()) {
return collapseShadeLockedOrShowPrimaryBouncer()
}
}
}
return false
@@ -90,16 +94,22 @@ constructor(
(statusBarStateController.state != StatusBarState.SHADE) &&
statusBarKeyguardViewManager.shouldDismissOnMenuPressed()
if (shouldUnlockOnMenuPressed) {
shadeController.animateCollapseShadeForced()
return true
return collapseShadeLockedOrShowPrimaryBouncer()
}
return false
}
private fun dispatchSpaceEvent(): Boolean {
if (isDeviceInteractive() && statusBarStateController.state != StatusBarState.SHADE) {
shadeController.animateCollapseShadeForced()
return true
private fun collapseShadeLockedOrShowPrimaryBouncer(): Boolean {
when (statusBarStateController.state) {
StatusBarState.SHADE -> return false
StatusBarState.SHADE_LOCKED -> {
shadeController.animateCollapseShadeForced()
return true
}
StatusBarState.KEYGUARD -> {
statusBarKeyguardViewManager.showPrimaryBouncer(true)
return true
}
}
return false
}

View File

@@ -131,14 +131,12 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() {
}
@Test
fun dispatchKeyEvent_menuActionUp_interactiveKeyguard_collapsesShade() {
fun dispatchKeyEvent_menuActionUp_interactiveKeyguard_showsPrimaryBouncer() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true)
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isTrue()
verify(shadeController).animateCollapseShadeForced()
verifyActionUpShowsPrimaryBouncer(KeyEvent.KEYCODE_MENU)
}
@Test
@@ -147,42 +145,48 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() {
whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)
whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true)
// action down: does NOT collapse the shade
val actionDownMenuKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU)
assertThat(underTest.dispatchKeyEvent(actionDownMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
// action up: collapses the shade
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isTrue()
verify(shadeController).animateCollapseShadeForced()
verifyActionUpCollapsesTheShade(KeyEvent.KEYCODE_MENU)
}
@Test
fun dispatchKeyEvent_menuActionUp_nonInteractiveKeyguard_neverCollapsesShade() {
fun dispatchKeyEvent_menuActionUp_nonInteractiveKeyguard_doNothing() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(asleepWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true)
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
verifyActionsDoNothing(KeyEvent.KEYCODE_MENU)
}
@Test
fun dispatchKeyEvent_spaceActionUp_interactiveKeyguard_collapsesShade() {
fun dispatchKeyEvent_spaceActionUp_interactiveKeyguard_showsPrimaryBouncer() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
// action down: does NOT collapse the shade
val actionDownMenuKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SPACE)
assertThat(underTest.dispatchKeyEvent(actionDownMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
verifyActionUpShowsPrimaryBouncer(KeyEvent.KEYCODE_SPACE)
}
// action up: collapses the shade
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isTrue()
verify(shadeController).animateCollapseShadeForced()
@Test
fun dispatchKeyEvent_spaceActionUp_shadeLocked_collapsesShade() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)
verifyActionUpCollapsesTheShade(KeyEvent.KEYCODE_SPACE)
}
@Test
fun dispatchKeyEvent_enterActionUp_interactiveKeyguard_showsPrimaryBouncer() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
verifyActionUpShowsPrimaryBouncer(KeyEvent.KEYCODE_ENTER)
}
@Test
fun dispatchKeyEvent_enterActionUp_shadeLocked_collapsesShade() {
keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode)
whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)
verifyActionUpCollapsesTheShade(KeyEvent.KEYCODE_ENTER)
}
@Test
@@ -252,4 +256,42 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() {
.isFalse()
verify(statusBarKeyguardViewManager, never()).interceptMediaKey(any())
}
private fun verifyActionUpCollapsesTheShade(keycode: Int) {
// action down: does NOT collapse the shade
val actionDownMenuKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, keycode)
assertThat(underTest.dispatchKeyEvent(actionDownMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
// action up: collapses the shade
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, keycode)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isTrue()
verify(shadeController).animateCollapseShadeForced()
}
private fun verifyActionUpShowsPrimaryBouncer(keycode: Int) {
// action down: does NOT collapse the shade
val actionDownMenuKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, keycode)
assertThat(underTest.dispatchKeyEvent(actionDownMenuKeyEvent)).isFalse()
verify(statusBarKeyguardViewManager, never()).showPrimaryBouncer(any())
// action up: collapses the shade
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, keycode)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isTrue()
verify(statusBarKeyguardViewManager).showPrimaryBouncer(eq(true))
}
private fun verifyActionsDoNothing(keycode: Int) {
// action down: does nothing
val actionDownMenuKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, keycode)
assertThat(underTest.dispatchKeyEvent(actionDownMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
verify(statusBarKeyguardViewManager, never()).showPrimaryBouncer(any())
// action up: doesNothing
val actionUpMenuKeyEvent = KeyEvent(KeyEvent.ACTION_UP, keycode)
assertThat(underTest.dispatchKeyEvent(actionUpMenuKeyEvent)).isFalse()
verify(shadeController, never()).animateCollapseShadeForced()
verify(statusBarKeyguardViewManager, never()).showPrimaryBouncer(any())
}
}