From 16260e73f6c1c9dc94acf0d328a3c564426b8711 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 1 Sep 2011 14:26:11 -0700 Subject: [PATCH] Dispatch onDetachedFromWindow before destroying everything Bug #5245686 Change-Id: I637178ee0bb47fbec9b59198b388bb8de22c1786 --- core/java/android/view/HardwareRenderer.java | 9 ++++----- core/java/android/view/TextureView.java | 5 +++++ core/java/android/view/ViewRootImpl.java | 13 +++++++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 2bf16d89616ce..1fcde3d13c2f0 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -344,9 +344,9 @@ public abstract class HardwareRenderer { static final int EGL_SURFACE_TYPE = 0x3033; static final int EGL_SWAP_BEHAVIOR_PRESERVED_BIT = 0x0400; - private static final int SURFACE_STATE_ERROR = 0; - private static final int SURFACE_STATE_SUCCESS = 1; - private static final int SURFACE_STATE_UPDATED = 2; + static final int SURFACE_STATE_ERROR = 0; + static final int SURFACE_STATE_SUCCESS = 1; + static final int SURFACE_STATE_UPDATED = 2; static EGL10 sEgl; static EGLDisplay sEglDisplay; @@ -913,8 +913,7 @@ public abstract class HardwareRenderer { @Override void destroyLayers(View view) { - if (view != null && isEnabled()) { - checkCurrent(); + if (view != null && isEnabled() && checkCurrent() != SURFACE_STATE_ERROR) { destroyHardwareLayer(view); GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_LAYERS); } diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index 9d959fbf59812..c735d6bddba69 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -285,6 +285,11 @@ public class TextureView extends View { } } + @Override + boolean destroyLayer() { + return false; + } + @Override HardwareLayer getHardwareLayer() { if (mLayer == null) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a0cc28761ca01..4a733f623b46f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2136,6 +2136,10 @@ public final class ViewRootImpl extends Handler implements ViewParent, void dispatchDetachedFromWindow() { if (mView != null && mView.mAttachInfo != null) { + if (mAttachInfo.mHardwareRenderer != null && + mAttachInfo.mHardwareRenderer.isEnabled()) { + mAttachInfo.mHardwareRenderer.validate(); + } mView.dispatchDetachedFromWindow(); } @@ -3564,6 +3568,11 @@ public final class ViewRootImpl extends Handler implements ViewParent, checkThread(); if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface); synchronized (this) { + if (mAdded) { + mAdded = false; + dispatchDetachedFromWindow(); + } + if (mAdded && !mFirst) { destroyHardwareRenderer(); @@ -3584,10 +3593,6 @@ public final class ViewRootImpl extends Handler implements ViewParent, mSurface.release(); } - if (mAdded) { - mAdded = false; - dispatchDetachedFromWindow(); - } } }