Merge change 20892

* changes:
  Revert "SurfaceFlinger will now allocate buffers based on the usage specified by the clients. This allows to allocate the right kind of buffer automatically, without having the user to specify anything."
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index cf26b1b..e1b8e99 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2947,6 +2947,11 @@
         public static final String DATA_MESSAGE_GET_APP_TOKEN_URL =
                 "data_messaging_get_app_token_url";
 
+	/**
+	 * Use android://<it> routing infos for Google Sync Server subcriptions.
+	 */
+	public static final String GSYNC_USE_RMQ2_ROUTING_INFO = "gsync_use_rmq2_routing_info";
+
         /**
          * Enable use of ssl session caching.
          * 'db' - save each session in a (per process) database
diff --git a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
index b9b07a8..6d50840 100644
--- a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
+++ b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
@@ -18,73 +18,68 @@
 
 import android.app.WallpaperManager;
 import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
 import android.service.wallpaper.WallpaperService;
 import android.view.SurfaceHolder;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
 
 /**
  * Default built-in wallpaper that simply shows a static image.
  */
 public class ImageWallpaper extends WallpaperService {
-    public WallpaperManager mWallpaperManager;
-    
-    static final int MSG_DRAW = 1;
-    
-    class MyEngine extends Engine {
-        final Paint mTextPaint = new Paint();
-        float mDensity;
-        Drawable mBackground;
-        long mAnimStartTime;
-        boolean mAnimLarger;
-        
-        final Handler mHandler = new Handler() {
+    WallpaperManager mWallpaperManager;
+    ImageWallpaper.DrawableEngine mEngine;
+    private WallpaperObserver mReceiver;
 
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_DRAW:
-                        drawFrame(true);
-                        mHandler.sendEmptyMessage(MSG_DRAW);
-                        break;
-                    default:
-                        super.handleMessage(msg);
-                }
-            }
-        };
-        
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mWallpaperManager = (WallpaperManager) getSystemService(WALLPAPER_SERVICE);
+        IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
+        mReceiver = new WallpaperObserver();
+        registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        unregisterReceiver(mReceiver);
+    }
+
+    public Engine onCreateEngine() {
+        mEngine = new DrawableEngine();
+        return mEngine;
+    }
+
+    class WallpaperObserver extends BroadcastReceiver {
+        public void onReceive(Context context, Intent intent) {
+            mEngine.updateWallpaper();
+        }
+    }
+
+    class DrawableEngine extends Engine {
+        private final Object mLock = new Object();
+        Drawable mBackground;
+
         @Override
         public void onCreate(SurfaceHolder surfaceHolder) {
             super.onCreate(surfaceHolder);
             mBackground = mWallpaperManager.getDrawable();
-            mTextPaint.setAntiAlias(true);
-            mDensity = getResources().getDisplayMetrics().density;
-            mTextPaint.setTextSize(30 * mDensity);
-            mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity, 0xff000000);
-            mTextPaint.setARGB(255, 255, 255, 255);
-            mTextPaint.setTextAlign(Paint.Align.CENTER);
         }
 
         @Override
         public void onVisibilityChanged(boolean visible) {
-            mHandler.removeMessages(MSG_DRAW);
-            if (visible) {
-                mHandler.sendEmptyMessage(MSG_DRAW);
-                mAnimStartTime = SystemClock.uptimeMillis();
-                mAnimLarger = true;
-            } else {
-                drawFrame(false);
-            }
+            drawFrame();
         }
         
         @Override
         public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
             super.onSurfaceChanged(holder, format, width, height);
-            drawFrame(false);
+            drawFrame();
         }
 
         @Override
@@ -97,48 +92,28 @@
             super.onSurfaceDestroyed(holder);
         }
         
-        void drawFrame(boolean drawText) {
+        void drawFrame() {
             SurfaceHolder sh = getSurfaceHolder();
             Canvas c = null;
             try {
                 c = sh.lockCanvas();
                 if (c != null) {
                     final Rect frame = sh.getSurfaceFrame();
-                    mBackground.setBounds(frame);
-                    mBackground.draw(c);
-                    
-                    if (drawText) {
-                        // Figure out animation.
-                        long now = SystemClock.uptimeMillis();
-                        while (mAnimStartTime < (now-1000)) {
-                            mAnimStartTime += 1000;
-                            mAnimLarger = !mAnimLarger;
-                        }
-                        float size = (now-mAnimStartTime) / (float)1000;
-                        if (!mAnimLarger) size = 1-size;
-                        int alpha = (int)(255*(size*size));
-                        mTextPaint.setARGB(alpha, 255, 255, 255);
-                        mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity,
-                                alpha<<24);
-                        mTextPaint.setTextSize(100 * mDensity * size);
-                        c.drawText("Am I live?",
-                                frame.left + (frame.right-frame.left)/2,
-                                frame.top + (frame.bottom-frame.top)/2, mTextPaint);
+                    synchronized (mLock) {
+                        final Drawable background = mBackground;
+                        background.setBounds(frame);
+                        background.draw(c);
                     }
                 }
             } finally {
                 if (c != null) sh.unlockCanvasAndPost(c);
             }
         }
-    }
-    
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        mWallpaperManager = (WallpaperManager)getSystemService(WALLPAPER_SERVICE);
-    }
-    
-    public Engine onCreateEngine() {
-        return new MyEngine();
+
+        void updateWallpaper() {
+            synchronized (mLock) {
+                mBackground = mWallpaperManager.getDrawable();
+            }
+        }
     }
 }
diff --git a/opengl/tests/filter/filter.cpp b/opengl/tests/filter/filter.cpp
index 82aafbf..739bf7c 100644
--- a/opengl/tests/filter/filter.cpp
+++ b/opengl/tests/filter/filter.cpp
@@ -10,6 +10,8 @@
 
 using namespace android;
 
+#define USE_DRAW_TEXTURE 1
+
 int main(int argc, char** argv)
 {
     if (argc!=2 && argc!=3) {
@@ -45,9 +47,9 @@
      dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
      eglInitialize(dpy, &majorVersion, &minorVersion);
      if (!usePbuffer) {
-         surface = eglCreateWindowSurface(dpy, config, window, NULL);
          EGLUtils::selectConfigForNativeWindow(
                  dpy, s_configAttribs, window, &config);
+         surface = eglCreateWindowSurface(dpy, config, window, NULL);
      } else {
          printf("using pbuffer\n");
          eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs);
@@ -63,6 +65,12 @@
      eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
      GLint dim = w<h ? w : h;
 
+     glViewport(0, 0, w, h);
+     glMatrixMode(GL_PROJECTION);
+     glLoadIdentity();
+     glOrthof(0, w, 0, h, 0, 1);
+
+     glClearColor(0,0,0,0);
      glClear(GL_COLOR_BUFFER_BIT);
 
      GLint crop[4] = { 0, 4, 4, -4 };
@@ -128,14 +136,52 @@
          break;
      }
 
-     glDrawTexiOES(0, 0, 0, dim, dim);
+     //glDrawTexiOES(0, 0, 0, dim, dim);
+     
+     const GLfloat vertices[4][2] = {
+             { 0,    0   },
+             { 0,    dim },
+             { dim,  dim },
+             { dim,  0   }
+     };
 
+     const GLfloat texCoords[4][2] = {
+             { 0,  0 },
+             { 0,  1 },
+             { 1,  1 },
+             { 1,  0 }
+     };
+     
      if (!usePbuffer) {
          eglSwapBuffers(dpy, surface);
-     } else {
-         glFinish();
      }
      
+     glMatrixMode(GL_MODELVIEW);
+     //glEnable(GL_SCISSOR_TEST);
+     //glScissor(0,dim,dim,h-dim);
+     
+     for (int y=0 ; y<dim ; y++) {
+         glClear(GL_COLOR_BUFFER_BIT);
+
+#if USE_DRAW_TEXTURE && GL_OES_draw_texture
+         glDrawTexiOES(0, y, 1, dim, dim);
+#else
+         glLoadIdentity();
+         glTranslatef(0, y, 0);
+         glEnableClientState(GL_VERTEX_ARRAY);
+         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+         glVertexPointer(2, GL_FLOAT, 0, vertices);
+         glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+#endif
+
+         if (!usePbuffer) {
+             eglSwapBuffers(dpy, surface);
+         } else {
+             glFinish();
+         }
+     }
+
      eglTerminate(dpy);
      return 0;
 }