From 95e0af8c470732c5d25f11424817b217846438c6 Mon Sep 17 00:00:00 2001 From: Beverly Date: Tue, 21 Mar 2023 13:55:53 +0000 Subject: [PATCH] RESTRICT AUTOMERGE Show primary bouncer on TOUCH_OUTSIDE The notification shade isn't showing over occluding apps, so it doesn't intercept touches for the alternate bouncer. Therefore, the AlternateBouncer needs to rely on TOUCH_OUTSIDE. This was fixed in udc-dev but also needs to be fixed in tm-qpr. Test: atest StatusBarKeyguardViewManagerTest Test: manually bring up altBouncer with UDFPS over an occluding app and tap outside UDFPS area, the primary bouncer will show Fixes: 274587619 Change-Id: I257221ad5f5a3fc127a588faea09f5057c2d9977 --- .../phone/StatusBarKeyguardViewManager.java | 10 ++++++---- .../phone/StatusBarKeyguardViewManagerTest.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 2dc15d09afe20..71e2e405d071a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -1452,11 +1452,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public boolean onTouch(MotionEvent event) { boolean handledTouch = false; if (mAlternateBouncerInteractor.isVisibleState()) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { + final boolean downThenUp = event.getActionMasked() == MotionEvent.ACTION_UP + && mAlternateBouncerReceivedDownTouch; + final boolean outsideTouch = event.getActionMasked() == MotionEvent.ACTION_OUTSIDE; + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { mAlternateBouncerReceivedDownTouch = true; - } else if (event.getAction() == MotionEvent.ACTION_UP - && mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime() - && mAlternateBouncerReceivedDownTouch) { + } else if ((downThenUp || outsideTouch) + && mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()) { showPrimaryBouncer(true); } handledTouch = true; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 61286a43217c5..346b90c1bd881 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -786,4 +786,20 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { // THEN the alternateBouncer doesn't hide verify(mAlternateBouncerInteractor, never()).hide(); } + + @Test + public void testAlternateBouncerOnTouch_actionOutside_hidesAlternateBouncer() { + reset(mAlternateBouncerInteractor); + + // GIVEN the alternate bouncer has shown for a minimum amount of time + when(mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()).thenReturn(true); + when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true); + + // WHEN only ACTION_OUTSIDE touch event comes + mStatusBarKeyguardViewManager.onTouch( + MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_OUTSIDE, 0f, 0f, 0)); + + // THEN the alternateBouncer hides + verify(mAlternateBouncerInteractor).hide(); + } }