176d6ea97b0d3e64787398a179e015443dde9c024Winson Chungpackage com.android.noisefield;
276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
376d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.app.Service;
476d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.graphics.PixelFormat;
576d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.os.Bundle;
676d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.renderscript.RenderScript;
776d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.renderscript.RenderScriptGL;
876d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.service.wallpaper.WallpaperService;
976d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.service.wallpaper.WallpaperService.Engine;
1076d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.util.DisplayMetrics;
1176d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.view.SurfaceHolder;
1276d6ea97b0d3e64787398a179e015443dde9c024Winson Chungimport android.view.WindowManager;
134f6e266df7b4384c43deeac4643a79dcf1063636Leon Hongimport android.util.Log;
144f6e266df7b4384c43deeac4643a79dcf1063636Leon Hongimport android.view.MotionEvent;
1576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
1676d6ea97b0d3e64787398a179e015443dde9c024Winson Chungpublic class NoiseFieldWallpaper extends WallpaperService {
1776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
1876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung    @Override
1976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung    public Engine onCreateEngine() {
2076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        return new RenderScriptEngine();
2176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung    }
2276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
2376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung    private class RenderScriptEngine extends Engine {
2476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        private RenderScriptGL mRenderScript = null;
2576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        private NoiseFieldRS mWallpaperRS = null;
264f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong        private int mDensityDPI;
2776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
2876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
2976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void onCreate(SurfaceHolder surfaceHolder) {
3076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onCreate(surfaceHolder);
3176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            setTouchEventsEnabled(true);
3276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            surfaceHolder.setSizeFromLayout();
3333113fcccefc422f984b6fbb89293c23d7d33a27Leon Hong            surfaceHolder.setFormat(PixelFormat.RGB_888);
3476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
3576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            DisplayMetrics metrics = new DisplayMetrics();
3676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            ((WindowManager) getApplication().getSystemService(Service.WINDOW_SERVICE))
3776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                    .getDefaultDisplay().getMetrics(metrics);
384f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong            mDensityDPI = metrics.densityDpi;
3976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
4076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
4176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
4276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void onDestroy() {
4376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onDestroy();
4476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            destroyRenderer();
4576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
4676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
4776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void destroyRenderer() {
4876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            if (mWallpaperRS != null) {
4976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mWallpaperRS.stop();
5076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mWallpaperRS = null;
5176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            }
5276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
5376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            if (mRenderScript != null) {
5476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mRenderScript.setSurface(null, 0, 0);
5576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mRenderScript.destroy();
5676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mRenderScript = null;
5776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            }
5876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
5976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
6076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
6176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void onSurfaceCreated(SurfaceHolder surfaceHolder) {
6276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onSurfaceCreated(surfaceHolder);
6376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
6476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
6576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            mRenderScript = new RenderScriptGL(NoiseFieldWallpaper.this, sc);
6676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            mRenderScript.setPriority(RenderScript.Priority.LOW);
6776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
6876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
6976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
7076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void onSurfaceDestroyed(SurfaceHolder surfaceHolder) {
7176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onSurfaceDestroyed(surfaceHolder);
7276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            destroyRenderer();
7376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
7476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
7576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
764f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong        public void onSurfaceChanged(SurfaceHolder surfaceHolder,
774f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong                                     int format,
784f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong                                     int width,
794f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong                                     int height) {
8076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onSurfaceChanged(surfaceHolder, format, width, height);
8176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
8276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            if (mRenderScript != null) {
8376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mRenderScript.setSurface(surfaceHolder, width, height);
8476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            }
8576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
8676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            if (mWallpaperRS == null) {
8776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mWallpaperRS = new NoiseFieldRS();
884f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong                mWallpaperRS.init(mDensityDPI, mRenderScript, getResources(), width, height);
8976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                mWallpaperRS.start();
9076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            }
9176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
9276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            mWallpaperRS.resize(width, height);
9376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
9476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
9576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
964f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong        public void onTouchEvent(MotionEvent ev) {
974f6e266df7b4384c43deeac4643a79dcf1063636Leon Hong            super.onTouchEvent(ev);
984cd1e13e3f6af7ab2c2ff3d5953d7e3677e2f0b1Winson Chung            if (mWallpaperRS != null) {
994cd1e13e3f6af7ab2c2ff3d5953d7e3677e2f0b1Winson Chung                mWallpaperRS.onTouchEvent(ev);
1004cd1e13e3f6af7ab2c2ff3d5953d7e3677e2f0b1Winson Chung            }
10176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
10276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung
10376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        @Override
10476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        public void onVisibilityChanged(boolean visible) {
10576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            super.onVisibilityChanged(visible);
10676d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            if (mWallpaperRS != null) {
10776d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                if (visible) {
10876d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                    mWallpaperRS.start();
10976d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                } else {
11076d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                    mWallpaperRS.stop();
11176d6ea97b0d3e64787398a179e015443dde9c024Winson Chung                }
11276d6ea97b0d3e64787398a179e015443dde9c024Winson Chung            }
11376d6ea97b0d3e64787398a179e015443dde9c024Winson Chung        }
11476d6ea97b0d3e64787398a179e015443dde9c024Winson Chung    }
11576d6ea97b0d3e64787398a179e015443dde9c024Winson Chung}
116