RenderScriptWallpaper.java revision 1cac273ca3dc02971458785fe4d6d27cfa3f613e
1423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen/*
2423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Copyright (C) 2009 The Android Open Source Project
3423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
4423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
5423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * you may not use this file except in compliance with the License.
6423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * You may obtain a copy of the License at
7423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
8423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
9423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen *
10423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Unless required by applicable law or agreed to in writing, software
11423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
12423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * See the License for the specific language governing permissions and
14423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * limitations under the License.
15423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen */
16423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
17423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
18423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpackage com.android.magicsmoke;
19423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
20423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.WallpaperService;
211cac273ca3dc02971458785fe4d6d27cfa3f613eJason Samsimport android.renderscript.RenderScriptGL;
22423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.RenderScript;
23423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.util.Log;
24423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.MotionEvent;
25423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.SurfaceHolder;
26423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.Surface;
27423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
28423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
29423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public Engine onCreateEngine() {
30423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        return new RenderScriptEngine();
31423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
32423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
33423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    protected abstract T createScene(int width, int height);
34423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
35423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private class RenderScriptEngine extends Engine {
361cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams        private RenderScriptGL mRs;
37423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        private T mRenderer;
38423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
39423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
40423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onCreate(SurfaceHolder surfaceHolder) {
41423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onCreate(surfaceHolder);
42423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            setTouchEventsEnabled(true);
43423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            surfaceHolder.setSizeFromLayout();
44423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
45423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
46423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
47423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onDestroy() {
48423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onDestroy();
49423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            destroyRenderer();
50423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
51423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
52423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        private void destroyRenderer() {
53423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer != null) {
54423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.stop();
55423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer = null;
56423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
57423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRs != null) {
58423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRs.destroy();
59423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRs = null;
601cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams            }
61423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
62423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
63423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
64423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onVisibilityChanged(boolean visible) {
65423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onVisibilityChanged(visible);
66423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer != null) {
67423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                if (visible) {
681cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams                    mRenderer.start();
69423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                } else {
70423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                    mRenderer.stop();
71423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                }
72423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
73423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
74423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
75423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
76423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
77423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceChanged(holder, format, width, height);
789c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams            if (mRs != null) {
799c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams                mRs.contextSetSurface(width, height, holder.getSurface());
809c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams            }
81423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer == null) {
82423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer = createScene(width, height);
83423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.init(mRs, getResources(), isPreview());
84423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.start();
85423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            } else {
86423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.resize(width, height);
87423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
88423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
89423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
90423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
91423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onTouchEvent(MotionEvent event) {
92423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mRenderer.onTouchEvent(event);
93423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
941cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams
95423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
96423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onOffsetsChanged(float xOffset, float yOffset,
97423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
98423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels);
99423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
100423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
101423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
102423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceCreated(SurfaceHolder holder) {
103423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceCreated(holder);
104423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
105423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            Surface surface = null;
106423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            while (surface == null) {
107423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                surface = holder.getSurface();
108423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
1091cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams            mRs = new RenderScriptGL(false, false);
110db27a7c47541365f87d128f748463dd176d53d3eMarco Nelissen            mRs.contextSetPriority(RenderScript.Priority.LOW);
111423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
112423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
113423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
114423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceDestroyed(SurfaceHolder holder) {
115423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceDestroyed(holder);
116423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            destroyRenderer();
117423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
118423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
119423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen}
120