Merge "Adding more test coverage for QuickSettingsController" into tm-qpr-dev am: 5a9061eeb3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21466903

Change-Id: If56d59ddc33a0061415f527ea0cd3c34f3f5625d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Shawn Lee
2023-02-22 20:53:46 +00:00
committed by Automerger Merge Worker
2 changed files with 209 additions and 46 deletions

View File

@@ -425,6 +425,11 @@ public class QuickSettingsController {
updateExpansionEnabledAmbient();
}
@VisibleForTesting
void setStatusBarMinHeight(int height) {
mStatusBarMinHeight = height;
}
int getHeaderHeight() {
return mQs.getHeader().getHeight();
}
@@ -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();
@@ -847,6 +853,11 @@ public class QuickSettingsController {
mTwoFingerExpandPossible = expandPossible;
}
@VisibleForTesting
boolean isTwoFingerExpandPossible() {
return mTwoFingerExpandPossible;
}
/** Called when Qs starts expanding */
private void onExpansionStarted() {
cancelExpansionAnimation();
@@ -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;
@@ -1668,7 +1680,8 @@ public class QuickSettingsController {
return false;
}
private void onPanelExpansionChanged(ShadeExpansionChangeEvent event) {
@VisibleForTesting
void onPanelExpansionChanged(ShadeExpansionChangeEvent event) {
mShadeExpandedFraction = event.getFraction();
}

View File

@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
@@ -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);
@@ -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);
@@ -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();
}
@@ -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);
@@ -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;
@@ -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);
@@ -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) {
@@ -412,4 +560,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase {
int oldMaxHeight = mQsController.updateHeightsOnShadeLayoutChange();
mQsController.handleShadeLayoutChanged(oldMaxHeight);
}
}