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) {
56c31dd3f30d02758747a40da1057a326b8bc0e01eRomain Guy                mRs.setSurface(null, 0, 0);
5744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs.destroy();
5844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs = null;
599182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            }
6044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
6144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
6244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
6344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onVisibilityChanged(boolean visible) {
6444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onVisibilityChanged(visible);
65d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy            if (mRenderer != null) {
66d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                if (visible) {
679182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams                    mRenderer.start();
68d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                } else {
69d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                    mRenderer.stop();
70d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                }
7144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
7244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
7344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
7444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
7544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
7644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceChanged(holder, format, width, height);
779182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            if (mRs != null) {
7876469b31f1bda22057330a0146d9296df92b9094Jason Sams                mRs.setSurface(holder, width, height);
799182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams            }
8044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRenderer == null) {
8144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer = createScene(width, height);
820ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy                mRenderer.init(mRs, getResources(), isPreview());
8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.start();
8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            } else {
8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.resize(width, height);
8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
8944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
909182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams        public void onOffsetsChanged(float xOffset, float yOffset,
9106d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
92b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX            if (mRenderer != null) mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceCreated(SurfaceHolder holder) {
9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceCreated(holder);
9844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
99258041d23145897222e9cc291ea7230eb5010f8eJason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
100bfdc438e718ee523bdbdf8871953fb42e69c9952Shih-wei Liao            mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc);
10176469b31f1bda22057330a0146d9296df92b9094Jason Sams            mRs.setPriority(RenderScript.Priority.LOW);
10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
10544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceDestroyed(SurfaceHolder holder) {
10644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceDestroyed(holder);
10744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            destroyRenderer();
10844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron
110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        @Override
111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        public Bundle onCommand(String action, int x, int y, int z,
112c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron                Bundle extras, boolean resultRequested) {
113b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX            if (mRenderer != null) {
114b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX                return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
115b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX            } else {
116b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX                return null;
117b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX            }
118c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        }
1199182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams
12044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    }
12144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy}
122