diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 85 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 1 |
2 files changed, 16 insertions, 70 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 61194bc2f2c0..171bf57ad519 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5806,7 +5806,21 @@ final class ActivityRecord extends WindowToken { displayContent.getInputMonitor().updateInputWindowsLw(false /*force*/); mTransitionChangeFlags = 0; - postApplyAnimation(visible, fromTransition); + // Set client visibility if: + // 1. The activity is becoming visible. This is usually no-op because assume that + // setVisibility(true) should have been called. Just in case if that was missed. + // 2. The activity is becoming invisible and not RESUMED state (it is usually PAUSED unless + // the activity is transient-hide). If the state is RESUMED, setVisibility(false) will be + // called until activityStopped. This is to avoid crashing apps that assume its view root + // won't be invisible before the activity is paused. + if (visible || mState != RESUMED) { + setClientVisible(visible); + } + // Notify the visibility change outside of transition in case onTransitionFinish is not + // called for updating snapshot states. + if (!fromTransition) { + mWmService.mSnapshotController.notifyAppVisibilityChanged(this, visible); + } } void commitVisibility(boolean visible, boolean performLayout) { @@ -5825,75 +5839,6 @@ final class ActivityRecord extends WindowToken { return mNeedsLetterboxedAnimation && isAnimating(); } - /** - * Post process after applying an app transition animation. - * - * <p class="note"><strong>Note: </strong> This function must be called after the animations - * have been applied and {@link #commitVisibility}.</p> - * - * @param visible {@code true} if this {@link ActivityRecord} has become visible, otherwise - * this has become invisible. - * @param fromTransition {@code true} if this call is part of finishing a transition. This is - * needed because the shell transition is no-longer active by the time - * commitVisibility is called. - */ - private void postApplyAnimation(boolean visible, boolean fromTransition) { - final boolean usingShellTransitions = mTransitionController.isShellTransitionsEnabled(); - final boolean delayed = !usingShellTransitions && isAnimating(PARENTS | CHILDREN, - ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION); - 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. - 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); - } - } - - // If we're becoming visible, immediately change client visibility as well. there seem - // to be some edge cases where we change our visibility but client visibility never gets - // updated. - // If we're becoming invisible, update the client visibility if we are not running an - // animation and aren't in RESUMED state. Otherwise, we'll update client visibility in - // onAnimationFinished or activityStopped. - if (visible || (mState != RESUMED && (usingShellTransitions || !isAnimating( - PARENTS, ANIMATION_TYPE_APP_TRANSITION)))) { - setClientVisible(visible); - } - - final DisplayContent displayContent = getDisplayContent(); - if (!displayContent.mClosingApps.contains(this) - && !displayContent.mOpeningApps.contains(this) - && !fromTransition) { - // Take the screenshot before possibly hiding the WSA, otherwise the screenshot - // will not be taken. - mWmService.mSnapshotController.notifyAppVisibilityChanged(this, visible); - } - - // If we are hidden but there is no delay needed we immediately - // apply the Surface transaction so that the ActivityManager - // can have some guarantee on the Surface state following - // setting the visibility. This captures cases like dismissing - // the docked or root pinned task where there is no app transition. - // - // In the case of a "Null" animation, there will be - // no animation but there will still be a transition set. - // We still need to delay hiding the surface such that it - // can be synchronized with showing the next surface in the transition. - if (!usingShellTransitions && !isVisible() && !delayed - && !displayContent.mAppTransition.isTransitionSet()) { - forAllWindows(win -> { - win.mWinAnimator.hide(getPendingTransaction(), "immediately hidden"); - }, true); - scheduleAnimation(); - } - } - /** Updates draw state and shows drawn windows. */ void commitFinishDrawing(SurfaceControl.Transaction t) { boolean committed = false; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index a718c06cc2fa..59ee2f5c8e9f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -1281,6 +1281,7 @@ public class WindowStateTests extends WindowTestsBase { // Simulate app plays closing transition to app2. app.mActivityRecord.commitVisibility(false, false); + mDisplayContent.computeImeTarget(true /* updateImeTarget */); assertTrue(app.mActivityRecord.mLastImeShown); // Verify the IME insets is visible on app, but not for app2 during app task switching. |