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