Add an extra transition type in TransitSession for custom transition.
In TransitionUtil#setupLeash, there will check whether the transition belong to opening type, and adjust the layer order according it. Which cannot support for custom type. By adding an extra transition info in TransitSession, it can help identify custom transition, without create new type of transition. Bug: 279104525 Test: atest SplitTransitionTests Test: verify the opening tasks remain visible during opening animation. Change-Id: Ic1302e211bc94ec66a293518b3823686e50e1ab2
This commit is contained in:
@@ -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;
|
||||
@@ -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 */);
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
@@ -560,6 +558,7 @@ class SplitScreenTransitions {
|
||||
mTransitions.getMainExecutor(), remoteTransition);
|
||||
mRemoteHandler.setTransition(transition);
|
||||
}
|
||||
mExtraTransitType = extraTransitType;
|
||||
}
|
||||
|
||||
/** Sets transition consumed callback. */
|
||||
|
||||
@@ -525,17 +525,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. */
|
||||
@@ -708,7 +708,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);
|
||||
}
|
||||
|
||||
@@ -759,7 +760,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);
|
||||
}
|
||||
|
||||
@@ -2333,7 +2335,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;
|
||||
@@ -2572,7 +2575,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 */);
|
||||
|
||||
@@ -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,
|
||||
@@ -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();
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user