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

Commit 42a2e42f authored by Andrii Kulian's avatar Andrii Kulian Committed by android-build-merger
Browse files

Merge "Close leaked windows when trying to preserve main one" into nyc-dev am:...

Merge "Close leaked windows when trying to preserve main one" into nyc-dev am: 4ef107bb am: 1c4c2caa
am: 49f7135f

* commit '49f7135f':
  Close leaked windows when trying to preserve main one

Change-Id: Ic83f1f4a07bed89bf77e96ae16a273c859624948
parents 65a39367 49f7135f
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -4183,12 +4183,10 @@ public final class ActivityThread {
                        // window is being added.
                        r.mPendingRemoveWindow = r.window;
                        r.mPendingRemoveWindowManager = wm;
                        if (r.mPreserveWindow) {
                        // We can only keep the part of the view hierarchy that we control,
                        // everything else must be removed, because it might not be able to
                        // behave properly when activity is relaunching.
                        r.window.clearContentView();
                        }
                    } else {
                        wm.removeViewImmediate(v);
                    }
@@ -4196,6 +4194,13 @@ public final class ActivityThread {
                if (wtoken != null && r.mPendingRemoveWindow == null) {
                    WindowManagerGlobal.getInstance().closeAll(wtoken,
                            r.activity.getClass().getName(), "Activity");
                } else if (r.mPendingRemoveWindow != null) {
                    // We're preserving only one window, others should be closed so app views
                    // will be detached before the final tear down. It should be done now because
                    // some components (e.g. WebView) rely on detach callbacks to perform receiver
                    // unregister and other cleanup.
                    WindowManagerGlobal.getInstance().closeAllExceptView(token, v,
                            r.activity.getClass().getName(), "Activity");
                }
                r.activity.mDecor = null;
            }
+22 −5
Original line number Diff line number Diff line
@@ -391,17 +391,34 @@ public final class WindowManagerGlobal {
        }
    }

    /**
     * Remove all roots with specified token.
     *
     * @param token app or window token.
     * @param who name of caller, used in logs.
     * @param what type of caller, used in logs.
     */
    public void closeAll(IBinder token, String who, String what) {
        closeAllExceptView(token, null /* view */, who, what);
    }

    /**
     * Remove all roots with specified token, except maybe one view.
     *
     * @param token app or window token.
     * @param view view that should be should be preserved along with it's root.
     *             Pass null if everything should be removed.
     * @param who name of caller, used in logs.
     * @param what type of caller, used in logs.
     */
    public void closeAllExceptView(IBinder token, View view, String who, String what) {
        synchronized (mLock) {
            int count = mViews.size();
            //Log.i("foo", "Closing all windows of " + token);
            for (int i = 0; i < count; i++) {
                //Log.i("foo", "@ " + i + " token " + mParams[i].token
                //        + " view " + mRoots[i].getView());
                if (token == null || mParams.get(i).token == token) {
                if ((view == null || mViews.get(i) != view)
                        && (token == null || mParams.get(i).token == token)) {
                    ViewRootImpl root = mRoots.get(i);

                    //Log.i("foo", "Force closing " + root);
                    if (who != null) {
                        WindowLeaked leak = new WindowLeaked(
                                what + " " + who + " has leaked window "