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

Commit 14d74b82 authored by Craig Mautner's avatar Craig Mautner Committed by Android Git Automerger
Browse files

am 1bf2b873: Defer detach until animations are complete.

* commit '1bf2b873':
  Defer detach until animations are complete.
parents 481b54be 1bf2b873
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -102,6 +102,10 @@ class DisplayContent {

    final WindowManagerService mService;

    static final int DEFER_DETACH = 1;
    static final int DEFER_REMOVAL = 2;
    int mDeferredActions;

    /**
     * @param display May not be null.
     * @param service You know.
+28 −0
Original line number Diff line number Diff line
@@ -137,6 +137,21 @@ public class TaskStack {
        return mBounds.isEmpty();
    }

    boolean isAnimating() {
        for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<AppWindowToken> activities = mTasks.get(taskNdx).mAppTokens;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ArrayList<WindowState> windows = activities.get(activityNdx).allAppWindows;
                for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
                    if (windows.get(winNdx).mWinAnimator.isAnimating()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    void resizeBounds(float oldWidth, float oldHeight, float newWidth, float newHeight) {
        if (oldWidth == newWidth && oldHeight == newHeight) {
            return;
@@ -351,6 +366,19 @@ public class TaskStack {
        mAnimationBackgroundSurface.mDimSurface.destroy();
    }

    void checkForDeferredDetach() {
        if (mDisplayContent != null &&
                (mDisplayContent.mDeferredActions & DisplayContent.DEFER_DETACH) != 0 &&
                !isAnimating()) {
            mDisplayContent.mDeferredActions &= ~DisplayContent.DEFER_DETACH;
            mService.detachStack(mStackId);
            if ((mDisplayContent.mDeferredActions & DisplayContent.DEFER_REMOVAL) != 0) {
                mDisplayContent.mDeferredActions &= ~DisplayContent.DEFER_REMOVAL;
                mService.onDisplayRemoved(mDisplayContent.getDisplayId());
            }
        }
    }

    public void dump(String prefix, PrintWriter pw) {
        pw.print(prefix); pw.print("mStackId="); pw.println(mStackId);
        for (int taskNdx = 0; taskNdx < mTasks.size(); ++taskNdx) {
+3 −7
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ public class WindowAnimator {
    Object mLastWindowFreezeSource;

    SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
            new SparseArray<WindowAnimator.DisplayContentsAnimator>(2);
            new SparseArray<DisplayContentsAnimator>(2);

    boolean mInitialized = false;

@@ -451,11 +451,6 @@ public class WindowAnimator {
        }
    }

    private void performAnimationsLocked(final int displayId) {
        updateWindowsLocked(displayId);
        updateWallpaperLocked(displayId);
    }


    /** Locked on mService.mWindowMap. */
    private void animateLocked() {
@@ -496,7 +491,8 @@ public class WindowAnimator {

                // Update animations of all applications, including those
                // associated with exiting/removed apps
                performAnimationsLocked(displayId);
                updateWindowsLocked(displayId);
                updateWallpaperLocked(displayId);

                final WindowList windows = mService.getWindowListLocked(displayId);
                final int N = windows.size();
+8 −0
Original line number Diff line number Diff line
@@ -4917,6 +4917,10 @@ public class WindowManagerService extends IWindowManager.Stub
            if (stack != null) {
                final DisplayContent displayContent = stack.getDisplayContent();
                if (displayContent != null) {
                    if (stack.isAnimating()) {
                        displayContent.mDeferredActions |= DisplayContent.DEFER_DETACH;
                        return;
                    }
                    displayContent.detachStack(stack);
                    stack.detachDisplay();
                }
@@ -10848,6 +10852,10 @@ public class WindowManagerService extends IWindowManager.Stub
    private void handleDisplayRemovedLocked(int displayId) {
        final DisplayContent displayContent = getDisplayContentLocked(displayId);
        if (displayContent != null) {
            if ((displayContent.mDeferredActions & DisplayContent.DEFER_DETACH) != 0) {
                displayContent.mDeferredActions |= DisplayContent.DEFER_REMOVAL;
                return;
            }
            mDisplayContents.delete(displayId);
            displayContent.close();
            if (displayId == Display.DEFAULT_DISPLAY) {
+1 −0
Original line number Diff line number Diff line
@@ -416,6 +416,7 @@ class WindowStateAnimator {
            mService.mPendingRemove.add(mWin);
            mWin.mRemoveOnExit = false;
        }
        mWin.getStack().checkForDeferredDetach();
        mAnimator.hideWallpapersLocked(mWin);
    }