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

Commit 598e9a7f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Prevent orphaning of windows when token is removed"

parents 821447a3 3d0bfd95
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_STARTING_WINDOW_DRAWN;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;

@@ -62,12 +61,10 @@ import android.util.Slog;
import android.view.IApplicationToken;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;

import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.function.Function;

class AppTokenList extends ArrayList<AppWindowToken> {
}
@@ -390,10 +387,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
    @Override
    void removeIfPossible() {
        mIsExiting = false;
        removeAllWindows();
        removeAllWindowsIfPossible();
        if (mTask != null) {
            mTask.mStack.mExitingAppTokens.remove(this);
            mTask.removeChild(this);
            removeImmediately();
        }
    }

+18 −5
Original line number Diff line number Diff line
@@ -300,7 +300,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        return token.asAppWindowToken();
    }

    void setWindowToken(IBinder binder, WindowToken token) {
    void addWindowToken(IBinder binder, WindowToken token) {
        final DisplayContent dc = mService.mRoot.getWindowTokenDisplay(token);
        if (dc != null) {
            // We currently don't support adding a window token to the display if the display
@@ -333,20 +333,33 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
    WindowToken removeWindowToken(IBinder binder) {
        final WindowToken token = mTokenMap.remove(binder);
        if (token != null && token.asAppWindowToken() == null) {
            token.setExiting();
        }
        return token;
    }

    /** Changes the display the input window token is housed on to this one. */
    void reParentWindowToken(WindowToken token) {
        final DisplayContent prevDc = token.getDisplayContent();
        if (prevDc == this) {
            return;
        }
        if (prevDc != null && prevDc.mTokenMap.remove(token.token) != null) {
            switch (token.windowType) {
                case TYPE_WALLPAPER:
                    mBelowAppWindowsContainers.removeChild(token);
                    prevDc.mBelowAppWindowsContainers.removeChild(token);
                    break;
                case TYPE_INPUT_METHOD:
                case TYPE_INPUT_METHOD_DIALOG:
                    mImeWindowsContainers.removeChild(token);
                    prevDc.mImeWindowsContainers.removeChild(token);
                    break;
                default:
                    mAboveAppWindowsContainers.removeChild(token);
                    prevDc.mAboveAppWindowsContainers.removeChild(token);
                    break;
            }
        }
        return token;

        addWindowToken(token.token, token);
    }

    void removeAppToken(IBinder binder) {
+2 −2
Original line number Diff line number Diff line
@@ -146,11 +146,11 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
        if (content != null) {
            content.mDimLayerController.removeDimLayerUser(this);
        }
        getParent().removeChild(this);
        removeImmediately();
        mService.mTaskIdToTask.delete(mTaskId);
    }

    // Change to use reparenting in WC when TaskStack is switched to use WC.
    // Change to use re-parenting in WC when TaskStack is switched to use WC.
    void moveTaskToStack(TaskStack stack, boolean toTop) {
        if (stack == mStack) {
            return;
+2 −4
Original line number Diff line number Diff line
@@ -1654,7 +1654,7 @@ public class WindowManagerService extends IWindowManager.Stub
        if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Removing " + win + " from " + token);
        // Window will already be removed from token before this post clean-up method is called.
        if (token.isEmpty()) {
            if (!token.explicit) {
            if (!token.mPersistOnEmpty) {
                token.removeImmediately();
            } else if (atoken != null) {
                // TODO: Should this be moved into AppWindowToken.removeWindow? Might go away after
@@ -2443,8 +2443,6 @@ public class WindowManagerService extends IWindowManager.Stub
                    return;
                }

                token.setExiting();

                mInputMonitor.updateInputWindowsLw(true /*force*/);
            }
        } finally {
@@ -8924,7 +8922,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        return;
                    }

                    token.removeAllWindows();
                    token.removeAllWindowsIfPossible();
                }
                WindowManagerService.this.removeWindowToken(binder, displayId);
            }
+11 −25
Original line number Diff line number Diff line
@@ -18,25 +18,18 @@ package com.android.server.wm;

import java.util.Comparator;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;

import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;

import android.os.Bundle;
import android.os.Debug;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.DisplayInfo;
import android.view.animation.Animation;

import java.io.PrintWriter;

@@ -58,8 +51,8 @@ class WindowToken extends WindowContainer<WindowState> {
    final int windowType;

    // Set if this token was explicitly added by a client, so should
    // not be removed when all windows are removed.
    final boolean explicit;
    // persist (not be removed) when all windows are removed.
    boolean mPersistOnEmpty;

    // For printing.
    String stringName;
@@ -104,27 +97,28 @@ class WindowToken extends WindowContainer<WindowState> {
        return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;
    };

    WindowToken(WindowManagerService service, IBinder _token, int type, boolean _explicit,
    WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
            DisplayContent dc) {
        mService = service;
        token = _token;
        windowType = type;
        explicit = _explicit;
        mPersistOnEmpty = persistOnEmpty;
        onDisplayChanged(dc);
    }

    void removeAllWindows() {
    void removeAllWindowsIfPossible() {
        for (int i = mChildren.size() - 1; i >= 0; --i) {
            final WindowState win = mChildren.get(i);
            if (DEBUG_WINDOW_MOVEMENT) Slog.w(TAG_WM, "removeAllWindows: removing win=" + win);
            if (DEBUG_WINDOW_MOVEMENT) Slog.w(TAG_WM,
                    "removeAllWindowsIfPossible: removing win=" + win);
            win.removeIfPossible();
            if (mChildren.contains(win)) {
                removeChild(win);
            }
        }
    }

    void setExiting() {
        // This token is exiting, so allow it to be removed when it no longer contains any windows.
        mPersistOnEmpty = false;

        if (hidden) {
            return;
        }
@@ -297,16 +291,8 @@ class WindowToken extends WindowContainer<WindowState> {
    }

    void onDisplayChanged(DisplayContent dc) {
        if (mDisplayContent == dc) {
            return;
        }

        if (mDisplayContent != null) {
            mDisplayContent.removeWindowToken(token);
        }
        dc.reParentWindowToken(this);
        mDisplayContent = dc;
        mDisplayContent.setWindowToken(token, this);

        super.onDisplayChanged(dc);
    }

Loading