1 package com.android.gallery3d.ui; 2 3 import android.os.ConditionVariable; 4 5 import com.android.gallery3d.app.AbstractGalleryActivity; 6 import com.android.gallery3d.glrenderer.GLCanvas; 7 import com.android.gallery3d.glrenderer.RawTexture; 8 import com.android.gallery3d.ui.GLRoot.OnGLIdleListener; 9 10 public class PreparePageFadeoutTexture implements OnGLIdleListener { 11 private static final long TIMEOUT = 200; 12 public static final String KEY_FADE_TEXTURE = "fade_texture"; 13 14 private RawTexture mTexture; 15 private ConditionVariable mResultReady = new ConditionVariable(false); 16 private boolean mCancelled = false; 17 private GLView mRootPane; 18 PreparePageFadeoutTexture(GLView rootPane)19 public PreparePageFadeoutTexture(GLView rootPane) { 20 if (rootPane == null) { 21 mCancelled = true; 22 return; 23 } 24 int w = rootPane.getWidth(); 25 int h = rootPane.getHeight(); 26 if (w == 0 || h == 0) { 27 mCancelled = true; 28 return; 29 } 30 mTexture = new RawTexture(w, h, true); 31 mRootPane = rootPane; 32 } 33 isCancelled()34 public boolean isCancelled() { 35 return mCancelled; 36 } 37 get()38 public synchronized RawTexture get() { 39 if (mCancelled) { 40 return null; 41 } else if (mResultReady.block(TIMEOUT)) { 42 return mTexture; 43 } else { 44 mCancelled = true; 45 return null; 46 } 47 } 48 49 @Override onGLIdle(GLCanvas canvas, boolean renderRequested)50 public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 51 if (!mCancelled) { 52 try { 53 canvas.beginRenderTarget(mTexture); 54 mRootPane.render(canvas); 55 canvas.endRenderTarget(); 56 } catch (RuntimeException e) { 57 mTexture = null; 58 } 59 } else { 60 mTexture = null; 61 } 62 mResultReady.open(); 63 return false; 64 } 65 prepareFadeOutTexture(AbstractGalleryActivity activity, GLView rootPane)66 public static void prepareFadeOutTexture(AbstractGalleryActivity activity, 67 GLView rootPane) { 68 PreparePageFadeoutTexture task = new PreparePageFadeoutTexture(rootPane); 69 if (task.isCancelled()) return; 70 GLRoot root = activity.getGLRoot(); 71 RawTexture texture = null; 72 root.unlockRenderThread(); 73 try { 74 root.addOnGLIdleListener(task); 75 texture = task.get(); 76 } finally { 77 root.lockRenderThread(); 78 } 79 80 if (texture == null) { 81 return; 82 } 83 activity.getTransitionStore().put(KEY_FADE_TEXTURE, texture); 84 } 85 } 86