From f3741120c1336cff854b69fcdb9f510c58a6d5c1 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Thu, 11 Nov 2021 18:39:30 +0800 Subject: [PATCH] Make sure launcher side can animate divider Fix divider target should pass to remote animation runner and add mIsDividerRemoteAnimating flag to eusure launcher side controlling the divider surface and shell side do not controll until remote animation finished. Bug: 202914644 Test: manual Test: pass existing tests Merged-In: I6411a609268274355a38c72fcb5d628b76b2340c Change-Id: I6411a609268274355a38c72fcb5d628b76b2340c --- .../splitscreen/SplitScreenController.java | 2 +- .../shell/splitscreen/StageCoordinator.java | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) 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)