From 054faba0a194fa78f551d60672d84c43732630d2 Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Thu, 24 Mar 2022 14:23:47 -0700 Subject: [PATCH] Add public constructors to gesture tutorial fragments. The lack of public, no-arg constructors was causing the tutorial to crash on re-creation (eg. rotating the screen.) Added public constructors and refactored event logging. Also added an update to the All Set page to allow the subtitle to display in one line. Fixes: 226321558 Fixes: 226550217 Test: manual Change-Id: I00a6135e658a66313df5e07833e6c6a20a618672 --- quickstep/res/layout/activity_allset.xml | 3 +- .../AssistantGestureTutorialFragment.java | 12 ++- .../BackGestureTutorialFragment.java | 15 ++-- .../interaction/GestureSandboxActivity.java | 15 ++-- .../HomeGestureTutorialFragment.java | 15 ++-- .../OverviewGestureTutorialFragment.java | 15 ++-- .../SandboxModeTutorialFragment.java | 12 ++- .../interaction/TutorialFragment.java | 86 +++++++++++-------- 8 files changed, 89 insertions(+), 84 deletions(-) diff --git a/quickstep/res/layout/activity_allset.xml b/quickstep/res/layout/activity_allset.xml index 06dfa37263..0cae733dbe 100644 --- a/quickstep/res/layout/activity_allset.xml +++ b/quickstep/res/layout/activity_allset.xml @@ -72,12 +72,11 @@ = mNumSteps; @@ -128,7 +133,7 @@ public class GestureSandboxActivity extends FragmentActivity { } mCurrentTutorialStep = mTutorialSteps[mCurrentStep]; mFragment = TutorialFragment.newInstance( - mCurrentTutorialStep, /* gestureComplete= */ false, mSharedPrefs, mStatsLogManager); + mCurrentTutorialStep, /* gestureComplete= */ false); getSupportFragmentManager().beginTransaction() .replace(R.id.gesture_tutorial_fragment_container, mFragment) .runOnCommit(() -> mFragment.onAttachedToWindow()) diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java index e987d5a83b..95eafdae33 100644 --- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java @@ -18,10 +18,10 @@ package com.android.quickstep.interaction; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.content.SharedPreferences; import android.view.MotionEvent; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.R; @@ -33,10 +33,7 @@ import java.util.ArrayList; /** Shows the Home gesture interactive tutorial. */ public class HomeGestureTutorialFragment extends TutorialFragment { - protected HomeGestureTutorialFragment( - SharedPreferences sharedPrefs, StatsLogManager statsLogManager) { - super(sharedPrefs, statsLogManager); - } + public HomeGestureTutorialFragment() {} @Nullable @Override @@ -108,14 +105,14 @@ public class HomeGestureTutorialFragment extends TutorialFragment { } @Override - void logTutorialStepShown() { - mStatsLogManager.logger().log( + void logTutorialStepShown(@NonNull StatsLogManager statsLogManager) { + statsLogManager.logger().log( StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_HOME_STEP_SHOWN); } @Override - void logTutorialStepCompleted() { - mStatsLogManager.logger().log( + void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager) { + statsLogManager.logger().log( StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_HOME_STEP_COMPLETED); } } diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java index c7e24dbd7c..4e1521f161 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java @@ -18,10 +18,10 @@ package com.android.quickstep.interaction; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.content.SharedPreferences; import android.view.MotionEvent; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.R; @@ -33,10 +33,7 @@ import java.util.ArrayList; /** Shows the Overview gesture interactive tutorial. */ public class OverviewGestureTutorialFragment extends TutorialFragment { - protected OverviewGestureTutorialFragment( - SharedPreferences sharedPrefs, StatsLogManager statsLogManager) { - super(sharedPrefs, statsLogManager); - } + public OverviewGestureTutorialFragment() {} @Nullable @Override @@ -120,14 +117,14 @@ public class OverviewGestureTutorialFragment extends TutorialFragment { } @Override - void logTutorialStepShown() { - mStatsLogManager.logger().log( + void logTutorialStepShown(@NonNull StatsLogManager statsLogManager) { + statsLogManager.logger().log( StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_OVERVIEW_STEP_SHOWN); } @Override - void logTutorialStepCompleted() { - mStatsLogManager.logger().log( + void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager) { + statsLogManager.logger().log( StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_OVERVIEW_STEP_COMPLETED); } } diff --git a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java index 92a27314bc..5183e2c961 100644 --- a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialFragment.java @@ -15,20 +15,18 @@ */ package com.android.quickstep.interaction; -import android.content.SharedPreferences; import android.view.MotionEvent; import android.view.View; +import androidx.annotation.NonNull; + import com.android.launcher3.logging.StatsLogManager; import com.android.quickstep.interaction.TutorialController.TutorialType; /** Shows the general navigation gesture sandbox environment. */ public class SandboxModeTutorialFragment extends TutorialFragment { - protected SandboxModeTutorialFragment( - SharedPreferences sharedPrefs, StatsLogManager statsLogManager) { - super(sharedPrefs, statsLogManager); - } + public SandboxModeTutorialFragment() {} @Override TutorialController createController(TutorialType type) { @@ -49,12 +47,12 @@ public class SandboxModeTutorialFragment extends TutorialFragment { } @Override - void logTutorialStepShown() { + void logTutorialStepShown(@NonNull StatsLogManager statsLogManager) { // No-Op: tutorial step not currently shown to users } @Override - void logTutorialStepCompleted() { + void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager) { // No-Op: tutorial step not currently shown to users } } diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java index 7556bf4c29..33e800d1c0 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java @@ -60,9 +60,6 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { private static final String COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY = "pref_completedTutorialSteps"; - private final SharedPreferences mSharedPrefs; - protected final StatsLogManager mStatsLogManager; - TutorialType mTutorialType; boolean mGestureComplete = false; @Nullable TutorialController mTutorialController = null; @@ -84,14 +81,10 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { private boolean mIsFoldable; public static TutorialFragment newInstance( - TutorialType tutorialType, - boolean gestureComplete, - SharedPreferences sharedPrefs, - StatsLogManager statsLogManager) { - TutorialFragment fragment = - getFragmentForTutorialType(tutorialType, sharedPrefs, statsLogManager); + TutorialType tutorialType, boolean gestureComplete) { + TutorialFragment fragment = getFragmentForTutorialType(tutorialType); if (fragment == null) { - fragment = new BackGestureTutorialFragment(sharedPrefs, statsLogManager); + fragment = new BackGestureTutorialFragment(); tutorialType = TutorialType.BACK_NAVIGATION; } @@ -103,36 +96,28 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { } @Nullable - private static TutorialFragment getFragmentForTutorialType( - TutorialType tutorialType, - SharedPreferences sharedPrefs, - StatsLogManager statsLogManager) { + private static TutorialFragment getFragmentForTutorialType(TutorialType tutorialType) { switch (tutorialType) { case BACK_NAVIGATION: case BACK_NAVIGATION_COMPLETE: - return new BackGestureTutorialFragment(sharedPrefs, statsLogManager); + return new BackGestureTutorialFragment(); case HOME_NAVIGATION: case HOME_NAVIGATION_COMPLETE: - return new HomeGestureTutorialFragment(sharedPrefs, statsLogManager); + return new HomeGestureTutorialFragment(); case OVERVIEW_NAVIGATION: case OVERVIEW_NAVIGATION_COMPLETE: - return new OverviewGestureTutorialFragment(sharedPrefs, statsLogManager); + return new OverviewGestureTutorialFragment(); case ASSISTANT: case ASSISTANT_COMPLETE: - return new AssistantGestureTutorialFragment(sharedPrefs, statsLogManager); + return new AssistantGestureTutorialFragment(); case SANDBOX_MODE: - return new SandboxModeTutorialFragment(sharedPrefs, statsLogManager); + return new SandboxModeTutorialFragment(); default: Log.e(LOG_TAG, "Failed to find an appropriate fragment for " + tutorialType.name()); } return null; } - protected TutorialFragment(SharedPreferences sharedPrefs, StatsLogManager statsLogManager) { - mSharedPrefs = sharedPrefs; - mStatsLogManager = statsLogManager; - } - @Nullable Integer getEdgeAnimationResId() { return null; } @@ -340,7 +325,10 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { } void onAttachedToWindow() { - logTutorialStepShown(); + StatsLogManager statsLogManager = getStatsLogManager(); + if (statsLogManager != null) { + logTutorialStepShown(statsLogManager); + } mEdgeBackGestureHandler.setViewGroupParent(getRootView()); } @@ -374,14 +362,20 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { } void continueTutorial() { - Set updatedCompletedSteps = new ArraySet<>(mSharedPrefs.getStringSet( - COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY, new ArraySet<>())); + SharedPreferences sharedPrefs = getSharedPreferences(); + if (sharedPrefs != null) { + Set updatedCompletedSteps = new ArraySet<>(sharedPrefs.getStringSet( + COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY, new ArraySet<>())); - updatedCompletedSteps.add(mTutorialType.toString()); + updatedCompletedSteps.add(mTutorialType.toString()); - mSharedPrefs.edit().putStringSet( - COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY, updatedCompletedSteps).apply(); - logTutorialStepCompleted(); + sharedPrefs.edit().putStringSet( + COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY, updatedCompletedSteps).apply(); + } + StatsLogManager statsLogManager = getStatsLogManager(); + if (statsLogManager != null) { + logTutorialStepCompleted(statsLogManager); + } GestureSandboxActivity gestureSandboxActivity = getGestureSandboxActivity(); if (gestureSandboxActivity == null) { @@ -397,9 +391,15 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { void closeTutorial(boolean tutorialSkipped) { if (tutorialSkipped) { - mSharedPrefs.edit().putBoolean(TUTORIAL_SKIPPED_PREFERENCE_KEY, true).apply(); - mStatsLogManager.logger().log( - StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_SKIPPED); + SharedPreferences sharedPrefs = getSharedPreferences(); + if (sharedPrefs != null) { + sharedPrefs.edit().putBoolean(TUTORIAL_SKIPPED_PREFERENCE_KEY, true).apply(); + } + StatsLogManager statsLogManager = getStatsLogManager(); + if (statsLogManager != null) { + statsLogManager.logger().log( + StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_SKIPPED); + } } FragmentActivity activity = getActivity(); if (activity != null) { @@ -433,9 +433,9 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { || (mTutorialController != null && mTutorialController.isGestureCompleted()); } - abstract void logTutorialStepShown(); + abstract void logTutorialStepShown(@NonNull StatsLogManager statsLogManager); - abstract void logTutorialStepCompleted(); + abstract void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager); @Nullable private GestureSandboxActivity getGestureSandboxActivity() { @@ -443,4 +443,18 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener { return context instanceof GestureSandboxActivity ? (GestureSandboxActivity) context : null; } + + @Nullable + private StatsLogManager getStatsLogManager() { + GestureSandboxActivity activity = getGestureSandboxActivity(); + + return activity != null ? activity.getStatsLogManager() : null; + } + + @Nullable + private SharedPreferences getSharedPreferences() { + GestureSandboxActivity activity = getGestureSandboxActivity(); + + return activity != null ? activity.getSharedPrefs() : null; + } }