Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef654bdd authored by Romain Guy's avatar Romain Guy
Browse files

Draw the wallpaper chosen by the user

parent 50cb54ff
Loading
Loading
Loading
Loading
+49 −74
Original line number Diff line number Diff line
@@ -18,73 +18,68 @@ package com.android.internal.service.wallpaper;

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;
    WallpaperManager mWallpaperManager;
    ImageWallpaper.DrawableEngine mEngine;
    private WallpaperObserver mReceiver;

    static final int MSG_DRAW = 1;
    @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);
    }

    class MyEngine extends Engine {
        final Paint mTextPaint = new Paint();
        float mDensity;
        Drawable mBackground;
        long mAnimStartTime;
        boolean mAnimLarger;
    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

        final Handler mHandler = new Handler() {
    public Engine onCreateEngine() {
        mEngine = new DrawableEngine();
        return mEngine;
    }

            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_DRAW:
                        drawFrame(true);
                        mHandler.sendEmptyMessage(MSG_DRAW);
                        break;
                    default:
                        super.handleMessage(msg);
    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 @@ public class ImageWallpaper extends WallpaperService {
            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);
        void updateWallpaper() {
            synchronized (mLock) {
                mBackground = mWallpaperManager.getDrawable();
            }
        }
    
    public Engine onCreateEngine() {
        return new MyEngine();
    }
}