Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +8 −43 Original line number Diff line number Diff line Loading @@ -80,10 +80,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public static final int PARALLAX_DISMISSING = 1; public static final int PARALLAX_ALIGN_CENTER = 2; private static final int FLING_RESIZE_DURATION = 250; private static final int FLING_SWITCH_DURATION = 350; private static final int FLING_ENTER_DURATION = 350; private static final int FLING_EXIT_DURATION = 350; private static final int FLING_ANIMATION_DURATION = 250; private final int mDividerWindowWidth; private final int mDividerInsets; Loading @@ -96,9 +93,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange private final Rect mBounds1 = new Rect(); // Bounds2 final position should be always at bottom or right private final Rect mBounds2 = new Rect(); // The temp bounds outside of display bounds for side stage when split screen inactive to avoid // flicker next time active split screen. private final Rect mInvisibleBounds = new Rect(); private final Rect mWinBounds1 = new Rect(); private final Rect mWinBounds2 = new Rect(); private final SplitLayoutHandler mSplitLayoutHandler; Loading Loading @@ -147,10 +141,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange resetDividerPosition(); mDimNonImeSide = resources.getBoolean(R.bool.config_dimNonImeAttachedSide); mInvisibleBounds.set(mRootBounds); mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0, isLandscape() ? 0 : mRootBounds.bottom); } private int getDividerInsets(Resources resources, Display display) { Loading Loading @@ -249,12 +239,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange rect.offset(-mRootBounds.left, -mRootBounds.top); } /** Gets bounds size equal to root bounds but outside of screen, used for position side stage * when split inactive to avoid flicker when next time active. */ public void getInvisibleBounds(Rect rect) { rect.set(mInvisibleBounds); } /** Returns leash of the current divider bar. */ @Nullable public SurfaceControl getDividerLeash() { Loading Loading @@ -300,10 +284,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, null); initDividerPosition(mTempRect); mInvisibleBounds.set(mRootBounds); mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0, isLandscape() ? 0 : mRootBounds.bottom); return true; } Loading Loading @@ -425,13 +405,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mFreezeDividerWindow = freezeDividerWindow; } /** Update current layout as divider put on start or end position. */ public void setDividerAtBorder(boolean start) { final int pos = start ? mDividerSnapAlgorithm.getDismissStartTarget().position : mDividerSnapAlgorithm.getDismissEndTarget().position; setDividePosition(pos, false /* applyLayoutChange */); } /** * Updates bounds with the passing position. Usually used to update recording bounds while * performing animation or dragging divider bar to resize the splits. Loading Loading @@ -476,17 +449,17 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public void snapToTarget(int currentPosition, DividerSnapAlgorithm.SnapTarget snapTarget) { switch (snapTarget.flag) { case FLAG_DISMISS_START: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> mSplitLayoutHandler.onSnappedToDismiss(false /* bottomOrRight */, EXIT_REASON_DRAG_DIVIDER)); break; case FLAG_DISMISS_END: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> mSplitLayoutHandler.onSnappedToDismiss(true /* bottomOrRight */, EXIT_REASON_DRAG_DIVIDER)); break; default: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> setDividePosition(snapTarget.position, true /* applyLayoutChange */)); break; } Loading Loading @@ -541,20 +514,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public void flingDividerToDismiss(boolean toEnd, int reason) { final int target = toEnd ? mDividerSnapAlgorithm.getDismissEndTarget().position : mDividerSnapAlgorithm.getDismissStartTarget().position; flingDividePosition(getDividePosition(), target, FLING_EXIT_DURATION, flingDividePosition(getDividePosition(), target, () -> mSplitLayoutHandler.onSnappedToDismiss(toEnd, reason)); } /** Fling divider from current position to center position. */ public void flingDividerToCenter() { final int pos = mDividerSnapAlgorithm.getMiddleTarget().position; flingDividePosition(getDividePosition(), pos, FLING_ENTER_DURATION, () -> setDividePosition(pos, true /* applyLayoutChange */)); } @VisibleForTesting void flingDividePosition(int from, int to, int duration, @Nullable Runnable flingFinishedCallback) { void flingDividePosition(int from, int to, @Nullable Runnable flingFinishedCallback) { if (from == to) { // No animation run, still callback to stop resizing. mSplitLayoutHandler.onLayoutSizeChanged(this); Loading @@ -564,7 +529,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } ValueAnimator animator = ValueAnimator .ofInt(from, to) .setDuration(duration); .setDuration(FLING_ANIMATION_DURATION); animator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); animator.addUpdateListener( animation -> updateDivideBounds((int) animation.getAnimatedValue())); Loading Loading @@ -621,7 +586,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange AnimatorSet set = new AnimatorSet(); set.playTogether(animator1, animator2, animator3); set.setDuration(FLING_SWITCH_DURATION); set.setDuration(FLING_ANIMATION_DURATION); set.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +19 −36 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.res.Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; Loading Loading @@ -489,6 +488,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final WindowContainerTransaction wct = new WindowContainerTransaction(); options = resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, wct); // If split still not active, apply windows bounds first to avoid surface reset to // wrong pos by SurfaceAnimator from wms. // TODO(b/223325631): check is it still necessary after improve enter transition done. if (!mMainStage.isActive()) { updateWindowBounds(mSplitLayout, wct); } wct.sendPendingIntent(intent, fillInIntent, options); mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct); } Loading Loading @@ -635,7 +641,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(sideTaskId, sideOptions); } // Using legacy transitions, so we can't use blast sync since it conflicts. mSyncQueue.queue(wct); mTaskOrganizer.applyTransaction(wct); mSyncQueue.runInSync(t -> { setDividerVisibility(true, t); updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); Loading Loading @@ -887,13 +893,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mShouldUpdateRecents = false; mIsDividerRemoteAnimating = false; mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null) { mSideStage.removeAllTasks(wct, false /* toTop */); mMainStage.deactivate(wct, false /* toTop */); wct.reorder(mRootTaskInfo.token, false /* onTop */); wct.setForceTranslucent(mRootTaskInfo.token, true); wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); onTransitionAnimationComplete(); } else { // Expand to top side split as full screen for fading out decor animation and dismiss Loading @@ -904,32 +907,27 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, ? mSideStage : mMainStage; tempFullStage.resetBounds(wct); wct.setSmallestScreenWidthDp(tempFullStage.mRootTaskInfo.token, SMALLEST_SCREEN_WIDTH_DP_UNDEFINED); mRootTaskInfo.configuration.smallestScreenWidthDp); dismissStage.dismiss(wct, false /* toTop */); } mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { t.setWindowCrop(mMainStage.mRootLeash, null) .setWindowCrop(mSideStage.mRootLeash, null); t.setPosition(mMainStage.mRootLeash, 0, 0) .setPosition(mSideStage.mRootLeash, 0, 0); t.hide(mMainStage.mDimLayer).hide(mSideStage.mDimLayer); setDividerVisibility(false, t); if (childrenToTop == null) { t.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.right); } else { // In this case, exit still under progress, fade out the split decor after first WCT // done and do remaining WCT after animation finished. if (childrenToTop != null) { childrenToTop.fadeOutDecor(() -> { WindowContainerTransaction finishedWCT = new WindowContainerTransaction(); mIsExiting = false; childrenToTop.dismiss(finishedWCT, true /* toTop */); finishedWCT.reorder(mRootTaskInfo.token, false /* toTop */); finishedWCT.setForceTranslucent(mRootTaskInfo.token, true); finishedWCT.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); mSyncQueue.queue(finishedWCT); mSyncQueue.runInSync(at -> { at.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.right); }); mTaskOrganizer.applyTransaction(finishedWCT); onTransitionAnimationComplete(); }); } Loading Loading @@ -998,7 +996,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mMainStage.activate(wct, true /* includingTopTask */); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); wct.setForceTranslucent(mRootTaskInfo.token, false); } void finishEnterSplitScreen(SurfaceControl.Transaction t) { Loading Loading @@ -1224,13 +1221,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Make the stages adjacent to each other so they occlude what's behind them. wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token); wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token); wct.setForceTranslucent(mRootTaskInfo.token, true); mSplitLayout.getInvisibleBounds(mTempRect1); wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { t.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.top); }); mTaskOrganizer.applyTransaction(wct); } private void onRootTaskVanished() { Loading Loading @@ -1386,17 +1377,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // TODO (b/238697912) : Add the validation to prevent entering non-recovered status final WindowContainerTransaction wct = new WindowContainerTransaction(); mSplitLayout.init(); mSplitLayout.setDividerAtBorder(mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); mMainStage.activate(wct, true /* includingTopTask */); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); wct.setForceTranslucent(mRootTaskInfo.token, false); prepareEnterSplitScreen(wct); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); mSplitLayout.flingDividerToCenter(); }); mSyncQueue.runInSync(t -> updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */)); } if (mMainStageListener.mHasChildren && mSideStageListener.mHasChildren) { mShouldUpdateRecents = true; Loading Loading @@ -1838,7 +1822,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // properly for the animation itself. mSplitLayout.release(); mSplitLayout.resetDividerPosition(); mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT; mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; } } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +1 −2 Original line number Diff line number Diff line Loading @@ -159,8 +159,7 @@ public class SplitLayoutTests extends ShellTestCase { } private void waitDividerFlingFinished() { verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), anyInt(), mRunnableCaptor.capture()); verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), mRunnableCaptor.capture()); mRunnableCaptor.getValue().run(); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +8 −43 Original line number Diff line number Diff line Loading @@ -80,10 +80,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public static final int PARALLAX_DISMISSING = 1; public static final int PARALLAX_ALIGN_CENTER = 2; private static final int FLING_RESIZE_DURATION = 250; private static final int FLING_SWITCH_DURATION = 350; private static final int FLING_ENTER_DURATION = 350; private static final int FLING_EXIT_DURATION = 350; private static final int FLING_ANIMATION_DURATION = 250; private final int mDividerWindowWidth; private final int mDividerInsets; Loading @@ -96,9 +93,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange private final Rect mBounds1 = new Rect(); // Bounds2 final position should be always at bottom or right private final Rect mBounds2 = new Rect(); // The temp bounds outside of display bounds for side stage when split screen inactive to avoid // flicker next time active split screen. private final Rect mInvisibleBounds = new Rect(); private final Rect mWinBounds1 = new Rect(); private final Rect mWinBounds2 = new Rect(); private final SplitLayoutHandler mSplitLayoutHandler; Loading Loading @@ -147,10 +141,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange resetDividerPosition(); mDimNonImeSide = resources.getBoolean(R.bool.config_dimNonImeAttachedSide); mInvisibleBounds.set(mRootBounds); mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0, isLandscape() ? 0 : mRootBounds.bottom); } private int getDividerInsets(Resources resources, Display display) { Loading Loading @@ -249,12 +239,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange rect.offset(-mRootBounds.left, -mRootBounds.top); } /** Gets bounds size equal to root bounds but outside of screen, used for position side stage * when split inactive to avoid flicker when next time active. */ public void getInvisibleBounds(Rect rect) { rect.set(mInvisibleBounds); } /** Returns leash of the current divider bar. */ @Nullable public SurfaceControl getDividerLeash() { Loading Loading @@ -300,10 +284,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, null); initDividerPosition(mTempRect); mInvisibleBounds.set(mRootBounds); mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0, isLandscape() ? 0 : mRootBounds.bottom); return true; } Loading Loading @@ -425,13 +405,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mFreezeDividerWindow = freezeDividerWindow; } /** Update current layout as divider put on start or end position. */ public void setDividerAtBorder(boolean start) { final int pos = start ? mDividerSnapAlgorithm.getDismissStartTarget().position : mDividerSnapAlgorithm.getDismissEndTarget().position; setDividePosition(pos, false /* applyLayoutChange */); } /** * Updates bounds with the passing position. Usually used to update recording bounds while * performing animation or dragging divider bar to resize the splits. Loading Loading @@ -476,17 +449,17 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public void snapToTarget(int currentPosition, DividerSnapAlgorithm.SnapTarget snapTarget) { switch (snapTarget.flag) { case FLAG_DISMISS_START: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> mSplitLayoutHandler.onSnappedToDismiss(false /* bottomOrRight */, EXIT_REASON_DRAG_DIVIDER)); break; case FLAG_DISMISS_END: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> mSplitLayoutHandler.onSnappedToDismiss(true /* bottomOrRight */, EXIT_REASON_DRAG_DIVIDER)); break; default: flingDividePosition(currentPosition, snapTarget.position, FLING_RESIZE_DURATION, flingDividePosition(currentPosition, snapTarget.position, () -> setDividePosition(snapTarget.position, true /* applyLayoutChange */)); break; } Loading Loading @@ -541,20 +514,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange public void flingDividerToDismiss(boolean toEnd, int reason) { final int target = toEnd ? mDividerSnapAlgorithm.getDismissEndTarget().position : mDividerSnapAlgorithm.getDismissStartTarget().position; flingDividePosition(getDividePosition(), target, FLING_EXIT_DURATION, flingDividePosition(getDividePosition(), target, () -> mSplitLayoutHandler.onSnappedToDismiss(toEnd, reason)); } /** Fling divider from current position to center position. */ public void flingDividerToCenter() { final int pos = mDividerSnapAlgorithm.getMiddleTarget().position; flingDividePosition(getDividePosition(), pos, FLING_ENTER_DURATION, () -> setDividePosition(pos, true /* applyLayoutChange */)); } @VisibleForTesting void flingDividePosition(int from, int to, int duration, @Nullable Runnable flingFinishedCallback) { void flingDividePosition(int from, int to, @Nullable Runnable flingFinishedCallback) { if (from == to) { // No animation run, still callback to stop resizing. mSplitLayoutHandler.onLayoutSizeChanged(this); Loading @@ -564,7 +529,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange } ValueAnimator animator = ValueAnimator .ofInt(from, to) .setDuration(duration); .setDuration(FLING_ANIMATION_DURATION); animator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); animator.addUpdateListener( animation -> updateDivideBounds((int) animation.getAnimatedValue())); Loading Loading @@ -621,7 +586,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange AnimatorSet set = new AnimatorSet(); set.playTogether(animator1, animator2, animator3); set.setDuration(FLING_SWITCH_DURATION); set.setDuration(FLING_ANIMATION_DURATION); set.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +19 −36 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.res.Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; Loading Loading @@ -489,6 +488,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final WindowContainerTransaction wct = new WindowContainerTransaction(); options = resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, wct); // If split still not active, apply windows bounds first to avoid surface reset to // wrong pos by SurfaceAnimator from wms. // TODO(b/223325631): check is it still necessary after improve enter transition done. if (!mMainStage.isActive()) { updateWindowBounds(mSplitLayout, wct); } wct.sendPendingIntent(intent, fillInIntent, options); mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct); } Loading Loading @@ -635,7 +641,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(sideTaskId, sideOptions); } // Using legacy transitions, so we can't use blast sync since it conflicts. mSyncQueue.queue(wct); mTaskOrganizer.applyTransaction(wct); mSyncQueue.runInSync(t -> { setDividerVisibility(true, t); updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); Loading Loading @@ -887,13 +893,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mShouldUpdateRecents = false; mIsDividerRemoteAnimating = false; mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null) { mSideStage.removeAllTasks(wct, false /* toTop */); mMainStage.deactivate(wct, false /* toTop */); wct.reorder(mRootTaskInfo.token, false /* onTop */); wct.setForceTranslucent(mRootTaskInfo.token, true); wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); onTransitionAnimationComplete(); } else { // Expand to top side split as full screen for fading out decor animation and dismiss Loading @@ -904,32 +907,27 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, ? mSideStage : mMainStage; tempFullStage.resetBounds(wct); wct.setSmallestScreenWidthDp(tempFullStage.mRootTaskInfo.token, SMALLEST_SCREEN_WIDTH_DP_UNDEFINED); mRootTaskInfo.configuration.smallestScreenWidthDp); dismissStage.dismiss(wct, false /* toTop */); } mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { t.setWindowCrop(mMainStage.mRootLeash, null) .setWindowCrop(mSideStage.mRootLeash, null); t.setPosition(mMainStage.mRootLeash, 0, 0) .setPosition(mSideStage.mRootLeash, 0, 0); t.hide(mMainStage.mDimLayer).hide(mSideStage.mDimLayer); setDividerVisibility(false, t); if (childrenToTop == null) { t.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.right); } else { // In this case, exit still under progress, fade out the split decor after first WCT // done and do remaining WCT after animation finished. if (childrenToTop != null) { childrenToTop.fadeOutDecor(() -> { WindowContainerTransaction finishedWCT = new WindowContainerTransaction(); mIsExiting = false; childrenToTop.dismiss(finishedWCT, true /* toTop */); finishedWCT.reorder(mRootTaskInfo.token, false /* toTop */); finishedWCT.setForceTranslucent(mRootTaskInfo.token, true); finishedWCT.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); mSyncQueue.queue(finishedWCT); mSyncQueue.runInSync(at -> { at.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.right); }); mTaskOrganizer.applyTransaction(finishedWCT); onTransitionAnimationComplete(); }); } Loading Loading @@ -998,7 +996,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mMainStage.activate(wct, true /* includingTopTask */); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); wct.setForceTranslucent(mRootTaskInfo.token, false); } void finishEnterSplitScreen(SurfaceControl.Transaction t) { Loading Loading @@ -1224,13 +1221,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Make the stages adjacent to each other so they occlude what's behind them. wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token); wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token); wct.setForceTranslucent(mRootTaskInfo.token, true); mSplitLayout.getInvisibleBounds(mTempRect1); wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { t.setPosition(mSideStage.mRootLeash, mTempRect1.left, mTempRect1.top); }); mTaskOrganizer.applyTransaction(wct); } private void onRootTaskVanished() { Loading Loading @@ -1386,17 +1377,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // TODO (b/238697912) : Add the validation to prevent entering non-recovered status final WindowContainerTransaction wct = new WindowContainerTransaction(); mSplitLayout.init(); mSplitLayout.setDividerAtBorder(mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); mMainStage.activate(wct, true /* includingTopTask */); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); wct.setForceTranslucent(mRootTaskInfo.token, false); prepareEnterSplitScreen(wct); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); mSplitLayout.flingDividerToCenter(); }); mSyncQueue.runInSync(t -> updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */)); } if (mMainStageListener.mHasChildren && mSideStageListener.mHasChildren) { mShouldUpdateRecents = true; Loading Loading @@ -1838,7 +1822,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // properly for the animation itself. mSplitLayout.release(); mSplitLayout.resetDividerPosition(); mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT; mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; } } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +1 −2 Original line number Diff line number Diff line Loading @@ -159,8 +159,7 @@ public class SplitLayoutTests extends ShellTestCase { } private void waitDividerFlingFinished() { verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), anyInt(), mRunnableCaptor.capture()); verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), mRunnableCaptor.capture()); mRunnableCaptor.getValue().run(); } Loading