diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 272724e449..096ac6c5ca 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -743,6 +743,8 @@ public abstract class AbsSwipeUpHandler, mRecentsAnimationStartCallbacks.clear(); } + TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, false); + // Only add the callback to enable the input consumer after we actually have the controller mStateCallback.runOnceAtState(STATE_APP_CONTROLLER_RECEIVED | STATE_GESTURE_STARTED, mRecentsAnimationController::enableInputConsumer); @@ -757,6 +759,8 @@ public abstract class AbsSwipeUpHandler, mActivityInitListener.unregister(); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); + TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true); + // Defer clearing the controller and the targets until after we've updated the state mRecentsAnimationController = null; mRecentsAnimationTargets = null; @@ -885,6 +889,7 @@ public abstract class AbsSwipeUpHandler, break; case LAST_TASK: mStateCallback.setState(STATE_RESUME_LAST_TASK); + TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true); break; } ActiveGestureLog.INSTANCE.addLog("onSettledOnEndTarget " + endTarget); @@ -1726,6 +1731,9 @@ public abstract class AbsSwipeUpHandler, @Override public void onRecentsAnimationFinished(RecentsAnimationController controller) { + if (!controller.getFinishTargetIsLauncher()) { + TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true); + } mRecentsAnimationController = null; mRecentsAnimationTargets = null; if (mRecentsView != null) { diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java index a21c7140de..239233b191 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java @@ -19,6 +19,7 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import android.graphics.Rect; import android.util.ArraySet; +import android.view.RemoteAnimationTarget; import androidx.annotation.BinderThread; import androidx.annotation.UiThread; @@ -39,6 +40,7 @@ public class RecentsAnimationCallbacks implements com.android.systemui.shared.system.RecentsAnimationListener { private final Set mListeners = new ArraySet<>(); + private final SystemUiProxy mSystemUiProxy; private final boolean mAllowMinimizeSplitScreen; // TODO(141886704): Remove these references when they are no longer needed @@ -46,7 +48,9 @@ public class RecentsAnimationCallbacks implements private boolean mCancelled; - public RecentsAnimationCallbacks(boolean allowMinimizeSplitScreen) { + public RecentsAnimationCallbacks(SystemUiProxy systemUiProxy, + boolean allowMinimizeSplitScreen) { + mSystemUiProxy = systemUiProxy; mAllowMinimizeSplitScreen = allowMinimizeSplitScreen; } @@ -89,8 +93,11 @@ public class RecentsAnimationCallbacks implements RemoteAnimationTargetCompat[] appTargets, RemoteAnimationTargetCompat[] wallpaperTargets, Rect homeContentInsets, Rect minimizedHomeBounds) { + RemoteAnimationTarget[] nonAppTargets = + mSystemUiProxy.onGoingToRecentsLegacy(mCancelled); RecentsAnimationTargets targets = new RecentsAnimationTargets(appTargets, - wallpaperTargets, homeContentInsets, minimizedHomeBounds); + wallpaperTargets, RemoteAnimationTargetCompat.wrap(nonAppTargets), + homeContentInsets, minimizedHomeBounds); mController = new RecentsAnimationController(animationController, mAllowMinimizeSplitScreen, this::onAnimationFinished); diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java b/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java index 3861bab04b..b6d9016727 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java @@ -31,9 +31,9 @@ public class RecentsAnimationTargets extends RemoteAnimationTargets { public final Rect minimizedHomeBounds; public RecentsAnimationTargets(RemoteAnimationTargetCompat[] apps, - RemoteAnimationTargetCompat[] wallpapers, Rect homeContentInsets, - Rect minimizedHomeBounds) { - super(apps, wallpapers, new RemoteAnimationTargetCompat[0], MODE_CLOSING); + RemoteAnimationTargetCompat[] wallpapers, RemoteAnimationTargetCompat[] nonApps, + Rect homeContentInsets, Rect minimizedHomeBounds) { + super(apps, wallpapers, nonApps, MODE_CLOSING); this.homeContentInsets = homeContentInsets; this.minimizedHomeBounds = minimizedHomeBounds; } diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index 6226fb0dc0..d6b95c13ab 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -34,6 +34,7 @@ import android.os.UserHandle; import android.util.Log; import android.view.MotionEvent; import android.view.RemoteAnimationAdapter; +import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import com.android.launcher3.util.MainThreadInitializedObject; @@ -612,6 +613,24 @@ public class SystemUiProxy implements ISystemUiProxy, } } + /** + * Call this when going to recents so that shell can set-up and provide appropriate leashes + * for animation (eg. DividerBar). + * + * @param cancel true if recents starting is being cancelled. + * @return RemoteAnimationTargets of windows that need to animate but only exist in shell. + */ + public RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel) { + if (mSplitScreen != null) { + try { + return mSplitScreen.onGoingToRecentsLegacy(cancel); + } catch (RemoteException e) { + Log.w(TAG, "Failed call onGoingToRecentsLegacy"); + } + } + return null; + } + // // One handed // diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 33718a3cac..fe07cbdcce 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -109,7 +109,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn final BaseActivityInterface activityInterface = gestureState.getActivityInterface(); mLastGestureState = gestureState; - mCallbacks = new RecentsAnimationCallbacks(activityInterface.allowMinimizeSplitScreen()); + mCallbacks = new RecentsAnimationCallbacks(SystemUiProxy.INSTANCE.get(mCtx), + activityInterface.allowMinimizeSplitScreen()); mCallbacks.addListener(new RecentsAnimationCallbacks.RecentsAnimationListener() { @Override public void onRecentsAnimationStart(RecentsAnimationController controller, diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java index a85a24dcd9..f292f1a6e3 100644 --- a/quickstep/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java @@ -15,6 +15,7 @@ */ package com.android.quickstep; +import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_FRONT; @@ -452,6 +453,10 @@ public final class TaskViewUtils { PendingAnimation pa = new PendingAnimation(RECENTS_LAUNCH_DURATION); createRecentsWindowAnimator(taskView, skipLauncherChanges, appTargets, wallpaperTargets, nonAppTargets, depthController, pa); + if (launcherClosing) { + // TODO(b/182592057): differentiate between "restore split" vs "launch fullscreen app" + TaskViewUtils.setDividerBarShown(nonAppTargets, true); + } Animator childStateAnimation = null; // Found a visible recents task that matches the opening app, lets launch the app from there @@ -504,4 +509,19 @@ public final class TaskViewUtils { stateManager.setCurrentAnimation(anim, childStateAnimation); anim.addListener(windowAnimEndListener); } + + static void setDividerBarShown(RemoteAnimationTargetCompat[] nonApps, boolean shown) { + // TODO(b/182592057): make this part of the animations instead. + if (nonApps != null && nonApps.length > 0) { + for (int i = 0; i < nonApps.length; ++i) { + final RemoteAnimationTargetCompat targ = nonApps[i]; + if (targ.windowType == TYPE_DOCK_DIVIDER) { + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + t.setVisibility(targ.leash.getSurfaceControl(), shown); + t.apply(); + t.close(); + } + } + } + } }