diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java index fb6cd8a513..49d820387c 100644 --- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java @@ -42,6 +42,13 @@ final class BackGestureTutorialController extends TutorialController { return R.string.back_gesture_intro_subtitle; } + @Override + public Integer getSuccessFeedbackSubtitle() { + return mTutorialFragment.isAtFinalStep() + ? R.string.back_gesture_feedback_complete_without_follow_up + : R.string.back_gesture_feedback_complete_with_overview_follow_up; + } + @Override protected int getMockAppTaskLayoutResId() { return getMockAppTaskCurrentPageLayoutResId(); @@ -85,10 +92,7 @@ final class BackGestureTutorialController extends TutorialController { case BACK_COMPLETED_FROM_RIGHT: mTutorialFragment.releaseFeedbackAnimation(); updateFakeAppTaskViewLayout(getMockAppTaskPreviousPageLayoutResId()); - int subtitleResId = mTutorialFragment.isAtFinalStep() - ? R.string.back_gesture_feedback_complete_without_follow_up - : R.string.back_gesture_feedback_complete_with_overview_follow_up; - showFeedback(subtitleResId, true); + showSuccessFeedback(); break; case BACK_CANCELLED_FROM_LEFT: case BACK_CANCELLED_FROM_RIGHT: diff --git a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java index 7fb7d2997e..c2524b1b5a 100644 --- a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java +++ b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java @@ -35,10 +35,9 @@ import java.util.List; /** Shows the gesture interactive sandbox in full screen mode. */ public class GestureSandboxActivity extends FragmentActivity { - private static final String LOG_TAG = "GestureSandboxActivity"; - private static final String KEY_TUTORIAL_STEPS = "tutorial_steps"; private static final String KEY_CURRENT_STEP = "current_step"; + private static final String KEY_GESTURE_COMPLETE = "gesture_complete"; private TutorialType[] mTutorialSteps; private TutorialType mCurrentTutorialStep; @@ -56,7 +55,8 @@ public class GestureSandboxActivity extends FragmentActivity { Bundle args = savedInstanceState == null ? getIntent().getExtras() : savedInstanceState; mTutorialSteps = getTutorialSteps(args); mCurrentTutorialStep = mTutorialSteps[mCurrentStep - 1]; - mFragment = TutorialFragment.newInstance(mCurrentTutorialStep); + mFragment = TutorialFragment.newInstance( + mCurrentTutorialStep, args.getBoolean(KEY_GESTURE_COMPLETE, false)); getSupportFragmentManager().beginTransaction() .add(R.id.gesture_tutorial_fragment_container, mFragment) .commit(); @@ -87,6 +87,7 @@ public class GestureSandboxActivity extends FragmentActivity { protected void onSaveInstanceState(@NonNull Bundle savedInstanceState) { savedInstanceState.putStringArray(KEY_TUTORIAL_STEPS, getTutorialStepNames()); savedInstanceState.putInt(KEY_CURRENT_STEP, mCurrentStep); + savedInstanceState.putBoolean(KEY_GESTURE_COMPLETE, mFragment.isGestureComplete()); super.onSaveInstanceState(savedInstanceState); } @@ -121,7 +122,7 @@ public class GestureSandboxActivity extends FragmentActivity { return; } mCurrentTutorialStep = mTutorialSteps[mCurrentStep]; - mFragment = TutorialFragment.newInstance(mCurrentTutorialStep); + mFragment = TutorialFragment.newInstance(mCurrentTutorialStep, false); getSupportFragmentManager().beginTransaction() .replace(R.id.gesture_tutorial_fragment_container, mFragment) .runOnCommit(() -> mFragment.onAttachedToWindow()) diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java index bbb22e643f..0bc3691d44 100644 --- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java @@ -41,6 +41,13 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll return R.string.home_gesture_intro_subtitle; } + @Override + public Integer getSuccessFeedbackSubtitle() { + return mTutorialFragment.isAtFinalStep() + ? R.string.home_gesture_feedback_complete_without_follow_up + : R.string.home_gesture_feedback_complete_with_follow_up; + } + @Override protected int getMockAppTaskLayoutResId() { return mTutorialFragment.isLargeScreen() @@ -84,10 +91,7 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll case HOME_GESTURE_COMPLETED: { mTutorialFragment.releaseFeedbackAnimation(); animateFakeTaskViewHome(finalVelocity, null); - int subtitleResId = mTutorialFragment.isAtFinalStep() - ? R.string.home_gesture_feedback_complete_without_follow_up - : R.string.home_gesture_feedback_complete_with_follow_up; - showFeedback(subtitleResId, true); + showSuccessFeedback(); break; } case HOME_NOT_STARTED_TOO_FAR_FROM_EDGE: diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java index 0fea0d7fe2..f308f27d4d 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java @@ -51,6 +51,13 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont return R.string.overview_gesture_intro_subtitle; } + @Override + public Integer getSuccessFeedbackSubtitle() { + return mTutorialFragment.getNumSteps() > 1 && mTutorialFragment.isAtFinalStep() + ? R.string.overview_gesture_feedback_complete_with_follow_up + : R.string.overview_gesture_feedback_complete_without_follow_up; + } + @Override protected int getMockAppTaskLayoutResId() { return mTutorialFragment.isLargeScreen() @@ -106,11 +113,7 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont mTutorialFragment.releaseFeedbackAnimation(); animateTaskViewToOverview(); onMotionPaused(true /*arbitrary value*/); - int subtitleResId = mTutorialFragment.getNumSteps() > 1 - && mTutorialFragment.isAtFinalStep() - ? R.string.overview_gesture_feedback_complete_with_follow_up - : R.string.overview_gesture_feedback_complete_without_follow_up; - showFeedback(subtitleResId, true); + showSuccessFeedback(); break; case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION: case HOME_OR_OVERVIEW_CANCELLED: diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index 81e18f64cb..4145393262 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -223,6 +223,11 @@ abstract class TutorialController implements BackGestureAttemptCallback, return null; } + @StringRes + public Integer getSuccessFeedbackSubtitle() { + return null; + } + void showFeedback() { if (mGestureCompleted) { mFeedbackView.setTranslationY(0); @@ -235,6 +240,13 @@ abstract class TutorialController implements BackGestureAttemptCallback, } } + /** + * Show feedback reflecting a successful gesture attempt. + **/ + void showSuccessFeedback() { + showFeedback(getSuccessFeedbackSubtitle(), true); + } + /** * Show feedback reflecting a failed gesture attempt. * diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java index 89be1a6190..2fd7cde3a0 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java @@ -49,8 +49,10 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { private static final String LOG_TAG = "TutorialFragment"; static final String KEY_TUTORIAL_TYPE = "tutorial_type"; + static final String KEY_GESTURE_COMPLETE = "gesture_complete"; TutorialType mTutorialType; + boolean mGestureComplete = false; @Nullable TutorialController mTutorialController = null; RootSandboxLayout mRootView; View mFingerDotView; @@ -67,7 +69,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { private boolean mIsLargeScreen; - public static TutorialFragment newInstance(TutorialType tutorialType) { + public static TutorialFragment newInstance(TutorialType tutorialType, boolean gestureComplete) { TutorialFragment fragment = getFragmentForTutorialType(tutorialType); if (fragment == null) { fragment = new BackGestureTutorialFragment(); @@ -76,6 +78,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { Bundle args = new Bundle(); args.putSerializable(KEY_TUTORIAL_TYPE, tutorialType); + args.putBoolean(KEY_GESTURE_COMPLETE, gestureComplete); fragment.setArguments(args); return fragment; } @@ -132,6 +135,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { super.onCreate(savedInstanceState); Bundle args = savedInstanceState != null ? savedInstanceState : getArguments(); mTutorialType = (TutorialType) args.getSerializable(KEY_TUTORIAL_TYPE); + mGestureComplete = args.getBoolean(KEY_GESTURE_COMPLETE, false); mEdgeBackGestureHandler = new EdgeBackGestureHandler(getContext()); mNavBarGestureHandler = new NavBarGestureHandler(getContext()); @@ -186,11 +190,13 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { } void initializeFeedbackVideoView() { - if (!updateFeedbackAnimation()) { + if (!updateFeedbackAnimation() || mTutorialController == null) { return; } - if (!mIntroductionShown && mTutorialController != null) { + if (isGestureComplete()) { + mTutorialController.showSuccessFeedback(); + } else if (!mIntroductionShown) { Integer introTileStringResId = mTutorialController.getIntroductionTitle(); Integer introSubtitleResId = mTutorialController.getIntroductionSubtitle(); if (introTileStringResId != null && introSubtitleResId != null) { @@ -372,6 +378,11 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { return getCurrentStep() == getNumSteps(); } + boolean isGestureComplete() { + return mGestureComplete + || (mTutorialController != null && mTutorialController.isGestureCompleted()); + } + @Nullable private GestureSandboxActivity getGestureSandboxActivity() { Context context = getContext();