Files
Lawnchair/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
T
Saumya Prakash 5c5472ff96 Fix UI issues of fake task view in gesture nav tutorial.
This change fixes the bug where the view for the fake task in the overview gesture was not being reset correctly. This was leading to UI issues such as lack of rounded corners and incorrect animations in the gesture navigation tutorial.

Flag: ENABLE_NEW_GESTURE_NAV_TUTORIAL
Fix: 281121451
Fix: 281121699
Fix: 281785378
Test: Manually went through the tutorial on handheld, foldable, and
tablet devices

Change-Id: I424a471013d2b8667724f790618d142ba7ae9a7b
2023-05-11 17:41:18 +00:00

164 lines
6.3 KiB
Java

/*
* 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 static com.android.launcher3.config.FeatureFlags.ENABLE_NEW_GESTURE_NAV_TUTORIAL;
import android.annotation.TargetApi;
import android.graphics.PointF;
import android.os.Build;
import com.android.launcher3.R;
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
import com.android.quickstep.util.LottieAnimationColorUtils;
import java.util.Map;
/** A {@link TutorialController} for the Home tutorial. */
@TargetApi(Build.VERSION_CODES.R)
final class HomeGestureTutorialController extends SwipeUpGestureTutorialController {
HomeGestureTutorialController(HomeGestureTutorialFragment fragment, TutorialType tutorialType) {
super(fragment, tutorialType);
if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) {
LottieAnimationColorUtils.updateColors(
mAnimatedGestureDemonstration,
Map.of(".onSurfaceHome", R.color.gesture_tutorial_workspace_background,
".surfaceHome", R.color.gesture_home_tutorial_background,
".arrow", R.color.gesture_home_tutorial_arrow),
mContext.getTheme());
}
}
@Override
public int getIntroductionTitle() {
return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
? R.string.home_gesture_tutorial_title
: R.string.home_gesture_intro_title;
}
@Override
public int getIntroductionSubtitle() {
return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
? R.string.home_gesture_tutorial_subtitle
: R.string.home_gesture_intro_subtitle;
}
@Override
public int getSpokenIntroductionSubtitle() {
return R.string.home_gesture_spoken_intro_subtitle;
}
@Override
public int 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 ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
? R.layout.swipe_up_gesture_tutorial_shape
: mTutorialFragment.isLargeScreen()
? R.layout.gesture_tutorial_tablet_mock_webpage
: R.layout.gesture_tutorial_mock_webpage;
}
@Override
protected int getGestureLottieAnimationId() {
return mTutorialFragment.isLargeScreen()
? mTutorialFragment.isFoldable()
? R.raw.home_gesture_tutorial_open_foldable_animation
: R.raw.home_gesture_tutorial_tablet_animation
: R.raw.home_gesture_tutorial_animation;
}
@Override
protected int getSwipeActionColorResId() {
return R.color.gesture_tutorial_workspace_background;
}
@Override
public void onBackGestureAttempted(BackGestureResult result) {
if (isGestureCompleted()) {
return;
}
switch (mTutorialType) {
case HOME_NAVIGATION:
switch (result) {
case BACK_COMPLETED_FROM_LEFT:
case BACK_COMPLETED_FROM_RIGHT:
case BACK_CANCELLED_FROM_LEFT:
case BACK_CANCELLED_FROM_RIGHT:
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
resetTaskView();
showFeedback(R.string.home_gesture_feedback_swipe_too_far_from_edge);
break;
}
break;
case HOME_NAVIGATION_COMPLETE:
if (result == BackGestureResult.BACK_COMPLETED_FROM_LEFT
|| result == BackGestureResult.BACK_COMPLETED_FROM_RIGHT) {
mTutorialFragment.close();
}
break;
}
}
@Override
public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) {
if (isGestureCompleted()) {
return;
}
switch (mTutorialType) {
case HOME_NAVIGATION:
switch (result) {
case HOME_GESTURE_COMPLETED: {
mTutorialFragment.releaseFeedbackAnimation();
animateFakeTaskViewHome(finalVelocity, null);
showSuccessFeedback();
break;
}
case HOME_NOT_STARTED_TOO_FAR_FROM_EDGE:
case OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE:
resetTaskView();
showFeedback(R.string.home_gesture_feedback_swipe_too_far_from_edge);
break;
case OVERVIEW_GESTURE_COMPLETED:
fadeOutFakeTaskView(true, true, () -> {
showFeedback(R.string.home_gesture_feedback_overview_detected);
showFakeTaskbar(/* animateFromHotseat= */ false);
});
break;
case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION:
case HOME_OR_OVERVIEW_CANCELLED:
fadeOutFakeTaskView(false, true, null);
showFeedback(R.string.home_gesture_feedback_wrong_swipe_direction);
break;
}
break;
case HOME_NAVIGATION_COMPLETE:
if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
mTutorialFragment.close();
}
break;
}
}
}