Fixed Shade freezing when tapped while collapsing

Shade collapse animation would freeze if the shade was tapped quickly
enough to not exceed touchSlop, as the code that starts the animation
again would not be run in this case. Added an extra condition that
allows these taps when the shade is in a partially expanded/collapsed
state.

Test: manual
Bug: 233309355
Change-Id: I321fef348128880fa9057496f97fa9b2a96f4804
This commit is contained in:
Shawn Lee
2022-09-30 11:51:08 -07:00
parent 3e2ed2a87b
commit 94b7244265
2 changed files with 48 additions and 0 deletions

View File

@@ -1440,6 +1440,16 @@ public final class NotificationPanelViewController {
mMaxAllowedKeyguardNotifications = maxAllowed;
}
@VisibleForTesting
boolean getClosing() {
return mClosing;
}
@VisibleForTesting
boolean getIsFlinging() {
return mIsFlinging;
}
private void updateMaxDisplayedNotifications(boolean recompute) {
if (recompute) {
setMaxDisplayedNotifications(Math.max(computeMaxKeyguardNotifications(), 1));
@@ -3684,6 +3694,11 @@ public final class NotificationPanelViewController {
setListening(true);
}
@VisibleForTesting
void setTouchSlopExceeded(boolean isTouchSlopExceeded) {
mTouchSlopExceeded = isTouchSlopExceeded;
}
public void setOverExpansion(float overExpansion) {
if (overExpansion == mOverExpansion) {
return;
@@ -4742,6 +4757,7 @@ public final class NotificationPanelViewController {
mAmbientState.setSwipingUp(false);
if ((mTracking && mTouchSlopExceeded) || Math.abs(x - mInitialExpandX) > mTouchSlop
|| Math.abs(y - mInitialExpandY) > mTouchSlop
|| (!isFullyExpanded() && !isFullyCollapsed())
|| event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) {
mVelocityTracker.computeCurrentVelocity(1000);
float vel = mVelocityTracker.getYVelocity();

View File

@@ -756,6 +756,38 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
assertThat(mNotificationPanelViewController.isTracking()).isTrue();
}
@Test
public void testOnTouchEvent_expansionResumesAfterBriefTouch() {
// Start shade collapse with swipe up
onTouchEvent(MotionEvent.obtain(0L /* downTime */,
0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
0 /* metaState */));
onTouchEvent(MotionEvent.obtain(0L /* downTime */,
0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 300f /* y */,
0 /* metaState */));
onTouchEvent(MotionEvent.obtain(0L /* downTime */,
0L /* eventTime */, MotionEvent.ACTION_UP, 0f /* x */, 300f /* y */,
0 /* metaState */));
assertThat(mNotificationPanelViewController.getClosing()).isTrue();
assertThat(mNotificationPanelViewController.getIsFlinging()).isTrue();
// simulate touch that does not exceed touch slop
onTouchEvent(MotionEvent.obtain(2L /* downTime */,
2L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 300f /* y */,
0 /* metaState */));
mNotificationPanelViewController.setTouchSlopExceeded(false);
onTouchEvent(MotionEvent.obtain(2L /* downTime */,
2L /* eventTime */, MotionEvent.ACTION_UP, 0f /* x */, 300f /* y */,
0 /* metaState */));
// fling should still be called after a touch that does not exceed touch slop
assertThat(mNotificationPanelViewController.getClosing()).isTrue();
assertThat(mNotificationPanelViewController.getIsFlinging()).isTrue();
}
@Test
public void handleTouchEventFromStatusBar_panelsNotEnabled_returnsFalseAndNoViewEvent() {
when(mCommandQueue.panelsEnabled()).thenReturn(false);