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;
2131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchoukimport android.os.Bundle;
22896a34b4dbb770fc55f3ff71ab80fa9813c64a2dMarco Nelissenimport android.graphics.PixelFormat;
231cac273ca3dc02971458785fe4d6d27cfa3f613eJason Samsimport android.renderscript.RenderScriptGL;
24423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.RenderScript;
25423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.util.Log;
26423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.MotionEvent;
27423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.SurfaceHolder;
28423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.Surface;
29423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
30423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
31423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    public Engine onCreateEngine() {
32423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        return new RenderScriptEngine();
33423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
34423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
35423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    protected abstract T createScene(int width, int height);
36423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
37423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    private class RenderScriptEngine extends Engine {
381cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams        private RenderScriptGL mRs;
39423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        private T mRenderer;
40423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
41423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
42423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onCreate(SurfaceHolder surfaceHolder) {
43423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onCreate(surfaceHolder);
4431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            setTouchEventsEnabled(false);
45423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            surfaceHolder.setSizeFromLayout();
46229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom            surfaceHolder.setFormat(PixelFormat.RGB_565);
47423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
48423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
49423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
50423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onDestroy() {
51423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onDestroy();
52423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            destroyRenderer();
53423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
54423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
55423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        private void destroyRenderer() {
56423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer != null) {
57ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen                mRenderer.stop(true);
58423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer = null;
59423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
60423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRs != null) {
61423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRs.destroy();
62423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRs = null;
631cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams            }
64423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
65423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
66423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
67423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onVisibilityChanged(boolean visible) {
68423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onVisibilityChanged(visible);
69423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer != null) {
70423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                if (visible) {
711cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams                    mRenderer.start();
72423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                } else {
73ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen                    mRenderer.stop(false);
74423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                }
75423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
76423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
77423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
78423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
79423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
80423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceChanged(holder, format, width, height);
819c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams            if (mRs != null) {
82c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams                mRs.setSurface(holder, width, height);
839c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams            }
84423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            if (mRenderer == null) {
85423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer = createScene(width, height);
86423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.init(mRs, getResources(), isPreview());
87423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.start();
88423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            } else {
89423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                mRenderer.resize(width, height);
90423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            }
91423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
92423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
93423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
94423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onOffsetsChanged(float xOffset, float yOffset,
95423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
968d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen            mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels);
97423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
98423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
99423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
100423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceCreated(SurfaceHolder holder) {
101423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceCreated(holder);
102423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
103ca13e07c26186e2b82721564f63108c286b5216dJason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
10492c671bb7fcc492c62256a477729fca8faf30f6bShih-wei Liao            mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc);
105c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams            mRs.setPriority(RenderScript.Priority.LOW);
106423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
107423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen
108423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        @Override
109423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        public void onSurfaceDestroyed(SurfaceHolder holder) {
110423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            super.onSurfaceDestroyed(holder);
111423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen            destroyRenderer();
112423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen        }
11331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
11431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        @Override
11531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        public Bundle onCommand(String action, int x, int y, int z,
11631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk                Bundle extras, boolean resultRequested) {
11731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk            return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
11831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk        }
11931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk
120423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen    }
121423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen}
122