Make sure to release split layout when returning to home

When returning to home from recent apps, the splitting tasks were
already hidden while performing the recent transition, so dismiss split
screen directly without requesting dismiss transition. Also reorder to
make sure it collects all clean-up operations before finishing the
transition.

Fix: 226682648
Bug: 206487881
Test: verify with the repro steps of the bug
Change-Id: I05e7ae6fa26631203d652ccb532fb57f532794d7
This commit is contained in:
Jerry Chang
2022-03-25 11:35:01 +00:00
parent 82c6e424d2
commit b3d0379faa
2 changed files with 29 additions and 24 deletions

View File

@@ -231,6 +231,26 @@ class SplitScreenTransitions {
void onFinish(WindowContainerTransaction wct, WindowContainerTransactionCallback wctCB) {
if (!mAnimations.isEmpty()) return;
if (mAnimatingTransition == mPendingEnter) {
mPendingEnter = null;
}
if (mPendingDismiss != null && mPendingDismiss.mTransition == mAnimatingTransition) {
mPendingDismiss = null;
}
if (mAnimatingTransition == mPendingRecent) {
// If the clean-up wct is null when finishing recent transition, it indicates it's
// returning to home and thus no need to reorder tasks.
final boolean returnToHome = wct == null;
if (returnToHome) {
wct = new WindowContainerTransaction();
}
mStageCoordinator.onRecentTransitionFinished(returnToHome, wct, mFinishTransaction);
mPendingRecent = null;
}
mPendingRemoteHandler = null;
mActiveRemoteHandler = null;
mAnimatingTransition = null;
mOnFinish.run();
if (mFinishTransaction != null) {
mFinishTransaction.apply();
@@ -241,22 +261,6 @@ class SplitScreenTransitions {
mFinishCallback.onTransitionFinished(wct /* wct */, wctCB /* wctCB */);
mFinishCallback = null;
}
if (mAnimatingTransition == mPendingEnter) {
mPendingEnter = null;
}
if (mPendingDismiss != null && mPendingDismiss.mTransition == mAnimatingTransition) {
mPendingDismiss = null;
}
if (mAnimatingTransition == mPendingRecent) {
// If the wct is not null while finishing recent transition, it indicates it's not
// dismissing split and thus need to reorder split task so they can be on top again.
final boolean dismissSplit = wct == null;
mStageCoordinator.finishRecentAnimation(dismissSplit);
mPendingRecent = null;
}
mPendingRemoteHandler = null;
mActiveRemoteHandler = null;
mAnimatingTransition = null;
}
// TODO(shell-transitions): real animations

View File

@@ -1568,8 +1568,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
logExit(dismissTransition.mReason);
// 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).
setDividerVisibility(false, t);
mSplitLayout.release();
mSplitLayout.release(t);
mSplitTransitions.mPendingDismiss = null;
return false;
} else {
@@ -1595,7 +1594,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
return true;
}
void finishRecentAnimation(boolean dismissSplit) {
void onRecentTransitionFinished(boolean returnToHome, WindowContainerTransaction wct,
SurfaceControl.Transaction finishT) {
// Exclude the case that the split screen has been dismissed already.
if (!mMainStage.isActive()) {
// The latest split dismissing transition might be a no-op transition and thus won't
@@ -1605,13 +1605,14 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
return;
}
if (dismissSplit) {
final WindowContainerTransaction wct = new WindowContainerTransaction();
if (returnToHome) {
// When returning to home from recent apps, the splitting tasks are already hidden, so
// append the reset of dismissing operations into the clean-up wct.
prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct);
mSplitTransitions.startDismissTransition(null /* transition */, wct, this,
STAGE_TYPE_UNDEFINED, EXIT_REASON_RETURN_HOME);
setSplitsVisible(false);
logExit(EXIT_REASON_RETURN_HOME);
} else {
setDividerVisibility(true, null /* t */);
setDividerVisibility(true, finishT);
}
}