Merge "Reduce flicker when split pair switching" into tm-qpr-dev
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user