Only do snapback animations on Swipeable views

SwipeHelper is observing all the children of the notification shade, it
is translating them on swipes and performs dismiss or snapback
animations on them.

NotificationSwipeHelper overrides a couple of methods to make them only
work for views implementing the SwipeableView interface.

The SwipeHelper#snapChild method is triggered for non swipeable views as
well, and it starts an animation for them, but previously we never
noticed, because the `setTranslation` method is overriden, so views
never had a starting translation to snap back from.

Updating the snapback anim to a spring animation (ag/22119722) caused a
regression, because the spring anim can do an overshoot from the target
position if it was given some starting velocity.

This is a trivial fix to skip triggering the snapback anim for non
swipeable views.

Fixes: 278858192
Test: atest NotificationSwipeHelperTest
Test: try to drag the non swipeable views in the NotificationShade and
observe that they stay in place

Change-Id: I5afb7bb94c052faf0025abe15f586937733c5fa4
This commit is contained in:
András Kurucz
2023-05-19 09:36:45 +00:00
parent fd9d67ef3e
commit fd77f12147
2 changed files with 21 additions and 8 deletions

View File

@@ -354,7 +354,11 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc
@Override
protected void snapChild(final View animView, final float targetLeft, float velocity) {
superSnapChild(animView, targetLeft, velocity);
if (animView instanceof SwipeableView) {
// only perform the snapback animation on views that are swipeable inside the shade.
superSnapChild(animView, targetLeft, velocity);
}
mCallback.onDragCancelled(animView);
if (targetLeft == 0) {
handleMenuCoveredOrDismissed();

View File

@@ -392,23 +392,32 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
@Test
public void testSnapchild_targetIsZero() {
doNothing().when(mSwipeHelper).superSnapChild(mView, 0, 0);
mSwipeHelper.snapChild(mView, 0, 0);
doNothing().when(mSwipeHelper).superSnapChild(mNotificationRow, 0, 0);
mSwipeHelper.snapChild(mNotificationRow, 0, 0);
verify(mCallback, times(1)).onDragCancelled(mView);
verify(mSwipeHelper, times(1)).superSnapChild(mView, 0, 0);
verify(mCallback, times(1)).onDragCancelled(mNotificationRow);
verify(mSwipeHelper, times(1)).superSnapChild(mNotificationRow, 0, 0);
verify(mSwipeHelper, times(1)).handleMenuCoveredOrDismissed();
}
@Test
public void testSnapchild_targetNotZero() {
doNothing().when(mSwipeHelper).superSnapChild(mNotificationRow, 10, 0);
mSwipeHelper.snapChild(mNotificationRow, 10, 0);
verify(mCallback, times(1)).onDragCancelled(mNotificationRow);
verify(mSwipeHelper, times(1)).superSnapChild(mNotificationRow, 10, 0);
verify(mSwipeHelper, times(0)).handleMenuCoveredOrDismissed();
}
@Test
public void testSnapchild_targetNotSwipeable() {
doNothing().when(mSwipeHelper).superSnapChild(mView, 10, 0);
mSwipeHelper.snapChild(mView, 10, 0);
verify(mCallback, times(1)).onDragCancelled(mView);
verify(mSwipeHelper, times(1)).superSnapChild(mView, 10, 0);
verify(mSwipeHelper, times(0)).handleMenuCoveredOrDismissed();
verify(mCallback).onDragCancelled(mView);
verify(mSwipeHelper, never()).superSnapChild(mView, 10, 0);
}
@Test