More cleanups

Change-Id: Id5967944b949a2aec57e4fe9fdcdc04c11b8c35a
diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java
index 266a6fed..0c2e944 100644
--- a/core/java/android/view/HardwareLayer.java
+++ b/core/java/android/view/HardwareLayer.java
@@ -122,16 +122,8 @@
     /**
      * Indicates that this layer has lost its texture.
      */
-    public void detachSurfaceTexture(final SurfaceTexture surface) {
-        mRenderer.safelyRun(new Runnable() {
-            @Override
-            public void run() {
-                surface.detachFromGLContext();
-                // SurfaceTexture owns the texture name and detachFromGLContext
-                // should have deleted it
-                nOnTextureDestroyed(mFinalizer.get());
-            }
-        });
+    public void detachSurfaceTexture() {
+        mRenderer.detachSurfaceTexture(mFinalizer.get());
     }
 
     public long getLayer() {
@@ -148,21 +140,10 @@
         mRenderer.pushLayerUpdate(this);
     }
 
-    /**
-     * This should only be used by HardwareRenderer! Do not call directly
-     */
-    SurfaceTexture createSurfaceTexture() {
-        SurfaceTexture st = new SurfaceTexture(nGetTexName(mFinalizer.get()));
-        nSetSurfaceTexture(mFinalizer.get(), st, true);
-        return st;
-    }
-
     static HardwareLayer adoptTextureLayer(HardwareRenderer renderer, long layer) {
         return new HardwareLayer(renderer, layer);
     }
 
-    private static native void nOnTextureDestroyed(long layerUpdater);
-
     private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque);
     private static native void nSetLayerPaint(long layerUpdater, long paint);
     private static native void nSetTransform(long layerUpdater, long matrix);
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index cfb4af2..e9bdcae 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -245,15 +245,10 @@
     abstract void invalidate(Surface surface);
 
     /**
-     * This method ensures the hardware renderer is in a valid state
-     * before executing the specified action.
-     *
-     * This method will attempt to set a valid state even if the window
-     * the renderer is attached to was destroyed.
-     *
-     * @return true if the action was run
+     * Detaches the layer's surface texture from the GL context and releases
+     * the texture id
      */
-    abstract boolean safelyRun(Runnable action);
+    abstract void detachSurfaceTexture(long hardwareLayer);
 
     /**
      * Setup the hardware renderer for drawing. This is called whenever the
@@ -315,8 +310,6 @@
      * as soon as possible.
      *
      * @param layer The hardware layer that needs an update
-     *
-     * @see #flushLayerUpdates()
      */
     abstract void pushLayerUpdate(HardwareLayer layer);
 
@@ -327,13 +320,6 @@
     abstract void onLayerDestroyed(HardwareLayer layer);
 
     /**
-     * Forces all enqueued layer updates to be executed immediately.
-     *
-     * @see #pushLayerUpdate(HardwareLayer)
-     */
-    abstract void flushLayerUpdates();
-
-    /**
      * Interface used to receive callbacks whenever a view is drawn by
      * a hardware renderer instance.
      */
@@ -374,16 +360,6 @@
      */
     abstract HardwareLayer createTextureLayer();
 
-    /**
-     * Creates a new {@link SurfaceTexture} that can be used to render into the
-     * specified hardware layer.
-     *
-     * @param layer The layer to render into using a {@link android.graphics.SurfaceTexture}
-     *
-     * @return A {@link SurfaceTexture}
-     */
-    abstract SurfaceTexture createSurfaceTexture(HardwareLayer layer);
-
     abstract boolean copyLayerInto(HardwareLayer layer, Bitmap bitmap);
 
     /**
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 1f7eaa2..59ec058 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -122,8 +122,7 @@
     private int mSaveCount;
 
     private final Object[] mNativeWindowLock = new Object[0];
-    // Used from native code, do not write!
-    @SuppressWarnings({"UnusedDeclaration"})
+    // Set by native code, do not write!
     private long mNativeWindow;
 
     /**
@@ -142,7 +141,6 @@
      * @param context The context to associate this view with.
      * @param attrs The attributes of the XML tag that is inflating the view.
      */
-    @SuppressWarnings({"UnusedDeclaration"})
     public TextureView(Context context, AttributeSet attrs) {
         super(context, attrs);
         init();
@@ -157,7 +155,6 @@
      *        reference to a style resource that supplies default values for
      *        the view. Can be 0 to not look for defaults.
      */
-    @SuppressWarnings({"UnusedDeclaration"})
     public TextureView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init();
@@ -176,7 +173,6 @@
      *        defStyleAttr is 0 or can not be found in the theme. Can be 0
      *        to not look for defaults.
      */
-    @SuppressWarnings({"UnusedDeclaration"})
     public TextureView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init();
@@ -234,7 +230,7 @@
 
     private void destroySurface() {
         if (mLayer != null) {
-            mLayer.detachSurfaceTexture(mSurface);
+            mLayer.detachSurfaceTexture();
 
             boolean shouldRelease = true;
             if (mListener != null) {
@@ -362,7 +358,8 @@
             mLayer = mAttachInfo.mHardwareRenderer.createTextureLayer();
             if (!mUpdateSurface) {
                 // Create a new SurfaceTexture for the layer.
-                mSurface = mAttachInfo.mHardwareRenderer.createSurfaceTexture(mLayer);
+                mSurface = new SurfaceTexture(false);
+                mLayer.setSurfaceTexture(mSurface);
             }
             mSurface.setDefaultBufferSize(getWidth(), getHeight());
             nCreateNativeWindow(mSurface);
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index bfab654..45714ff 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -19,8 +19,6 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.graphics.SurfaceTexture;
 import android.graphics.drawable.Drawable;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -35,9 +33,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashSet;
 
 /**
@@ -152,9 +147,8 @@
     }
 
     @Override
-    boolean safelyRun(Runnable action) {
-        nRunWithGlContext(mNativeProxy, action);
-        return true;
+    void detachSurfaceTexture(long hardwareLayer) {
+        nDetachSurfaceTexture(mNativeProxy, hardwareLayer);
     }
 
     @Override
@@ -270,18 +264,6 @@
     }
 
     @Override
-    SurfaceTexture createSurfaceTexture(final HardwareLayer layer) {
-        final SurfaceTexture[] ret = new SurfaceTexture[1];
-        nRunWithGlContext(mNativeProxy, new Runnable() {
-            @Override
-            public void run() {
-                ret[0] = layer.createSurfaceTexture();
-            }
-        });
-        return ret[0];
-    }
-
-    @Override
     boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
         return nCopyLayerInto(mNativeProxy,
                 layer.getDeferredLayerUpdater(), bitmap.mNativeBitmap);
@@ -293,11 +275,6 @@
     }
 
     @Override
-    void flushLayerUpdates() {
-        // TODO: Figure out what this should do or remove it
-    }
-
-    @Override
     void onLayerDestroyed(HardwareLayer layer) {
         nCancelLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
     }
@@ -415,7 +392,6 @@
     private static native void nSetOpaque(long nativeProxy, boolean opaque);
     private static native int nSyncAndDrawFrame(long nativeProxy,
             long frameTimeNanos, long recordDuration, float density);
-    private static native void nRunWithGlContext(long nativeProxy, Runnable runnable);
     private static native void nDestroyCanvasAndSurface(long nativeProxy);
 
     private static native void nInvokeFunctor(long functor, boolean waitForCompletion);
@@ -425,6 +401,7 @@
     private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
     private static native void nPushLayerUpdate(long nativeProxy, long layer);
     private static native void nCancelLayerUpdate(long nativeProxy, long layer);
+    private static native void nDetachSurfaceTexture(long nativeProxy, long layer);
 
     private static native void nFlushCaches(long nativeProxy, int flushMode);
 
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 84e30c6..4c9d3f9 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -640,17 +640,6 @@
         // TODO Implement
     }
 
-    void flushHardwareLayerUpdates() {
-        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
-            mAttachInfo.mHardwareRenderer.flushLayerUpdates();
-        }
-    }
-
-    void dispatchFlushHardwareLayerUpdates() {
-        mHandler.removeMessages(MSG_FLUSH_LAYER_UPDATES);
-        mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_FLUSH_LAYER_UPDATES));
-    }
-
     public void detachFunctor(long functor) {
         // TODO: Make the resize buffer some other way to not need this block
         mBlockResizeBuffer = true;
@@ -2999,8 +2988,7 @@
     private final static int MSG_DISPATCH_DONE_ANIMATING = 22;
     private final static int MSG_INVALIDATE_WORLD = 23;
     private final static int MSG_WINDOW_MOVED = 24;
-    private final static int MSG_FLUSH_LAYER_UPDATES = 25;
-    private final static int MSG_SYNTHESIZE_INPUT_EVENT = 26;
+    private final static int MSG_SYNTHESIZE_INPUT_EVENT = 25;
 
     final class ViewRootHandler extends Handler {
         @Override
@@ -3048,8 +3036,6 @@
                     return "MSG_DISPATCH_DONE_ANIMATING";
                 case MSG_WINDOW_MOVED:
                     return "MSG_WINDOW_MOVED";
-                case MSG_FLUSH_LAYER_UPDATES:
-                    return "MSG_FLUSH_LAYER_UPDATES";
                 case MSG_SYNTHESIZE_INPUT_EVENT:
                     return "MSG_SYNTHESIZE_INPUT_EVENT";
             }
@@ -3277,9 +3263,6 @@
                     invalidateWorld(mView);
                 }
             } break;
-            case MSG_FLUSH_LAYER_UPDATES: {
-                flushHardwareLayerUpdates();
-            } break;
             }
         }
     }
diff --git a/core/jni/android_view_HardwareLayer.cpp b/core/jni/android_view_HardwareLayer.cpp
index ace17ec..50edb76 100644
--- a/core/jni/android_view_HardwareLayer.cpp
+++ b/core/jni/android_view_HardwareLayer.cpp
@@ -43,12 +43,6 @@
 
 #ifdef USE_OPENGL_RENDERER
 
-static void android_view_HardwareLayer_onTextureDestroyed(JNIEnv* env, jobject clazz,
-        jlong layerUpdaterPtr) {
-    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
-    layer->backingLayer()->clearTexture();
-}
-
 static jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
         jlong layerUpdaterPtr, jint width, jint height, jboolean isOpaque) {
     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
@@ -110,8 +104,6 @@
 static JNINativeMethod gMethods[] = {
 #ifdef USE_OPENGL_RENDERER
 
-    { "nOnTextureDestroyed",     "(J)V",       (void*) android_view_HardwareLayer_onTextureDestroyed },
-
     { "nPrepare",                "(JIIZ)Z",    (void*) android_view_HardwareLayer_prepare },
     { "nSetLayerPaint",          "(JJ)V",      (void*) android_view_HardwareLayer_setLayerPaint },
     { "nSetTransform",           "(JJ)V",      (void*) android_view_HardwareLayer_setTransform },
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 3e62d0b..e63c475 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -47,8 +47,6 @@
 using namespace android::uirenderer;
 using namespace android::uirenderer::renderthread;
 
-static jmethodID gRunnableMethod;
-
 static JNIEnv* getenv(JavaVM* vm) {
     JNIEnv* env;
     if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
@@ -57,25 +55,6 @@
     return env;
 }
 
-class JavaTask : public RenderTask {
-public:
-    JavaTask(JNIEnv* env, jobject jrunnable) {
-        env->GetJavaVM(&mVm);
-        mRunnable = env->NewGlobalRef(jrunnable);
-    }
-
-    virtual void run() {
-        JNIEnv* env = getenv(mVm);
-        env->CallVoidMethod(mRunnable, gRunnableMethod);
-        env->DeleteGlobalRef(mRunnable);
-        delete this;
-    };
-
-private:
-    JavaVM* mVm;
-    jobject mRunnable;
-};
-
 class OnFinishedEvent {
 public:
     OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener)
@@ -276,13 +255,6 @@
     RenderProxy::invokeFunctor(functor, waitForCompletion);
 }
 
-static void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
-        jlong proxyPtr, jobject jrunnable) {
-    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
-    RenderTask* task = new JavaTask(env, jrunnable);
-    proxy->runWithGlContext(task);
-}
-
 static jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
         jlong proxyPtr, jint width, jint height) {
     RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -319,6 +291,13 @@
     proxy->cancelLayerUpdate(layer);
 }
 
+static void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz,
+        jlong proxyPtr, jlong layerPtr) {
+    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
+    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
+    proxy->detachSurfaceTexture(layer);
+}
+
 static void android_view_ThreadedRenderer_flushCaches(JNIEnv* env, jobject clazz,
         jlong proxyPtr, jint flushMode) {
     RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -380,12 +359,12 @@
     { "nSyncAndDrawFrame", "(JJJF)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
     { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
     { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
-    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
     { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
     { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
     { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
     { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate },
     { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate },
+    { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture },
     { "nFlushCaches", "(JI)V", (void*) android_view_ThreadedRenderer_flushCaches },
     { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
     { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
@@ -396,11 +375,6 @@
 };
 
 int register_android_view_ThreadedRenderer(JNIEnv* env) {
-#ifdef USE_OPENGL_RENDERER
-    jclass cls = env->FindClass("java/lang/Runnable");
-    gRunnableMethod = env->GetMethodID(cls, "run", "()V");
-    env->DeleteLocalRef(cls);
-#endif
     return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
 }
 
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp
index 02b0372..836de45 100644
--- a/libs/hwui/DeferredLayerUpdater.cpp
+++ b/libs/hwui/DeferredLayerUpdater.cpp
@@ -119,5 +119,13 @@
     }
 }
 
+void DeferredLayerUpdater::detachSurfaceTexture() {
+    if (mSurfaceTexture.get()) {
+        mSurfaceTexture->detachFromContext();
+        mSurfaceTexture = 0;
+        mLayer->clearTexture();
+    }
+}
+
 } /* namespace uirenderer */
 } /* namespace android */
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index 5905b95..c838c32 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -81,6 +81,8 @@
         return mLayer;
     }
 
+    ANDROID_API void detachSurfaceTexture();
+
 private:
     // Generic properties
     uint32_t mWidth;
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index f90a26a..e1ee620 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -301,6 +301,17 @@
     mDrawFrameTask.removeLayerUpdate(layer);
 }
 
+CREATE_BRIDGE1(detachSurfaceTexture, DeferredLayerUpdater* layer) {
+    args->layer->detachSurfaceTexture();
+    return NULL;
+}
+
+void RenderProxy::detachSurfaceTexture(DeferredLayerUpdater* layer) {
+    SETUP_TASK(detachSurfaceTexture);
+    args->layer = layer;
+    postAndWait(task);
+}
+
 CREATE_BRIDGE2(flushCaches, CanvasContext* context, Caches::FlushMode flushMode) {
     args->context->flushCaches(args->flushMode);
     return NULL;
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index df0aff0..c7358e6 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -83,6 +83,7 @@
     ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
     ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
     ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
+    ANDROID_API void detachSurfaceTexture(DeferredLayerUpdater* layer);
 
     ANDROID_API void flushCaches(Caches::FlushMode flushMode);