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
17package com.android.wallpaper.holospiral;
18
19import android.content.Context;
20import android.graphics.PixelFormat;
21import android.renderscript.RSSurfaceView;
22import android.renderscript.RenderScript;
23import android.renderscript.RenderScriptGL;
24import android.view.MotionEvent;
25import android.view.Surface;
26import android.view.SurfaceHolder;
27
28public 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