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

Commit 7e031ced authored by Issei Suzuki's avatar Issei Suzuki
Browse files

Defer destroying surface while exit animation is running for shell.

Bug: 217174830
Test: manual.
  1. start search app
  2. search image
  3. click share to start Chooser activity (in a separate task)
  4. close Chooser activity
Change-Id: I5a4f6fcdf16c5ce40298385d2153e108f43378f2
parent 3c237f78
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;
@@ -2360,8 +2358,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;
@@ -2543,8 +2542,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();
        }