Show swipe-up tip with exponential backoff

Change-Id: Icd32c0bd98623173322e5e33bd5400e679a01a10
Fixes: 79985309
Test: Manual test
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index a7163bb..d437555 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -94,6 +94,8 @@
         String OVERVIEW_OPENED_FROM_HOME_COUNT = "OverviewOpenedFromHomeCount";
         String HAS_SEEN_RECENTS_SWIPE_UP_ONBOARDING = "HasSeenRecentsSwipeUpOnboarding";
         String HAS_SEEN_RECENTS_QUICK_SCRUB_ONBOARDING = "HasSeenRecentsQuickScrubOnboarding";
+        String DISMISSED_RECENTS_SWIPE_UP_ONBOARDING_COUNT =
+                "DismissedRecentsSwipeUpOnboardingCount";
         String HAS_DISMISSED_RECENTS_QUICK_SCRUB_ONBOARDING_ONCE =
                 "HasDismissedRecentsQuickScrubOnboardingOnce";
         String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index ff0c11d..bcc33d2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -20,6 +20,7 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 
 import static com.android.systemui.Prefs.Key.HAS_DISMISSED_RECENTS_QUICK_SCRUB_ONBOARDING_ONCE;
+import static com.android.systemui.Prefs.Key.DISMISSED_RECENTS_SWIPE_UP_ONBOARDING_COUNT;
 import static com.android.systemui.Prefs.Key.HAS_SEEN_RECENTS_QUICK_SCRUB_ONBOARDING;
 import static com.android.systemui.Prefs.Key.HAS_SEEN_RECENTS_SWIPE_UP_ONBOARDING;
 import static com.android.systemui.Prefs.Key.OVERVIEW_OPENED_COUNT;
@@ -87,9 +88,17 @@
     private static final int SWIPE_UP_SHOW_ON_OVERVIEW_OPENED_FROM_HOME_COUNT = 3;
     // Show quick scrub tips after opening overview this number of times.
     private static final int QUICK_SCRUB_SHOW_ON_OVERVIEW_OPENED_COUNT = 10;
-    // After explicitly dismissing, show again after launching this number of apps for swipe-up
-    // tips.
+    // Maximum number of dismissals while still showing swipe-up tips.
+    private static final int MAX_DISMISSAL_ON_SWIPE_UP_SHOW = 4;
+    // Number of dismissals for swipe-up tips when exponential backoff starts.
+    private static final int BACKOFF_DISMISSAL_COUNT_ON_SWIPE_UP_SHOW = 2;
+    // After explicitly dismissing for <= BACKOFF_DISMISSAL_COUNT_ON_SWIPE_UP_SHOW times, show again
+    // after launching this number of apps for swipe-up tips.
     private static final int SWIPE_UP_SHOW_ON_APP_LAUNCH_AFTER_DISMISS = 5;
+    // After explicitly dismissing for > BACKOFF_DISMISSAL_COUNT_ON_SWIPE_UP_SHOW but
+    // <= MAX_DISMISSAL_ON_SWIPE_UP_SHOW times, show again after launching this number of apps for
+    // swipe-up tips.
+    private static final int SWIPE_UP_SHOW_ON_APP_LAUNCH_AFTER_DISMISS_BACK_OFF = 10;
 
     private final Context mContext;
     private final WindowManager mWindowManager;
@@ -152,9 +161,20 @@
                     if (getOpenedOverviewFromHomeCount()
                             >= SWIPE_UP_SHOW_ON_OVERVIEW_OPENED_FROM_HOME_COUNT) {
                         if (mHasDismissedSwipeUpTip) {
+                            int hasDimissedSwipeUpOnboardingCount =
+                                    getDismissedSwipeUpOnboardingCount();
+                            if (hasDimissedSwipeUpOnboardingCount > MAX_DISMISSAL_ON_SWIPE_UP_SHOW) {
+                                Log.d(TAG, "Should not be reached");
+                                return;
+                            }
+                            final int swipeUpShowOnAppLauncherAfterDismiss =
+                                    hasDimissedSwipeUpOnboardingCount
+                                            <= BACKOFF_DISMISSAL_COUNT_ON_SWIPE_UP_SHOW
+                                            ? SWIPE_UP_SHOW_ON_APP_LAUNCH_AFTER_DISMISS
+                                            : SWIPE_UP_SHOW_ON_APP_LAUNCH_AFTER_DISMISS_BACK_OFF;
                             mNumAppsLaunchedSinceSwipeUpTipDismiss++;
                             if (mNumAppsLaunchedSinceSwipeUpTipDismiss
-                                    == SWIPE_UP_SHOW_ON_APP_LAUNCH_AFTER_DISMISS) {
+                                    == swipeUpShowOnAppLauncherAfterDismiss) {
                                 mNumAppsLaunchedSinceSwipeUpTipDismiss = 0;
                                 shouldLog = show(R.string.recents_swipe_up_onboarding);
                             }
@@ -286,6 +306,10 @@
             if (v.getTag().equals(R.string.recents_swipe_up_onboarding)) {
                 mHasDismissedSwipeUpTip = true;
                 mNumAppsLaunchedSinceSwipeUpTipDismiss = 0;
+                setDismissedSwipeUpOnboardingCount(getDismissedSwipeUpOnboardingCount() + 1);
+                if (getDismissedSwipeUpOnboardingCount() > MAX_DISMISSAL_ON_SWIPE_UP_SHOW) {
+                    setHasSeenSwipeUpOnboarding(true);
+                }
                 notifyOnTip(DISMISS, RECENTS_SWIPE_UP_ONBOARDING_TIP);
             } else {
                 notifyOnTip(DISMISS, RECENTS_QUICK_SCRUB_ONBOARDING_TIP);
@@ -304,6 +328,7 @@
         if (RESET_PREFS_FOR_DEBUG) {
             setHasSeenSwipeUpOnboarding(false);
             setHasSeenQuickScrubOnboarding(false);
+            setDismissedSwipeUpOnboardingCount(0);
             setHasDismissedQuickScrubOnboardingOnce(false);
             setOpenedOverviewCount(0);
             setOpenedOverviewFromHomeCount(0);
@@ -440,6 +465,8 @@
                 + mNumAppsLaunchedSinceSwipeUpTipDismiss);
         pw.println("      hasSeenSwipeUpOnboarding: " + hasSeenSwipeUpOnboarding());
         pw.println("      hasSeenQuickScrubOnboarding: " + hasSeenQuickScrubOnboarding());
+        pw.println("      getDismissedSwipeUpOnboardingCount: "
+                + getDismissedSwipeUpOnboardingCount());
         pw.println("      hasDismissedQuickScrubOnboardingOnce: "
                 + hasDismissedQuickScrubOnboardingOnce());
         pw.println("      getOpenedOverviewCount: " + getOpenedOverviewCount());
@@ -488,6 +515,16 @@
         }
     }
 
+    private int getDismissedSwipeUpOnboardingCount() {
+        return Prefs.getInt(mContext, DISMISSED_RECENTS_SWIPE_UP_ONBOARDING_COUNT, 0);
+    }
+
+    private void setDismissedSwipeUpOnboardingCount(int dismissedSwipeUpOnboardingCount) {
+        Log.d(TAG, "setDismissedSwipeUpOnboardingCount: " + dismissedSwipeUpOnboardingCount);
+        Prefs.putInt(mContext, DISMISSED_RECENTS_SWIPE_UP_ONBOARDING_COUNT,
+                dismissedSwipeUpOnboardingCount);
+    }
+
     private boolean hasDismissedQuickScrubOnboardingOnce() {
         return Prefs.getBoolean(mContext, HAS_DISMISSED_RECENTS_QUICK_SCRUB_ONBOARDING_ONCE, false);
     }