diff options
| author | 2023-05-04 15:40:05 +0000 | |
|---|---|---|
| committer | 2023-05-04 15:40:05 +0000 | |
| commit | cf02b08d0eb00714759775dc9429e5e39fc54cd9 (patch) | |
| tree | 43bd1f259f1dd1f3c1c3c97d226e95ec609c8d9a | |
| parent | 8fd01cb7391915730c60b4f878827ac07db2cdf2 (diff) | |
| parent | ee5e5562a8244e4a7f658b2f1cb5f477a1e74a86 (diff) | |
Merge "Fix accident evict if drag same app to same position." into udc-dev
2 files changed, 34 insertions, 19 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 78ea1d7ae9b9..5c2f1438c08e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -482,8 +482,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } final WindowContainerTransaction wct = new WindowContainerTransaction(); - final WindowContainerTransaction evictWct = new WindowContainerTransaction(); - prepareEvictChildTasks(position, evictWct); options = resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, null /* wct */); wct.sendPendingIntent(intent, fillInIntent, options); @@ -494,12 +492,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, prepareEnterSplitScreen(wct, null /* taskInfo */, position); mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, - null /* consumedCallback */, - (finishWct, finishT) -> { - if (!evictWct.isEmpty()) { - finishWct.merge(evictWct, true); - } - } /* finishedCallback */, extraTransitType); + null /* consumedCallback */, null /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ @@ -1511,7 +1504,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (taskInfo != null) { wct.startTask(taskInfo.taskId, resolveStartStage(STAGE_TYPE_UNDEFINED, startPosition, null, wct)); - targetStage.evictAllChildren(wct); } // If running background, we need to reparent current top visible task to another stage // and evict all tasks current under its. @@ -1521,7 +1513,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, updateWindowBounds(mSplitLayout, wct); final StageTaskListener anotherStage = targetStage == mMainStage ? mSideStage : mMainStage; - anotherStage.evictAllChildren(wct); anotherStage.reparentTopTask(wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); @@ -1540,6 +1531,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSideStage.addTask(taskInfo, wct); } mMainStage.activate(wct, true /* includingTopTask */); + mSplitLayout.resetDividerPosition(); updateWindowBounds(mSplitLayout, wct); wct.reorder(mRootTaskInfo.token, true); setRootForceTranslucent(false, wct); @@ -1778,7 +1770,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); } - void onChildTaskAppeared(StageListenerImpl stageListener, int taskId) { + /** Callback when split roots have child task appeared under it, this is a little different from + * #onStageHasChildrenChanged because this would be called every time child task appeared. + * NOTICE: This only be called on legacy transition. */ + private void onChildTaskAppeared(StageListenerImpl stageListener, int taskId) { // Handle entering split screen while there is a split pair running in the background. if (stageListener == mSideStageListener && !isSplitScreenVisible() && isSplitActive() && mSplitRequest == null) { @@ -1824,6 +1819,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.setForceTranslucent(mRootTaskInfo.token, translucent); } + /** Callback when split roots visiblility changed. + * NOTICE: This only be called on legacy transition. */ private void onStageVisibilityChanged(StageListenerImpl stageListener) { // If split didn't active, just ignore this callback because we should already did these // on #applyExitSplitScreen. @@ -1965,6 +1962,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + /** Callback when split roots have child or haven't under it. + * NOTICE: This only be called on legacy transition. */ private void onStageHasChildrenChanged(StageListenerImpl stageListener) { final boolean hasChildren = stageListener.mHasChildren; final boolean isSideStage = stageListener == mSideStageListener; @@ -2555,7 +2554,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, boolean shouldAnimate = true; if (mSplitTransitions.isPendingEnter(transition)) { shouldAnimate = startPendingEnterAnimation( - transition, info, startTransaction, finishTransaction); + mSplitTransitions.mPendingEnter, info, startTransaction, finishTransaction); } else if (mSplitTransitions.isPendingDismiss(transition)) { shouldAnimate = startPendingDismissAnimation( mSplitTransitions.mPendingDismiss, info, startTransaction, finishTransaction); @@ -2591,7 +2590,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - private boolean startPendingEnterAnimation(@NonNull IBinder transition, + private boolean startPendingEnterAnimation( + @NonNull SplitScreenTransitions.TransitSession enterTransition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) { // First, verify that we actually have opened apps in both splits. @@ -2602,9 +2602,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); if (taskInfo == null || !taskInfo.hasParentTask()) continue; final @StageType int stageType = getStageType(getStageOfTask(taskInfo)); - if (stageType == STAGE_TYPE_MAIN) { + if (stageType == STAGE_TYPE_MAIN + && (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) { + // Includes TRANSIT_CHANGE to cover reparenting top-most task to split. mainChild = change; - } else if (stageType == STAGE_TYPE_SIDE) { + } else if (stageType == STAGE_TYPE_SIDE && isOpeningType(change.getMode())) { sideChild = change; } } @@ -2623,7 +2625,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN : (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED); mSplitTransitions.mPendingEnter.cancel( - (cancelWct, cancelT) -> prepareExitSplitScreen(dismissTop, cancelWct)); + (cancelWct, cancelT) -> { + mSideStage.removeAllTasks(cancelWct, dismissTop == STAGE_TYPE_SIDE); + mMainStage.deactivate(cancelWct, dismissTop == STAGE_TYPE_MAIN); + }); return true; } } @@ -2645,6 +2650,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, + " before startAnimation()."); } + final TransitionInfo.Change finalMainChild = mainChild; + final TransitionInfo.Change finalSideChild = sideChild; + enterTransition.setFinishedCallback((callbackWct, callbackT) -> { + if (finalMainChild != null) { + mMainStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId); + } + if (finalSideChild != null) { + mSideStage.evictOtherChildren(callbackWct, finalSideChild.getTaskInfo().taskId); + } + }); + finishEnterSplitScreen(finishT); addDividerBarToTransition(info, true /* show */); return true; @@ -2911,6 +2927,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } if (!isSplitScreenVisible()) { // If split running background, exit split first. + // TODO(b/280392203) : skip doing this on shell transition once this bug is fixed. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT); } mLogger.enterRequestedByDrag(position, dragSessionId); @@ -2922,6 +2939,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, public void onRequestToSplit(InstanceId sessionId, int enterReason) { if (!isSplitScreenVisible()) { // If split running background, exit split first. + // TODO(b/280392203) : skip doing this on shell transition once this bug is fixed. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT); } mLogger.enterRequested(sessionId, enterReason); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index d27064d1b4da..44a0ede82e5c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -158,8 +158,6 @@ public class StageCoordinatorTests extends ShellTestCase { verify(mStageCoordinator).prepareEnterSplitScreen(eq(wct), eq(task), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT)); verify(mMainStage).reparentTopTask(eq(wct)); - verify(mMainStage).evictAllChildren(eq(wct)); - verify(mSideStage).evictAllChildren(eq(wct)); verify(mSplitLayout).resetDividerPosition(); assertEquals(SPLIT_POSITION_BOTTOM_OR_RIGHT, mStageCoordinator.getSideStagePosition()); assertEquals(SPLIT_POSITION_TOP_OR_LEFT, mStageCoordinator.getMainStagePosition()); @@ -178,7 +176,6 @@ public class StageCoordinatorTests extends ShellTestCase { mStageCoordinator.moveToStage(task, SPLIT_POSITION_BOTTOM_OR_RIGHT, wct); verify(mStageCoordinator).prepareEnterSplitScreen(eq(wct), eq(task), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT)); - verify(mMainStage).evictAllChildren(eq(wct)); assertEquals(SPLIT_POSITION_BOTTOM_OR_RIGHT, mStageCoordinator.getMainStagePosition()); assertEquals(SPLIT_POSITION_TOP_OR_LEFT, mStageCoordinator.getSideStagePosition()); } |