OSDN Git Service

Expose View.executeHardwareAction()
authorRomain Guy <romainguy@google.com>
Thu, 26 Sep 2013 21:57:30 +0000 (14:57 -0700)
committerRomain Guy <romainguy@google.com>
Thu, 26 Sep 2013 22:01:01 +0000 (22:01 +0000)
Bug #10911502

Views creating hardware resources need a way to safely interact
with the hardware. This new method invokes HardwareRenderer.safelyRun()
which executes a Runnable after making sure the hardawre rendering
context is in a valid state.

With the OpenGL backend, executeHardwareAction() tries to call
eglMakeCurrent() if needed. This method is not guaranteed to
work.

Change-Id: I38ec65132eeba85605cffb1a6de12b7a0184e213

core/java/android/view/TextureView.java
core/java/android/view/View.java

index b2c9f8c..47f7628 100644 (file)
@@ -213,8 +213,8 @@ public class TextureView extends View {
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        if (mLayer != null && mAttachInfo != null && mAttachInfo.mHardwareRenderer != null) {
-            boolean success = mAttachInfo.mHardwareRenderer.safelyRun(new Runnable() {
+        if (mLayer != null) {
+            boolean success = executeHardwareAction(new Runnable() {
                 @Override
                 public void run() {
                     destroySurface();
index 4680e76..c67e036 100644 (file)
@@ -12368,6 +12368,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
         }
     }
 
+    /**
+     * 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.
+     *
+     * This method is not guaranteed to work. If the hardware renderer
+     * does not exist or cannot be put in a valid state, this method
+     * will not executed the specified action.
+     *
+     * The specified action is executed synchronously.
+     *
+     * @param action The action to execute after the renderer is in a valid state
+     *
+     * @return True if the specified Runnable was executed, false otherwise
+     *
+     * @hide
+     */
+    public boolean executeHardwareAction(Runnable action) {
+        //noinspection SimplifiableIfStatement
+        if (mAttachInfo != null && mAttachInfo.mHardwareRenderer != null) {
+            return mAttachInfo.mHardwareRenderer.safelyRun(action);
+        }
+        return false;
+    }
+
     void invalidateInheritedLayoutMode(int layoutModeOfRoot) {
     }