Reduce operations in postApplyAnimation for shell transition

This is a partial alternative solution of [1] to avoid black background
(no wallpaper target) when turning on screen with a translucent activity
which is occluding keyguard while AOD is disabled.

[1]: Ifc3ce28424fe87b1e0a0a2af07bdad559575ebec

Now instead of always recomputing wallpaper target after committing
visibility, the update hint only needs to be set when there is a
translucent occluding activity.

Also use usingShellTransitions to skip some legacy animation checks
that shell transition doesn't care.

Bug: 260059642
Test: Enable shell transition. Disable AOD
      KeyguardTests#testDialogShowWhenLockedActivity
      KeyguardTests#testTranslucentShowWhenLockedActivity
Test: Transition latency of OpenAppMicrobenchmark
Change-Id: Ic3c704f0579690c51f7188a26c5256dc3e74e1f7
This commit is contained in:
Riddle Hsu
2022-12-02 23:56:27 +08:00
parent 2a23c2e341
commit 607c7a1914
2 changed files with 18 additions and 16 deletions

View File

@@ -5435,25 +5435,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
*/
private void postApplyAnimation(boolean visible, boolean fromTransition) {
final boolean usingShellTransitions = mTransitionController.isShellTransitionsEnabled();
final boolean delayed = isAnimating(PARENTS | CHILDREN,
final boolean delayed = !usingShellTransitions && isAnimating(PARENTS | CHILDREN,
ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION
| ANIMATION_TYPE_RECENTS);
if (!delayed) {
if (!delayed && !usingShellTransitions) {
// We aren't delayed anything, but exiting windows rely on the animation finished
// callback being called in case the ActivityRecord was pretending to be delayed,
// which we might have done because we were in closing/opening apps list.
if (!usingShellTransitions) {
onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, null /* AnimationAdapter */);
if (visible) {
// The token was made immediately visible, there will be no entrance animation.
// We need to inform the client the enter animation was finished.
mEnteringAnimation = true;
mWmService.mActivityManagerAppTransitionNotifier.onAppTransitionFinishedLocked(
token);
}
} else {
// update wallpaper target
setAppLayoutChanges(FINISH_LAYOUT_REDO_WALLPAPER, "ActivityRecord");
onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, null /* AnimationAdapter */);
if (visible) {
// The token was made immediately visible, there will be no entrance animation.
// We need to inform the client the enter animation was finished.
mEnteringAnimation = true;
mWmService.mActivityManagerAppTransitionNotifier.onAppTransitionFinishedLocked(
token);
}
}
@@ -5462,8 +5457,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// updated.
// If we're becoming invisible, update the client visibility if we are not running an
// animation. Otherwise, we'll update client visibility in onAnimationFinished.
if (visible || !isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS)
|| usingShellTransitions) {
if (visible || usingShellTransitions
|| !isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS)) {
setClientVisible(visible);
}

View File

@@ -37,6 +37,7 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
@@ -650,6 +651,12 @@ class KeyguardController {
mRequestDismissKeyguard = lastDismissKeyguardActivity != mDismissingKeyguardActivity
&& !mOccluded && !mKeyguardGoingAway
&& mDismissingKeyguardActivity != null;
if (mOccluded && mKeyguardShowing && !display.isSleeping() && !top.fillsParent()
&& display.mWallpaperController.getWallpaperTarget() == null) {
// The occluding activity may be translucent or not fill screen. Then let wallpaper
// to check whether it should set itself as target to avoid blank background.
display.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
}
if (mTopTurnScreenOnActivity != lastTurnScreenOnActivity
&& mTopTurnScreenOnActivity != null