Loading core/java/android/view/ViewRootImpl.java +29 −25 Original line number Diff line number Diff line Loading @@ -313,6 +313,9 @@ public final class ViewRootImpl implements ViewParent, private int mViewLayoutDirectionInitial; /** Set to true once doDie() has been called. */ private boolean mRemoved; /** * Consistency verifier for debugging purposes. */ Loading Loading @@ -420,8 +423,6 @@ public final class ViewRootImpl implements ViewParent, synchronized (this) { if (mView == null) { mView = view; Slog.d(TAG, "setView: b9406261 setting mView to " + view + " mAdded=" + mAdded + " Callers=" + Debug.getCallers(4)); mViewLayoutDirectionInitial = mView.getRawLayoutDirection(); mFallbackEventHandler.setView(view); mWindowAttributes.copyFrom(attrs); Loading Loading @@ -477,8 +478,6 @@ public final class ViewRootImpl implements ViewParent, = panelParentView.getApplicationWindowToken(); } mAdded = true; Slog.d(TAG, "setView: b9406261 setting mAdded=true mView=" + mView + " Callers=" + Debug.getCallers(4)); int res; /* = WindowManagerImpl.ADD_OKAY; */ // Schedule the first layout -before- adding to the window Loading @@ -504,8 +503,6 @@ public final class ViewRootImpl implements ViewParent, mFallbackEventHandler.setView(null); unscheduleTraversals(); setAccessibilityFocus(null, null); Slog.d(TAG, "setView: b9406261 threw exception e=" + e + " Callers=" + Debug.getCallers(4)); throw new RuntimeException("Adding window failed", e); } finally { if (restore) { Loading Loading @@ -845,6 +842,7 @@ public final class ViewRootImpl implements ViewParent, invalidateChildInParent(null, dirty); } @Override public ViewParent invalidateChildInParent(int[] location, Rect dirty) { checkThread(); if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty); Loading Loading @@ -902,10 +900,12 @@ public final class ViewRootImpl implements ViewParent, } } @Override public ViewParent getParent() { return null; } @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { if (child != mView) { throw new RuntimeException("child is not mine, honest!"); Loading Loading @@ -2805,9 +2805,7 @@ public final class ViewRootImpl implements ViewParent, setAccessibilityFocus(null, null); if (mView != null) { mView.assignParent(null); } mView = null; mAttachInfo.mRootView = null; mAttachInfo.mSurface = null; Loading Loading @@ -5126,12 +5124,18 @@ public final class ViewRootImpl implements ViewParent, } } public void die(boolean immediate) { /** * @param immediate True, do now if not in traversal. False, put on queue and do later. * @return True, request has been queued. False, request has been completed. */ boolean die(boolean immediate) { // Make sure we do execute immediately if we are in the middle of a traversal or the damage // done by dispatchDetachedFromWindow will cause havoc on return. if (immediate && !mIsInTraversal) { doDie(); } else { return false; } if (!mIsDrawing) { destroyHardwareRenderer(); } else { Loading @@ -5139,16 +5143,18 @@ public final class ViewRootImpl implements ViewParent, " window=" + this + ", title=" + mWindowAttributes.getTitle()); } mHandler.sendEmptyMessage(MSG_DIE); } return true; } void doDie() { checkThread(); if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface); synchronized (this) { if (mRemoved) { return; } mRemoved = true; if (mAdded) { Slog.d(TAG, "doDie: b9406261 mAdded==true mView=" + mView + " Callers=" + Debug.getCallers(4)); dispatchDetachedFromWindow(); } Loading Loading @@ -5176,8 +5182,6 @@ public final class ViewRootImpl implements ViewParent, } } Slog.d(TAG, "doDie: b9406261 setting mAdded=false mView=" + mView + " Callers=" + Debug.getCallers(4)); mAdded = false; } WindowManagerGlobal.getInstance().doRemoveView(this); Loading core/java/android/view/WindowManagerGlobal.java +16 −4 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.util.AndroidRuntimeException; import android.util.ArraySet; import android.util.Log; import android.view.inputmethod.InputMethodManager; Loading Loading @@ -111,6 +112,7 @@ public final class WindowManagerGlobal { private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>(); private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private final ArraySet<View> mDyingViews = new ArraySet<View>(); private boolean mNeedsEglTerminate; private Runnable mSystemPropertyUpdater; Loading Loading @@ -220,9 +222,15 @@ public final class WindowManagerGlobal { int index = findViewLocked(view, false); if (index >= 0) { if (mDyingViews.contains(view)) { // Don't wait for MSG_DIE to make it's way through root's queue. mRoots.get(index).doDie(); } else { throw new IllegalStateException("View " + view + " has already been added to the window manager."); } // The previous removeView() had not completed executing. Now it has. } // If this is a panel window, then find the window it is being // attached to for future reference. Loading Loading @@ -334,9 +342,12 @@ public final class WindowManagerGlobal { imm.windowDismissed(mViews.get(index).getWindowToken()); } } root.die(immediate); boolean deferred = root.die(immediate); if (view != null) { view.assignParent(null); if (deferred) { mDyingViews.add(view); } } } Loading @@ -345,8 +356,9 @@ public final class WindowManagerGlobal { final int index = mRoots.indexOf(root); if (index >= 0) { mRoots.remove(index); mViews.remove(index); mParams.remove(index); final View view = mViews.remove(index); mDyingViews.remove(view); } } } Loading Loading
core/java/android/view/ViewRootImpl.java +29 −25 Original line number Diff line number Diff line Loading @@ -313,6 +313,9 @@ public final class ViewRootImpl implements ViewParent, private int mViewLayoutDirectionInitial; /** Set to true once doDie() has been called. */ private boolean mRemoved; /** * Consistency verifier for debugging purposes. */ Loading Loading @@ -420,8 +423,6 @@ public final class ViewRootImpl implements ViewParent, synchronized (this) { if (mView == null) { mView = view; Slog.d(TAG, "setView: b9406261 setting mView to " + view + " mAdded=" + mAdded + " Callers=" + Debug.getCallers(4)); mViewLayoutDirectionInitial = mView.getRawLayoutDirection(); mFallbackEventHandler.setView(view); mWindowAttributes.copyFrom(attrs); Loading Loading @@ -477,8 +478,6 @@ public final class ViewRootImpl implements ViewParent, = panelParentView.getApplicationWindowToken(); } mAdded = true; Slog.d(TAG, "setView: b9406261 setting mAdded=true mView=" + mView + " Callers=" + Debug.getCallers(4)); int res; /* = WindowManagerImpl.ADD_OKAY; */ // Schedule the first layout -before- adding to the window Loading @@ -504,8 +503,6 @@ public final class ViewRootImpl implements ViewParent, mFallbackEventHandler.setView(null); unscheduleTraversals(); setAccessibilityFocus(null, null); Slog.d(TAG, "setView: b9406261 threw exception e=" + e + " Callers=" + Debug.getCallers(4)); throw new RuntimeException("Adding window failed", e); } finally { if (restore) { Loading Loading @@ -845,6 +842,7 @@ public final class ViewRootImpl implements ViewParent, invalidateChildInParent(null, dirty); } @Override public ViewParent invalidateChildInParent(int[] location, Rect dirty) { checkThread(); if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty); Loading Loading @@ -902,10 +900,12 @@ public final class ViewRootImpl implements ViewParent, } } @Override public ViewParent getParent() { return null; } @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { if (child != mView) { throw new RuntimeException("child is not mine, honest!"); Loading Loading @@ -2805,9 +2805,7 @@ public final class ViewRootImpl implements ViewParent, setAccessibilityFocus(null, null); if (mView != null) { mView.assignParent(null); } mView = null; mAttachInfo.mRootView = null; mAttachInfo.mSurface = null; Loading Loading @@ -5126,12 +5124,18 @@ public final class ViewRootImpl implements ViewParent, } } public void die(boolean immediate) { /** * @param immediate True, do now if not in traversal. False, put on queue and do later. * @return True, request has been queued. False, request has been completed. */ boolean die(boolean immediate) { // Make sure we do execute immediately if we are in the middle of a traversal or the damage // done by dispatchDetachedFromWindow will cause havoc on return. if (immediate && !mIsInTraversal) { doDie(); } else { return false; } if (!mIsDrawing) { destroyHardwareRenderer(); } else { Loading @@ -5139,16 +5143,18 @@ public final class ViewRootImpl implements ViewParent, " window=" + this + ", title=" + mWindowAttributes.getTitle()); } mHandler.sendEmptyMessage(MSG_DIE); } return true; } void doDie() { checkThread(); if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface); synchronized (this) { if (mRemoved) { return; } mRemoved = true; if (mAdded) { Slog.d(TAG, "doDie: b9406261 mAdded==true mView=" + mView + " Callers=" + Debug.getCallers(4)); dispatchDetachedFromWindow(); } Loading Loading @@ -5176,8 +5182,6 @@ public final class ViewRootImpl implements ViewParent, } } Slog.d(TAG, "doDie: b9406261 setting mAdded=false mView=" + mView + " Callers=" + Debug.getCallers(4)); mAdded = false; } WindowManagerGlobal.getInstance().doRemoveView(this); Loading
core/java/android/view/WindowManagerGlobal.java +16 −4 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.util.AndroidRuntimeException; import android.util.ArraySet; import android.util.Log; import android.view.inputmethod.InputMethodManager; Loading Loading @@ -111,6 +112,7 @@ public final class WindowManagerGlobal { private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>(); private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private final ArraySet<View> mDyingViews = new ArraySet<View>(); private boolean mNeedsEglTerminate; private Runnable mSystemPropertyUpdater; Loading Loading @@ -220,9 +222,15 @@ public final class WindowManagerGlobal { int index = findViewLocked(view, false); if (index >= 0) { if (mDyingViews.contains(view)) { // Don't wait for MSG_DIE to make it's way through root's queue. mRoots.get(index).doDie(); } else { throw new IllegalStateException("View " + view + " has already been added to the window manager."); } // The previous removeView() had not completed executing. Now it has. } // If this is a panel window, then find the window it is being // attached to for future reference. Loading Loading @@ -334,9 +342,12 @@ public final class WindowManagerGlobal { imm.windowDismissed(mViews.get(index).getWindowToken()); } } root.die(immediate); boolean deferred = root.die(immediate); if (view != null) { view.assignParent(null); if (deferred) { mDyingViews.add(view); } } } Loading @@ -345,8 +356,9 @@ public final class WindowManagerGlobal { final int index = mRoots.indexOf(root); if (index >= 0) { mRoots.remove(index); mViews.remove(index); mParams.remove(index); final View view = mViews.remove(index); mDyingViews.remove(view); } } } Loading