Merge changes I53d8e217,Iff38e372 into udc-dev

* changes:
  Aggressively reset SwipeHelper state
  Clear mTouchedView when a snap-back animation ends
This commit is contained in:
Jeff DeCew
2023-06-01 20:00:14 +00:00
committed by Android (Google) Code Review
3 changed files with 43 additions and 12 deletions

View File

@@ -548,6 +548,10 @@ public class SwipeHelper implements Gefingerpoken, Dumpable {
if (!cancelled) { if (!cancelled) {
updateSwipeProgressFromOffset(animView, canBeDismissed); updateSwipeProgressFromOffset(animView, canBeDismissed);
resetSwipeOfView(animView); resetSwipeOfView(animView);
// Clear the snapped view after success, assuming it's not being swiped now
if (animView == mTouchedView && !mIsSwiping) {
mTouchedView = null;
}
} }
onChildSnappedBack(animView, targetLeft); onChildSnappedBack(animView, targetLeft);
}); });
@@ -813,13 +817,39 @@ public class SwipeHelper implements Gefingerpoken, Dumpable {
} }
} }
public void resetSwipeState() { private void resetSwipeState() {
View swipedView = getSwipedView(); resetSwipeStates(/* resetAll= */ false);
}
public void resetTouchState() {
resetSwipeStates(/* resetAll= */ true);
}
/** This method resets the swipe state, and if `resetAll` is true, also resets the snap state */
private void resetSwipeStates(boolean resetAll) {
final View touchedView = mTouchedView;
final boolean wasSnapping = mSnappingChild;
final boolean wasSwiping = mIsSwiping;
mTouchedView = null; mTouchedView = null;
mIsSwiping = false; mIsSwiping = false;
if (swipedView != null) { // If we were swiping, then we resetting swipe requires resetting everything.
snapChildIfNeeded(swipedView, false, 0); resetAll |= wasSwiping;
onChildSnappedBack(swipedView, 0); if (resetAll) {
mSnappingChild = false;
}
if (touchedView == null) return; // No view to reset visually
// When snap needs to be reset, first thing is to cancel any translation animation
final boolean snapNeedsReset = resetAll && wasSnapping;
if (snapNeedsReset) {
cancelTranslateAnimation(touchedView);
}
// actually reset the view to default state
if (resetAll) {
snapChildIfNeeded(touchedView, false, 0);
}
// report if a swipe or snap was reset.
if (wasSwiping || snapNeedsReset) {
onChildSnappedBack(touchedView, 0);
} }
} }

View File

@@ -4406,6 +4406,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
boolean nowHiddenAtAll = mAmbientState.isHiddenAtAll(); boolean nowHiddenAtAll = mAmbientState.isHiddenAtAll();
if (nowFullyHidden != wasFullyHidden) { if (nowFullyHidden != wasFullyHidden) {
updateVisibility(); updateVisibility();
mSwipeHelper.resetTouchState();
} }
if (!wasHiddenAtAll && nowHiddenAtAll) { if (!wasHiddenAtAll && nowHiddenAtAll) {
resetExposedMenuView(true /* animate */, true /* animate */); resetExposedMenuView(true /* animate */, true /* animate */);
@@ -5866,7 +5867,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
} }
private void cancelActiveSwipe() { private void cancelActiveSwipe() {
mSwipeHelper.resetSwipeState(); mSwipeHelper.resetTouchState();
updateContinuousShadowDrawing(); updateContinuousShadowDrawing();
} }

View File

@@ -836,7 +836,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
} }
@Test @Test
public void onShadeClosesWithAnimationWillResetSwipeState() { public void onShadeClosesWithAnimationWillResetTouchState() {
// GIVEN shade is expanded // GIVEN shade is expanded
mStackScroller.setIsExpanded(true); mStackScroller.setIsExpanded(true);
clearInvocations(mNotificationSwipeHelper); clearInvocations(mNotificationSwipeHelper);
@@ -846,12 +846,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
mStackScroller.setIsExpanded(false); mStackScroller.setIsExpanded(false);
mStackScroller.onExpansionStopped(); mStackScroller.onExpansionStopped();
// VERIFY swipe is reset // VERIFY touch is reset
verify(mNotificationSwipeHelper).resetSwipeState(); verify(mNotificationSwipeHelper).resetTouchState();
} }
@Test @Test
public void onShadeClosesWithoutAnimationWillResetSwipeState() { public void onShadeClosesWithoutAnimationWillResetTouchState() {
// GIVEN shade is expanded // GIVEN shade is expanded
mStackScroller.setIsExpanded(true); mStackScroller.setIsExpanded(true);
clearInvocations(mNotificationSwipeHelper); clearInvocations(mNotificationSwipeHelper);
@@ -859,8 +859,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
// WHEN closing the shade without the animation // WHEN closing the shade without the animation
mStackScroller.setIsExpanded(false); mStackScroller.setIsExpanded(false);
// VERIFY swipe is reset // VERIFY touch is reset
verify(mNotificationSwipeHelper).resetSwipeState(); verify(mNotificationSwipeHelper).resetTouchState();
} }
@Test @Test