Merge "Add public constructors to gesture tutorial fragments." into tm-dev
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;
+    }
 }