Fix switch task flicker from reveal animation.

While prepareing reveal animation in core, the initial position will be
set to 0,0 even when the window is shift by other insets.
- Only splash screen need to apply reveal animation, so ignore the
animation when removing task snapshot starting window.
- Set the initial position after the animation leash just created.

Fixes: 192333159
Test: Rotate device to landscape then use task switch to launch apps,
testing for both hot and cold launch.

Change-Id: I82d78822e0a44350a49ac4cee105f10790014982
This commit is contained in:
wilsonshih
2021-06-30 21:17:52 +08:00
parent fc3e38324f
commit 9768747be9
5 changed files with 18 additions and 1 deletions

View File

@@ -2252,6 +2252,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
final WindowManagerPolicy.StartingSurface surface;
final StartingData startingData = mStartingData;
if (mStartingData != null) {
surface = mStartingSurface;
mStartingData = null;
@@ -2278,7 +2279,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final Runnable removeSurface = () -> {
ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Removing startingView=%s", surface);
try {
surface.remove(prepareAnimation);
surface.remove(prepareAnimation && startingData.needRevealAnimation());
} catch (Exception e) {
Slog.w(TAG_WM, "Exception when removing starting window", e);
}

View File

@@ -40,6 +40,11 @@ class SnapshotStartingData extends StartingData {
mSnapshot);
}
@Override
boolean needRevealAnimation() {
return false;
}
@Override
boolean hasImeSurface() {
return mSnapshot.hasImeSurface();

View File

@@ -58,4 +58,9 @@ class SplashScreenStartingData extends StartingData {
mLogo, mWindowFlags, mMergedOverrideConfiguration,
activity.getDisplayContent().getDisplayId());
}
@Override
boolean needRevealAnimation() {
return true;
}
}

View File

@@ -47,6 +47,11 @@ public abstract class StartingData {
*/
abstract StartingSurface createStartingSurface(ActivityRecord activity);
/**
* @return Whether to apply reveal animation when exiting the starting window.
*/
abstract boolean needRevealAnimation();
/** @see android.window.TaskSnapshot#hasImeSurface() */
boolean hasImeSurface() {
return false;

View File

@@ -197,6 +197,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
ANIMATION_TYPE_STARTING_REVEAL);
windowAnimationLeash = adaptor.mAnimationLeash;
mainFrame = mainWindow.getRelativeFrame();
t.setPosition(windowAnimationLeash, mainFrame.left, mainFrame.top);
}
}
}