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
diff --git a/quickstep/res/layout/activity_allset.xml b/quickstep/res/layout/activity_allset.xml
index 06dfa37..0cae733 100644
--- a/quickstep/res/layout/activity_allset.xml
+++ b/quickstep/res/layout/activity_allset.xml
@@ -72,12 +72,11 @@
<TextView
android:id="@+id/subtitle"
style="@style/TextAppearance.GestureTutorial.Feedback.Subtitle.AllSet"
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/allset_subtitle_margin_top"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintWidth_max="@dimen/allset_subtitle_width_max"
android:gravity="start"/>
<androidx.constraintlayout.widget.Guideline
diff --git a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java
index b3f2354..f440638 100644
--- a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.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 Home gesture interactive tutorial. */
public class AssistantGestureTutorialFragment extends TutorialFragment {
- protected AssistantGestureTutorialFragment(
- SharedPreferences sharedPrefs, StatsLogManager statsLogManager) {
- super(sharedPrefs, statsLogManager);
- }
+ public AssistantGestureTutorialFragment() {}
@Override
TutorialController createController(TutorialType type) {
@@ -49,12 +47,12 @@
}
@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/BackGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
index e7ed0b4..37253e2 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
@@ -19,10 +19,10 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-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;
@@ -34,10 +34,7 @@
/** Shows the Back gesture interactive tutorial. */
public class BackGestureTutorialFragment extends TutorialFragment {
- protected BackGestureTutorialFragment(
- SharedPreferences sharedPrefs, StatsLogManager statsLogManager) {
- super(sharedPrefs, statsLogManager);
- }
+ public BackGestureTutorialFragment() {}
@Nullable
@Override
@@ -126,14 +123,14 @@
}
@Override
- void logTutorialStepShown() {
- mStatsLogManager.logger().log(
+ void logTutorialStepShown(@NonNull StatsLogManager statsLogManager) {
+ statsLogManager.logger().log(
StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_BACK_STEP_SHOWN);
}
@Override
- void logTutorialStepCompleted() {
- mStatsLogManager.logger().log(
+ void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager) {
+ statsLogManager.logger().log(
StatsLogManager.LauncherEvent.LAUNCHER_GESTURE_TUTORIAL_BACK_STEP_COMPLETED);
}
}
diff --git a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
index 002e8b7..7daac81 100644
--- a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
@@ -65,10 +65,7 @@
mTutorialSteps = getTutorialSteps(args);
mCurrentTutorialStep = mTutorialSteps[mCurrentStep - 1];
mFragment = TutorialFragment.newInstance(
- mCurrentTutorialStep,
- args.getBoolean(KEY_GESTURE_COMPLETE, false),
- mSharedPrefs,
- mStatsLogManager);
+ mCurrentTutorialStep, args.getBoolean(KEY_GESTURE_COMPLETE, false));
getSupportFragmentManager().beginTransaction()
.add(R.id.gesture_tutorial_fragment_container, mFragment)
.commit();
@@ -103,6 +100,14 @@
super.onSaveInstanceState(savedInstanceState);
}
+ protected SharedPreferences getSharedPrefs() {
+ return mSharedPrefs;
+ }
+
+ protected StatsLogManager getStatsLogManager() {
+ return mStatsLogManager;
+ }
+
/** Returns true iff there aren't anymore tutorial types to display to the user. */
public boolean isTutorialComplete() {
return mCurrentStep >= mNumSteps;
@@ -128,7 +133,7 @@
}
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 e987d5a..95eafda 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java
@@ -18,10 +18,10 @@
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 @@
/** 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 @@
}
@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 c7e24db..4e1521f 100644
--- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java
@@ -18,10 +18,10 @@
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 @@
/** 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 @@
}
@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 92a2731..5183e2c 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 @@
}
@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 7556bf4..33e800d 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
@@ -60,9 +60,6 @@
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 @@
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 @@
}
@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 @@
}
void onAttachedToWindow() {
- logTutorialStepShown();
+ StatsLogManager statsLogManager = getStatsLogManager();
+ if (statsLogManager != null) {
+ logTutorialStepShown(statsLogManager);
+ }
mEdgeBackGestureHandler.setViewGroupParent(getRootView());
}
@@ -374,14 +362,20 @@
}
void continueTutorial() {
- Set<String> updatedCompletedSteps = new ArraySet<>(mSharedPrefs.getStringSet(
- COMPLETED_TUTORIAL_STEPS_PREFERENCE_KEY, new ArraySet<>()));
+ SharedPreferences sharedPrefs = getSharedPreferences();
+ if (sharedPrefs != null) {
+ Set<String> 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 @@
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 @@
|| (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 @@
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;
+ }
}