Merge change I32d41651 into eclair

* changes:
  Allow a GLThread to release and reacquire the EGL Surface as needed.
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index ac27a2d..0330163 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -971,33 +971,41 @@
              * accesses EGL.
              */
             try {
-                try {
-                    sGLThreadManager.start(this);
-                } catch (InterruptedException e) {
-                    return;
-                }
                 guardedRun();
             } catch (InterruptedException e) {
                 // fall thru and exit normally
             } finally {
-                try {
-                    sGLThreadManager.end(this);
-                } finally {
-                    synchronized(this) {
-                        if (LOG_THREADS) {
-                            Log.i("GLThread", "exiting tid=" +  getId());
-                        }
-                        mDone = true;
-                        notifyAll();
+                synchronized(this) {
+                    if (LOG_THREADS) {
+                        Log.i("GLThread", "exiting tid=" +  getId());
                     }
+                    mDone = true;
+                    notifyAll();
                 }
             }
         }
 
+        private void startEgl() throws InterruptedException {
+            if (! mHaveEgl) {
+                mHaveEgl = true;
+                sGLThreadManager.start(this);
+                mEglHelper.start();
+            }
+        }
+
+        private void stopEgl() {
+            if (mHaveEgl) {
+                mHaveEgl = false;
+                mEglHelper.destroySurface();
+                mEglHelper.finish();
+                sGLThreadManager.end(this);
+            }
+        }
+
         private void guardedRun() throws InterruptedException {
             mEglHelper = new EglHelper();
             try {
-                mEglHelper.start();
+                startEgl();
 
                 GL10 gl = null;
                 boolean tellRendererSurfaceCreated = true;
@@ -1021,20 +1029,30 @@
                             r.run();
                         }
                         if (mPaused) {
-                            mEglHelper.destroySurface();
-                            mEglHelper.finish();
+                            stopEgl();
                             needStart = true;
                         }
-                        while (needToWait()) {
-                            if (LOG_THREADS) {
-                                Log.i("GLThread", "needToWait tid=" + getId());
-                            }
+                        while(true) {
                             if (!mHasSurface) {
                                 if (!mWaitingForSurface) {
-                                    mEglHelper.destroySurface();
+                                    stopEgl();
                                     mWaitingForSurface = true;
                                     notifyAll();
                                 }
+                            } else {
+                                boolean shouldHaveEgl = sGLThreadManager.shouldHaveEgl(this);
+                                if (mHaveEgl && (!shouldHaveEgl)) {
+                                    stopEgl();
+                                } else if ((!mHaveEgl) && shouldHaveEgl) {
+                                    startEgl();
+                                    needStart = true;
+                                }
+                            }
+                            if (!needToWait()) {
+                                break;
+                            }
+                            if (LOG_THREADS) {
+                                Log.i("GLThread", "needToWait tid=" + getId());
                             }
                             wait();
                         }
@@ -1053,7 +1071,7 @@
                         }
                     }
                     if (needStart) {
-                        mEglHelper.start();
+                        startEgl();
                         tellRendererSurfaceCreated = true;
                         changed = true;
                     }
@@ -1084,21 +1102,16 @@
                 /*
                  * clean-up everything...
                  */
-                mEglHelper.destroySurface();
-                mEglHelper.finish();
+                stopEgl();
             }
         }
 
         private boolean needToWait() {
-            if (sGLThreadManager.shouldQuit(this)) {
-                mDone = true;
-                notifyAll();
-            }
             if (mDone) {
                 return false;
             }
 
-            if (mPaused || (! mHasSurface)) {
+            if (mPaused || (! mHasSurface) || (! mHaveEgl)) {
                 return true;
             }
 
@@ -1223,6 +1236,7 @@
         private boolean mPaused;
         private boolean mHasSurface;
         private boolean mWaitingForSurface;
+        private boolean mHaveEgl;
         private int mWidth;
         private int mHeight;
         private int mRenderMode;
@@ -1273,9 +1287,9 @@
     }
 
     static class GLThreadManager {
-        public boolean shouldQuit(GLThread thread) {
+        public boolean shouldHaveEgl(GLThread thread) {
             synchronized(this) {
-                return thread != mMostRecentGLThread;
+                return thread == mMostRecentGLThread || mMostRecentGLThread == null;
             }
         }
         public void start(GLThread thread) throws InterruptedException {