144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy/*
244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * Copyright (C) 2009 The Android Open Source Project
344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy *
444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * you may not use this file except in compliance with the License.
644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * You may obtain a copy of the License at
744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy *
844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy *
1044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * Unless required by applicable law or agreed to in writing, software
1144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
1244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * See the License for the specific language governing permissions and
1444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy * limitations under the License.
1544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy */
1644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
1744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guypackage com.android.wallpaper;
1844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
1944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.service.wallpaper.WallpaperService;
20c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleronimport android.os.Bundle;
21b418c5c443dc18fbdc7d644c407fada2be78c50fJason Samsimport android.renderscript.RenderScriptGL;
2244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.renderscript.RenderScript;
2344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.SurfaceHolder;
2444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.Surface;
2544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
2644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guypublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
2744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    public Engine onCreateEngine() {
2844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        return new RenderScriptEngine();
2944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    }
3044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    protected abstract T createScene(int width, int height);
3244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    private class RenderScriptEngine extends Engine {
34b418c5c443dc18fbdc7d644c407fada2be78c50fJason Sams        private RenderScriptGL mRs;
3544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        private T mRenderer;
3644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
3844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onCreate(SurfaceHolder surfaceHolder) {
3944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onCreate(surfaceHolder);
4044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            setTouchEventsEnabled(false);
4144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            surfaceHolder.setSizeFromLayout();
4244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
4344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
4444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
4544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onDestroy() {
4644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onDestroy();
4744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            destroyRenderer();
4844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
4944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
5044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        private void destroyRenderer() {
5144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRenderer != null) {
5244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.stop();
5344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer = null;
5444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
5544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRs != null) {
5644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs.destroy();
5744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs = null;
589182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            }
5944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
6044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
6144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
6244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onVisibilityChanged(boolean visible) {
6344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onVisibilityChanged(visible);
64d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy            if (mRenderer != null) {
65d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                if (visible) {
669182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams                    mRenderer.start();
67d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                } else {
68d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                    mRenderer.stop();
69d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                }
7044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
7144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
7244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
7344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
7444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
7544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceChanged(holder, format, width, height);
769182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            if (mRs != null) {
7776469b31f1bda22057330a0146d9296df92b9094Jason Sams                mRs.setSurface(holder, width, height);
789182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            }
7944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRenderer == null) {
8044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer = createScene(width, height);
810ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy                mRenderer.init(mRs, getResources(), isPreview());
8244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.start();
8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            } else {
8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.resize(width, height);
8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
899182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams        public void onOffsetsChanged(float xOffset, float yOffset,
9006d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
9144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
9244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceCreated(SurfaceHolder holder) {
9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceCreated(holder);
9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
98258041d23145897222e9cc291ea7230eb5010f8eJason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
99bfdc438e718ee523bdbdf8871953fb42e69c9952Shih-wei Liao            mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc);
10076469b31f1bda22057330a0146d9296df92b9094Jason Sams            mRs.setPriority(RenderScript.Priority.LOW);
10144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceDestroyed(SurfaceHolder holder) {
10544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceDestroyed(holder);
10644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            destroyRenderer();
10744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
108c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron
109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        @Override
110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        public Bundle onCommand(String action, int x, int y, int z,
111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron                Bundle extras, boolean resultRequested) {
112c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron            return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
113c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        }
1149182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams
11544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    }
11644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy}
117