Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f77c42f authored by Issei Suzuki's avatar Issei Suzuki Committed by Android (Google) Code Review
Browse files

Merge "Defer destroying surface while exit animation is running for shell." into tm-dev

parents 9bdc17bb 7e031ced
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -63,8 +63,6 @@ import static com.android.server.wm.TaskFragmentProto.DISPLAY_ID;
import static com.android.server.wm.TaskFragmentProto.MIN_HEIGHT;
import static com.android.server.wm.TaskFragmentProto.MIN_WIDTH;
import static com.android.server.wm.TaskFragmentProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainerChildProto.TASK_FRAGMENT;

import android.annotation.IntDef;
@@ -2370,8 +2368,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
        if (!hasChild()) {
            return false;
        }
        return isAnimating(TRANSITION | CHILDREN, WindowState.EXIT_ANIMATING_TYPES)
                || inTransition();
        return isExitAnimationRunningSelfOrChild() || inTransition();
    }

    @Override
+17 −0
Original line number Diff line number Diff line
@@ -1196,6 +1196,23 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
        return false;
    }

    boolean isExitAnimationRunningSelfOrChild() {
        if (!mTransitionController.isShellTransitionsEnabled()) {
            return isAnimating(TRANSITION | CHILDREN, WindowState.EXIT_ANIMATING_TYPES);
        }
        if (mTransitionController.isCollecting(this)) {
            return true;
        }

        for (int i = mChildren.size() - 1; i >= 0; --i) {
            WindowContainer child = mChildren.get(i);
            if (child.isExitAnimationRunningSelfOrChild()) {
                return true;
            }
        }
        return false;
    }

    void sendAppVisibilityToClients() {
        for (int i = mChildren.size() - 1; i >= 0; --i) {
            final WindowContainer wc = mChildren.get(i);
+1 −3
Original line number Diff line number Diff line
@@ -119,7 +119,6 @@ import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
@@ -2561,8 +2560,7 @@ public class WindowManagerService extends IWindowManager.Stub
        if (win.isWinVisibleLw() && winAnimator.applyAnimationLocked(transit, false)) {
            focusMayChange = true;
            win.mAnimatingExit = true;
        } else if (win.mDisplayContent.okToAnimate() && win.isAnimating(TRANSITION | PARENTS,
                WindowState.EXIT_ANIMATING_TYPES)) {
        } else if (win.mDisplayContent.okToAnimate() && win.isExitAnimationRunningSelfOrParent()) {
            // Currently in a hide animation... turn this into
            // an exit.
            win.mAnimatingExit = true;
+13 −4
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITIO
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_STARTING_REVEAL;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainerChildProto.WINDOW;
@@ -2610,8 +2611,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
                        mWmService.mAccessibilityController.onWindowTransition(this, transit);
                    }
                }
                final boolean isAnimating = mAnimatingExit
                        || isAnimating(TRANSITION | PARENTS, EXIT_ANIMATING_TYPES);
                final boolean isAnimating = mAnimatingExit || isExitAnimationRunningSelfOrParent();
                final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null
                        && mActivityRecord.isLastWindow(this);
                // We delay the removal of a window if it has a showing surface that can be used to run
@@ -4977,6 +4977,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        return false;
    }

    boolean isExitAnimationRunningSelfOrParent() {
        return inAppOrRecentsTransition()
                || isAnimating(0 /* flags */, ANIMATION_TYPE_WINDOW_ANIMATION);
    }

    boolean isExitAnimationRunningSelfOrChild() {
        return isAnimating(CHILDREN, ANIMATION_TYPE_WINDOW_ANIMATION);
    }

    private boolean shouldFinishAnimatingExit() {
        // Exit animation might be applied soon.
        if (inTransition()) {
@@ -4988,7 +4997,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            return true;
        }
        // Exit animation is running.
        if (isAnimating(TRANSITION | PARENTS, EXIT_ANIMATING_TYPES)) {
        if (isExitAnimationRunningSelfOrParent()) {
            ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "shouldWaitAnimatingExit: isAnimating: %s",
                    this);
            return false;
@@ -5081,7 +5090,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

    @Override
    boolean handleCompleteDeferredRemoval() {
        if (mRemoveOnExit && !isSelfAnimating(0 /* flags */, EXIT_ANIMATING_TYPES)) {
        if (mRemoveOnExit && !isSelfAnimating(0 /* flags */, ANIMATION_TYPE_WINDOW_ANIMATION)) {
            mRemoveOnExit = false;
            removeImmediately();
        }