1package com.android.noisefield;
2
3import android.app.Service;
4import android.graphics.PixelFormat;
5import android.os.Bundle;
6import android.renderscript.RenderScript;
7import android.renderscript.RenderScriptGL;
8import android.service.wallpaper.WallpaperService;
9import android.service.wallpaper.WallpaperService.Engine;
10import android.util.DisplayMetrics;
11import android.view.SurfaceHolder;
12import android.view.WindowManager;
13import android.util.Log;
14import android.view.MotionEvent;
15
16public class NoiseFieldWallpaper extends WallpaperService {
17
18    @Override
19    public Engine onCreateEngine() {
20        return new RenderScriptEngine();
21    }
22
23    private class RenderScriptEngine extends Engine {
24        private RenderScriptGL mRenderScript = null;
25        private NoiseFieldRS mWallpaperRS = null;
26        private int mDensityDPI;
27
28        @Override
29        public void onCreate(SurfaceHolder surfaceHolder) {
30            super.onCreate(surfaceHolder);
31            setTouchEventsEnabled(true);
32            surfaceHolder.setSizeFromLayout();
33            surfaceHolder.setFormat(PixelFormat.RGB_888);
34
35            DisplayMetrics metrics = new DisplayMetrics();
36            ((WindowManager) getApplication().getSystemService(Service.WINDOW_SERVICE))
37                    .getDefaultDisplay().getMetrics(metrics);
38            mDensityDPI = metrics.densityDpi;
39        }
40
41        @Override
42        public void onDestroy() {
43            super.onDestroy();
44            destroyRenderer();
45        }
46
47        public void destroyRenderer() {
48            if (mWallpaperRS != null) {
49                mWallpaperRS.stop();
50                mWallpaperRS = null;
51            }
52
53            if (mRenderScript != null) {
54                mRenderScript.setSurface(null, 0, 0);
55                mRenderScript.destroy();
56                mRenderScript = null;
57            }
58        }
59
60        @Override
61        public void onSurfaceCreated(SurfaceHolder surfaceHolder) {
62            super.onSurfaceCreated(surfaceHolder);
63
64            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
65            mRenderScript = new RenderScriptGL(NoiseFieldWallpaper.this, sc);
66            mRenderScript.setPriority(RenderScript.Priority.LOW);
67        }
68
69        @Override
70        public void onSurfaceDestroyed(SurfaceHolder surfaceHolder) {
71            super.onSurfaceDestroyed(surfaceHolder);
72            destroyRenderer();
73        }
74
75        @Override
76        public void onSurfaceChanged(SurfaceHolder surfaceHolder,
77                                     int format,
78                                     int width,
79                                     int height) {
80            super.onSurfaceChanged(surfaceHolder, format, width, height);
81
82            if (mRenderScript != null) {
83                mRenderScript.setSurface(surfaceHolder, width, height);
84            }
85
86            if (mWallpaperRS == null) {
87                mWallpaperRS = new NoiseFieldRS();
88                mWallpaperRS.init(mDensityDPI, mRenderScript, getResources(), width, height);
89                mWallpaperRS.start();
90            }
91
92            mWallpaperRS.resize(width, height);
93        }
94
95        @Override
96        public void onTouchEvent(MotionEvent ev) {
97            super.onTouchEvent(ev);
98            mWallpaperRS.onTouchEvent(ev);
99        }
100
101        @Override
102        public void onVisibilityChanged(boolean visible) {
103            super.onVisibilityChanged(visible);
104            if (mWallpaperRS != null) {
105                if (visible) {
106                    mWallpaperRS.start();
107                } else {
108                    mWallpaperRS.stop();
109                }
110            }
111        }
112    }
113}
114