OSDN Git Service

Fix NPE, ANRs in Gallery
authorBobby Georgescu <georgescu@google.com>
Thu, 23 Aug 2012 21:35:18 +0000 (14:35 -0700)
committerBobby Georgescu <georgescu@google.com>
Thu, 23 Aug 2012 21:40:11 +0000 (14:40 -0700)
Bug: 7041482
Bug: 7041769
Change-Id: I06596bd9a058a8fe51c19108a0891c458950f22b

src/com/android/gallery3d/app/AlbumPage.java
src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java

index fe0e078..a391950 100644 (file)
@@ -233,25 +233,23 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
         }
     }
 
-    private PreparePageFadeoutTexture mPrepareFadeoutTask;
-
-    private void startPrepareFadeOutTexture() {
+    private void prepareFadeOutTexture() {
         GLRoot root = mActivity.getGLRoot();
-        mPrepareFadeoutTask = new PreparePageFadeoutTexture(
+        PreparePageFadeoutTexture task = new PreparePageFadeoutTexture(
                 mSlotView.getWidth(), mSlotView.getHeight() +
                 mActivity.getGalleryActionBar().getHeight(), mRootPane);
+        RawTexture texture = null;
         root.unlockRenderThread();
         try {
-            root.addOnGLIdleListener(mPrepareFadeoutTask);
+            root.addOnGLIdleListener(task);
+            texture = task.get();
         } finally {
             root.lockRenderThread();
         }
-    }
 
-    private void finishPrepareFadeOutTexture() {
-        mActivity.getTransitionStore().put(KEY_FADE_TEXTURE,
-                mPrepareFadeoutTask.get());
-        mPrepareFadeoutTask = null;
+        if (texture != null) {
+            mActivity.getTransitionStore().put(KEY_FADE_TEXTURE, texture);
+        }
     }
 
     private void onSingleTapUp(int slotIndex) {
@@ -266,9 +264,9 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
             // Show pressed-up animation for the single-tap.
             mAlbumView.setPressedIndex(slotIndex);
             mAlbumView.setPressedUp();
-            startPrepareFadeOutTexture();
             mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_PHOTO, slotIndex, 0),
                     FadeTexture.DURATION);
+            prepareFadeOutTexture();
         }
     }
 
@@ -282,7 +280,6 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
         } else {
             // Get into the PhotoPage.
             // mAlbumView.savePositions(PositionRepository.getInstance(mActivity));
-            finishPrepareFadeOutTexture();
             Bundle data = new Bundle();
             data.putInt(PhotoPage.KEY_INDEX_HINT, slotIndex);
             data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT,
index 250d17a..f2b306e 100644 (file)
@@ -8,6 +8,7 @@ public class PreparePageFadeoutTexture implements OnGLIdleListener {
     private static final long TIMEOUT = FadeTexture.DURATION;
     private RawTexture mTexture;
     private ConditionVariable mResultReady = new ConditionVariable(false);
+    private boolean mCancelled = false;
     private GLView mRootPane;
 
     public PreparePageFadeoutTexture(int w, int h,  GLView rootPane) {
@@ -16,18 +17,25 @@ public class PreparePageFadeoutTexture implements OnGLIdleListener {
     }
 
     public synchronized RawTexture get() {
-        if (mResultReady.block(TIMEOUT)) {
+        if (mCancelled) {
+            return null;
+        } else if (mResultReady.block(TIMEOUT)) {
             return mTexture;
         } else {
+            mCancelled = true;
             return null;
         }
     }
 
     @Override
     public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
-            canvas.beginRenderTarget(mTexture);
-            mRootPane.render(canvas);
-            canvas.endRenderTarget();
+            if(!mCancelled) {
+                canvas.beginRenderTarget(mTexture);
+                mRootPane.render(canvas);
+                canvas.endRenderTarget();
+            } else {
+                mTexture = null;
+            }
             mResultReady.open();
             return false;
     }