Merge "Reduce flicker when split pair switching" into tm-qpr-dev

This commit is contained in:
Tony Huang
2022-09-20 03:12:05 +00:00
committed by Android (Google) Code Review

View File

@@ -154,7 +154,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
private StageCoordinator mStageCoordinator; private StageCoordinator mStageCoordinator;
// Only used for the legacy recents animation from splitscreen to allow the tasks to be animated // Only used for the legacy recents animation from splitscreen to allow the tasks to be animated
// outside the bounds of the roots by being reparented into a higher level fullscreen container // outside the bounds of the roots by being reparented into a higher level fullscreen container
private SurfaceControl mSplitTasksContainerLayer; private SurfaceControl mGoingToRecentsTasksLayer;
private SurfaceControl mStartingSplitTasksLayer;
public SplitScreenController(Context context, public SplitScreenController(Context context,
ShellInit shellInit, ShellInit shellInit,
@@ -509,19 +510,53 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
} }
RemoteAnimationTarget[] onGoingToRecentsLegacy(RemoteAnimationTarget[] apps) { RemoteAnimationTarget[] onGoingToRecentsLegacy(RemoteAnimationTarget[] apps) {
if (ENABLE_SHELL_TRANSITIONS) return null;
if (isSplitScreenVisible()) { if (isSplitScreenVisible()) {
// Evict child tasks except the top visible one under split root to ensure it could be // Evict child tasks except the top visible one under split root to ensure it could be
// launched as full screen when switching to it on recents. // launched as full screen when switching to it on recents.
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
mStageCoordinator.prepareEvictInvisibleChildTasks(wct); mStageCoordinator.prepareEvictInvisibleChildTasks(wct);
mSyncQueue.queue(wct); mSyncQueue.queue(wct);
} else {
return null;
} }
return reparentSplitTasksForAnimation(apps, false /* enterSplitScreen */);
SurfaceControl.Transaction t = mTransactionPool.acquire();
if (mGoingToRecentsTasksLayer != null) {
t.remove(mGoingToRecentsTasksLayer);
}
mGoingToRecentsTasksLayer = reparentSplitTasksForAnimation(apps, t,
"SplitScreenController#onGoingToRecentsLegacy" /* callsite */);
t.apply();
mTransactionPool.release(t);
return new RemoteAnimationTarget[]{mStageCoordinator.getDividerBarLegacyTarget()};
} }
RemoteAnimationTarget[] onStartingSplitLegacy(RemoteAnimationTarget[] apps) { RemoteAnimationTarget[] onStartingSplitLegacy(RemoteAnimationTarget[] apps) {
if (ENABLE_SHELL_TRANSITIONS) return null;
int openingApps = 0;
for (int i = 0; i < apps.length; ++i) {
if (apps[i].mode == MODE_OPENING) openingApps++;
}
if (openingApps < 2) {
// Not having enough apps to enter split screen
return null;
}
SurfaceControl.Transaction t = mTransactionPool.acquire();
if (mStartingSplitTasksLayer != null) {
t.remove(mStartingSplitTasksLayer);
}
mStartingSplitTasksLayer = reparentSplitTasksForAnimation(apps, t,
"SplitScreenController#onStartingSplitLegacy" /* callsite */);
t.apply();
mTransactionPool.release(t);
try { try {
return reparentSplitTasksForAnimation(apps, true /* enterSplitScreen */); return new RemoteAnimationTarget[]{mStageCoordinator.getDividerBarLegacyTarget()};
} finally { } finally {
for (RemoteAnimationTarget appTarget : apps) { for (RemoteAnimationTarget appTarget : apps) {
if (appTarget.leash != null) { if (appTarget.leash != null) {
@@ -531,45 +566,23 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
} }
} }
private RemoteAnimationTarget[] reparentSplitTasksForAnimation(RemoteAnimationTarget[] apps, private SurfaceControl reparentSplitTasksForAnimation(RemoteAnimationTarget[] apps,
boolean enterSplitScreen) { SurfaceControl.Transaction t, String callsite) {
if (ENABLE_SHELL_TRANSITIONS) return null;
if (enterSplitScreen) {
int openingApps = 0;
for (int i = 0; i < apps.length; ++i) {
if (apps[i].mode == MODE_OPENING) openingApps++;
}
if (openingApps < 2) {
// Not having enough apps to enter split screen
return null;
}
} else if (!isSplitScreenVisible()) {
return null;
}
final SurfaceControl.Transaction transaction = mTransactionPool.acquire();
if (mSplitTasksContainerLayer != null) {
// Remove the previous layer before recreating
transaction.remove(mSplitTasksContainerLayer);
}
final SurfaceControl.Builder builder = new SurfaceControl.Builder(new SurfaceSession()) final SurfaceControl.Builder builder = new SurfaceControl.Builder(new SurfaceSession())
.setContainerLayer() .setContainerLayer()
.setName("RecentsAnimationSplitTasks") .setName("RecentsAnimationSplitTasks")
.setHidden(false) .setHidden(false)
.setCallsite("SplitScreenController#onGoingtoRecentsLegacy"); .setCallsite(callsite);
mRootTDAOrganizer.attachToDisplayArea(DEFAULT_DISPLAY, builder); mRootTDAOrganizer.attachToDisplayArea(DEFAULT_DISPLAY, builder);
mSplitTasksContainerLayer = builder.build(); final SurfaceControl splitTasksLayer = builder.build();
for (int i = 0; i < apps.length; ++i) { for (int i = 0; i < apps.length; ++i) {
final RemoteAnimationTarget appTarget = apps[i]; final RemoteAnimationTarget appTarget = apps[i];
transaction.reparent(appTarget.leash, mSplitTasksContainerLayer); t.reparent(appTarget.leash, splitTasksLayer);
transaction.setPosition(appTarget.leash, appTarget.screenSpaceBounds.left, t.setPosition(appTarget.leash, appTarget.screenSpaceBounds.left,
appTarget.screenSpaceBounds.top); appTarget.screenSpaceBounds.top);
} }
transaction.apply(); return splitTasksLayer;
mTransactionPool.release(transaction);
return new RemoteAnimationTarget[]{mStageCoordinator.getDividerBarLegacyTarget()};
} }
/** /**
* Sets drag info to be logged when splitscreen is entered. * Sets drag info to be logged when splitscreen is entered.