Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +1 −1 Original line number Diff line number Diff line Loading @@ -897,7 +897,7 @@ public class PipTransition extends PipTransitionController { .setWindowCrop(leash, endBounds.width(), endBounds.height()); } } mSplitScreenOptional.get().finishEnterSplitScreen(startTransaction); mSplitScreenOptional.get().finishEnterSplitScreen(finishTransaction); startTransaction.apply(); mPipOrganizer.onExitPipFinished(taskInfo); Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +9 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.common.split.SplitScreenConstants.FLAG_IS_DIVIDER_BAR; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; import static com.android.wm.shell.splitscreen.SplitScreen.stageTypeToString; Loading Loading @@ -155,8 +156,10 @@ class SplitScreenTransitions { } boolean isRootOrSplitSideRoot = change.getParent() == null || topRoot.equals(change.getParent()); // For enter or exit, we only want to animate the side roots but not the top-root. if (!isRootOrSplitSideRoot || topRoot.equals(change.getContainer())) { boolean isDivider = change.getFlags() == FLAG_IS_DIVIDER_BAR; // For enter or exit, we only want to animate side roots and the divider but not the // top-root. if (!isRootOrSplitSideRoot || topRoot.equals(change.getContainer()) || isDivider) { continue; } Loading @@ -165,6 +168,10 @@ class SplitScreenTransitions { t.setPosition(leash, change.getEndAbsBounds().left, change.getEndAbsBounds().top); t.setWindowCrop(leash, change.getEndAbsBounds().width(), change.getEndAbsBounds().height()); } else if (isDivider) { t.setPosition(leash, change.getEndAbsBounds().left, change.getEndAbsBounds().top); t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } boolean isOpening = isOpeningTransition(info); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +28 −26 Original line number Diff line number Diff line Loading @@ -895,10 +895,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSyncQueue.queue(wrapAsSplitRemoteAnimation(adapter), WindowManager.TRANSIT_OPEN, wct); } mSyncQueue.runInSync(t -> { setDividerVisibility(true, t); }); setEnterInstanceId(instanceId); } Loading Loading @@ -937,6 +933,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled(boolean isKeyguardOccluded) { onRemoteAnimationFinishedOrCancelled(evictWct); setDividerVisibility(true, null); try { adapter.getRunner().onAnimationCancelled(isKeyguardOccluded); } catch (RemoteException e) { Loading Loading @@ -977,6 +974,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, t.setPosition(apps[i].leash, 0, 0); } } setDividerVisibility(true, t); t.apply(); IRemoteAnimationFinishedCallback wrapCallback = Loading Loading @@ -1467,6 +1465,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, void finishEnterSplitScreen(SurfaceControl.Transaction t) { mSplitLayout.init(); setDividerVisibility(true, t); // Ensure divider surface are re-parented back into the hierarchy at the end of the // transition. See Transition#buildFinishTransaction for more detail. t.reparent(mSplitLayout.getDividerLeash(), mRootTaskLeash); updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); t.show(mRootTaskLeash); setSplitsVisible(true); Loading Loading @@ -1776,6 +1778,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, setDividerVisibility(mainStageVisible, null); } // Set divider visibility flag and try to apply it, the param transaction is used to apply. // See applyDividerVisibility for more detail. private void setDividerVisibility(boolean visible, @Nullable SurfaceControl.Transaction t) { if (visible == mDividerVisible) { return; Loading @@ -1802,14 +1806,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return; } if (t != null) { applyDividerVisibility(t); } else { mSyncQueue.runInSync(transaction -> applyDividerVisibility(transaction)); } } private void applyDividerVisibility(SurfaceControl.Transaction t) { // Apply divider visibility by current visibility flag. If param transaction is non-null, it // will apply by that transaction, if it is null and visible, it will run a fade-in animation, // otherwise hide immediately. private void applyDividerVisibility(@Nullable SurfaceControl.Transaction t) { final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash(); if (dividerLeash == null) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, Loading @@ -1826,7 +1829,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mDividerFadeInAnimator.cancel(); } if (mDividerVisible) { mSplitLayout.getRefDividerBounds(mTempRect1); if (t != null) { t.setVisibility(dividerLeash, mDividerVisible); t.setLayer(dividerLeash, Integer.MAX_VALUE); t.setPosition(dividerLeash, mTempRect1.left, mTempRect1.top); } else if (mDividerVisible) { final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); mDividerFadeInAnimator = ValueAnimator.ofFloat(0f, 1f); mDividerFadeInAnimator.addUpdateListener(animation -> { Loading Loading @@ -1866,7 +1874,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mDividerFadeInAnimator.start(); } else { t.hide(dividerLeash); final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); transaction.hide(dividerLeash); transaction.apply(); mTransactionPool.release(transaction); } } Loading Loading @@ -2450,7 +2461,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } finishEnterSplitScreen(finishT); addDividerBarToTransition(info, finishT, true /* show */); addDividerBarToTransition(info, true /* show */); return true; } Loading Loading @@ -2593,7 +2604,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (dismissTransition.mDismissTop == STAGE_TYPE_UNDEFINED) { // TODO: Have a proper remote for this. Until then, though, reset state and use the // normal animation stuff (which falls back to the normal launcher remote). t.hide(mSplitLayout.getDividerLeash()); setDividerVisibility(false, t); mSplitLayout.release(t); mSplitTransitions.mPendingDismiss = null; return false; Loading @@ -2611,7 +2622,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); } addDividerBarToTransition(info, finishT, false /* show */); addDividerBarToTransition(info, false /* show */); return true; } Loading Loading @@ -2652,11 +2663,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, logExit(EXIT_REASON_UNKNOWN); } private void addDividerBarToTransition(@NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction finishT, boolean show) { private void addDividerBarToTransition(@NonNull TransitionInfo info, boolean show) { final SurfaceControl leash = mSplitLayout.getDividerLeash(); final TransitionInfo.Change barChange = new TransitionInfo.Change(null /* token */, leash); mSplitLayout.getRefDividerBounds(mTempRect1); barChange.setParent(mRootTaskInfo.token); barChange.setStartAbsBounds(mTempRect1); barChange.setEndAbsBounds(mTempRect1); barChange.setMode(show ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK); Loading @@ -2664,15 +2675,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Technically this should be order-0, but this is running after layer assignment // and it's a special case, so just add to end. info.addChange(barChange); if (show) { finishT.setLayer(leash, Integer.MAX_VALUE); finishT.setPosition(leash, mTempRect1.left, mTempRect1.top); finishT.show(leash); // Ensure divider surface are re-parented back into the hierarchy at the end of the // transition. See Transition#buildFinishTransaction for more detail. finishT.reparent(leash, mRootTaskLeash); } } RemoteAnimationTarget getDividerBarLegacyTarget() { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ public class StageCoordinatorTests extends ShellTestCase { private SurfaceSession mSurfaceSession = new SurfaceSession(); private SurfaceControl mRootLeash; private SurfaceControl mDividerLeash; private ActivityManager.RunningTaskInfo mRootTask; private StageCoordinator mStageCoordinator; private Transitions mTransitions; Loading @@ -129,12 +130,14 @@ public class StageCoordinatorTests extends ShellTestCase { mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool, mMainExecutor, Optional.empty())); mDividerLeash = new SurfaceControl.Builder(mSurfaceSession).setName("fakeDivider").build(); when(mSplitLayout.getBounds1()).thenReturn(mBounds1); when(mSplitLayout.getBounds2()).thenReturn(mBounds2); when(mSplitLayout.getRootBounds()).thenReturn(mRootBounds); when(mSplitLayout.isLandscape()).thenReturn(false); when(mSplitLayout.applyTaskChanges(any(), any(), any())).thenReturn(true); when(mSplitLayout.getDividerLeash()).thenReturn(mDividerLeash); mRootTask = new TestRunningTaskInfoBuilder().build(); mRootLeash = new SurfaceControl.Builder(mSurfaceSession).setName("test").build(); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +1 −1 Original line number Diff line number Diff line Loading @@ -897,7 +897,7 @@ public class PipTransition extends PipTransitionController { .setWindowCrop(leash, endBounds.width(), endBounds.height()); } } mSplitScreenOptional.get().finishEnterSplitScreen(startTransaction); mSplitScreenOptional.get().finishEnterSplitScreen(finishTransaction); startTransaction.apply(); mPipOrganizer.onExitPipFinished(taskInfo); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +9 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.common.split.SplitScreenConstants.FLAG_IS_DIVIDER_BAR; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; import static com.android.wm.shell.splitscreen.SplitScreen.stageTypeToString; Loading Loading @@ -155,8 +156,10 @@ class SplitScreenTransitions { } boolean isRootOrSplitSideRoot = change.getParent() == null || topRoot.equals(change.getParent()); // For enter or exit, we only want to animate the side roots but not the top-root. if (!isRootOrSplitSideRoot || topRoot.equals(change.getContainer())) { boolean isDivider = change.getFlags() == FLAG_IS_DIVIDER_BAR; // For enter or exit, we only want to animate side roots and the divider but not the // top-root. if (!isRootOrSplitSideRoot || topRoot.equals(change.getContainer()) || isDivider) { continue; } Loading @@ -165,6 +168,10 @@ class SplitScreenTransitions { t.setPosition(leash, change.getEndAbsBounds().left, change.getEndAbsBounds().top); t.setWindowCrop(leash, change.getEndAbsBounds().width(), change.getEndAbsBounds().height()); } else if (isDivider) { t.setPosition(leash, change.getEndAbsBounds().left, change.getEndAbsBounds().top); t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } boolean isOpening = isOpeningTransition(info); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +28 −26 Original line number Diff line number Diff line Loading @@ -895,10 +895,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSyncQueue.queue(wrapAsSplitRemoteAnimation(adapter), WindowManager.TRANSIT_OPEN, wct); } mSyncQueue.runInSync(t -> { setDividerVisibility(true, t); }); setEnterInstanceId(instanceId); } Loading Loading @@ -937,6 +933,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled(boolean isKeyguardOccluded) { onRemoteAnimationFinishedOrCancelled(evictWct); setDividerVisibility(true, null); try { adapter.getRunner().onAnimationCancelled(isKeyguardOccluded); } catch (RemoteException e) { Loading Loading @@ -977,6 +974,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, t.setPosition(apps[i].leash, 0, 0); } } setDividerVisibility(true, t); t.apply(); IRemoteAnimationFinishedCallback wrapCallback = Loading Loading @@ -1467,6 +1465,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, void finishEnterSplitScreen(SurfaceControl.Transaction t) { mSplitLayout.init(); setDividerVisibility(true, t); // Ensure divider surface are re-parented back into the hierarchy at the end of the // transition. See Transition#buildFinishTransaction for more detail. t.reparent(mSplitLayout.getDividerLeash(), mRootTaskLeash); updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); t.show(mRootTaskLeash); setSplitsVisible(true); Loading Loading @@ -1776,6 +1778,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, setDividerVisibility(mainStageVisible, null); } // Set divider visibility flag and try to apply it, the param transaction is used to apply. // See applyDividerVisibility for more detail. private void setDividerVisibility(boolean visible, @Nullable SurfaceControl.Transaction t) { if (visible == mDividerVisible) { return; Loading @@ -1802,14 +1806,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return; } if (t != null) { applyDividerVisibility(t); } else { mSyncQueue.runInSync(transaction -> applyDividerVisibility(transaction)); } } private void applyDividerVisibility(SurfaceControl.Transaction t) { // Apply divider visibility by current visibility flag. If param transaction is non-null, it // will apply by that transaction, if it is null and visible, it will run a fade-in animation, // otherwise hide immediately. private void applyDividerVisibility(@Nullable SurfaceControl.Transaction t) { final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash(); if (dividerLeash == null) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, Loading @@ -1826,7 +1829,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mDividerFadeInAnimator.cancel(); } if (mDividerVisible) { mSplitLayout.getRefDividerBounds(mTempRect1); if (t != null) { t.setVisibility(dividerLeash, mDividerVisible); t.setLayer(dividerLeash, Integer.MAX_VALUE); t.setPosition(dividerLeash, mTempRect1.left, mTempRect1.top); } else if (mDividerVisible) { final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); mDividerFadeInAnimator = ValueAnimator.ofFloat(0f, 1f); mDividerFadeInAnimator.addUpdateListener(animation -> { Loading Loading @@ -1866,7 +1874,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mDividerFadeInAnimator.start(); } else { t.hide(dividerLeash); final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); transaction.hide(dividerLeash); transaction.apply(); mTransactionPool.release(transaction); } } Loading Loading @@ -2450,7 +2461,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } finishEnterSplitScreen(finishT); addDividerBarToTransition(info, finishT, true /* show */); addDividerBarToTransition(info, true /* show */); return true; } Loading Loading @@ -2593,7 +2604,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (dismissTransition.mDismissTop == STAGE_TYPE_UNDEFINED) { // TODO: Have a proper remote for this. Until then, though, reset state and use the // normal animation stuff (which falls back to the normal launcher remote). t.hide(mSplitLayout.getDividerLeash()); setDividerVisibility(false, t); mSplitLayout.release(t); mSplitTransitions.mPendingDismiss = null; return false; Loading @@ -2611,7 +2622,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); } addDividerBarToTransition(info, finishT, false /* show */); addDividerBarToTransition(info, false /* show */); return true; } Loading Loading @@ -2652,11 +2663,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, logExit(EXIT_REASON_UNKNOWN); } private void addDividerBarToTransition(@NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction finishT, boolean show) { private void addDividerBarToTransition(@NonNull TransitionInfo info, boolean show) { final SurfaceControl leash = mSplitLayout.getDividerLeash(); final TransitionInfo.Change barChange = new TransitionInfo.Change(null /* token */, leash); mSplitLayout.getRefDividerBounds(mTempRect1); barChange.setParent(mRootTaskInfo.token); barChange.setStartAbsBounds(mTempRect1); barChange.setEndAbsBounds(mTempRect1); barChange.setMode(show ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK); Loading @@ -2664,15 +2675,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Technically this should be order-0, but this is running after layer assignment // and it's a special case, so just add to end. info.addChange(barChange); if (show) { finishT.setLayer(leash, Integer.MAX_VALUE); finishT.setPosition(leash, mTempRect1.left, mTempRect1.top); finishT.show(leash); // Ensure divider surface are re-parented back into the hierarchy at the end of the // transition. See Transition#buildFinishTransaction for more detail. finishT.reparent(leash, mRootTaskLeash); } } RemoteAnimationTarget getDividerBarLegacyTarget() { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ public class StageCoordinatorTests extends ShellTestCase { private SurfaceSession mSurfaceSession = new SurfaceSession(); private SurfaceControl mRootLeash; private SurfaceControl mDividerLeash; private ActivityManager.RunningTaskInfo mRootTask; private StageCoordinator mStageCoordinator; private Transitions mTransitions; Loading @@ -129,12 +130,14 @@ public class StageCoordinatorTests extends ShellTestCase { mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool, mMainExecutor, Optional.empty())); mDividerLeash = new SurfaceControl.Builder(mSurfaceSession).setName("fakeDivider").build(); when(mSplitLayout.getBounds1()).thenReturn(mBounds1); when(mSplitLayout.getBounds2()).thenReturn(mBounds2); when(mSplitLayout.getRootBounds()).thenReturn(mRootBounds); when(mSplitLayout.isLandscape()).thenReturn(false); when(mSplitLayout.applyTaskChanges(any(), any(), any())).thenReturn(true); when(mSplitLayout.getDividerLeash()).thenReturn(mDividerLeash); mRootTask = new TestRunningTaskInfoBuilder().build(); mRootLeash = new SurfaceControl.Builder(mSurfaceSession).setName("test").build(); Loading