Set force translucent by split visibility
In order to ensure right life cycle and visiblity of launcher, we should still set right translucent state for top root task by split root visibility changed. But we also need to prvent b/264690550 happen again. Use a flag to record current of translucent state and prevent it set after split entered and become visible. (It should already set when entering) Also remove uncessary using of setForceTanslucent on moveToStage and correct some codes Fix: 267674372 Test: manual Test: pass existing tests Change-Id: Ide8a171435027054e053bb8609d7182bf13cfd84
This commit is contained in:
@@ -207,6 +207,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
private boolean mIsDividerRemoteAnimating;
|
||||
private boolean mIsDropEntering;
|
||||
private boolean mIsExiting;
|
||||
private boolean mIsRootTranslucent;
|
||||
|
||||
private DefaultMixedHandler mMixedHandler;
|
||||
private final Toast mSplitUnsupportedToast;
|
||||
@@ -422,6 +423,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
}
|
||||
}
|
||||
|
||||
if (!isSplitActive()) {
|
||||
// prevent the fling divider to center transitioni if split screen didn't active.
|
||||
mIsDropEntering = true;
|
||||
}
|
||||
|
||||
setSideStagePosition(sideStagePosition, wct);
|
||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||
targetStage.evictAllChildren(evictWct);
|
||||
@@ -436,28 +442,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
// reparent the task to an invisible split root will make the activity invisible. Reorder
|
||||
// the root task to front to make the entering transition from pip to split smooth.
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, true);
|
||||
wct.reorder(targetStage.mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(targetStage.mRootTaskInfo.token, true);
|
||||
// prevent the fling divider to center transition
|
||||
mIsDropEntering = true;
|
||||
|
||||
targetStage.addTask(task, wct);
|
||||
|
||||
if (ENABLE_SHELL_TRANSITIONS) {
|
||||
prepareEnterSplitScreen(wct);
|
||||
mSplitTransitions.startEnterTransition(TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, wct,
|
||||
null, this, null /* consumedCallback */, (finishWct, finishT) -> {
|
||||
if (!evictWct.isEmpty()) {
|
||||
finishWct.merge(evictWct, true);
|
||||
}
|
||||
} /* finishedCallback */);
|
||||
} else {
|
||||
if (!evictWct.isEmpty()) {
|
||||
wct.merge(evictWct, true /* transfer */);
|
||||
}
|
||||
mTaskOrganizer.applyTransaction(wct);
|
||||
if (!evictWct.isEmpty()) {
|
||||
wct.merge(evictWct, true /* transfer */);
|
||||
}
|
||||
mTaskOrganizer.applyTransaction(wct);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -716,7 +707,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mSplitLayout.setDivideRatio(splitRatio);
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, false);
|
||||
setRootForceTranslucent(false, wct);
|
||||
|
||||
// Make sure the launch options will put tasks in the corresponding split roots
|
||||
mainOptions = mainOptions != null ? mainOptions : new Bundle();
|
||||
@@ -923,7 +914,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, false);
|
||||
setRootForceTranslucent(false, wct);
|
||||
|
||||
// TODO(b/268008375): Merge APIs to start a split pair into one.
|
||||
if (mainTaskId != INVALID_TASK_ID) {
|
||||
@@ -1344,7 +1335,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mSideStage.removeAllTasks(wct, false /* toTop */);
|
||||
mMainStage.deactivate(wct, false /* toTop */);
|
||||
wct.reorder(mRootTaskInfo.token, false /* onTop */);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, true);
|
||||
setRootForceTranslucent(true, wct);
|
||||
wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
|
||||
onTransitionAnimationComplete();
|
||||
} else {
|
||||
@@ -1376,7 +1367,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mMainStage.deactivate(finishedWCT, childrenToTop == mMainStage /* toTop */);
|
||||
mSideStage.removeAllTasks(finishedWCT, childrenToTop == mSideStage /* toTop */);
|
||||
finishedWCT.reorder(mRootTaskInfo.token, false /* toTop */);
|
||||
finishedWCT.setForceTranslucent(mRootTaskInfo.token, true);
|
||||
setRootForceTranslucent(true, wct);
|
||||
finishedWCT.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
|
||||
mSyncQueue.queue(finishedWCT);
|
||||
mSyncQueue.runInSync(at -> {
|
||||
@@ -1488,7 +1479,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mMainStage.activate(wct, true /* includingTopTask */);
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, false);
|
||||
setRootForceTranslucent(false, wct);
|
||||
}
|
||||
|
||||
void finishEnterSplitScreen(SurfaceControl.Transaction t) {
|
||||
@@ -1692,6 +1683,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
|
||||
mRootTaskInfo = null;
|
||||
mRootTaskLeash = null;
|
||||
mIsRootTranslucent = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1710,7 +1702,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);
|
||||
setRootForceTranslucent(true, wct);
|
||||
mSplitLayout.getInvisibleBounds(mTempRect1);
|
||||
wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
|
||||
mSyncQueue.queue(wct);
|
||||
@@ -1734,7 +1726,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mSideStage.evictOtherChildren(wct, taskId);
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, false);
|
||||
setRootForceTranslucent(false, wct);
|
||||
|
||||
mSyncQueue.queue(wct);
|
||||
mSyncQueue.runInSync(t -> {
|
||||
@@ -1758,6 +1750,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mDisplayInsetsController.removeInsetsChangedListener(mDisplayId, mSplitLayout);
|
||||
}
|
||||
|
||||
private void setRootForceTranslucent(boolean translucent, WindowContainerTransaction wct) {
|
||||
if (mIsRootTranslucent == translucent) return;
|
||||
|
||||
mIsRootTranslucent = translucent;
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, translucent);
|
||||
}
|
||||
|
||||
private void onStageVisibilityChanged(StageListenerImpl stageListener) {
|
||||
// If split didn't active, just ignore this callback because we should already did these
|
||||
// on #applyExitSplitScreen.
|
||||
@@ -1784,12 +1783,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
// Split entering background.
|
||||
wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token,
|
||||
true /* setReparentLeafTaskIfRelaunch */);
|
||||
if (!mMainStage.mRootTaskInfo.isSleeping && !mSideStage.mRootTaskInfo.isSleeping) {
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, true);
|
||||
}
|
||||
setRootForceTranslucent(true, wct);
|
||||
} else {
|
||||
wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token,
|
||||
false /* setReparentLeafTaskIfRelaunch */);
|
||||
setRootForceTranslucent(false, wct);
|
||||
}
|
||||
|
||||
mSyncQueue.queue(wct);
|
||||
@@ -1921,7 +1919,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mMainStage.activate(wct, true /* includingTopTask */);
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
wct.reorder(mRootTaskInfo.token, true);
|
||||
wct.setForceTranslucent(mRootTaskInfo.token, false);
|
||||
setRootForceTranslucent(false, wct);
|
||||
}
|
||||
|
||||
mSyncQueue.queue(wct);
|
||||
|
||||
Reference in New Issue
Block a user