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