Loading packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +16 −3 Original line number Diff line number Diff line Loading @@ -425,6 +425,11 @@ public class QuickSettingsController { updateExpansionEnabledAmbient(); } @VisibleForTesting void setStatusBarMinHeight(int height) { mStatusBarMinHeight = height; } int getHeaderHeight() { return mQs.getHeader().getHeight(); } Loading Loading @@ -474,7 +479,8 @@ public class QuickSettingsController { } /** Returns whether or not event should open QS */ private boolean isOpenQsEvent(MotionEvent event) { @VisibleForTesting boolean isOpenQsEvent(MotionEvent event) { final int pointerCount = event.getPointerCount(); final int action = event.getActionMasked(); Loading Loading @@ -847,6 +853,11 @@ public class QuickSettingsController { mTwoFingerExpandPossible = expandPossible; } @VisibleForTesting boolean isTwoFingerExpandPossible() { return mTwoFingerExpandPossible; } /** Called when Qs starts expanding */ private void onExpansionStarted() { cancelExpansionAnimation(); Loading Loading @@ -1363,7 +1374,8 @@ public class QuickSettingsController { return mTouchAboveFalsingThreshold; } private void onHeightChanged() { @VisibleForTesting void onHeightChanged() { mMaxExpansionHeight = isQsFragmentCreated() ? mQs.getDesiredHeight() : 0; if (mExpanded && mFullyExpanded) { mExpansionHeight = mMaxExpansionHeight; Loading Loading @@ -1668,7 +1680,8 @@ public class QuickSettingsController { return false; } private void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { @VisibleForTesting void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { mShadeExpandedFraction = event.getFraction(); } Loading packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +193 −43 Original line number Diff line number Diff line Loading @@ -16,6 +16,13 @@ package com.android.systemui.shade; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.BUTTON_SECONDARY; import static android.view.MotionEvent.BUTTON_STYLUS_PRIMARY; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; Loading Loading @@ -70,13 +77,11 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; Loading @@ -97,6 +102,11 @@ import dagger.Lazy; public class QuickSettingsControllerTest extends SysuiTestCase { private static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; private static final float QS_FRAME_START_X = 0f; private static final int QS_FRAME_WIDTH = 1000; private static final int QS_FRAME_TOP = 0; private static final int QS_FRAME_BOTTOM = 1000; private QuickSettingsController mQsController; Loading Loading @@ -139,8 +149,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private ShadeLogger mShadeLogger; @Mock private DumpManager mDumpManager; @Mock private DozeParameters mDozeParameters; @Mock private ScreenOffAnimationController mScreenOffAnimationController; @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private UiEventLogger mUiEventLogger; Loading Loading @@ -169,6 +178,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { when(mPanelView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar); when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000); when(mPanelView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame); when(mQsFrame.getX()).thenReturn(QS_FRAME_START_X); when(mQsFrame.getWidth()).thenReturn(QS_FRAME_WIDTH); when(mQsHeader.getTop()).thenReturn(QS_FRAME_TOP); when(mQsHeader.getBottom()).thenReturn(QS_FRAME_BOTTOM); when(mPanelView.getY()).thenReturn((float) QS_FRAME_TOP); when(mPanelView.getHeight()).thenReturn(QS_FRAME_BOTTOM); when(mPanelView.findViewById(R.id.keyguard_status_view)) .thenReturn(mock(KeyguardStatusView.class)); when(mQs.getView()).thenReturn(mPanelView); Loading Loading @@ -229,20 +244,9 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @After public void tearDown() { mNotificationPanelViewController.cancelHeightAnimator(); mMainHandler.removeCallbacksAndMessages(null); } @Test public void testOnTouchEvent_isConflictingExpansionGestureSet() { assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); } @Test public void testCloseQsSideEffects() { enableSplitShade(true); Loading Loading @@ -270,7 +274,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { public void testPanelStaysOpenWhenClosingQs() { mShadeExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1, /* expanded= */ true, /* tracking= */ false, /* dragDownPxAmount= */ 0); mNotificationPanelViewController.setExpandedFraction(1f); mQsController.setShadeExpandedHeight(1); float shadeExpandedHeight = mQsController.getShadeExpandedHeight(); mQsController.animateCloseQs(false); Loading @@ -281,16 +285,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Test public void interceptTouchEvent_withinQs_shadeExpanded_startsQsTracking() { mQsController.setQs(mQs); when(mQsFrame.getX()).thenReturn(0f); when(mQsFrame.getWidth()).thenReturn(1000); when(mQsHeader.getTop()).thenReturn(0); when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); createMotionEvent(0, 500, ACTION_MOVE)); assertThat(mQsController.isTracking()).isTrue(); } Loading @@ -299,20 +299,123 @@ public class QuickSettingsControllerTest extends SysuiTestCase { public void interceptTouchEvent_withinQs_shadeExpanded_inSplitShade_doesNotStartQsTracking() { enableSplitShade(true); mQsController.setQs(mQs); when(mQsFrame.getX()).thenReturn(0f); when(mQsFrame.getWidth()).thenReturn(1000); when(mQsHeader.getTop()).thenReturn(0); when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); createMotionEvent(0, 500, ACTION_MOVE)); assertThat(mQsController.isTracking()).isFalse(); } @Test public void interceptTouch_downBetweenFullyCollapsedAndExpanded() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); mQsController.onHeightChanged(); mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); assertThat(mQsController.onIntercept( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_DOWN))).isTrue(); } @Test public void onTouch_moveActionSetsCorrectExpansionHeight() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); mQsController.onHeightChanged(); mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 4, ACTION_DOWN), false, false); assertThat(mQsController.isTracking()).isTrue(); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 4 + 1, ACTION_MOVE), false, false); assertThat(mQsController.getExpansionHeight()).isEqualTo(QS_FRAME_BOTTOM / 2 + 1); } @Test public void handleTouch_downActionInQsArea() { mQsController.setQs(mQs); mQsController.setBarState(SHADE); mQsController.onPanelExpansionChanged( new ShadeExpansionChangeEvent( 0.5f, true, true, 0 )); MotionEvent event = createMotionEvent(QS_FRAME_WIDTH / 2, QS_FRAME_BOTTOM / 2, ACTION_DOWN); mQsController.handleTouch(event, false, false); assertThat(mQsController.isTracking()).isTrue(); assertThat(mQsController.getInitialTouchY()).isEqualTo(QS_FRAME_BOTTOM / 2); } @Test public void handleTouch_qsTouchedWhileCollapsingDisablesTracking() { mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM, ACTION_DOWN), false, false); mQsController.setLastShadeFlingWasExpanding(false); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, true); MotionEvent secondTouch = createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN); mQsController.handleTouch(secondTouch, false, true); assertThat(mQsController.isTracking()).isFalse(); } @Test public void handleTouch_qsTouchedWhileExpanding() { mQsController.setQs(mQs); mQsController.handleTouch( createMotionEvent(100, 100, ACTION_DOWN), false, false); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, false); mQsController.setLastShadeFlingWasExpanding(true); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN), false, false); assertThat(mQsController.isTracking()).isTrue(); } @Test public void handleTouch_isConflictingExpansionGestureSet() { assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); } @Test public void handleTouch_isConflictingExpansionGestureSet_cancel() { mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_UP), true, true); assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); } @Test public void handleTouch_twoFingerExpandPossibleConditions() { assertThat(mQsController.isTwoFingerExpandPossible()).isFalse(); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), true, false); assertThat(mQsController.isTwoFingerExpandPossible()).isTrue(); } @Test public void handleTouch_twoFingerDrag() { mQsController.setQs(mQs); mQsController.setStatusBarMinHeight(1); mQsController.setTwoFingerExpandPossible(true); mQsController.handleTouch( createMultitouchMotionEvent(ACTION_POINTER_DOWN), false, false); assertThat(mQsController.isExpandImmediate()).isTrue(); verify(mQs).setListening(true); } @Test public void onQsFragmentAttached_fullWidth_setsFullWidthTrueOnQS() { setIsFullWidth(true); Loading @@ -329,19 +432,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { verify(mQSFragment).setIsNotificationPanelFullWidth(false); } @Test public void getMaxPanelTransitionDistance_inSplitShade_withHeadsUp_returnsBiggerValue() { enableSplitShade(true); mNotificationPanelViewController.expandWithQs(); when(mHeadsUpManager.isTrackingHeadsUp()).thenReturn(true); mNotificationPanelViewController.setHeadsUpDraggingStartingHeight( SPLIT_SHADE_FULL_TRANSITION_DISTANCE); assertThat(mQsController.calculatePanelHeightExpanded(0)) .isGreaterThan(SPLIT_SHADE_FULL_TRANSITION_DISTANCE); } @Test public void setQsExpansion_lockscreenShadeTransitionInProgress_usesLockscreenSquishiness() { float squishinessFraction = 0.456f; Loading Loading @@ -378,6 +468,21 @@ public class QuickSettingsControllerTest extends SysuiTestCase { ); } @Test public void updateExpansion_expandImmediateOrAlreadyExpanded_usesFullSquishiness() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(100); mQsController.onHeightChanged(); mQsController.setExpandImmediate(true); mQsController.setExpanded(false); mQsController.updateExpansion(); mQsController.setExpandImmediate(false); mQsController.setExpanded(true); mQsController.updateExpansion(); verify(mQs, times(2)).setQsExpansion(0, 0, 0, 1); } @Test public void shadeExpanded_onKeyguard() { mStatusBarStateController.setState(KEYGUARD); Loading @@ -393,9 +498,52 @@ public class QuickSettingsControllerTest extends SysuiTestCase { assertThat(mQsController.computeExpansionFraction()).isEqualTo(1f); } @Test public void handleTouch_splitShadeAndtouchXOutsideQs() { enableSplitShade(true); assertThat(mQsController.handleTouch(createMotionEvent( QS_FRAME_WIDTH + 1, QS_FRAME_BOTTOM - 1, ACTION_DOWN), false, false)).isFalse(); } @Test public void isOpenQsEvent_twoFingerDrag() { assertThat(mQsController.isOpenQsEvent( createMultitouchMotionEvent(ACTION_POINTER_DOWN))).isTrue(); } @Test public void isOpenQsEvent_stylusButtonClickDrag() { MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); event.setButtonState(BUTTON_STYLUS_PRIMARY); assertThat(mQsController.isOpenQsEvent(event)).isTrue(); } @Test public void isOpenQsEvent_mouseButtonClickDrag() { MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); event.setButtonState(BUTTON_SECONDARY); assertThat(mQsController.isOpenQsEvent(event)).isTrue(); } private static MotionEvent createMotionEvent(int x, int y, int action) { return MotionEvent.obtain( /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); return MotionEvent.obtain(0, 0, action, x, y, 0); } // Creates an empty multitouch event for now private static MotionEvent createMultitouchMotionEvent(int action) { return MotionEvent.obtain(0, 0, action, 2, new MotionEvent.PointerProperties[] { new MotionEvent.PointerProperties(), new MotionEvent.PointerProperties() }, new MotionEvent.PointerCoords[] { new MotionEvent.PointerCoords(), new MotionEvent.PointerCoords() }, 0, 0, 0, 0, 0, 0, 0, 0); } private void enableSplitShade(boolean enabled) { Loading @@ -412,4 +560,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { int oldMaxHeight = mQsController.updateHeightsOnShadeLayoutChange(); mQsController.handleShadeLayoutChanged(oldMaxHeight); } } Loading
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +16 −3 Original line number Diff line number Diff line Loading @@ -425,6 +425,11 @@ public class QuickSettingsController { updateExpansionEnabledAmbient(); } @VisibleForTesting void setStatusBarMinHeight(int height) { mStatusBarMinHeight = height; } int getHeaderHeight() { return mQs.getHeader().getHeight(); } Loading Loading @@ -474,7 +479,8 @@ public class QuickSettingsController { } /** Returns whether or not event should open QS */ private boolean isOpenQsEvent(MotionEvent event) { @VisibleForTesting boolean isOpenQsEvent(MotionEvent event) { final int pointerCount = event.getPointerCount(); final int action = event.getActionMasked(); Loading Loading @@ -847,6 +853,11 @@ public class QuickSettingsController { mTwoFingerExpandPossible = expandPossible; } @VisibleForTesting boolean isTwoFingerExpandPossible() { return mTwoFingerExpandPossible; } /** Called when Qs starts expanding */ private void onExpansionStarted() { cancelExpansionAnimation(); Loading Loading @@ -1363,7 +1374,8 @@ public class QuickSettingsController { return mTouchAboveFalsingThreshold; } private void onHeightChanged() { @VisibleForTesting void onHeightChanged() { mMaxExpansionHeight = isQsFragmentCreated() ? mQs.getDesiredHeight() : 0; if (mExpanded && mFullyExpanded) { mExpansionHeight = mMaxExpansionHeight; Loading Loading @@ -1668,7 +1680,8 @@ public class QuickSettingsController { return false; } private void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { @VisibleForTesting void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { mShadeExpandedFraction = event.getFraction(); } Loading
packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +193 −43 Original line number Diff line number Diff line Loading @@ -16,6 +16,13 @@ package com.android.systemui.shade; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.BUTTON_SECONDARY; import static android.view.MotionEvent.BUTTON_STYLUS_PRIMARY; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; Loading Loading @@ -70,13 +77,11 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; Loading @@ -97,6 +102,11 @@ import dagger.Lazy; public class QuickSettingsControllerTest extends SysuiTestCase { private static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; private static final float QS_FRAME_START_X = 0f; private static final int QS_FRAME_WIDTH = 1000; private static final int QS_FRAME_TOP = 0; private static final int QS_FRAME_BOTTOM = 1000; private QuickSettingsController mQsController; Loading Loading @@ -139,8 +149,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private ShadeLogger mShadeLogger; @Mock private DumpManager mDumpManager; @Mock private DozeParameters mDozeParameters; @Mock private ScreenOffAnimationController mScreenOffAnimationController; @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private UiEventLogger mUiEventLogger; Loading Loading @@ -169,6 +178,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { when(mPanelView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar); when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000); when(mPanelView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame); when(mQsFrame.getX()).thenReturn(QS_FRAME_START_X); when(mQsFrame.getWidth()).thenReturn(QS_FRAME_WIDTH); when(mQsHeader.getTop()).thenReturn(QS_FRAME_TOP); when(mQsHeader.getBottom()).thenReturn(QS_FRAME_BOTTOM); when(mPanelView.getY()).thenReturn((float) QS_FRAME_TOP); when(mPanelView.getHeight()).thenReturn(QS_FRAME_BOTTOM); when(mPanelView.findViewById(R.id.keyguard_status_view)) .thenReturn(mock(KeyguardStatusView.class)); when(mQs.getView()).thenReturn(mPanelView); Loading Loading @@ -229,20 +244,9 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @After public void tearDown() { mNotificationPanelViewController.cancelHeightAnimator(); mMainHandler.removeCallbacksAndMessages(null); } @Test public void testOnTouchEvent_isConflictingExpansionGestureSet() { assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); } @Test public void testCloseQsSideEffects() { enableSplitShade(true); Loading Loading @@ -270,7 +274,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { public void testPanelStaysOpenWhenClosingQs() { mShadeExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1, /* expanded= */ true, /* tracking= */ false, /* dragDownPxAmount= */ 0); mNotificationPanelViewController.setExpandedFraction(1f); mQsController.setShadeExpandedHeight(1); float shadeExpandedHeight = mQsController.getShadeExpandedHeight(); mQsController.animateCloseQs(false); Loading @@ -281,16 +285,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Test public void interceptTouchEvent_withinQs_shadeExpanded_startsQsTracking() { mQsController.setQs(mQs); when(mQsFrame.getX()).thenReturn(0f); when(mQsFrame.getWidth()).thenReturn(1000); when(mQsHeader.getTop()).thenReturn(0); when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); createMotionEvent(0, 500, ACTION_MOVE)); assertThat(mQsController.isTracking()).isTrue(); } Loading @@ -299,20 +299,123 @@ public class QuickSettingsControllerTest extends SysuiTestCase { public void interceptTouchEvent_withinQs_shadeExpanded_inSplitShade_doesNotStartQsTracking() { enableSplitShade(true); mQsController.setQs(mQs); when(mQsFrame.getX()).thenReturn(0f); when(mQsFrame.getWidth()).thenReturn(1000); when(mQsHeader.getTop()).thenReturn(0); when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); createMotionEvent(0, 500, ACTION_MOVE)); assertThat(mQsController.isTracking()).isFalse(); } @Test public void interceptTouch_downBetweenFullyCollapsedAndExpanded() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); mQsController.onHeightChanged(); mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); assertThat(mQsController.onIntercept( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_DOWN))).isTrue(); } @Test public void onTouch_moveActionSetsCorrectExpansionHeight() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); mQsController.onHeightChanged(); mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 4, ACTION_DOWN), false, false); assertThat(mQsController.isTracking()).isTrue(); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 4 + 1, ACTION_MOVE), false, false); assertThat(mQsController.getExpansionHeight()).isEqualTo(QS_FRAME_BOTTOM / 2 + 1); } @Test public void handleTouch_downActionInQsArea() { mQsController.setQs(mQs); mQsController.setBarState(SHADE); mQsController.onPanelExpansionChanged( new ShadeExpansionChangeEvent( 0.5f, true, true, 0 )); MotionEvent event = createMotionEvent(QS_FRAME_WIDTH / 2, QS_FRAME_BOTTOM / 2, ACTION_DOWN); mQsController.handleTouch(event, false, false); assertThat(mQsController.isTracking()).isTrue(); assertThat(mQsController.getInitialTouchY()).isEqualTo(QS_FRAME_BOTTOM / 2); } @Test public void handleTouch_qsTouchedWhileCollapsingDisablesTracking() { mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM, ACTION_DOWN), false, false); mQsController.setLastShadeFlingWasExpanding(false); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, true); MotionEvent secondTouch = createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN); mQsController.handleTouch(secondTouch, false, true); assertThat(mQsController.isTracking()).isFalse(); } @Test public void handleTouch_qsTouchedWhileExpanding() { mQsController.setQs(mQs); mQsController.handleTouch( createMotionEvent(100, 100, ACTION_DOWN), false, false); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, false); mQsController.setLastShadeFlingWasExpanding(true); mQsController.handleTouch( createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN), false, false); assertThat(mQsController.isTracking()).isTrue(); } @Test public void handleTouch_isConflictingExpansionGestureSet() { assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); } @Test public void handleTouch_isConflictingExpansionGestureSet_cancel() { mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), false, false); assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_UP), true, true); assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); } @Test public void handleTouch_twoFingerExpandPossibleConditions() { assertThat(mQsController.isTwoFingerExpandPossible()).isFalse(); mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), true, false); assertThat(mQsController.isTwoFingerExpandPossible()).isTrue(); } @Test public void handleTouch_twoFingerDrag() { mQsController.setQs(mQs); mQsController.setStatusBarMinHeight(1); mQsController.setTwoFingerExpandPossible(true); mQsController.handleTouch( createMultitouchMotionEvent(ACTION_POINTER_DOWN), false, false); assertThat(mQsController.isExpandImmediate()).isTrue(); verify(mQs).setListening(true); } @Test public void onQsFragmentAttached_fullWidth_setsFullWidthTrueOnQS() { setIsFullWidth(true); Loading @@ -329,19 +432,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { verify(mQSFragment).setIsNotificationPanelFullWidth(false); } @Test public void getMaxPanelTransitionDistance_inSplitShade_withHeadsUp_returnsBiggerValue() { enableSplitShade(true); mNotificationPanelViewController.expandWithQs(); when(mHeadsUpManager.isTrackingHeadsUp()).thenReturn(true); mNotificationPanelViewController.setHeadsUpDraggingStartingHeight( SPLIT_SHADE_FULL_TRANSITION_DISTANCE); assertThat(mQsController.calculatePanelHeightExpanded(0)) .isGreaterThan(SPLIT_SHADE_FULL_TRANSITION_DISTANCE); } @Test public void setQsExpansion_lockscreenShadeTransitionInProgress_usesLockscreenSquishiness() { float squishinessFraction = 0.456f; Loading Loading @@ -378,6 +468,21 @@ public class QuickSettingsControllerTest extends SysuiTestCase { ); } @Test public void updateExpansion_expandImmediateOrAlreadyExpanded_usesFullSquishiness() { mQsController.setQs(mQs); when(mQs.getDesiredHeight()).thenReturn(100); mQsController.onHeightChanged(); mQsController.setExpandImmediate(true); mQsController.setExpanded(false); mQsController.updateExpansion(); mQsController.setExpandImmediate(false); mQsController.setExpanded(true); mQsController.updateExpansion(); verify(mQs, times(2)).setQsExpansion(0, 0, 0, 1); } @Test public void shadeExpanded_onKeyguard() { mStatusBarStateController.setState(KEYGUARD); Loading @@ -393,9 +498,52 @@ public class QuickSettingsControllerTest extends SysuiTestCase { assertThat(mQsController.computeExpansionFraction()).isEqualTo(1f); } @Test public void handleTouch_splitShadeAndtouchXOutsideQs() { enableSplitShade(true); assertThat(mQsController.handleTouch(createMotionEvent( QS_FRAME_WIDTH + 1, QS_FRAME_BOTTOM - 1, ACTION_DOWN), false, false)).isFalse(); } @Test public void isOpenQsEvent_twoFingerDrag() { assertThat(mQsController.isOpenQsEvent( createMultitouchMotionEvent(ACTION_POINTER_DOWN))).isTrue(); } @Test public void isOpenQsEvent_stylusButtonClickDrag() { MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); event.setButtonState(BUTTON_STYLUS_PRIMARY); assertThat(mQsController.isOpenQsEvent(event)).isTrue(); } @Test public void isOpenQsEvent_mouseButtonClickDrag() { MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); event.setButtonState(BUTTON_SECONDARY); assertThat(mQsController.isOpenQsEvent(event)).isTrue(); } private static MotionEvent createMotionEvent(int x, int y, int action) { return MotionEvent.obtain( /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); return MotionEvent.obtain(0, 0, action, x, y, 0); } // Creates an empty multitouch event for now private static MotionEvent createMultitouchMotionEvent(int action) { return MotionEvent.obtain(0, 0, action, 2, new MotionEvent.PointerProperties[] { new MotionEvent.PointerProperties(), new MotionEvent.PointerProperties() }, new MotionEvent.PointerCoords[] { new MotionEvent.PointerCoords(), new MotionEvent.PointerCoords() }, 0, 0, 0, 0, 0, 0, 0, 0); } private void enableSplitShade(boolean enabled) { Loading @@ -412,4 +560,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { int oldMaxHeight = mQsController.updateHeightsOnShadeLayoutChange(); mQsController.handleShadeLayoutChanged(oldMaxHeight); } }