From 607c7a191434b58e44b4d727dd6a5ba936653d1e Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 2 Dec 2022 23:56:27 +0800 Subject: [PATCH] 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 --- .../com/android/server/wm/ActivityRecord.java | 27 ++++++++----------- .../android/server/wm/KeyguardController.java | 7 +++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 66992aa79fc27..aa9a33826aee6 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -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); } diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index d76f6be93aebb..e6c2d65169817 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -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