Merge "Fix invoking transient taskbar in desktop windowing prototypes" into tm-qpr-dev
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java
index ae121e2..d087d39 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java
@@ -16,6 +16,7 @@
 package com.android.launcher3.statehandlers;
 
 import android.os.SystemProperties;
+import android.util.Log;
 import android.view.View;
 
 import com.android.launcher3.Launcher;
@@ -29,6 +30,9 @@
  */
 public class DesktopVisibilityController {
 
+    private static final String TAG = "DesktopVisController";
+    private static final boolean DEBUG = false;
+
     private final Launcher mLauncher;
 
     private boolean mFreeformTasksVisible;
@@ -58,6 +62,9 @@
      * Sets whether freeform windows are visible and updates launcher visibility based on that.
      */
     public void setFreeformTasksVisible(boolean freeformTasksVisible) {
+        if (DEBUG) {
+            Log.d(TAG, "setFreeformTasksVisible: visible=" + freeformTasksVisible);
+        }
         if (!isDesktopModeSupported()) {
             return;
         }
@@ -83,6 +90,9 @@
      * Sets whether the overview is visible and updates launcher visibility based on that.
      */
     public void setOverviewStateEnabled(boolean overviewStateEnabled) {
+        if (DEBUG) {
+            Log.d(TAG, "setOverviewStateEnabled: enabled=" + overviewStateEnabled);
+        }
         if (!isDesktopModeSupported()) {
             return;
         }
@@ -109,6 +119,9 @@
      * Sets whether recents gesture is in progress.
      */
     public void setGestureInProgress(boolean gestureInProgress) {
+        if (DEBUG) {
+            Log.d(TAG, "setGestureInProgress: inProgress=" + gestureInProgress);
+        }
         if (!isDesktopModeSupported()) {
             return;
         }
@@ -118,6 +131,9 @@
     }
 
     private void setLauncherViewsVisibility(int visibility) {
+        if (DEBUG) {
+            Log.d(TAG, "setLauncherViewsVisibility: visibility=" + visibility);
+        }
         View workspaceView = mLauncher.getWorkspace();
         if (workspaceView != null) {
             workspaceView.setVisibility(visibility);
@@ -129,6 +145,9 @@
     }
 
     private void markLauncherPaused() {
+        if (DEBUG) {
+            Log.d(TAG, "markLauncherPaused");
+        }
         StatefulActivity<LauncherState> activity =
                 QuickstepLauncher.ACTIVITY_TRACKER.getCreatedActivity();
         if (activity != null) {
@@ -137,6 +156,9 @@
     }
 
     private void markLauncherResumed() {
+        if (DEBUG) {
+            Log.d(TAG, "markLauncherResumed");
+        }
         StatefulActivity<LauncherState> activity =
                 QuickstepLauncher.ACTIVITY_TRACKER.getCreatedActivity();
         // Check activity state before calling setResumed(). Launcher may have been actually
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 5537878..124f15e 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -800,7 +800,7 @@
 
     @Override
     public void setResumed() {
-        if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) {
+        if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
             DesktopVisibilityController controller = mDesktopVisibilityController;
             if (controller != null && controller.areFreeformTasksVisible()
                     && !controller.isGestureInProgress()) {
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 274b686..f9ad749 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -20,6 +20,7 @@
 import static com.android.launcher3.anim.Interpolators.INSTANT;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
 import static com.android.quickstep.AbsSwipeUpHandler.RECENTS_ATTACH_DURATION;
+import static com.android.quickstep.GestureState.GestureEndTarget.LAST_TASK;
 import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
 import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_FADE_ANIM;
 import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_TRANSLATE_X_ANIM;
@@ -62,6 +63,7 @@
 import com.android.launcher3.views.ScrimView;
 import com.android.quickstep.util.ActivityInitListener;
 import com.android.quickstep.util.AnimatorControllerWithResistance;
+import com.android.quickstep.views.DesktopTaskView;
 import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.recents.model.ThumbnailData;
 
@@ -107,6 +109,20 @@
         if (endTarget != null) {
             // We were on our way to this state when we got canceled, end there instead.
             startState = stateFromGestureEndTarget(endTarget);
+            if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
+                DesktopVisibilityController controller = getDesktopVisibilityController();
+                if (controller != null && controller.areFreeformTasksVisible()
+                        && endTarget == LAST_TASK) {
+                    // When we are cancelling the transition and going back to last task, move to
+                    // rest state instead when desktop tasks are visible.
+                    // If a fullscreen task is visible, launcher goes to normal state when the
+                    // activity is stopped. This does not happen when freeform tasks are visible
+                    // on top of launcher. Force the launcher state to rest state here.
+                    startState = activity.getStateManager().getRestState();
+                    // Do not animate the transition
+                    activityVisible = false;
+                }
+            }
         }
         activity.getStateManager().goToState(startState, activityVisible);
     }
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index c45b2f0..725f9e7 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -40,6 +40,7 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.quickstep.TopTaskTracker.CachedTaskInfo;
 import com.android.quickstep.util.ActiveGestureLog;
+import com.android.quickstep.views.DesktopTaskView;
 import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.recents.model.ThumbnailData;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -238,6 +239,12 @@
             // to let the transition controller collect Home activity.
             CachedTaskInfo cti = gestureState.getRunningTask();
             boolean homeIsOnTop = cti != null && cti.isHomeTask();
+            if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
+                if (cti != null && cti.isFreeformTask()) {
+                    // No transient launch when desktop task is on top
+                    homeIsOnTop = true;
+                }
+            }
             if (!homeIsOnTop) {
                 options.setTransientLaunch();
             }
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index d4bf5c7..6d8ee10 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -18,6 +18,7 @@
 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.content.Intent.ACTION_CHOOSER;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.view.Display.DEFAULT_DISPLAY;
@@ -255,6 +256,15 @@
         }
 
         /**
+         * Returns {@code true} if this task windowing mode is set to {@link
+         * android.app.WindowConfiguration#WINDOWING_MODE_FREEFORM}
+         */
+        public boolean isFreeformTask() {
+            return mTopTask != null && mTopTask.configuration.windowConfiguration.getWindowingMode()
+                    == WINDOWING_MODE_FREEFORM;
+        }
+
+        /**
          * Returns {@link Task} array which can be used as a placeholder until the true object
          * is loaded by the model
          */
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index c6dc15a..ff26129 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -41,8 +41,10 @@
 import com.android.launcher3.util.PendingSplitSelectInfo;
 import com.android.launcher3.util.SplitConfigurationOptions;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
+import com.android.quickstep.GestureState;
 import com.android.quickstep.LauncherActivityInterface;
 import com.android.quickstep.RotationTouchHelper;
+import com.android.quickstep.SystemUiProxy;
 import com.android.quickstep.util.SplitSelectStateController;
 import com.android.systemui.shared.recents.model.Task;
 
@@ -223,11 +225,23 @@
 
     @Override
     public void onGestureAnimationEnd() {
+        DesktopVisibilityController desktopVisibilityController = null;
+        boolean showDesktopApps = false;
+        if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
+            desktopVisibilityController = mActivity.getDesktopVisibilityController();
+            if (mCurrentGestureEndTarget == GestureState.GestureEndTarget.LAST_TASK
+                    && desktopVisibilityController.areFreeformTasksVisible()) {
+                // Recents gesture was cancelled and we are returning to the previous task.
+                // After super class has handled clean up, show desktop apps on top again
+                showDesktopApps = true;
+            }
+        }
         super.onGestureAnimationEnd();
-        DesktopVisibilityController desktopVisibilityController =
-                mActivity.getDesktopVisibilityController();
         if (desktopVisibilityController != null) {
             desktopVisibilityController.setGestureInProgress(false);
         }
+        if (showDesktopApps) {
+            SystemUiProxy.INSTANCE.get(mActivity).showDesktopApps();
+        }
     }
 }