Loading core/java/android/window/IRemoteTransition.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -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); } libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +12 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 " Loading @@ -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; } Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java +10 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,16 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { return new WindowContainerTransaction(); } @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() + ":" Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,30 @@ public class SplitTransitionTests extends ShellTestCase { assertTrue(testRemote.isCalled()); } @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() { Loading Loading
core/java/android/window/IRemoteTransition.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -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); }
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +12 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 " Loading @@ -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; } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java +10 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,16 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { return new WindowContainerTransaction(); } @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() + ":" Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,30 @@ public class SplitTransitionTests extends ShellTestCase { assertTrue(testRemote.isCalled()); } @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() { Loading