From cd05ff0772df2c87b29180f0f8a90842c6ac8e52 Mon Sep 17 00:00:00 2001 From: Bobby Georgescu Date: Thu, 23 Aug 2012 14:35:18 -0700 Subject: [PATCH] Fix NPE, ANRs in Gallery Bug: 7041482 Bug: 7041769 Change-Id: I06596bd9a058a8fe51c19108a0891c458950f22b --- src/com/android/gallery3d/app/AlbumPage.java | 21 +++++++++------------ .../gallery3d/ui/PreparePageFadeoutTexture.java | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/com/android/gallery3d/app/AlbumPage.java b/src/com/android/gallery3d/app/AlbumPage.java index fe0e07836..a39195007 100644 --- a/src/com/android/gallery3d/app/AlbumPage.java +++ b/src/com/android/gallery3d/app/AlbumPage.java @@ -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, diff --git a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java index 250d17a2b..f2b306ef5 100644 --- a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java +++ b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java @@ -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; } -- 2.11.0