Merge "Add overview button handling to Go recents." into ub-launcher3-master
diff --git a/go/quickstep/src/com/android/launcher3/uioverrides/RecentsUiFactory.java b/go/quickstep/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
index d7cba39..29e650c 100644
--- a/go/quickstep/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
+++ b/go/quickstep/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
@@ -28,6 +28,7 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.util.TouchController;
 import com.android.quickstep.OverviewInteractionState;
+import com.android.quickstep.views.IconRecentsView;
 
 import java.util.ArrayList;
 
@@ -35,7 +36,7 @@
  * Provides recents-related {@link UiFactory} logic and classes.
  */
 public abstract class RecentsUiFactory {
-    
+
     public static final boolean GO_LOW_RAM_RECENTS_ENABLED = true;
     // Scale recents takes before animating in
     private static final float RECENTS_PREPARE_SCALE = 1.33f;
@@ -87,7 +88,10 @@
      *
      * @param launcher the launcher activity
      */
-    public static void resetOverview(Launcher launcher) {}
+    public static void resetOverview(Launcher launcher) {
+        IconRecentsView recentsView = launcher.getOverviewPanel();
+        recentsView.setTransitionedFromApp(false);
+    }
 
     /**
      * Recents logic that triggers when launcher state changes or launcher activity stops/resumes.
diff --git a/go/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java b/go/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
index defed84..051c80f 100644
--- a/go/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
+++ b/go/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
@@ -34,6 +34,7 @@
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.quickstep.util.MultiValueUpdateListener;
 import com.android.quickstep.util.RemoteAnimationProvider;
+import com.android.quickstep.util.RemoteAnimationTargetSet;
 import com.android.quickstep.views.IconRecentsView;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
@@ -100,6 +101,10 @@
             return anim;
         }
 
+        RemoteAnimationTargetSet targetSet =
+                new RemoteAnimationTargetSet(targetCompats, MODE_CLOSING);
+        mRecentsView.setTransitionedFromApp(!targetSet.isAnimatingHome());
+
         RemoteAnimationTargetCompat recentsTarget = null;
         RemoteAnimationTargetCompat closingAppTarget = null;
 
diff --git a/go/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/go/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
index d9873fe..379cc10 100644
--- a/go/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
+++ b/go/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
@@ -96,7 +96,7 @@
             if (recents == null) {
                 return false;
             }
-            //TODO: Launch last running task or go to home.
+            recents.handleOverviewCommand();
             return true;
         }
     }
@@ -146,7 +146,7 @@
         protected boolean handleCommand(long elapsedTime) {
             IconRecentsView recents = mHelper.getVisibleRecentsView();
             if (recents != null) {
-                //TODO: Launch next task in icon recents.
+                recents.handleOverviewCommand();
                 return true;
             } else if (elapsedTime < ViewConfiguration.getDoubleTapTimeout()) {
                 // The user tried to launch back into overview too quickly, either after
diff --git a/go/quickstep/src/com/android/quickstep/TaskHolder.java b/go/quickstep/src/com/android/quickstep/TaskHolder.java
index 8d5e4d5..a89229f 100644
--- a/go/quickstep/src/com/android/quickstep/TaskHolder.java
+++ b/go/quickstep/src/com/android/quickstep/TaskHolder.java
@@ -25,7 +25,7 @@
  * A recycler view holder that holds the task view and binds {@link Task} content (app title, icon,
  * etc.) to the view.
  */
-final class TaskHolder extends ViewHolder {
+public final class TaskHolder extends ViewHolder {
 
     private final TaskItemView mTaskItemView;
     private Task mTask;
diff --git a/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java b/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java
index 0e5dbc4..a1d62c2 100644
--- a/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java
+++ b/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java
@@ -35,8 +35,9 @@
 
 import com.android.launcher3.R;
 import com.android.quickstep.RecentsToActivityHelper;
-import com.android.quickstep.TaskAdapter;
 import com.android.quickstep.TaskActionController;
+import com.android.quickstep.TaskAdapter;
+import com.android.quickstep.TaskHolder;
 import com.android.quickstep.TaskListLoader;
 import com.android.quickstep.TaskSwipeCallback;
 
@@ -80,6 +81,7 @@
     private RecyclerView mTaskRecyclerView;
     private View mEmptyView;
     private View mContentView;
+    private boolean mTransitionedFromApp;
 
     public IconRecentsView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -147,6 +149,38 @@
     }
 
     /**
+     * Set whether we transitioned to recents from the most recent app.
+     *
+     * @param transitionedFromApp true if transitioned from the most recent app, false otherwise
+     */
+    public void setTransitionedFromApp(boolean transitionedFromApp) {
+        mTransitionedFromApp = transitionedFromApp;
+    }
+
+    /**
+     * Handles input from the overview button. Launch the most recent task unless we just came from
+     * the app. In that case, we launch the next most recent.
+     */
+    public void handleOverviewCommand() {
+        int childCount = mTaskRecyclerView.getChildCount();
+        if (childCount == 0) {
+            // Do nothing
+            return;
+        }
+        TaskHolder taskToLaunch;
+        if (mTransitionedFromApp && childCount > 1) {
+            // Launch the next most recent app
+            TaskItemView itemView = (TaskItemView) mTaskRecyclerView.getChildAt(1);
+            taskToLaunch = (TaskHolder) mTaskRecyclerView.getChildViewHolder(itemView);
+        } else {
+            // Launch the most recent app
+            TaskItemView itemView = (TaskItemView) mTaskRecyclerView.getChildAt(0);
+            taskToLaunch = (TaskHolder) mTaskRecyclerView.getChildViewHolder(itemView);
+        }
+        mTaskActionController.launchTask(taskToLaunch);
+    }
+
+    /**
      * Get the thumbnail view associated with a task for the purposes of animation.
      *
      * @param taskId task id of thumbnail view to get