Home | History | Annotate | Download | only in noisefield
      1 package com.android.noisefield;
      2 
      3 import android.app.Service;
      4 import android.graphics.PixelFormat;
      5 import android.os.Bundle;
      6 import android.renderscript.RenderScript;
      7 import android.renderscript.RenderScriptGL;
      8 import android.service.wallpaper.WallpaperService;
      9 import android.service.wallpaper.WallpaperService.Engine;
     10 import android.util.DisplayMetrics;
     11 import android.view.SurfaceHolder;
     12 import android.view.WindowManager;
     13 import android.util.Log;
     14 import android.view.MotionEvent;
     15 
     16 public 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             if (mWallpaperRS != null) {
     99                 mWallpaperRS.onTouchEvent(ev);
    100             }
    101         }
    102 
    103         @Override
    104         public void onVisibilityChanged(boolean visible) {
    105             super.onVisibilityChanged(visible);
    106             if (mWallpaperRS != null) {
    107                 if (visible) {
    108                     mWallpaperRS.start();
    109                 } else {
    110                     mWallpaperRS.stop();
    111                 }
    112             }
    113         }
    114     }
    115 }
    116