From a8ccd542bcafa25f3812f79a129b2d511b22d614 Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Tue, 9 May 2023 15:23:47 -0700 Subject: [PATCH] Fix the overview tutorial step success animation - Tapping the screen after a successful overview gesture, but before the delayed success feedbck created a janky experience - Immediately setting the gesture as successful Flag: ENABLE_NEW_GESTURE_NAV_TUTORIAL Fixes: 281742006 Test: tapped the screen quickly after successfully completing the overview gesture Change-Id: I166060191753d6b95bc223e2be08df2bb4b4ecfd --- .../OverviewGestureTutorialController.java | 58 ++++++++----------- .../OverviewGestureTutorialFragment.java | 2 +- .../SwipeUpGestureTutorialController.java | 1 + .../interaction/TutorialController.java | 21 ++++--- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java index dfbcf4d14a..ea721bca6f 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java @@ -21,7 +21,6 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_NEW_GESTURE_NAV_T import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.annotation.Nullable; import android.annotation.TargetApi; import android.graphics.PointF; import android.os.Build; @@ -145,30 +144,11 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont showFeedback(R.string.overview_gesture_feedback_swipe_too_far_from_edge); break; case OVERVIEW_GESTURE_COMPLETED: + setGestureCompleted(); mTutorialFragment.releaseFeedbackAnimation(); - if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) { - onMotionPaused(true /*arbitrary value*/); - animateTaskViewToOverview(() -> { - mFakeTaskView.setVisibility(View.INVISIBLE); - if(!mTutorialFragment.isLargeScreen()){ - mFakePreviousTaskView.animateToFillScreen(() -> { - mFakeLauncherView.setBackgroundColor( - mContext.getColor( - R.color.gesture_overview_tutorial_swipe_rect - )); - showSuccessFeedback(); - }); - } else { - mFakeLauncherView.setBackgroundColor( - mContext.getColor( - R.color.gesture_overview_tutorial_swipe_rect - )); - showSuccessFeedback(); - } - }); - } else { - animateTaskViewToOverview(null); - onMotionPaused(true /*arbitrary value*/); + animateTaskViewToOverview(ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()); + onMotionPaused(true /*arbitrary value*/); + if (!ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) { showSuccessFeedback(); } break; @@ -189,21 +169,28 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont /** * runnable executed with slight delay to ease the swipe animation after landing on overview - * @param runnable */ - public void animateTaskViewToOverview(@Nullable Runnable runnable) { + public void animateTaskViewToOverview(boolean animateDelayedSuccessFeedback) { PendingAnimation anim = new PendingAnimation(TASK_VIEW_END_ANIMATION_DURATION_MILLIS); anim.setFloat(mTaskViewSwipeUpAnimation .getCurrentShift(), AnimatedFloat.VALUE, 1, ACCEL); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animator) { - if (runnable != null) { - new Handler().postDelayed(runnable, 300); + if (animateDelayedSuccessFeedback) { + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animator) { + new Handler().postDelayed(() -> { + mFakeTaskView.setVisibility(View.INVISIBLE); + if (!mTutorialFragment.isLargeScreen()) { + mFakePreviousTaskView.animateToFillScreen( + () -> onSuccessAnimationComplete()); + } else { + onSuccessAnimationComplete(); + } + }, TASK_VIEW_FILL_SCREEN_ANIMATION_DELAY_MILLIS); } - } - }); + }); + } ArrayList animators = new ArrayList<>(); @@ -222,4 +209,9 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont animset.start(); mRunningWindowAnim = SwipeUpAnimationLogic.RunningWindowAnim.wrap(animset); } + + private void onSuccessAnimationComplete() { + setLauncherViewColor(R.color.gesture_overview_tutorial_swipe_rect); + showSuccessFeedback(); + } } diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java index c471a13869..01074dd276 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java @@ -73,7 +73,7 @@ public class OverviewGestureTutorialFragment extends TutorialFragment { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); - controller.animateTaskViewToOverview(null); + controller.animateTaskViewToOverview(false); } }); diff --git a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java index a8af05e7d8..5a2c2cdf11 100644 --- a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java @@ -64,6 +64,7 @@ abstract class SwipeUpGestureTutorialController extends TutorialController { private static final int FAKE_PREVIOUS_TASK_MARGIN = Utilities.dpToPx(12); protected static final long TASK_VIEW_END_ANIMATION_DURATION_MILLIS = 300; + protected static final long TASK_VIEW_FILL_SCREEN_ANIMATION_DELAY_MILLIS = 300; private static final long HOME_SWIPE_ANIMATION_DURATION_MILLIS = 625; private static final long OVERVIEW_SWIPE_ANIMATION_DURATION_MILLIS = 1000; diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index d4ff457266..198305fe04 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -316,6 +316,14 @@ abstract class TutorialController implements BackGestureAttemptCallback, } } + /** + * Only use this when a gesture is completed, but the feedback shouldn't be shown immediately. + * In that case, call this method immediately instead. + */ + public void setGestureCompleted() { + mGestureCompleted = true; + } + /** * Show feedback reflecting a successful gesture attempt. **/ @@ -641,13 +649,17 @@ abstract class TutorialController implements BackGestureAttemptCallback, } } + void setLauncherViewColor(@ColorRes int backgroundColorRes) { + mFakeLauncherView.setBackgroundColor(mContext.getColor(backgroundColorRes)); + } + private void updateDrawables() { if (mContext != null) { mTutorialFragment.getRootView().setBackground(AppCompatResources.getDrawable( mContext, getMockWallpaperResId())); mTutorialFragment.updateFeedbackAnimation(); - mFakeLauncherView.setBackgroundColor( - mContext.getColor(R.color.gesture_tutorial_fake_wallpaper_color)); + setLauncherViewColor(ENABLE_NEW_GESTURE_NAV_TUTORIAL.get() + ? getSwipeActionColorResId() : R.color.gesture_tutorial_fake_wallpaper_color); updateFakeViewLayout(mFakeHotseatView, getMockHotseatResId()); mHotseatIconView = mFakeHotseatView.findViewById(R.id.hotseat_icon_1); updateFakeViewLayout(mFakeTaskView, getMockAppTaskLayoutResId()); @@ -657,11 +669,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, getMockPreviousAppTaskThumbnailColorResId())); mFakeIconView.setBackground(AppCompatResources.getDrawable( mContext, getMockAppIconResId())); - - if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) { - mFakeLauncherView.setBackgroundColor( - mContext.getColor(getSwipeActionColorResId())); - } } }