Merge "Update Gesture navigation tutorial to match new specs" into sc-dev

This commit is contained in:
Schneider Victor-tulias
2021-07-13 23:27:45 +00:00
committed by Android (Google) Code Review
16 changed files with 87 additions and 1434 deletions
@@ -15,9 +15,8 @@
*/
package com.android.quickstep.interaction;
import static com.android.quickstep.interaction.TutorialController.TutorialType.BACK_NAVIGATION;
import static com.android.quickstep.interaction.TutorialController.TutorialType.BACK_NAVIGATION_COMPLETE;
import static com.android.quickstep.interaction.TutorialController.TutorialType.LEFT_EDGE_BACK_NAVIGATION;
import static com.android.quickstep.interaction.TutorialController.TutorialType.RIGHT_EDGE_BACK_NAVIGATION;
import android.graphics.PointF;
@@ -36,15 +35,12 @@ final class BackGestureTutorialController extends TutorialController {
@Override
public Integer getIntroductionTitle() {
return mTutorialType == LEFT_EDGE_BACK_NAVIGATION
? R.string.back_left_gesture_intro_title : R.string.back_right_gesture_intro_title;
return R.string.back_gesture_intro_title;
}
@Override
public Integer getIntroductionSubtitle() {
return mTutorialType == LEFT_EDGE_BACK_NAVIGATION
? R.string.back_left_gesture_intro_subtitle
: R.string.back_right_gesture_intro_subtitle;
return R.string.back_gesture_intro_subtitle;
}
@Override
@@ -58,11 +54,8 @@ final class BackGestureTutorialController extends TutorialController {
return;
}
switch (mTutorialType) {
case RIGHT_EDGE_BACK_NAVIGATION:
handleAttemptFromRight(result);
break;
case LEFT_EDGE_BACK_NAVIGATION:
handleAttemptFromLeft(result);
case BACK_NAVIGATION:
handleBackAttempt(result);
break;
case BACK_NAVIGATION_COMPLETE:
if (result == BackGestureResult.BACK_COMPLETED_FROM_LEFT
@@ -73,8 +66,9 @@ final class BackGestureTutorialController extends TutorialController {
}
}
private void handleAttemptFromRight(BackGestureResult result) {
private void handleBackAttempt(BackGestureResult result) {
switch (result) {
case BACK_COMPLETED_FROM_LEFT:
case BACK_COMPLETED_FROM_RIGHT:
mTutorialFragment.releaseGestureVideoView();
hideFeedback(true);
@@ -85,39 +79,12 @@ final class BackGestureTutorialController extends TutorialController {
: R.string.back_gesture_feedback_complete_with_overview_follow_up;
showFeedback(subtitleResId, true);
break;
case BACK_CANCELLED_FROM_RIGHT:
showFeedback(R.string.back_gesture_feedback_cancelled_right_edge);
break;
case BACK_COMPLETED_FROM_LEFT:
case BACK_CANCELLED_FROM_LEFT:
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
showFeedback(R.string.back_gesture_feedback_swipe_too_far_from_right_edge);
break;
case BACK_NOT_STARTED_IN_NAV_BAR_REGION:
showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar);
break;
}
}
private void handleAttemptFromLeft(BackGestureResult result) {
switch (result) {
case BACK_COMPLETED_FROM_LEFT:
mTutorialFragment.releaseGestureVideoView();
hideFeedback(true);
mFakeTaskView.setBackground(AppCompatResources.getDrawable(mContext,
R.drawable.mock_conversations_list));
int subtitleResId = mTutorialFragment.isAtFinalStep()
? R.string.back_gesture_feedback_complete_without_follow_up
: R.string.back_gesture_feedback_complete_with_back_right_follow_up;
showFeedback(subtitleResId, true);
break;
case BACK_CANCELLED_FROM_LEFT:
showFeedback(R.string.back_gesture_feedback_cancelled_left_edge);
break;
case BACK_COMPLETED_FROM_RIGHT:
case BACK_CANCELLED_FROM_RIGHT:
showFeedback(R.string.back_gesture_feedback_cancelled);
break;
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
showFeedback(R.string.back_gesture_feedback_swipe_too_far_from_left_edge);
showFeedback(R.string.back_gesture_feedback_swipe_too_far_from_edge);
break;
case BACK_NOT_STARTED_IN_NAV_BAR_REGION:
showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar);
@@ -134,8 +101,7 @@ final class BackGestureTutorialController extends TutorialController {
if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
mTutorialFragment.closeTutorial();
}
} else if (mTutorialType == LEFT_EDGE_BACK_NAVIGATION
|| mTutorialType == RIGHT_EDGE_BACK_NAVIGATION) {
} else if (mTutorialType == BACK_NAVIGATION) {
showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar);
}
}
@@ -28,17 +28,13 @@ public class BackGestureTutorialFragment extends TutorialFragment {
@Nullable
@Override
Integer getFeedbackVideoResId(boolean forDarkMode) {
return mTutorialType == TutorialType.RIGHT_EDGE_BACK_NAVIGATION
? R.drawable.gesture_tutorial_motion_back_right
: R.drawable.gesture_tutorial_motion_back_left;
return R.drawable.gesture_tutorial_motion_back;
}
@Nullable
@Override
Integer getGestureVideoResId() {
return mTutorialType == TutorialType.RIGHT_EDGE_BACK_NAVIGATION
? R.drawable.gesture_tutorial_loop_back_right
: R.drawable.gesture_tutorial_loop_back_left;
return R.drawable.gesture_tutorial_loop_back;
}
@Override
@@ -141,7 +141,7 @@ public class GestureSandboxActivity extends FragmentActivity {
}
private TutorialType[] getTutorialSteps(Bundle extras) {
TutorialType[] defaultSteps = new TutorialType[] {TutorialType.LEFT_EDGE_BACK_NAVIGATION};
TutorialType[] defaultSteps = new TutorialType[] {TutorialType.BACK_NAVIGATION};
mCurrentStep = 1;
mNumSteps = 1;
@@ -82,7 +82,6 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll
case HOME_GESTURE_COMPLETED: {
mTutorialFragment.releaseGestureVideoView();
animateFakeTaskViewHome(finalVelocity, null);
showActionButton();
int subtitleResId = mTutorialFragment.isAtFinalStep()
? R.string.home_gesture_feedback_complete_without_follow_up
: R.string.home_gesture_feedback_complete_with_follow_up;
@@ -36,11 +36,9 @@ public class SandboxModeTutorialController extends SwipeUpGestureTutorialControl
showRippleEffect(null);
showFeedback(R.string.sandbox_mode_back_gesture_feedback_successful);
break;
case BACK_CANCELLED_FROM_RIGHT:
showFeedback(R.string.back_gesture_feedback_cancelled_right_edge);
break;
case BACK_CANCELLED_FROM_LEFT:
showFeedback(R.string.back_gesture_feedback_cancelled_left_edge);
case BACK_CANCELLED_FROM_RIGHT:
showFeedback(R.string.back_gesture_feedback_cancelled);
break;
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
showFeedback(R.string.sandbox_mode_back_gesture_feedback_swipe_too_far_from_edge);
@@ -59,6 +59,7 @@ abstract class TutorialController implements BackGestureAttemptCallback,
private static final int FEEDBACK_ANIMATION_MS = 250;
private static final int RIPPLE_VISIBLE_MS = 300;
private static final int GESTURE_ANIMATION_DELAY_MS = 1500;
private static final int ADVANCE_TUTORIAL_TIMEOUT_MS = 4000;
final TutorialFragment mTutorialFragment;
TutorialType mTutorialType;
@@ -220,7 +221,15 @@ abstract class TutorialController implements BackGestureAttemptCallback,
mFeedbackView.findViewById(R.id.gesture_tutorial_fragment_feedback_subtitle);
subtitle.setText(subtitleResId);
if (isGestureSuccessful) {
showActionButton();
hideCloseButton();
if (mTutorialFragment.isAtFinalStep()) {
showActionButton();
}
if (mFeedbackVideoViewCallback != null) {
mFeedbackVideoView.removeCallbacks(mFeedbackVideoViewCallback);
mFeedbackVideoViewCallback = null;
}
}
mGestureCompleted = isGestureSuccessful;
@@ -248,6 +257,16 @@ abstract class TutorialController implements BackGestureAttemptCallback,
mFeedbackView.animate()
.setDuration(FEEDBACK_ANIMATION_MS)
.translationY(0)
.withEndAction(() -> {
if (isGestureSuccessful && !mTutorialFragment.isAtFinalStep()) {
if (mFeedbackViewCallback != null) {
mFeedbackView.removeCallbacks(mFeedbackViewCallback);
}
mFeedbackViewCallback = mTutorialFragment::continueTutorial;
mFeedbackView.postDelayed(mFeedbackViewCallback,
ADVANCE_TUTORIAL_TIMEOUT_MS);
}
})
.start();
mFeedbackTitleView.postDelayed(mTitleViewCallback, FEEDBACK_ANIMATION_MS);
}
@@ -352,19 +371,26 @@ abstract class TutorialController implements BackGestureAttemptCallback,
}
}
void hideActionButton() {
void hideCloseButton() {
mCloseButton.setVisibility(GONE);
}
void showCloseButton() {
mCloseButton.setVisibility(View.VISIBLE);
mCloseButton.setTextAppearance(Utilities.isDarkTheme(mContext)
? R.style.TextAppearance_GestureTutorial_Feedback_Subtext
: R.style.TextAppearance_GestureTutorial_Feedback_Subtext_Dark);
}
void hideActionButton() {
showCloseButton();
// Invisible to maintain the layout.
mActionButton.setVisibility(View.INVISIBLE);
mActionButton.setOnClickListener(null);
}
void showActionButton() {
mCloseButton.setVisibility(GONE);
hideCloseButton();
mActionButton.setVisibility(View.VISIBLE);
mActionButton.setOnClickListener(this::onActionButtonClicked);
}
@@ -461,8 +487,7 @@ abstract class TutorialController implements BackGestureAttemptCallback,
/** Denotes the type of the tutorial. */
enum TutorialType {
RIGHT_EDGE_BACK_NAVIGATION,
LEFT_EDGE_BACK_NAVIGATION,
BACK_NAVIGATION,
BACK_NAVIGATION_COMPLETE,
HOME_NAVIGATION,
HOME_NAVIGATION_COMPLETE,
@@ -64,7 +64,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
TutorialFragment fragment = getFragmentForTutorialType(tutorialType);
if (fragment == null) {
fragment = new BackGestureTutorialFragment();
tutorialType = TutorialType.RIGHT_EDGE_BACK_NAVIGATION;
tutorialType = TutorialType.BACK_NAVIGATION;
}
Bundle args = new Bundle();
@@ -76,8 +76,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
@Nullable
private static TutorialFragment getFragmentForTutorialType(TutorialType tutorialType) {
switch (tutorialType) {
case RIGHT_EDGE_BACK_NAVIGATION:
case LEFT_EDGE_BACK_NAVIGATION:
case BACK_NAVIGATION:
case BACK_NAVIGATION_COMPLETE:
return new BackGestureTutorialFragment();
case HOME_NAVIGATION: