diff options
9 files changed, 100 insertions, 6 deletions
diff --git a/core/java/android/window/IRemoteTransition.aidl b/core/java/android/window/IRemoteTransition.aidl index 2efb68a33889..ec8b66d8b2f2 100644 --- a/core/java/android/window/IRemoteTransition.aidl +++ b/core/java/android/window/IRemoteTransition.aidl @@ -59,4 +59,12 @@ oneway interface IRemoteTransition { void mergeAnimation(in IBinder transition, in TransitionInfo info, in SurfaceControl.Transaction t, in IBinder mergeTarget, in IRemoteTransitionFinishedCallback finishCallback); + + /** + * Called when a different handler has consumed the transition + * + * @param transition An identifier for the transition that was consumed. + * @param aborted Whether the transition is aborted or not. + */ + void onTransitionConsumed(in IBinder transition, in boolean aborted); } 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 b2948667f9e6..026f9898359f 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 @@ -2693,7 +2693,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @NonNull Transitions.TransitionFinishCallback finishCallback) { boolean shouldAnimate = true; if (mSplitTransitions.isPendingEnter(transition)) { - shouldAnimate = startPendingEnterAnimation( + shouldAnimate = startPendingEnterAnimation(transition, mSplitTransitions.mPendingEnter, info, startTransaction, finishTransaction); } else if (mSplitTransitions.isPendingDismiss(transition)) { final SplitScreenTransitions.DismissSession dismiss = mSplitTransitions.mPendingDismiss; @@ -2732,7 +2732,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - private boolean startPendingEnterAnimation( + private boolean startPendingEnterAnimation(@NonNull IBinder transition, @NonNull SplitScreenTransitions.EnterSession enterTransition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) { @@ -2761,21 +2761,22 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - if (mSplitTransitions.mPendingEnter.mExtraTransitType + SplitScreenTransitions.EnterSession pendingEnter = mSplitTransitions.mPendingEnter; + if (pendingEnter.mExtraTransitType == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { // Open to side should only be used when split already active and foregorund. if (mainChild == null && sideChild == null) { Log.w(TAG, splitFailureMessage("startPendingEnterAnimation", "Launched a task in split, but didn't receive any task in transition.")); // This should happen when the target app is already on front, so just cancel. - mSplitTransitions.mPendingEnter.cancel(null); + pendingEnter.cancel(null); return true; } } else { if (mainChild == null || sideChild == null) { final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN : (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED); - mSplitTransitions.mPendingEnter.cancel( + pendingEnter.cancel( (cancelWct, cancelT) -> prepareExitSplitScreen(dismissTop, cancelWct)); Log.w(TAG, splitFailureMessage("startPendingEnterAnimation", "launched 2 tasks in split, but didn't receive " @@ -2786,6 +2787,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (mRecentTasks.isPresent() && sideChild != null) { mRecentTasks.get().removeSplitPair(sideChild.getTaskInfo().taskId); } + if (pendingEnter.mRemoteHandler != null) { + // Pass false for aborted since WM didn't abort, business logic chose to + // terminate/exit early + pendingEnter.mRemoteHandler.onTransitionConsumed(transition, + false /*aborted*/, finishT); + } mSplitUnsupportedToast.show(); return true; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java index fab2dd2bf3e1..8b050e524038 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java @@ -152,6 +152,16 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { } @Override + public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted, + @Nullable SurfaceControl.Transaction finishTransaction) { + try { + mRemote.getRemoteTransition().onTransitionConsumed(transition, aborted); + } catch (RemoteException e) { + Log.e(Transitions.TAG, "Error calling onTransitionConsumed()", e); + } + } + + @Override public String toString() { return "OneShotRemoteHandler:" + mRemote.getDebugName() + ":" + mRemote.getRemoteTransition(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java index a90edf20f94e..592b22a47bc4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java @@ -86,7 +86,16 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { @Override public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted, @Nullable SurfaceControl.Transaction finishT) { - mRequestedRemotes.remove(transition); + RemoteTransition remoteTransition = mRequestedRemotes.remove(transition); + if (remoteTransition == null) { + return; + } + + try { + remoteTransition.getRemoteTransition().onTransitionConsumed(transition, aborted); + } catch (RemoteException e) { + Log.e(TAG, "Error delegating onTransitionConsumed()", e); + } } @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index ebc284b1b77e..befc702b01aa 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -208,6 +208,30 @@ public class SplitTransitionTests extends ShellTestCase { @Test @UiThreadTest + public void testRemoteTransitionConsumed() { + // Omit side child change + TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0) + .addChange(TRANSIT_OPEN, mMainChild) + .build(); + TestRemoteTransition testRemote = new TestRemoteTransition(); + + IBinder transition = mSplitScreenTransitions.startEnterTransition( + TRANSIT_OPEN, new WindowContainerTransaction(), + new RemoteTransition(testRemote, "Test"), mStageCoordinator, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + mMainStage.onTaskAppeared(mMainChild, createMockSurface()); + boolean accepted = mStageCoordinator.startAnimation(transition, info, + mock(SurfaceControl.Transaction.class), + mock(SurfaceControl.Transaction.class), + mock(Transitions.TransitionFinishCallback.class)); + assertTrue(accepted); + + assertTrue(testRemote.isConsumed()); + + } + + @Test + @UiThreadTest public void testMonitorInSplit() { enterSplit(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index d5986780d5d8..a3af9e269209 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -285,6 +285,10 @@ public class ShellTransitionTests extends ShellTestCase { SurfaceControl.Transaction t, IBinder mergeTarget, IRemoteTransitionFinishedCallback finishCallback) throws RemoteException { } + + @Override + public void onTransitionConsumed(IBinder iBinder, boolean b) throws RemoteException { + } }; IBinder transitToken = new Binder(); transitions.requestStartTransition(transitToken, @@ -427,6 +431,10 @@ public class ShellTransitionTests extends ShellTestCase { SurfaceControl.Transaction t, IBinder mergeTarget, IRemoteTransitionFinishedCallback finishCallback) throws RemoteException { } + + @Override + public void onTransitionConsumed(IBinder iBinder, boolean b) throws RemoteException { + } }; TransitionFilter filter = new TransitionFilter(); @@ -473,6 +481,10 @@ public class ShellTransitionTests extends ShellTestCase { SurfaceControl.Transaction t, IBinder mergeTarget, IRemoteTransitionFinishedCallback finishCallback) throws RemoteException { } + + @Override + public void onTransitionConsumed(IBinder iBinder, boolean b) throws RemoteException { + } }; final int transitType = TRANSIT_FIRST_CUSTOM + 1; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TestRemoteTransition.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TestRemoteTransition.java index 39ab23877c68..87330d2dc877 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TestRemoteTransition.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TestRemoteTransition.java @@ -31,6 +31,7 @@ import android.window.WindowContainerTransaction; */ public class TestRemoteTransition extends IRemoteTransition.Stub { private boolean mCalled = false; + private boolean mConsumed = false; final WindowContainerTransaction mRemoteFinishWCT = new WindowContainerTransaction(); @Override @@ -48,6 +49,11 @@ public class TestRemoteTransition extends IRemoteTransition.Stub { IRemoteTransitionFinishedCallback finishCallback) throws RemoteException { } + @Override + public void onTransitionConsumed(IBinder iBinder, boolean b) throws RemoteException { + mConsumed = true; + } + /** * Check whether this remote transition * {@link #startAnimation(IBinder, TransitionInfo, SurfaceControl.Transaction, @@ -56,4 +62,12 @@ public class TestRemoteTransition extends IRemoteTransition.Stub { public boolean isCalled() { return mCalled; } + + /** + * Check whether this remote transition's {@link #onTransitionConsumed(IBinder, boolean)} + * is called + */ + public boolean isConsumed() { + return mConsumed; + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java index 1e7222de91d9..88b9c020e9a5 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java @@ -233,6 +233,11 @@ public abstract class RemoteAnimationRunnerCompat extends IRemoteAnimationRunner runner.onAnimationCancelled(); finishRunnable.run(); } + + @Override + public void onTransitionConsumed(IBinder iBinder, boolean aborted) + throws RemoteException { + } }; } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index a1f0e7723597..b45613e0e182 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -269,6 +269,11 @@ public class KeyguardService extends Service { } } + @Override + public void onTransitionConsumed(IBinder transition, boolean aborted) + throws RemoteException { + } + private static void initAlphaForAnimationTargets(@NonNull SurfaceControl.Transaction t, @NonNull RemoteAnimationTarget[] targets) { for (RemoteAnimationTarget target : targets) { |