1f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescupackage com.android.gallery3d.ui;
2f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
3c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescuimport android.os.ConditionVariable;
4c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescu
551bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.app.AbstractGalleryActivity;
6a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas;
7a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.RawTexture;
8f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
9f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
10f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescupublic class PreparePageFadeoutTexture implements OnGLIdleListener {
114831c7494373c360062a7becac820eba3bc39287Bobby Georgescu    private static final long TIMEOUT = 200;
1251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu    public static final String KEY_FADE_TEXTURE = "fade_texture";
1351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu
14f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mTexture;
15c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescu    private ConditionVariable mResultReady = new ConditionVariable(false);
164e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu    private boolean mCancelled = false;
17f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private GLView mRootPane;
18f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
197077701c8b11f6022cc712f5450e0f7b29535e41Bobby Georgescu    public PreparePageFadeoutTexture(GLView rootPane) {
20e5c6c9b09881478b4649b284656eee53d7c7e90dBobby Georgescu        if (rootPane == null) {
21e5c6c9b09881478b4649b284656eee53d7c7e90dBobby Georgescu            mCancelled = true;
22e5c6c9b09881478b4649b284656eee53d7c7e90dBobby Georgescu            return;
23e5c6c9b09881478b4649b284656eee53d7c7e90dBobby Georgescu        }
244831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        int w = rootPane.getWidth();
254831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        int h = rootPane.getHeight();
264831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        if (w == 0 || h == 0) {
274831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            mCancelled = true;
284831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            return;
294831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        }
304831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        mTexture = new RawTexture(w, h, true);
31f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        mRootPane =  rootPane;
32f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
33f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
344831c7494373c360062a7becac820eba3bc39287Bobby Georgescu    public boolean isCancelled() {
354831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        return mCancelled;
364831c7494373c360062a7becac820eba3bc39287Bobby Georgescu    }
374831c7494373c360062a7becac820eba3bc39287Bobby Georgescu
38f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    public synchronized RawTexture get() {
394e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu        if (mCancelled) {
404e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu            return null;
414e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu        } else if (mResultReady.block(TIMEOUT)) {
42c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescu            return mTexture;
43c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescu        } else {
444e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu            mCancelled = true;
45c760a5c49774c90b97ae818c6ee4e14825361b4bBobby Georgescu            return null;
46f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
47f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
48f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
49f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    @Override
50f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
514831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        if (!mCancelled) {
524831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            try {
534e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu                canvas.beginRenderTarget(mTexture);
544e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu                mRootPane.render(canvas);
554e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu                canvas.endRenderTarget();
564831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            } catch (RuntimeException e) {
574e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu                mTexture = null;
584e88a8c2a2addfadb05ca9699f505a3f348f3692Bobby Georgescu            }
594831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        } else {
604831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            mTexture = null;
614831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        }
624831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        mResultReady.open();
634831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        return false;
64f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
6551bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu
664831c7494373c360062a7becac820eba3bc39287Bobby Georgescu    public static void prepareFadeOutTexture(AbstractGalleryActivity activity,
677077701c8b11f6022cc712f5450e0f7b29535e41Bobby Georgescu            GLView rootPane) {
687077701c8b11f6022cc712f5450e0f7b29535e41Bobby Georgescu        PreparePageFadeoutTexture task = new PreparePageFadeoutTexture(rootPane);
694831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        if (task.isCancelled()) return;
704831c7494373c360062a7becac820eba3bc39287Bobby Georgescu        GLRoot root = activity.getGLRoot();
7151bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        RawTexture texture = null;
7251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        root.unlockRenderThread();
7351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        try {
7451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu            root.addOnGLIdleListener(task);
7551bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu            texture = task.get();
7651bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        } finally {
7751bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu            root.lockRenderThread();
7851bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        }
7951bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu
8057731ee210c22382d33f6f562f9e7e66fce651deJohn Reck        if (texture == null) {
814831c7494373c360062a7becac820eba3bc39287Bobby Georgescu            return;
8251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        }
8357731ee210c22382d33f6f562f9e7e66fce651deJohn Reck        activity.getTransitionStore().put(KEY_FADE_TEXTURE, texture);
8451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu    }
85f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu}
86