126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski/* 226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Copyright (C) 2010 The Android Open Source Project 326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * 426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * you may not use this file except in compliance with the License. 626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * You may obtain a copy of the License at 726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * 826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * 1026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * See the License for the specific language governing permissions and 1426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski * limitations under the License. 1526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski */ 1626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 1726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskipackage com.android.wallpaper.holospiral; 1826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 1926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.content.Context; 2026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.graphics.PixelFormat; 2126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.RSSurfaceView; 2226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.RenderScript; 2326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.renderscript.RenderScriptGL; 2426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.view.MotionEvent; 2526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.view.Surface; 2626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskiimport android.view.SurfaceHolder; 2726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 2826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinskipublic class HoloSpiralView extends RSSurfaceView { 2926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private static final String LOG_TAG = "HoloRSView"; 3026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private boolean mDragging = false; 3126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private float mStartX = 0; 3226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private float mCurrentPosition = 0; 3326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private float mWallpaperWidth = 0; 3426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 3526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public HoloSpiralView(Context context) { 3626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski super(context); 3726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 3826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 3926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private RenderScriptGL mRenderScript = null; 4026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski private HoloSpiralRS mWallpaperRS = null; 4126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 4226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void destroyRenderer() { 4326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mWallpaperRS != null) { 4426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.stop(); 4526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS = null; 4626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 4726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 4826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mRenderScript != null) { 49213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams mRenderScript.setSurface(null, 0, 0); 5026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mRenderScript = null; 51213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams destroyRenderScriptGL(); 5226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 5326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 5426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 5526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski @Override 5626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void surfaceCreated(SurfaceHolder surfaceHolder) { 5726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski super.surfaceCreated(surfaceHolder); 5826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 5926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski Surface surface = null; 6026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski while (surface == null) { 6126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski surface = surfaceHolder.getSurface(); 6226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 6326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 64213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams mRenderScript = createRenderScriptGL(sc); 65213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams mRenderScript.setPriority(RenderScript.Priority.LOW); 6626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 6726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski surfaceHolder.setSizeFromLayout(); 6826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski surfaceHolder.setFormat(PixelFormat.RGBA_8888); 6926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 7026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 7126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski @Override 7226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 7326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski super.surfaceDestroyed(surfaceHolder); 7426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski destroyRenderer(); 7526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 7626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 7726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski @Override 7826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 7926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski super.surfaceChanged(surfaceHolder, format, width, height); 8026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mRenderScript != null) { 81213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams mRenderScript.setSurface(surfaceHolder, width, height); 8226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 8326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 8426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mWallpaperRS == null) { 8526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS = new HoloSpiralRS(mRenderScript, getResources()); 8626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.start(); 8726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 8826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 8926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.resize(width, height); 9026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperWidth = width; 9126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 9226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 9326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void onResume() { 94213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams resume(); 9526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mWallpaperRS != null) { 9626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.start(); 9726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 9826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 9926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 10026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public void onPause() { 101213cc60e83d3d34e09b5907d8ded0a15892993f1Jason Sams pause(); 10226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (mWallpaperRS != null) { 10326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.stop(); 10426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 10526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 10626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 10726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski @Override 10826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski protected void onDetachedFromWindow() { 10926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski super.onDetachedFromWindow(); 11026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski destroyRenderer(); 11126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 11226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 11326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski @Override 11426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski public boolean onTouchEvent(MotionEvent event) { 11526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (event.getActionIndex() == 0) { 11626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski float realPosition = mCurrentPosition + (event.getX() - mStartX); 11726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (realPosition < 0.0f) { 11826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski realPosition = 0.0f; 11926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } else if (realPosition > mWallpaperWidth * 4) { 12026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski realPosition = mWallpaperWidth * 4; 12126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 12226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski 12326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 12426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mDragging = true; 12526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mStartX = event.getX(0); 12626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } else if (event.getActionMasked() == MotionEvent.ACTION_UP) { 12726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mDragging = false; 12826122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mCurrentPosition = realPosition; 12926122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } else if (mDragging) { 13026122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski float ratio = realPosition / (mWallpaperWidth * 4); 13126122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski mWallpaperRS.setOffset(ratio, 0, 0, 0); 13226122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 13326122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski return true; 13426122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 13526122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski return false; 13626122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski } 13726122dc2e3971577fd8bbcfbac2140d73b817377Adam Lesinski} 138