package com.android.gallery3d.ui; import android.os.ConditionVariable; import com.android.gallery3d.app.AbstractGalleryActivity; import com.android.gallery3d.ui.GLRoot.OnGLIdleListener; public class PreparePageFadeoutTexture implements OnGLIdleListener { private static final long TIMEOUT = 500; public static final String KEY_FADE_TEXTURE = "fade_texture"; private RawTexture mTexture; private ConditionVariable mResultReady = new ConditionVariable(false); private boolean mCancelled = false; private GLView mRootPane; public PreparePageFadeoutTexture(GLView rootPane) { mTexture = new RawTexture(rootPane.getWidth(), rootPane.getHeight(), true); mRootPane = rootPane; } public synchronized RawTexture get() { if (mCancelled) { return null; } else if (mResultReady.block(TIMEOUT)) { return mTexture; } else { mCancelled = true; return null; } } @Override public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { if(!mCancelled) { canvas.beginRenderTarget(mTexture); mRootPane.render(canvas); canvas.endRenderTarget(); } else { mTexture = null; } mResultReady.open(); return false; } public static boolean prepareFadeOutTexture(AbstractGalleryActivity activity, GLView rootPane) { if (rootPane.getWidth() == 0 || rootPane.getHeight() == 0) { // The view hasn't been measured yet, just abort the animation return false; } GLRoot root = activity.getGLRoot(); PreparePageFadeoutTexture task = new PreparePageFadeoutTexture(rootPane); RawTexture texture = null; root.unlockRenderThread(); try { root.addOnGLIdleListener(task); texture = task.get(); } finally { root.lockRenderThread(); } if (texture == null) { return false; } activity.getTransitionStore().put(KEY_FADE_TEXTURE, texture); return true; } }