Merge "Fix crash with OpenGL wallpaper Bug #5216751"
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 049a284..492f3c2 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -300,7 +300,9 @@
             }
 
             if (mIsHwAccelerated) {
-                drawWallpaperWithOpenGL(sh, availw, availh, xPixels, yPixels);
+                if (!drawWallpaperWithOpenGL(sh, availw, availh, xPixels, yPixels)) {
+                    drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
+                }
             } else {
                 drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
             }
@@ -367,8 +369,8 @@
             }
         }
 
-        private void drawWallpaperWithOpenGL(SurfaceHolder sh, int w, int h, int left, int top) {
-            initGL(sh);
+        private boolean drawWallpaperWithOpenGL(SurfaceHolder sh, int w, int h, int left, int top) {
+            if (!initGL(sh)) return false;
 
             final float right = left + mBackgroundWidth;
             final float bottom = top + mBackgroundHeight;
@@ -423,6 +425,8 @@
             checkEglError();
     
             finishGL();
+
+            return true;
         }
 
         private FloatBuffer createMesh(int left, int top, float right, float bottom) {
@@ -533,11 +537,12 @@
         }
     
         private void finishGL() {
-            mEgl.eglDestroyContext(mEglDisplay, mEglContext);
+            mEgl.eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
             mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
+            mEgl.eglDestroyContext(mEglDisplay, mEglContext);
         }
         
-        private void initGL(SurfaceHolder surfaceHolder) {
+        private boolean initGL(SurfaceHolder surfaceHolder) {
             mEgl = (EGL10) EGLContext.getEGL();
     
             mEglDisplay = mEgl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
@@ -565,7 +570,7 @@
                 int error = mEgl.eglGetError();
                 if (error == EGL_BAD_NATIVE_WINDOW) {
                     Log.e(GL_LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
-                    return;
+                    return false;
                 }
                 throw new RuntimeException("createWindowSurface failed " +
                         GLUtils.getEGLErrorString(error));
@@ -577,6 +582,8 @@
             }
     
             mGL = mEglContext.getGL();
+
+            return true;
         }