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