Draw the wallpaper chosen by the user
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();
+            }
+        }
     }
 }