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