Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java +32 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.wm.shell.common.split; import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_30_70; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_50_50; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_70_30; Loading @@ -36,6 +37,8 @@ import android.hardware.display.DisplayManager; import android.view.Display; import android.view.DisplayInfo; import androidx.annotation.Nullable; import java.util.ArrayList; /** Loading Loading @@ -203,6 +206,21 @@ public class DividerSnapAlgorithm { } } /** * Gets the SnapTarget corresponding to the given {@link SnapPosition}, or null if no such * SnapTarget exists. */ @Nullable public SnapTarget findSnapTarget(@SnapPosition int snapPosition) { for (SnapTarget t : mTargets) { if (t.snapPosition == snapPosition) { return t; } } return null; } public float calculateDismissingFraction(int position) { if (position < mFirstSplitTarget.position) { return 1f - (float) (position - getStartInset()) Loading Loading @@ -356,9 +374,9 @@ public class DividerSnapAlgorithm { * Adds a target at {@param position} but only if the area with size of {@param smallerSize} * meets the minimal size requirement. */ private void maybeAddTarget(int position, int smallerSize, @SnapPosition int snapTo) { private void maybeAddTarget(int position, int smallerSize, @SnapPosition int snapPosition) { if (smallerSize >= mMinimalSizeResizableTask) { mTargets.add(new SnapTarget(position, position, snapTo)); mTargets.add(new SnapTarget(position, position, snapPosition)); } } Loading Loading @@ -418,6 +436,13 @@ public class DividerSnapAlgorithm { return mLastSplitTarget != mMiddleTarget; } /** * Finds the {@link SnapPosition} nearest to the given position. */ public int calculateNearestSnapPosition(int currentPosition) { return snap(currentPosition, /* hardDismiss */ true).snapPosition; } /** * Cycles through all non-dismiss targets with a stepping of {@param increment}. It moves left * if {@param increment} is negative and moves right otherwise. Loading Loading @@ -454,7 +479,7 @@ public class DividerSnapAlgorithm { /** * An int describing the placement of the divider in this snap target. */ public final @SnapPosition int snapTo; public final @SnapPosition int snapPosition; public boolean isMiddleTarget; Loading @@ -464,15 +489,15 @@ public class DividerSnapAlgorithm { */ private final float distanceMultiplier; public SnapTarget(int position, int taskPosition, @SnapPosition int snapTo) { this(position, taskPosition, snapTo, 1f); public SnapTarget(int position, int taskPosition, @SnapPosition int snapPosition) { this(position, taskPosition, snapPosition, 1f); } public SnapTarget(int position, int taskPosition, @SnapPosition int snapTo, public SnapTarget(int position, int taskPosition, @SnapPosition int snapPosition, float distanceMultiplier) { this.position = position; this.taskPosition = taskPosition; this.snapTo = snapTo; this.snapPosition = snapPosition; this.distanceMultiplier = distanceMultiplier; } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +29 −18 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLIT_SCREEN_DOUBLE_TAP_DIVIDER; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLIT_SCREEN_RESIZE; import static com.android.wm.shell.animation.Interpolators.DIM_INTERPOLATOR; Loading Loading @@ -66,6 +67,7 @@ import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayInsetsController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.InteractionJankMonitorUtils; import com.android.wm.shell.common.split.SplitScreenConstants.SnapPosition; import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition; import java.io.PrintWriter; Loading Loading @@ -115,7 +117,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @VisibleForTesting DividerSnapAlgorithm mDividerSnapAlgorithm; private WindowContainerToken mWinToken1; private WindowContainerToken mWinToken2; private int mDividePosition; private int mDividerPosition; private boolean mInitialized = false; private boolean mFreezeDividerWindow = false; private int mOrientation; Loading Loading @@ -267,7 +269,14 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } int getDividePosition() { return mDividePosition; return mDividerPosition; } /** * Finds the {@link SnapPosition} nearest to the current divider position. */ public int calculateCurrentSnapPosition() { return mDividerSnapAlgorithm.calculateNearestSnapPosition(mDividerPosition); } /** Loading Loading @@ -344,16 +353,16 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } private void initDividerPosition(Rect oldBounds) { final float snapRatio = (float) mDividePosition final float snapRatio = (float) mDividerPosition / (float) (isLandscape(oldBounds) ? oldBounds.width() : oldBounds.height()); // Estimate position by previous ratio. final float length = (float) (isLandscape() ? mRootBounds.width() : mRootBounds.height()); final int estimatePosition = (int) (length * snapRatio); // Init divider position by estimated position using current bounds snap algorithm. mDividePosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget( mDividerPosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget( estimatePosition).position; updateBounds(mDividePosition); updateBounds(mDividerPosition); } private void updateBounds(int position) { Loading Loading @@ -467,27 +476,29 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } void setDividePosition(int position, boolean applyLayoutChange) { mDividePosition = position; updateBounds(mDividePosition); mDividerPosition = position; updateBounds(mDividerPosition); if (applyLayoutChange) { mSplitLayoutHandler.onLayoutSizeChanged(this); } } /** Updates divide position and split bounds 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); final DividerSnapAlgorithm.SnapTarget snapTarget = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(position); public void setDivideRatio(@SnapPosition int snapPosition) { final DividerSnapAlgorithm.SnapTarget snapTarget = mDividerSnapAlgorithm.findSnapTarget( snapPosition); if (snapTarget == null) { throw new IllegalArgumentException("No SnapTarget for position " + snapPosition); } setDividePosition(snapTarget.position, false /* applyLayoutChange */); } /** Resets divider position. */ public void resetDividerPosition() { mDividePosition = mDividerSnapAlgorithm.getMiddleTarget().position; updateBounds(mDividePosition); mDividerPosition = mDividerSnapAlgorithm.getMiddleTarget().position; updateBounds(mDividerPosition); mWinToken1 = null; mWinToken2 = null; mWinBounds1.setEmpty(); Loading @@ -510,7 +521,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange * target indicates dismissing split. */ public void snapToTarget(int currentPosition, DividerSnapAlgorithm.SnapTarget snapTarget) { switch (snapTarget.snapTo) { switch (snapTarget.snapPosition) { case SNAP_TO_START_AND_DISMISS: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, () -> mSplitLayoutHandler.onSnappedToDismiss(false /* bottomOrRight */, Loading Loading @@ -668,8 +679,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @Override public void onAnimationEnd(Animator animation) { mDividePosition = dividerPos; updateBounds(mDividePosition); mDividerPosition = dividerPos; updateBounds(mDividerPosition); finishCallback.accept(insets); InteractionJankMonitorUtils.endTracing(CUJ_SPLIT_SCREEN_DOUBLE_TAP_DIVIDER); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl +8 −8 Original line number Diff line number Diff line Loading @@ -91,42 +91,42 @@ interface ISplitScreen { * Starts tasks simultaneously in one transition. */ oneway void startTasks(int taskId1, in Bundle options1, int taskId2, in Bundle options2, int splitPosition, float splitRatio, in RemoteTransition remoteTransition, int splitPosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 10; /** * Starts a pair of intent and task in one transition. */ oneway void startIntentAndTask(in PendingIntent pendingIntent, int userId1, in Bundle options1, int taskId, in Bundle options2, int sidePosition, float splitRatio, int taskId, in Bundle options2, int sidePosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 16; /** * Starts a pair of shortcut and task in one transition. */ oneway void startShortcutAndTask(in ShortcutInfo shortcutInfo, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options2, int splitPosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 17; /** * Version of startTasks using legacy transition system. */ oneway void startTasksWithLegacyTransition(int taskId1, in Bundle options1, int taskId2, in Bundle options2, int splitPosition, float splitRatio, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 11; /** * Starts a pair of intent and task using legacy transition system. */ oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent, int userId1, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options1, int taskId, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 12; /** * Starts a pair of shortcut and task using legacy transition system. */ oneway void startShortcutAndTaskWithLegacyTransition(in ShortcutInfo shortcutInfo, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options1, int taskId, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 15; /** Loading @@ -135,7 +135,7 @@ interface ISplitScreen { oneway void startIntentsWithLegacyTransition(in PendingIntent pendingIntent1, int userId1, in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2, int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition, float splitRatio, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18; int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18; /** * Start a pair of intents in one transition. Loading @@ -143,7 +143,7 @@ interface ISplitScreen { oneway void startIntents(in PendingIntent pendingIntent1, int userId1, in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2, int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition, float splitRatio, in RemoteTransition remoteTransition, in InstanceId instanceId) = 19; int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 19; /** * Blocking call that notifies and gets additional split-screen targets when entering Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +47 −39 File changed.Preview size limit exceeded, changes collapsed. Show changes libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +35 −32 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.split.SplitLayout; import com.android.wm.shell.common.split.SplitScreenConstants.SnapPosition; import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition; import com.android.wm.shell.common.split.SplitScreenUtils; import com.android.wm.shell.common.split.SplitWindowManager; Loading Loading @@ -631,8 +632,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } /** Starts 2 tasks in one transition. */ void startTasks(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, void startTasks(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId2 == INVALID_TASK_ID) { Loading @@ -654,13 +655,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startTask(taskId1, options1); startWithTask(wct, taskId2, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId2, options2, snapPosition, remoteTransition, instanceId); } /** Start an intent and a task to a split pair in one transition. */ void startIntentAndTask(PendingIntent pendingIntent, Intent fillInIntent, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId == INVALID_TASK_ID) { Loading @@ -676,13 +677,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.sendPendingIntent(pendingIntent, fillInIntent, options1); startWithTask(wct, taskId, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId, options2, snapPosition, remoteTransition, instanceId); } /** Starts a shortcut and a task to a split pair in one transition. */ void startShortcutAndTask(ShortcutInfo shortcutInfo, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId == INVALID_TASK_ID) { options1 = options1 != null ? options1 : new Bundle(); Loading @@ -697,7 +699,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1); startWithTask(wct, taskId, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId, options2, snapPosition, remoteTransition, instanceId); } /** Loading @@ -708,14 +710,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * {@link SplitscreenEventLogger#logEnter(float, int, int, int, int, boolean)} */ private void startWithTask(WindowContainerTransaction wct, int mainTaskId, @Nullable Bundle mainOptions, float splitRatio, @Nullable Bundle mainOptions, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { if (!mMainStage.isActive()) { // 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(wct, false /* reparent */); } mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); Loading @@ -740,7 +742,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1, PendingIntent pendingIntent2, Intent fillInIntent2, @Nullable ShortcutInfo shortcutInfo2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (pendingIntent2 == null) { Loading @@ -762,7 +764,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } setSideStagePosition(splitPosition, wct); mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); Loading Loading @@ -790,7 +792,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, /** Starts a pair of tasks using legacy transition. */ void startTasksWithLegacyTransition(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId2 == INVALID_TASK_ID) { Loading @@ -811,7 +813,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startTask(taskId1, options1); mSplitRequest = new SplitRequest(taskId1, taskId2, splitPosition); startWithLegacyTransition(wct, taskId2, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId2, options2, splitPosition, snapPosition, adapter, instanceId); } Loading @@ -820,8 +822,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1, @Nullable PendingIntent pendingIntent2, Intent fillInIntent2, @Nullable ShortcutInfo shortcutInfo2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (pendingIntent2 == null) { Loading @@ -840,13 +842,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, pendingIntent2 != null ? pendingIntent2.getIntent() : null, splitPosition); } startWithLegacyTransition(wct, pendingIntent2, fillInIntent2, shortcutInfo2, options2, splitPosition, splitRatio, adapter, instanceId); splitPosition, snapPosition, adapter, instanceId); } void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId == INVALID_TASK_ID) { Loading @@ -859,15 +861,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.sendPendingIntent(pendingIntent, fillInIntent, options1); mSplitRequest = new SplitRequest(taskId, pendingIntent.getIntent(), splitPosition); startWithLegacyTransition(wct, taskId, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId, options2, splitPosition, snapPosition, adapter, instanceId); } /** Starts a pair of shortcut and task using legacy transition. */ void startShortcutAndTaskWithLegacyTransition(ShortcutInfo shortcutInfo, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId == INVALID_TASK_ID) { Loading @@ -878,7 +880,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1); startWithLegacyTransition(wct, taskId, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId, options2, splitPosition, snapPosition, adapter, instanceId); } Loading Loading @@ -928,18 +930,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startWithLegacyTransition(WindowContainerTransaction wct, @Nullable PendingIntent mainPendingIntent, @Nullable Intent mainFillInIntent, @Nullable ShortcutInfo mainShortcutInfo, @Nullable Bundle mainOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { startWithLegacyTransition(wct, INVALID_TASK_ID, mainPendingIntent, mainFillInIntent, mainShortcutInfo, mainOptions, sidePosition, splitRatio, adapter, instanceId); mainShortcutInfo, mainOptions, sidePosition, snapPosition, adapter, instanceId); } private void startWithLegacyTransition(WindowContainerTransaction wct, int mainTaskId, @Nullable Bundle mainOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @Nullable Bundle mainOptions, @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { startWithLegacyTransition(wct, mainTaskId, null /* mainPendingIntent */, null /* mainFillInIntent */, null /* mainShortcutInfo */, mainOptions, sidePosition, splitRatio, adapter, instanceId); snapPosition, adapter, instanceId); } /** Loading @@ -950,15 +953,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startWithLegacyTransition(WindowContainerTransaction wct, int mainTaskId, @Nullable PendingIntent mainPendingIntent, @Nullable Intent mainFillInIntent, @Nullable ShortcutInfo mainShortcutInfo, @Nullable Bundle options, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { if (!isSplitScreenVisible()) { exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT); } // Init divider first to make divider leash for remote animation target. mSplitLayout.init(); mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); // Apply surface bounds before animation start. SurfaceControl.Transaction startT = mTransactionPool.acquire(); Loading Loading @@ -1761,7 +1764,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, rightBottomTaskId = sideStageTopTaskId; } SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds, leftTopTaskId, rightBottomTaskId); leftTopTaskId, rightBottomTaskId, mSplitLayout.calculateCurrentSnapPosition()); if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) { // Update the pair for the top tasks recentTasks.addSplitPair(mainStageTopTaskId, sideStageTopTaskId, splitBounds); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java +32 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.wm.shell.common.split; import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_30_70; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_50_50; import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_70_30; Loading @@ -36,6 +37,8 @@ import android.hardware.display.DisplayManager; import android.view.Display; import android.view.DisplayInfo; import androidx.annotation.Nullable; import java.util.ArrayList; /** Loading Loading @@ -203,6 +206,21 @@ public class DividerSnapAlgorithm { } } /** * Gets the SnapTarget corresponding to the given {@link SnapPosition}, or null if no such * SnapTarget exists. */ @Nullable public SnapTarget findSnapTarget(@SnapPosition int snapPosition) { for (SnapTarget t : mTargets) { if (t.snapPosition == snapPosition) { return t; } } return null; } public float calculateDismissingFraction(int position) { if (position < mFirstSplitTarget.position) { return 1f - (float) (position - getStartInset()) Loading Loading @@ -356,9 +374,9 @@ public class DividerSnapAlgorithm { * Adds a target at {@param position} but only if the area with size of {@param smallerSize} * meets the minimal size requirement. */ private void maybeAddTarget(int position, int smallerSize, @SnapPosition int snapTo) { private void maybeAddTarget(int position, int smallerSize, @SnapPosition int snapPosition) { if (smallerSize >= mMinimalSizeResizableTask) { mTargets.add(new SnapTarget(position, position, snapTo)); mTargets.add(new SnapTarget(position, position, snapPosition)); } } Loading Loading @@ -418,6 +436,13 @@ public class DividerSnapAlgorithm { return mLastSplitTarget != mMiddleTarget; } /** * Finds the {@link SnapPosition} nearest to the given position. */ public int calculateNearestSnapPosition(int currentPosition) { return snap(currentPosition, /* hardDismiss */ true).snapPosition; } /** * Cycles through all non-dismiss targets with a stepping of {@param increment}. It moves left * if {@param increment} is negative and moves right otherwise. Loading Loading @@ -454,7 +479,7 @@ public class DividerSnapAlgorithm { /** * An int describing the placement of the divider in this snap target. */ public final @SnapPosition int snapTo; public final @SnapPosition int snapPosition; public boolean isMiddleTarget; Loading @@ -464,15 +489,15 @@ public class DividerSnapAlgorithm { */ private final float distanceMultiplier; public SnapTarget(int position, int taskPosition, @SnapPosition int snapTo) { this(position, taskPosition, snapTo, 1f); public SnapTarget(int position, int taskPosition, @SnapPosition int snapPosition) { this(position, taskPosition, snapPosition, 1f); } public SnapTarget(int position, int taskPosition, @SnapPosition int snapTo, public SnapTarget(int position, int taskPosition, @SnapPosition int snapPosition, float distanceMultiplier) { this.position = position; this.taskPosition = taskPosition; this.snapTo = snapTo; this.snapPosition = snapPosition; this.distanceMultiplier = distanceMultiplier; } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +29 −18 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLIT_SCREEN_DOUBLE_TAP_DIVIDER; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLIT_SCREEN_RESIZE; import static com.android.wm.shell.animation.Interpolators.DIM_INTERPOLATOR; Loading Loading @@ -66,6 +67,7 @@ import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayInsetsController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.InteractionJankMonitorUtils; import com.android.wm.shell.common.split.SplitScreenConstants.SnapPosition; import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition; import java.io.PrintWriter; Loading Loading @@ -115,7 +117,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @VisibleForTesting DividerSnapAlgorithm mDividerSnapAlgorithm; private WindowContainerToken mWinToken1; private WindowContainerToken mWinToken2; private int mDividePosition; private int mDividerPosition; private boolean mInitialized = false; private boolean mFreezeDividerWindow = false; private int mOrientation; Loading Loading @@ -267,7 +269,14 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } int getDividePosition() { return mDividePosition; return mDividerPosition; } /** * Finds the {@link SnapPosition} nearest to the current divider position. */ public int calculateCurrentSnapPosition() { return mDividerSnapAlgorithm.calculateNearestSnapPosition(mDividerPosition); } /** Loading Loading @@ -344,16 +353,16 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } private void initDividerPosition(Rect oldBounds) { final float snapRatio = (float) mDividePosition final float snapRatio = (float) mDividerPosition / (float) (isLandscape(oldBounds) ? oldBounds.width() : oldBounds.height()); // Estimate position by previous ratio. final float length = (float) (isLandscape() ? mRootBounds.width() : mRootBounds.height()); final int estimatePosition = (int) (length * snapRatio); // Init divider position by estimated position using current bounds snap algorithm. mDividePosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget( mDividerPosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget( estimatePosition).position; updateBounds(mDividePosition); updateBounds(mDividerPosition); } private void updateBounds(int position) { Loading Loading @@ -467,27 +476,29 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } void setDividePosition(int position, boolean applyLayoutChange) { mDividePosition = position; updateBounds(mDividePosition); mDividerPosition = position; updateBounds(mDividerPosition); if (applyLayoutChange) { mSplitLayoutHandler.onLayoutSizeChanged(this); } } /** Updates divide position and split bounds 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); final DividerSnapAlgorithm.SnapTarget snapTarget = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(position); public void setDivideRatio(@SnapPosition int snapPosition) { final DividerSnapAlgorithm.SnapTarget snapTarget = mDividerSnapAlgorithm.findSnapTarget( snapPosition); if (snapTarget == null) { throw new IllegalArgumentException("No SnapTarget for position " + snapPosition); } setDividePosition(snapTarget.position, false /* applyLayoutChange */); } /** Resets divider position. */ public void resetDividerPosition() { mDividePosition = mDividerSnapAlgorithm.getMiddleTarget().position; updateBounds(mDividePosition); mDividerPosition = mDividerSnapAlgorithm.getMiddleTarget().position; updateBounds(mDividerPosition); mWinToken1 = null; mWinToken2 = null; mWinBounds1.setEmpty(); Loading @@ -510,7 +521,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange * target indicates dismissing split. */ public void snapToTarget(int currentPosition, DividerSnapAlgorithm.SnapTarget snapTarget) { switch (snapTarget.snapTo) { switch (snapTarget.snapPosition) { case SNAP_TO_START_AND_DISMISS: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, () -> mSplitLayoutHandler.onSnappedToDismiss(false /* bottomOrRight */, Loading Loading @@ -668,8 +679,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange @Override public void onAnimationEnd(Animator animation) { mDividePosition = dividerPos; updateBounds(mDividePosition); mDividerPosition = dividerPos; updateBounds(mDividerPosition); finishCallback.accept(insets); InteractionJankMonitorUtils.endTracing(CUJ_SPLIT_SCREEN_DOUBLE_TAP_DIVIDER); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl +8 −8 Original line number Diff line number Diff line Loading @@ -91,42 +91,42 @@ interface ISplitScreen { * Starts tasks simultaneously in one transition. */ oneway void startTasks(int taskId1, in Bundle options1, int taskId2, in Bundle options2, int splitPosition, float splitRatio, in RemoteTransition remoteTransition, int splitPosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 10; /** * Starts a pair of intent and task in one transition. */ oneway void startIntentAndTask(in PendingIntent pendingIntent, int userId1, in Bundle options1, int taskId, in Bundle options2, int sidePosition, float splitRatio, int taskId, in Bundle options2, int sidePosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 16; /** * Starts a pair of shortcut and task in one transition. */ oneway void startShortcutAndTask(in ShortcutInfo shortcutInfo, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options2, int splitPosition, int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 17; /** * Version of startTasks using legacy transition system. */ oneway void startTasksWithLegacyTransition(int taskId1, in Bundle options1, int taskId2, in Bundle options2, int splitPosition, float splitRatio, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 11; /** * Starts a pair of intent and task using legacy transition system. */ oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent, int userId1, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options1, int taskId, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 12; /** * Starts a pair of shortcut and task using legacy transition system. */ oneway void startShortcutAndTaskWithLegacyTransition(in ShortcutInfo shortcutInfo, in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio, in Bundle options1, int taskId, in Bundle options2, int splitPosition, int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 15; /** Loading @@ -135,7 +135,7 @@ interface ISplitScreen { oneway void startIntentsWithLegacyTransition(in PendingIntent pendingIntent1, int userId1, in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2, int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition, float splitRatio, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18; int snapPosition, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18; /** * Start a pair of intents in one transition. Loading @@ -143,7 +143,7 @@ interface ISplitScreen { oneway void startIntents(in PendingIntent pendingIntent1, int userId1, in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2, int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition, float splitRatio, in RemoteTransition remoteTransition, in InstanceId instanceId) = 19; int snapPosition, in RemoteTransition remoteTransition, in InstanceId instanceId) = 19; /** * Blocking call that notifies and gets additional split-screen targets when entering Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +47 −39 File changed.Preview size limit exceeded, changes collapsed. Show changes
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +35 −32 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.split.SplitLayout; import com.android.wm.shell.common.split.SplitScreenConstants.SnapPosition; import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition; import com.android.wm.shell.common.split.SplitScreenUtils; import com.android.wm.shell.common.split.SplitWindowManager; Loading Loading @@ -631,8 +632,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } /** Starts 2 tasks in one transition. */ void startTasks(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, void startTasks(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId2 == INVALID_TASK_ID) { Loading @@ -654,13 +655,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startTask(taskId1, options1); startWithTask(wct, taskId2, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId2, options2, snapPosition, remoteTransition, instanceId); } /** Start an intent and a task to a split pair in one transition. */ void startIntentAndTask(PendingIntent pendingIntent, Intent fillInIntent, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId == INVALID_TASK_ID) { Loading @@ -676,13 +677,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.sendPendingIntent(pendingIntent, fillInIntent, options1); startWithTask(wct, taskId, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId, options2, snapPosition, remoteTransition, instanceId); } /** Starts a shortcut and a task to a split pair in one transition. */ void startShortcutAndTask(ShortcutInfo shortcutInfo, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskId == INVALID_TASK_ID) { options1 = options1 != null ? options1 : new Bundle(); Loading @@ -697,7 +699,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1); startWithTask(wct, taskId, options2, splitRatio, remoteTransition, instanceId); startWithTask(wct, taskId, options2, snapPosition, remoteTransition, instanceId); } /** Loading @@ -708,14 +710,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * {@link SplitscreenEventLogger#logEnter(float, int, int, int, int, boolean)} */ private void startWithTask(WindowContainerTransaction wct, int mainTaskId, @Nullable Bundle mainOptions, float splitRatio, @Nullable Bundle mainOptions, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { if (!mMainStage.isActive()) { // 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(wct, false /* reparent */); } mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); Loading @@ -740,7 +742,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1, PendingIntent pendingIntent2, Intent fillInIntent2, @Nullable ShortcutInfo shortcutInfo2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @SplitPosition int splitPosition, @SnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (pendingIntent2 == null) { Loading @@ -762,7 +764,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } setSideStagePosition(splitPosition, wct); mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); Loading Loading @@ -790,7 +792,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, /** Starts a pair of tasks using legacy transition. */ void startTasksWithLegacyTransition(int taskId1, @Nullable Bundle options1, int taskId2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId2 == INVALID_TASK_ID) { Loading @@ -811,7 +813,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startTask(taskId1, options1); mSplitRequest = new SplitRequest(taskId1, taskId2, splitPosition); startWithLegacyTransition(wct, taskId2, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId2, options2, splitPosition, snapPosition, adapter, instanceId); } Loading @@ -820,8 +822,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1, @Nullable PendingIntent pendingIntent2, Intent fillInIntent2, @Nullable ShortcutInfo shortcutInfo2, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (pendingIntent2 == null) { Loading @@ -840,13 +842,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, pendingIntent2 != null ? pendingIntent2.getIntent() : null, splitPosition); } startWithLegacyTransition(wct, pendingIntent2, fillInIntent2, shortcutInfo2, options2, splitPosition, splitRatio, adapter, instanceId); splitPosition, snapPosition, adapter, instanceId); } void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId == INVALID_TASK_ID) { Loading @@ -859,15 +861,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.sendPendingIntent(pendingIntent, fillInIntent, options1); mSplitRequest = new SplitRequest(taskId, pendingIntent.getIntent(), splitPosition); startWithLegacyTransition(wct, taskId, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId, options2, splitPosition, snapPosition, adapter, instanceId); } /** Starts a pair of shortcut and task using legacy transition. */ void startShortcutAndTaskWithLegacyTransition(ShortcutInfo shortcutInfo, @Nullable Bundle options1, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int splitPosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { final WindowContainerTransaction wct = new WindowContainerTransaction(); if (options1 == null) options1 = new Bundle(); if (taskId == INVALID_TASK_ID) { Loading @@ -878,7 +880,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(options1, mSideStage); wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1); startWithLegacyTransition(wct, taskId, options2, splitPosition, splitRatio, adapter, startWithLegacyTransition(wct, taskId, options2, splitPosition, snapPosition, adapter, instanceId); } Loading Loading @@ -928,18 +930,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startWithLegacyTransition(WindowContainerTransaction wct, @Nullable PendingIntent mainPendingIntent, @Nullable Intent mainFillInIntent, @Nullable ShortcutInfo mainShortcutInfo, @Nullable Bundle mainOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { startWithLegacyTransition(wct, INVALID_TASK_ID, mainPendingIntent, mainFillInIntent, mainShortcutInfo, mainOptions, sidePosition, splitRatio, adapter, instanceId); mainShortcutInfo, mainOptions, sidePosition, snapPosition, adapter, instanceId); } private void startWithLegacyTransition(WindowContainerTransaction wct, int mainTaskId, @Nullable Bundle mainOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @Nullable Bundle mainOptions, @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { startWithLegacyTransition(wct, mainTaskId, null /* mainPendingIntent */, null /* mainFillInIntent */, null /* mainShortcutInfo */, mainOptions, sidePosition, splitRatio, adapter, instanceId); snapPosition, adapter, instanceId); } /** Loading @@ -950,15 +953,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startWithLegacyTransition(WindowContainerTransaction wct, int mainTaskId, @Nullable PendingIntent mainPendingIntent, @Nullable Intent mainFillInIntent, @Nullable ShortcutInfo mainShortcutInfo, @Nullable Bundle options, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { @SplitPosition int sidePosition, @SnapPosition int snapPosition, RemoteAnimationAdapter adapter, InstanceId instanceId) { if (!isSplitScreenVisible()) { exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT); } // Init divider first to make divider leash for remote animation target. mSplitLayout.init(); mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(snapPosition); // Apply surface bounds before animation start. SurfaceControl.Transaction startT = mTransactionPool.acquire(); Loading Loading @@ -1761,7 +1764,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, rightBottomTaskId = sideStageTopTaskId; } SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds, leftTopTaskId, rightBottomTaskId); leftTopTaskId, rightBottomTaskId, mSplitLayout.calculateCurrentSnapPosition()); if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) { // Update the pair for the top tasks recentTasks.addSplitPair(mainStageTopTaskId, sideStageTopTaskId, splitBounds); Loading