RenderScriptWallpaper.java revision c9e42c271d74990016bb2824ba72237f9c3529a3
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;
2144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.renderscript.RenderScript;
2244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.SurfaceHolder;
2344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.Surface;
2444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
2544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guypublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
2644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    public Engine onCreateEngine() {
2744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        return new RenderScriptEngine();
2844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    }
2944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    protected abstract T createScene(int width, int height);
3144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    private class RenderScriptEngine extends Engine {
3344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        private RenderScript mRs;
3444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        private T mRenderer;
3544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
3644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
3744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onCreate(SurfaceHolder surfaceHolder) {
3844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onCreate(surfaceHolder);
3944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            setTouchEventsEnabled(false);
4044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            surfaceHolder.setSizeFromLayout();
4144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
4244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
4344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
4444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onDestroy() {
4544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onDestroy();
4644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            destroyRenderer();
4744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
4844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
4944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        private void destroyRenderer() {
5044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRenderer != null) {
5144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.stop();
5244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer = null;
5344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
5444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRs != null) {
5544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs.destroy();
5644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRs = null;
5744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
5844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
5944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
6044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
6144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onVisibilityChanged(boolean visible) {
6244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onVisibilityChanged(visible);
63d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy            if (mRenderer != null) {
64d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                if (visible) {
65d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                    mRenderer.start();
66d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                } else {
67d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                    mRenderer.stop();
68d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy                }
6944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
7044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
7144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
7244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
7344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
7444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceChanged(holder, format, width, height);
7544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            if (mRenderer == null) {
7644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer = createScene(width, height);
770ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy                mRenderer.init(mRs, getResources(), isPreview());
7844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.start();
7944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            } else {
8044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                mRenderer.resize(width, height);
8144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
8244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onOffsetsChanged(float xOffset, float yOffset, int xPixels, int yPixels) {
8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
8944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
9044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceCreated(SurfaceHolder holder) {
9144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceCreated(holder);
9244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            Surface surface = null;
9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            while (surface == null) {
9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy                surface = holder.getSurface();
9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            }
975d43b50fb2a88c6166a7c3b25c4d39d7522cd308Jason Sams            mRs = new RenderScript(surface, false, false);
9844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
9944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy
10044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        @Override
10144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        public void onSurfaceDestroyed(SurfaceHolder holder) {
10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            super.onSurfaceDestroyed(holder);
10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy            destroyRenderer();
10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy        }
105c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron
106c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        @Override
107c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        public Bundle onCommand(String action, int x, int y, int z,
108c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron                Bundle extras, boolean resultRequested) {
109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron            return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron        }
111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron
11244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy    }
11344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy}
114