Skip launcher animation when top window is already animating.
Currently we invoke the launcher back callback even when the top window leash is not created (which could happen when it already has an animation in progress, such as activity launch animation). Bug:231636972 Test: Swipe back during activity launch animation. m Change-Id: Icf9a39bf68cb862defde3c2cfa5960eada41d277
This commit is contained in:
@@ -402,7 +402,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
|
||||
private boolean shouldDispatchToLauncher(int backType) {
|
||||
return backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
|
||||
&& mBackToLauncherCallback != null
|
||||
&& mEnableAnimations.get();
|
||||
&& mEnableAnimations.get()
|
||||
&& mBackNavigationInfo != null
|
||||
&& mBackNavigationInfo.getDepartingAnimationTarget() != null;
|
||||
}
|
||||
|
||||
private static void dispatchOnBackStarted(IOnBackInvokedCallback callback) {
|
||||
|
||||
@@ -112,6 +112,7 @@ class BackNavigationController {
|
||||
RemoteAnimationTarget topAppTarget = null;
|
||||
int prevTaskId;
|
||||
int prevUserId;
|
||||
boolean prepareAnimation;
|
||||
|
||||
BackNavigationInfo.Builder infoBuilder = new BackNavigationInfo.Builder();
|
||||
synchronized (wmService.mGlobalLock) {
|
||||
@@ -257,7 +258,8 @@ class BackNavigationController {
|
||||
BackNavigationInfo.typeToString(backType));
|
||||
|
||||
// For now, we only animate when going home.
|
||||
boolean prepareAnimation = backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
|
||||
prepareAnimation = backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
|
||||
&& requestAnimation
|
||||
// Only create a new leash if no leash has been created.
|
||||
// Otherwise return null for animation target to avoid conflict.
|
||||
&& !removedWindowContainer.hasCommittedReparentToAnimationLeash();
|
||||
@@ -292,7 +294,7 @@ class BackNavigationController {
|
||||
}
|
||||
|
||||
// Special handling for back to home animation
|
||||
if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && requestAnimation
|
||||
if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && prepareAnimation
|
||||
&& prevTask != null) {
|
||||
currentTask.mBackGestureStarted = true;
|
||||
// Make launcher show from behind by marking its top activity as visible and
|
||||
@@ -347,7 +349,7 @@ class BackNavigationController {
|
||||
Task finalTask = currentTask;
|
||||
RemoteCallback onBackNavigationDone = new RemoteCallback(result -> onBackNavigationDone(
|
||||
result, finalRemovedWindowContainer, finalBackType, finalTask,
|
||||
finalprevActivity, requestAnimation));
|
||||
finalprevActivity, prepareAnimation));
|
||||
infoBuilder.setOnBackNavigationDone(onBackNavigationDone);
|
||||
}
|
||||
|
||||
@@ -381,14 +383,14 @@ class BackNavigationController {
|
||||
|
||||
private void onBackNavigationDone(
|
||||
Bundle result, WindowContainer<?> windowContainer, int backType,
|
||||
Task task, ActivityRecord prevActivity, boolean requestAnimation) {
|
||||
Task task, ActivityRecord prevActivity, boolean prepareAnimation) {
|
||||
SurfaceControl surfaceControl = windowContainer.getSurfaceControl();
|
||||
boolean triggerBack = result != null && result.getBoolean(
|
||||
BackNavigationInfo.KEY_TRIGGER_BACK);
|
||||
ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "onBackNavigationDone backType=%s, "
|
||||
+ "task=%s, prevActivity=%s", backType, task, prevActivity);
|
||||
|
||||
if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && requestAnimation) {
|
||||
if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && prepareAnimation) {
|
||||
if (triggerBack) {
|
||||
if (surfaceControl != null && surfaceControl.isValid()) {
|
||||
// When going back to home, hide the task surface before it is re-parented to
|
||||
|
||||
Reference in New Issue
Block a user