Merge "Support to start tasks into split screen with specific split ratio" into sc-v2-dev

This commit is contained in:
Jerry Chang
2021-11-26 05:43:34 +00:00
committed by Android (Google) Code Review
5 changed files with 27 additions and 8 deletions

View File

@@ -321,6 +321,16 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mSplitLayoutHandler.onLayoutSizeChanged(this); mSplitLayoutHandler.onLayoutSizeChanged(this);
} }
/** Sets divide position base on the ratio within root bounds. */
public void setDivideRatio(float ratio) {
final int position = isLandscape()
? mRootBounds.left + (int) (mRootBounds.width() * ratio)
: mRootBounds.top + (int) (mRootBounds.height() * ratio);
DividerSnapAlgorithm.SnapTarget snapTarget =
mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(position);
setDividePosition(snapTarget.position);
}
/** Resets divider position. */ /** Resets divider position. */
public void resetDividerPosition() { public void resetDividerPosition() {
mDividePosition = mDividerSnapAlgorithm.getMiddleTarget().position; mDividePosition = mDividerSnapAlgorithm.getMiddleTarget().position;

View File

@@ -83,14 +83,15 @@ interface ISplitScreen {
* Starts tasks simultaneously in one transition. * Starts tasks simultaneously in one transition.
*/ */
oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId, oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId,
in Bundle sideOptions, int sidePosition, in RemoteTransition remoteTransition) = 10; in Bundle sideOptions, int sidePosition, float splitRatio,
in RemoteTransition remoteTransition) = 10;
/** /**
* Version of startTasks using legacy transition system. * Version of startTasks using legacy transition system.
*/ */
oneway void startTasksWithLegacyTransition(int mainTaskId, in Bundle mainOptions, oneway void startTasksWithLegacyTransition(int mainTaskId, in Bundle mainOptions,
int sideTaskId, in Bundle sideOptions, int sidePosition, int sideTaskId, in Bundle sideOptions, int sidePosition,
in RemoteAnimationAdapter adapter) = 11; float splitRatio, in RemoteAnimationAdapter adapter) = 11;
/** /**
* Blocking call that notifies and gets additional split-screen targets when entering * Blocking call that notifies and gets additional split-screen targets when entering

View File

@@ -610,21 +610,21 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
@Override @Override
public void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions, public void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
RemoteAnimationAdapter adapter) { float splitRatio, RemoteAnimationAdapter adapter) {
executeRemoteCallWithTaskPermission(mController, "startTasks", executeRemoteCallWithTaskPermission(mController, "startTasks",
(controller) -> controller.mStageCoordinator.startTasksWithLegacyTransition( (controller) -> controller.mStageCoordinator.startTasksWithLegacyTransition(
mainTaskId, mainOptions, sideTaskId, sideOptions, sidePosition, mainTaskId, mainOptions, sideTaskId, sideOptions, sidePosition,
adapter)); splitRatio, adapter));
} }
@Override @Override
public void startTasks(int mainTaskId, @Nullable Bundle mainOptions, public void startTasks(int mainTaskId, @Nullable Bundle mainOptions,
int sideTaskId, @Nullable Bundle sideOptions, int sideTaskId, @Nullable Bundle sideOptions,
@SplitPosition int sidePosition, @SplitPosition int sidePosition, float splitRatio,
@Nullable RemoteTransition remoteTransition) { @Nullable RemoteTransition remoteTransition) {
executeRemoteCallWithTaskPermission(mController, "startTasks", executeRemoteCallWithTaskPermission(mController, "startTasks",
(controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions, (controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions,
sideTaskId, sideOptions, sidePosition, remoteTransition)); sideTaskId, sideOptions, sidePosition, splitRatio, remoteTransition));
} }
@Override @Override

View File

@@ -333,7 +333,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
/** Starts 2 tasks in one transition. */ /** Starts 2 tasks in one transition. */
void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId,
@Nullable Bundle sideOptions, @SplitPosition int sidePosition, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, float splitRatio,
@Nullable RemoteTransition remoteTransition) { @Nullable RemoteTransition remoteTransition) {
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
mainOptions = mainOptions != null ? mainOptions : new Bundle(); mainOptions = mainOptions != null ? mainOptions : new Bundle();
@@ -345,6 +345,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */); mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);
mSideStage.setBounds(getSideStageBounds(), wct); mSideStage.setBounds(getSideStageBounds(), wct);
mSplitLayout.setDivideRatio(splitRatio);
// Make sure the launch options will put tasks in the corresponding split roots // Make sure the launch options will put tasks in the corresponding split roots
addActivityOptions(mainOptions, mMainStage); addActivityOptions(mainOptions, mMainStage);
addActivityOptions(sideOptions, mSideStage); addActivityOptions(sideOptions, mSideStage);
@@ -360,7 +361,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
/** Starts 2 tasks in one legacy transition. */ /** Starts 2 tasks in one legacy transition. */
void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions, void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
RemoteAnimationAdapter adapter) { float splitRatio, RemoteAnimationAdapter adapter) {
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
// Need to add another wrapper here in shell so that we can inject the divider bar // Need to add another wrapper here in shell so that we can inject the divider bar
// and also manage the process elevation via setRunningRemote // and also manage the process elevation via setRunningRemote
@@ -415,6 +416,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
sideOptions = sideOptions != null ? sideOptions : new Bundle(); sideOptions = sideOptions != null ? sideOptions : new Bundle();
setSideStagePosition(sidePosition, wct); setSideStagePosition(sidePosition, wct);
mSplitLayout.setDivideRatio(splitRatio);
// Build a request WCT that will launch both apps such that task 0 is on the main stage // Build a request WCT that will launch both apps such that task 0 is on the main stage
// while task 1 is on the side stage. // while task 1 is on the side stage.
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */); mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);

View File

@@ -105,6 +105,12 @@ public class SplitLayoutTests extends ShellTestCase {
verify(mSplitLayoutHandler).onLayoutSizeChanged(any(SplitLayout.class)); verify(mSplitLayoutHandler).onLayoutSizeChanged(any(SplitLayout.class));
} }
@Test
public void testSetDivideRatio() {
mSplitLayout.setDivideRatio(0.5f);
verify(mSplitLayoutHandler).onLayoutSizeChanged(any(SplitLayout.class));
}
@Test @Test
public void testOnDoubleTappedDivider() { public void testOnDoubleTappedDivider() {
mSplitLayout.onDoubleTappedDivider(); mSplitLayout.onDoubleTappedDivider();