From 2ec0ade64a4b4228caa8881a55d3cb02e434e3a1 Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Thu, 24 Sep 2020 13:27:30 -0700 Subject: [PATCH] Add sandbox mode to gesture tutorial settings. Test: manual Added a Sandbox mode tutorial fragment and controller. This fragment allows the user to try all the gesture commands and receive feedback, whether the gesture was successful or not. Preview: https://drive.google.com/file/d/1Qmn71ZHMOrv2XjUngb6S4W5jOaBIvF1_/view?usp=sharing Change-Id: I7d28ce25daa38fa6d05b18d43d02b77c1fc8a264 --- quickstep/res/values/strings.xml | 15 +++ .../SandboxModeTutorialController.java | 102 ++++++++++++++++++ .../SandboxModeTutorialFragment.java | 43 ++++++++ .../interaction/TutorialController.java | 6 +- .../interaction/TutorialFragment.java | 2 + .../settings/DeveloperOptionsFragment.java | 9 ++ 6 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java create mode 100644 quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index 769d29838a..b913ba4480 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -149,6 +149,21 @@ Try swiping further + + Sandbox Mode + + Try any navigation gesture + + Back gesture successful + + Assistant gesture successful + + Home gesture successful + + Overview gesture successful + + Make sure you swipe from the left/right edge of the screen + All set diff --git a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java new file mode 100644 index 0000000000..d54efc56e5 --- /dev/null +++ b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.interaction; + +import android.graphics.PointF; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.android.launcher3.R; +import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult; +import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult; + +/** A {@link TutorialController} for the Sandbox Mode. */ +public class SandboxModeTutorialController extends SwipeUpGestureTutorialController { + + SandboxModeTutorialController(SandboxModeTutorialFragment fragment, TutorialType tutorialType) { + super(fragment, tutorialType); + } + + @Nullable + @Override + Integer getTitleStringId() { + return R.string.sandbox_mode_title; + } + + @Nullable + @Override + Integer getSubtitleStringId() { + return R.string.sandbox_mode_subtitle; + } + + @Nullable + @Override + Integer getActionButtonStringId() { + return R.string.gesture_tutorial_action_button_label_done; + } + + @Override + void onActionButtonClicked(View button) { + mTutorialFragment.closeTutorial(); + } + + @Override + public void onBackGestureAttempted(BackGestureResult result) { + switch (result) { + case BACK_COMPLETED_FROM_LEFT: + case BACK_COMPLETED_FROM_RIGHT: + 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); + break; + case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE: + showFeedback(R.string.sandbox_mode_back_gesture_feedback_swipe_too_far_from_edge); + break; + } + } + + @Override + public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) { + switch (result) { + case ASSISTANT_COMPLETED: + showRippleEffect(null); + showFeedback(R.string.sandbox_mode_assistant_gesture_feedback_successful); + break; + case HOME_GESTURE_COMPLETED: + animateFakeTaskViewHome(finalVelocity, () -> { + showFeedback(R.string.sandbox_mode_home_gesture_feedback_successful); + }); + break; + case OVERVIEW_GESTURE_COMPLETED: + fadeOutFakeTaskView(true, () -> { + showFeedback(R.string.sandbox_mode_overview_gesture_feedback_successful); + }); + break; + case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION: + case HOME_OR_OVERVIEW_CANCELLED: + case HOME_NOT_STARTED_TOO_FAR_FROM_EDGE: + case OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE: + showFeedback(R.string.home_gesture_feedback_swipe_too_far_from_edge); + break; + } + } +} diff --git a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java new file mode 100644 index 0000000000..955a2f7d2e --- /dev/null +++ b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.interaction; + +import android.view.MotionEvent; +import android.view.View; + +import com.android.quickstep.interaction.TutorialController.TutorialType; + +/** Shows the general navigation gesture sandbox environment. */ +public class SandboxModeTutorialFragment extends TutorialFragment { + + @Override + TutorialController createController(TutorialType type) { + return new SandboxModeTutorialController(this, type); + } + + @Override + Class getControllerClass() { + return SandboxModeTutorialController.class; + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && mTutorialController != null) { + mTutorialController.setRippleHotspot(motionEvent.getX(), motionEvent.getY()); + } + return super.onTouch(view, motionEvent); + } +} diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index d0a12679c0..2198ade105 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -213,7 +213,8 @@ abstract class TutorialController implements BackGestureAttemptCallback, return mTutorialType == TutorialType.BACK_NAVIGATION_COMPLETE || mTutorialType == TutorialType.HOME_NAVIGATION_COMPLETE || mTutorialType == TutorialType.OVERVIEW_NAVIGATION_COMPLETE - || mTutorialType == TutorialType.ASSISTANT_COMPLETE; + || mTutorialType == TutorialType.ASSISTANT_COMPLETE + || mTutorialType == TutorialType.SANDBOX_MODE; } /** Denotes the type of the tutorial. */ @@ -226,6 +227,7 @@ abstract class TutorialController implements BackGestureAttemptCallback, OVERVIEW_NAVIGATION, OVERVIEW_NAVIGATION_COMPLETE, ASSISTANT, - ASSISTANT_COMPLETE + ASSISTANT_COMPLETE, + SANDBOX_MODE } } diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java index 559ba354d2..f297d5a835 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java @@ -76,6 +76,8 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { case ASSISTANT: case ASSISTANT_COMPLETE: return new AssistantGestureTutorialFragment(); + case SANDBOX_MODE: + return new SandboxModeTutorialFragment(); default: Log.e(LOG_TAG, "Failed to find an appropriate fragment for " + tutorialType.name()); } diff --git a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java index 4baecb7c56..f4b059d8d8 100644 --- a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java +++ b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java @@ -306,6 +306,15 @@ public class DeveloperOptionsFragment extends PreferenceFragmentCompat { return true; }); sandboxCategory.addPreference(launchAssistantTutorialPreference); + Preference launchSandboxModeTutorialPreference = new Preference(context); + launchSandboxModeTutorialPreference.setKey("launchSandboxMode"); + launchSandboxModeTutorialPreference.setTitle("Launch Sandbox Mode"); + launchSandboxModeTutorialPreference.setSummary("Practice navigation gestures"); + launchSandboxModeTutorialPreference.setOnPreferenceClickListener(preference -> { + startActivity(launchSandboxIntent.putExtra("tutorial_type", "SANDBOX_MODE")); + return true; + }); + sandboxCategory.addPreference(launchSandboxModeTutorialPreference); } private String toName(String action) {