Support to start tasks into split screen with specific split ratio
Split tasks can be shawn with different split ratio in overview panel. Supports to specify split ratio when launching split tasks from overview. Fix: 207479945 Test: atest WMShellUnitTests Test: Quickswitch back to app pair keep split ratio Change-Id: Ifa6d57c0ec9b75fbcaeb80a11a95f65af8c09a0b
This commit is contained in:
@@ -321,6 +321,16 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
|
||||
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. */
|
||||
public void resetDividerPosition() {
|
||||
mDividePosition = mDividerSnapAlgorithm.getMiddleTarget().position;
|
||||
|
||||
@@ -83,14 +83,15 @@ interface ISplitScreen {
|
||||
* Starts tasks simultaneously in one transition.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
oneway void startTasksWithLegacyTransition(int mainTaskId, in Bundle mainOptions,
|
||||
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
|
||||
|
||||
@@ -605,21 +605,21 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
@Override
|
||||
public void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
|
||||
int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
|
||||
RemoteAnimationAdapter adapter) {
|
||||
float splitRatio, RemoteAnimationAdapter adapter) {
|
||||
executeRemoteCallWithTaskPermission(mController, "startTasks",
|
||||
(controller) -> controller.mStageCoordinator.startTasksWithLegacyTransition(
|
||||
mainTaskId, mainOptions, sideTaskId, sideOptions, sidePosition,
|
||||
adapter));
|
||||
splitRatio, adapter));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startTasks(int mainTaskId, @Nullable Bundle mainOptions,
|
||||
int sideTaskId, @Nullable Bundle sideOptions,
|
||||
@SplitPosition int sidePosition,
|
||||
@SplitPosition int sidePosition, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition) {
|
||||
executeRemoteCallWithTaskPermission(mController, "startTasks",
|
||||
(controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions,
|
||||
sideTaskId, sideOptions, sidePosition, remoteTransition));
|
||||
sideTaskId, sideOptions, sidePosition, splitRatio, remoteTransition));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -322,7 +322,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
|
||||
/** Starts 2 tasks in one transition. */
|
||||
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) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
mainOptions = mainOptions != null ? mainOptions : new Bundle();
|
||||
@@ -334,6 +334,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);
|
||||
mSideStage.setBounds(getSideStageBounds(), wct);
|
||||
|
||||
mSplitLayout.setDivideRatio(splitRatio);
|
||||
// Make sure the launch options will put tasks in the corresponding split roots
|
||||
addActivityOptions(mainOptions, mMainStage);
|
||||
addActivityOptions(sideOptions, mSideStage);
|
||||
@@ -349,7 +350,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
/** Starts 2 tasks in one legacy transition. */
|
||||
void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
|
||||
int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
|
||||
RemoteAnimationAdapter adapter) {
|
||||
float splitRatio, RemoteAnimationAdapter adapter) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
// Need to add another wrapper here in shell so that we can inject the divider bar
|
||||
// and also manage the process elevation via setRunningRemote
|
||||
@@ -404,6 +405,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
sideOptions = sideOptions != null ? sideOptions : new Bundle();
|
||||
setSideStagePosition(sidePosition, wct);
|
||||
|
||||
mSplitLayout.setDivideRatio(splitRatio);
|
||||
// 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.
|
||||
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);
|
||||
|
||||
@@ -105,6 +105,12 @@ public class SplitLayoutTests extends ShellTestCase {
|
||||
verify(mSplitLayoutHandler).onLayoutSizeChanged(any(SplitLayout.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetDivideRatio() {
|
||||
mSplitLayout.setDivideRatio(0.5f);
|
||||
verify(mSplitLayoutHandler).onLayoutSizeChanged(any(SplitLayout.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnDoubleTappedDivider() {
|
||||
mSplitLayout.onDoubleTappedDivider();
|
||||
|
||||
Reference in New Issue
Block a user