Merge "Make sure to release split layout when returning to home" into tm-dev

This commit is contained in:
Jerry Chang
2022-03-31 00:37:38 +00:00
committed by Android (Google) Code Review
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);
}
}