From 409296f3467809cd557785ab07e7ce5accca575c Mon Sep 17 00:00:00 2001 From: Matt Pietal <mpietal@google.com> Date: Fri, 3 Nov 2023 12:43:34 +0000 Subject: [PATCH] MIGRAGE_NSSL - Fix QS pulldown on lockscreen On lockscreen only, when swiping down from the very top it should go directly to quick settings and not the shade. Bug: 301238359 Test: atest NotificationShadeWindowViewControllerTest Flag: LEGACY MIGRATE_NSSL DISABLED Change-Id: Iaf2d828cd7f828f3fafdb92d0697def62a698a8c --- ...NotificationShadeWindowViewController.java | 13 ++++++ ...tificationShadeWindowViewControllerTest.kt | 41 +++++++++++++++---- .../shade/NotificationShadeWindowViewTest.kt | 2 + 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index a2627eddf05de..a2ca49d9ba573 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -113,6 +113,7 @@ public class NotificationShadeWindowViewController implements Dumpable { private final SysUIKeyEventHandler mSysUIKeyEventHandler; private final PrimaryBouncerInteractor mPrimaryBouncerInteractor; private final AlternateBouncerInteractor mAlternateBouncerInteractor; + private final QuickSettingsController mQuickSettingsController; private GestureDetector mPulsingWakeupGestureHandler; private GestureDetector mDreamingWakeupGestureHandler; private View mBrightnessMirror; @@ -188,6 +189,7 @@ public class NotificationShadeWindowViewController implements Dumpable { BouncerMessageInteractor bouncerMessageInteractor, BouncerLogger bouncerLogger, SysUIKeyEventHandler sysUIKeyEventHandler, + QuickSettingsController quickSettingsController, PrimaryBouncerInteractor primaryBouncerInteractor, AlternateBouncerInteractor alternateBouncerInteractor, SelectedUserInteractor selectedUserInteractor) { @@ -220,6 +222,7 @@ public class NotificationShadeWindowViewController implements Dumpable { mSysUIKeyEventHandler = sysUIKeyEventHandler; mPrimaryBouncerInteractor = primaryBouncerInteractor; mAlternateBouncerInteractor = alternateBouncerInteractor; + mQuickSettingsController = quickSettingsController; // This view is not part of the newly inflated expanded status bar. mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container); @@ -454,6 +457,16 @@ public class NotificationShadeWindowViewController implements Dumpable { && !bouncerShowing && !mStatusBarStateController.isDozing()) { if (mDragDownHelper.isDragDownEnabled()) { + if (mFeatureFlagsClassic.isEnabled(Flags.MIGRATE_NSSL)) { + // When on lockscreen, if the touch originates at the top of the screen + // go directly to QS and not the shade + if (mQuickSettingsController.shouldQuickSettingsIntercept( + ev.getX(), ev.getY(), 0)) { + mShadeLogger.d("NSWVC: QS intercepted"); + return true; + } + } + // This handles drag down over lockscreen boolean result = mDragDownHelper.onInterceptTouchEvent(ev); if (mFeatureFlagsClassic.isEnabled(Flags.MIGRATE_NSSL)) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index 4e3e165c83bb6..5459779121c98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -97,6 +97,7 @@ import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat +import java.util.Optional import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.TestScope @@ -111,9 +112,8 @@ import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations -import java.util.Optional import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -140,6 +140,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { @Mock private lateinit var stackScrollLayoutController: NotificationStackScrollLayoutController @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager @Mock private lateinit var statusBarWindowStateController: StatusBarWindowStateController + @Mock private lateinit var quickSettingsController: QuickSettingsController @Mock private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController @Mock private lateinit var lockIconViewController: LockIconViewController @@ -166,7 +167,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { @Mock lateinit var alternateBouncerInteractor: AlternateBouncerInteractor private val notificationLaunchAnimationRepository = NotificationLaunchAnimationRepository() private val notificationLaunchAnimationInteractor = - NotificationLaunchAnimationInteractor(notificationLaunchAnimationRepository) + NotificationLaunchAnimationInteractor(notificationLaunchAnimationRepository) private lateinit var fakeClock: FakeSystemClock private lateinit var interactionEventHandlerCaptor: ArgumentCaptor<InteractionEventHandler> @@ -274,6 +275,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { ), BouncerLogger(logcatLogBuffer("BouncerLog")), sysUIKeyEventHandler, + quickSettingsController, primaryBouncerInteractor, alternateBouncerInteractor, mSelectedUserInteractor, @@ -460,9 +462,11 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { // AND alternate bouncer doesn't want the touch whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT)) .thenReturn(false) + // AND quick settings controller doesn't want it + whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any())) + .thenReturn(false) // AND the lock icon wants the touch - whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)) - .thenReturn(true) + whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(true) featureFlagsClassic.set(MIGRATE_NSSL, true) @@ -476,10 +480,31 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { whenever(sysuiStatusBarStateController.isDozing).thenReturn(true) // AND alternate bouncer doesn't want the touch whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT)) - .thenReturn(false) + .thenReturn(false) // AND the lock icon does NOT want the touch - whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)) - .thenReturn(false) + whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(false) + // AND quick settings controller doesn't want it + whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any())) + .thenReturn(false) + + featureFlagsClassic.set(MIGRATE_NSSL, true) + + // THEN touch should NOT be intercepted by NotificationShade + assertThat(interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)).isTrue() + } + + @Test + fun shouldInterceptTouchEvent_dozing_touchInStatusBar_touchIntercepted() { + // GIVEN dozing + whenever(sysuiStatusBarStateController.isDozing).thenReturn(true) + // AND alternate bouncer doesn't want the touch + whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT)) + .thenReturn(false) + // AND the lock icon does NOT want the touch + whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(false) + // AND quick settings controller DOES want it + whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any())) + .thenReturn(true) featureFlagsClassic.set(MIGRATE_NSSL, true) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt index 3d5d26ab194e8..a6ab6a51bfa70 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -121,6 +121,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { @Mock private lateinit var notificationStackScrollLayout: NotificationStackScrollLayout @Mock private lateinit var notificationShadeDepthController: NotificationShadeDepthController @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController + @Mock private lateinit var quickSettingsController: QuickSettingsController @Mock private lateinit var notificationStackScrollLayoutController: NotificationStackScrollLayoutController @@ -264,6 +265,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { ), BouncerLogger(logcatLogBuffer("BouncerLog")), Mockito.mock(SysUIKeyEventHandler::class.java), + quickSettingsController, primaryBouncerInteractor, alternateBouncerInteractor, mSelectedUserInteractor, -- GitLab