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

This commit is contained in:
Andrii Kulian
2016-05-13 03:24:33 +00:00
committed by Android (Google) Code Review
2 changed files with 33 additions and 11 deletions

View File

@@ -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();
}
// 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;
}

View File

@@ -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 "