diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 05552aad23034..bfd6e088dfc05 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -352,7 +352,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel, RemoteAnimationTarget[] apps) { - if (!isSplitScreenVisible()) return null; + if (apps.length < 2) return null; final SurfaceControl.Builder builder = new SurfaceControl.Builder(new SurfaceSession()) .setContainerLayer() .setName("RecentsAnimationSplitTasks") diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index e30e6c537c93a..0f9eb11720502 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -157,6 +157,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mExitSplitScreenOnHide; private boolean mKeyguardOccluded; private boolean mDeviceSleep; + private boolean mIsDividerRemoteAnimating; @StageType private int mDismissTop = NO_DISMISS; @@ -363,6 +364,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) { + // Init divider first to make divider leash for remote animation target. + setDividerVisibility(true /* visible */); final WindowContainerTransaction wct = new WindowContainerTransaction(); // Need to add another wrapper here in shell so that we can inject the divider bar // and also manage the process elevation via setRunningRemote @@ -373,12 +376,23 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, final IRemoteAnimationFinishedCallback finishedCallback) { + mIsDividerRemoteAnimating = true; RemoteAnimationTarget[] augmentedNonApps = new RemoteAnimationTarget[nonApps.length + 1]; for (int i = 0; i < nonApps.length; ++i) { augmentedNonApps[i] = nonApps[i]; } augmentedNonApps[augmentedNonApps.length - 1] = getDividerBarLegacyTarget(); + + IRemoteAnimationFinishedCallback wrapCallback = + new IRemoteAnimationFinishedCallback.Stub() { + @Override + public void onAnimationFinished() throws RemoteException { + mIsDividerRemoteAnimating = false; + mSyncQueue.runInSync(t -> applyDividerVisibility(t)); + finishedCallback.onAnimationFinished(); + } + }; try { try { ActivityTaskManager.getService().setRunningRemoteTransitionDelegate( @@ -387,8 +401,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, Slog.e(TAG, "Unable to boost animation thread. This should only happen" + " during unit tests"); } - adapter.getRunner().onAnimationStart(transit, apps, wallpapers, nonApps, - finishedCallback); + adapter.getRunner().onAnimationStart(transit, apps, wallpapers, + augmentedNonApps, wrapCallback); } catch (RemoteException e) { Slog.e(TAG, "Error starting remote animation", e); } @@ -396,6 +410,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled() { + mIsDividerRemoteAnimating = false; try { adapter.getRunner().onAnimationCancelled(); } catch (RemoteException e) { @@ -812,7 +827,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, } private void setDividerVisibility(boolean visible) { - if (mDividerVisible == visible) return; + if (mIsDividerRemoteAnimating || mDividerVisible == visible) return; mDividerVisible = visible; if (visible) { mSplitLayout.init(); @@ -860,10 +875,10 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, } private void applyDividerVisibility(SurfaceControl.Transaction t) { + if (mIsDividerRemoteAnimating) return; + final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash(); - if (dividerLeash == null) { - return; - } + if (dividerLeash == null) return; if (mDividerVisible) { t.show(dividerLeash)