Merge "TextureView: destroy layer on destroyHardwareResources event" into nyc-mr1-dev
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index b2e2505..ce2fa81 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -218,35 +218,47 @@
     /** @hide */
     @Override
     protected void onDetachedFromWindowInternal() {
-        destroySurface();
+        destroyHardwareLayer();
+        releaseSurfaceTexture();
         super.onDetachedFromWindowInternal();
     }
 
-    private void destroySurface() {
+    /**
+     * @hide
+     */
+    @Override
+    protected void destroyHardwareResources() {
+        destroyHardwareLayer();
+        mUpdateSurface = mSurface != null;
+    }
+
+    private void destroyHardwareLayer() {
         if (mLayer != null) {
             mLayer.detachSurfaceTexture();
-
-            boolean shouldRelease = true;
-            if (mListener != null) {
-                shouldRelease = mListener.onSurfaceTextureDestroyed(mSurface);
-            }
-
-            synchronized (mNativeWindowLock) {
-                nDestroyNativeWindow();
-            }
-
             mLayer.destroy();
-            if (shouldRelease) mSurface.release();
-            mSurface = null;
             mLayer = null;
-
-            // Make sure if/when new layer gets re-created, transform matrix will
-            // be re-applied.
             mMatrixChanged = true;
-            mHadSurface = true;
         }
     }
 
+    private void releaseSurfaceTexture() {
+        boolean shouldRelease = true;
+
+        if (mListener != null) {
+            shouldRelease = mListener.onSurfaceTextureDestroyed(mSurface);
+        }
+
+        synchronized (mNativeWindowLock) {
+            nDestroyNativeWindow();
+        }
+
+        if (shouldRelease) {
+            mSurface.release();
+        }
+        mSurface = null;
+        mHadSurface = true;
+    }
+
     /**
      * The layer type of a TextureView is ignored since a TextureView is always
      * considered to act as a hardware layer. The optional paint supplied to this
@@ -366,9 +378,9 @@
                 // Create a new SurfaceTexture for the layer.
                 mSurface = new SurfaceTexture(false);
                 mLayer.setSurfaceTexture(mSurface);
+                nCreateNativeWindow(mSurface);
             }
             mSurface.setDefaultBufferSize(getWidth(), getHeight());
-            nCreateNativeWindow(mSurface);
 
             mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler);