diff options
2 files changed, 61 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 78ae938b4a98..adf70a255b4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1735,6 +1735,11 @@ public class NotificationPanelViewController extends PanelViewController { return false; } + @VisibleForTesting + boolean isQsTracking() { + return mQsTracking; + } + @Override protected boolean isInContentBounds(float x, float y) { float stackScrollerX = mNotificationStackScrollLayoutController.getX(); @@ -2812,7 +2817,7 @@ public class NotificationPanelViewController extends PanelViewController { private boolean shouldQuickSettingsIntercept(float x, float y, float yDiff) { if (!isQsExpansionEnabled() || mCollapsedOnDown || (mKeyguardShowing && mKeyguardBypassController.getBypassEnabled()) - || (mKeyguardShowing && mShouldUseSplitNotificationShade)) { + || mShouldUseSplitNotificationShade) { return false; } View header = mKeyguardShowing || mQs == null ? mKeyguardStatusBar : mQs.getHeader(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 05fb1f5959ea..71f1f0b0f7cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -56,6 +56,7 @@ import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.ViewParent; import android.view.ViewPropertyAnimator; import android.view.ViewStub; import android.view.accessibility.AccessibilityManager; @@ -99,6 +100,7 @@ import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.FalsingManager; +import com.android.systemui.plugins.qs.QS; import com.android.systemui.qrcodescanner.controller.QRCodeScannerController; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.statusbar.CommandQueue; @@ -334,6 +336,12 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { private NotificationStackSizeCalculator mNotificationStackSizeCalculator; @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + @Mock + private QS mQs; + @Mock + private View mQsHeader; + @Mock + private ViewParent mViewParent; private NotificationPanelViewController.PanelEventsEmitter mPanelEventsEmitter; private Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); private SysuiStatusBarStateController mStatusBarStateController; @@ -455,6 +463,9 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { return null; }).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any()); + when(mView.getParent()).thenReturn(mViewParent); + when(mQs.getHeader()).thenReturn(mQsHeader); + mMainHandler = new Handler(Looper.getMainLooper()); mPanelEventsEmitter = new NotificationPanelViewController.PanelEventsEmitter(); @@ -984,6 +995,50 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { assertThat(mNotificationPanelViewController.mQsExpandImmediate).isTrue(); } + @Test + public void interceptTouchEvent_withinQs_shadeExpanded_startsQsTracking() { + mNotificationPanelViewController.mQs = mQs; + when(mQsFrame.getX()).thenReturn(0f); + when(mQsFrame.getWidth()).thenReturn(1000); + when(mQsHeader.getTop()).thenReturn(0); + when(mQsHeader.getBottom()).thenReturn(1000); + PanelViewController.TouchHandler touchHandler = + mNotificationPanelViewController.createTouchHandler(); + + mNotificationPanelViewController.setExpandedFraction(1f); + touchHandler.onInterceptTouchEvent( + createMotionEvent(/* x= */ 0, /* y= */ 0, MotionEvent.ACTION_DOWN)); + touchHandler.onInterceptTouchEvent( + createMotionEvent(/* x= */ 0, /* y= */ 500, MotionEvent.ACTION_MOVE)); + + assertThat(mNotificationPanelViewController.isQsTracking()).isTrue(); + } + + @Test + public void interceptTouchEvent_withinQs_shadeExpanded_inSplitShade_doesNotStartQsTracking() { + enableSplitShade(true); + mNotificationPanelViewController.mQs = mQs; + when(mQsFrame.getX()).thenReturn(0f); + when(mQsFrame.getWidth()).thenReturn(1000); + when(mQsHeader.getTop()).thenReturn(0); + when(mQsHeader.getBottom()).thenReturn(1000); + PanelViewController.TouchHandler touchHandler = + mNotificationPanelViewController.createTouchHandler(); + + mNotificationPanelViewController.setExpandedFraction(1f); + touchHandler.onInterceptTouchEvent( + createMotionEvent(/* x= */ 0, /* y= */ 0, MotionEvent.ACTION_DOWN)); + touchHandler.onInterceptTouchEvent( + createMotionEvent(/* x= */ 0, /* y= */ 500, MotionEvent.ACTION_MOVE)); + + assertThat(mNotificationPanelViewController.isQsTracking()).isFalse(); + } + + private static MotionEvent createMotionEvent(int x, int y, int action) { + return MotionEvent.obtain( + /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); + } + private void triggerPositionClockAndNotifications() { mNotificationPanelViewController.closeQs(); } |