Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +14 −15 Original line number Diff line number Diff line Loading @@ -30,8 +30,6 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON import static com.android.wm.shell.splitscreen.SplitScreenController.exitReasonToString; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; Loading Loading @@ -165,7 +163,7 @@ class SplitScreenTransitions { t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } boolean isOpening = isOpeningTransition(info); boolean isOpening = TransitionUtil.isOpeningType(info.getType()); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { // fade in startExampleAnimation(leash, true /* show */); Loading Loading @@ -295,14 +293,16 @@ class SplitScreenTransitions { @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, extraTransitType); return transition; } Loading @@ -310,9 +310,10 @@ class SplitScreenTransitions { void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType) { mPendingEnter = new TransitSession( transition, consumedCallback, finishedCallback, remoteTransition); transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); Loading Loading @@ -513,12 +514,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } private boolean isOpeningTransition(TransitionInfo info) { return TransitionUtil.isOpeningType(info.getType()) || info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE || info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN; } /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); Loading @@ -539,16 +534,19 @@ class SplitScreenTransitions { /** Whether the transition was canceled. */ boolean mCanceled; /** A note for extra transit type, to help indicate custom transition. */ final int mExtraTransitType; TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { this(transition, consumedCallback, finishedCallback, null /* remoteTransition */); this(transition, consumedCallback, finishedCallback, null /* remoteTransition */, 0); } TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback, @Nullable RemoteTransition remoteTransition) { @Nullable RemoteTransition remoteTransition, int extraTransitType) { mTransition = transition; mConsumedCallback = consumedCallback; mFinishedCallback = finishedCallback; Loading @@ -560,6 +558,7 @@ class SplitScreenTransitions { mTransitions.getMainExecutor(), remoteTransition); mRemoteHandler.setTransition(transition); } mExtraTransitType = extraTransitType; } /** Sets transition consumed callback. */ Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +11 −7 Original line number Diff line number Diff line Loading @@ -526,17 +526,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(intent, fillInIntent, options); // If split screen is not activated, we're expecting to open a pair of apps to split. final int transitType = mMainStage.isActive() final int extraTransitType = mMainStage.isActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position); mSplitTransitions.startEnterTransition(transitType, wct, null, this, mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, null /* consumedCallback */, (finishWct, finishT) -> { if (!evictWct.isEmpty()) { finishWct.merge(evictWct, true); } } /* finishedCallback */); } /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ Loading Loading @@ -709,7 +709,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(mainTaskId, mainOptions); mSplitTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } Loading Loading @@ -760,7 +761,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } Loading Loading @@ -2334,7 +2336,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), null /* consumedCallback */, null /* finishedCallback */); null /* consumedCallback */, null /* finishedCallback */, 0 /* extraTransitType */); } } return out; Loading Loading @@ -2573,7 +2576,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } if (info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mSplitTransitions.mPendingEnter.mExtraTransitType == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mainChild == null && sideChild == null) { Log.w(TAG, "Launched a task in split, but didn't receive any task in transition."); mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +6 −5 Original line number Diff line number Diff line Loading @@ -180,8 +180,9 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null); TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, Loading Loading @@ -397,7 +398,7 @@ public class SplitTransitionTests extends ShellTestCase { } private TransitionInfo createEnterPairInfo() { return new TransitionInfoBuilder(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0) return new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(TRANSIT_OPEN, mMainChild) .addChange(TRANSIT_OPEN, mSideChild) .build(); Loading @@ -406,9 +407,9 @@ public class SplitTransitionTests extends ShellTestCase { private void enterSplit() { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), mStageCoordinator, null, null); mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +14 −15 Original line number Diff line number Diff line Loading @@ -30,8 +30,6 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON import static com.android.wm.shell.splitscreen.SplitScreenController.exitReasonToString; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; Loading Loading @@ -165,7 +163,7 @@ class SplitScreenTransitions { t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } boolean isOpening = isOpeningTransition(info); boolean isOpening = TransitionUtil.isOpeningType(info.getType()); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { // fade in startExampleAnimation(leash, true /* show */); Loading Loading @@ -295,14 +293,16 @@ class SplitScreenTransitions { @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, extraTransitType); return transition; } Loading @@ -310,9 +310,10 @@ class SplitScreenTransitions { void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType) { mPendingEnter = new TransitSession( transition, consumedCallback, finishedCallback, remoteTransition); transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); Loading Loading @@ -513,12 +514,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } private boolean isOpeningTransition(TransitionInfo info) { return TransitionUtil.isOpeningType(info.getType()) || info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE || info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN; } /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); Loading @@ -539,16 +534,19 @@ class SplitScreenTransitions { /** Whether the transition was canceled. */ boolean mCanceled; /** A note for extra transit type, to help indicate custom transition. */ final int mExtraTransitType; TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { this(transition, consumedCallback, finishedCallback, null /* remoteTransition */); this(transition, consumedCallback, finishedCallback, null /* remoteTransition */, 0); } TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback, @Nullable RemoteTransition remoteTransition) { @Nullable RemoteTransition remoteTransition, int extraTransitType) { mTransition = transition; mConsumedCallback = consumedCallback; mFinishedCallback = finishedCallback; Loading @@ -560,6 +558,7 @@ class SplitScreenTransitions { mTransitions.getMainExecutor(), remoteTransition); mRemoteHandler.setTransition(transition); } mExtraTransitType = extraTransitType; } /** Sets transition consumed callback. */ Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +11 −7 Original line number Diff line number Diff line Loading @@ -526,17 +526,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(intent, fillInIntent, options); // If split screen is not activated, we're expecting to open a pair of apps to split. final int transitType = mMainStage.isActive() final int extraTransitType = mMainStage.isActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position); mSplitTransitions.startEnterTransition(transitType, wct, null, this, mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, null /* consumedCallback */, (finishWct, finishT) -> { if (!evictWct.isEmpty()) { finishWct.merge(evictWct, true); } } /* finishedCallback */); } /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ Loading Loading @@ -709,7 +709,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(mainTaskId, mainOptions); mSplitTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } Loading Loading @@ -760,7 +761,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } Loading Loading @@ -2334,7 +2336,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), null /* consumedCallback */, null /* finishedCallback */); null /* consumedCallback */, null /* finishedCallback */, 0 /* extraTransitType */); } } return out; Loading Loading @@ -2573,7 +2576,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } if (info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mSplitTransitions.mPendingEnter.mExtraTransitType == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mainChild == null && sideChild == null) { Log.w(TAG, "Launched a task in split, but didn't receive any task in transition."); mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +6 −5 Original line number Diff line number Diff line Loading @@ -180,8 +180,9 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null); TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, Loading Loading @@ -397,7 +398,7 @@ public class SplitTransitionTests extends ShellTestCase { } private TransitionInfo createEnterPairInfo() { return new TransitionInfoBuilder(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0) return new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(TRANSIT_OPEN, mMainChild) .addChange(TRANSIT_OPEN, mSideChild) .build(); Loading @@ -406,9 +407,9 @@ public class SplitTransitionTests extends ShellTestCase { private void enterSplit() { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), mStageCoordinator, null, null); mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, Loading