Home | History | Annotate | Download | only in holospiral
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.wallpaper.holospiral;
     18 
     19 import android.content.Context;
     20 import android.graphics.PixelFormat;
     21 import android.renderscript.RSSurfaceView;
     22 import android.renderscript.RenderScript;
     23 import android.renderscript.RenderScriptGL;
     24 import android.view.MotionEvent;
     25 import android.view.Surface;
     26 import android.view.SurfaceHolder;
     27 
     28 public class HoloSpiralView extends RSSurfaceView {
     29     private static final String LOG_TAG = "HoloRSView";
     30     private boolean mDragging = false;
     31     private float mStartX = 0;
     32     private float mCurrentPosition = 0;
     33     private float mWallpaperWidth = 0;
     34 
     35     public HoloSpiralView(Context context) {
     36         super(context);
     37     }
     38 
     39     private RenderScriptGL mRenderScript = null;
     40     private HoloSpiralRS mWallpaperRS = null;
     41 
     42     public void destroyRenderer() {
     43         if (mWallpaperRS != null) {
     44             mWallpaperRS.stop();
     45             mWallpaperRS = null;
     46         }
     47 
     48         if (mRenderScript != null) {
     49             mRenderScript.setSurface(null, 0, 0);
     50             mRenderScript = null;
     51             destroyRenderScriptGL();
     52         }
     53     }
     54 
     55     @Override
     56     public void surfaceCreated(SurfaceHolder surfaceHolder) {
     57         super.surfaceCreated(surfaceHolder);
     58 
     59         Surface surface = null;
     60         while (surface == null) {
     61             surface = surfaceHolder.getSurface();
     62         }
     63         RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
     64         mRenderScript = createRenderScriptGL(sc);
     65         mRenderScript.setPriority(RenderScript.Priority.LOW);
     66 
     67         surfaceHolder.setSizeFromLayout();
     68         surfaceHolder.setFormat(PixelFormat.RGBA_8888);
     69     }
     70 
     71     @Override
     72     public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
     73         super.surfaceDestroyed(surfaceHolder);
     74         destroyRenderer();
     75     }
     76 
     77     @Override
     78     public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
     79         super.surfaceChanged(surfaceHolder, format, width, height);
     80         if (mRenderScript != null) {
     81             mRenderScript.setSurface(surfaceHolder, width, height);
     82         }
     83 
     84         if (mWallpaperRS == null) {
     85             mWallpaperRS = new HoloSpiralRS(mRenderScript, getResources());
     86             mWallpaperRS.start();
     87         }
     88 
     89         mWallpaperRS.resize(width, height);
     90         mWallpaperWidth = width;
     91     }
     92 
     93     public void onResume() {
     94         resume();
     95         if (mWallpaperRS != null) {
     96             mWallpaperRS.start();
     97         }
     98     }
     99 
    100     public void onPause() {
    101         pause();
    102         if (mWallpaperRS != null) {
    103             mWallpaperRS.stop();
    104         }
    105     }
    106 
    107     @Override
    108     protected void onDetachedFromWindow() {
    109         super.onDetachedFromWindow();
    110         destroyRenderer();
    111     }
    112 
    113     @Override
    114     public boolean onTouchEvent(MotionEvent event) {
    115         if (event.getActionIndex() == 0) {
    116             float realPosition = mCurrentPosition + (event.getX() - mStartX);
    117             if (realPosition < 0.0f) {
    118                 realPosition = 0.0f;
    119             } else if (realPosition > mWallpaperWidth * 4) {
    120                 realPosition = mWallpaperWidth * 4;
    121             }
    122 
    123             if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
    124                 mDragging = true;
    125                 mStartX = event.getX(0);
    126             } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {
    127                 mDragging = false;
    128                 mCurrentPosition = realPosition;
    129             } else if (mDragging) {
    130                 float ratio = realPosition / (mWallpaperWidth * 4);
    131                 mWallpaperRS.setOffset(ratio, 0, 0, 0);
    132             }
    133             return true;
    134         }
    135         return false;
    136     }
    137 }
    138