1bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen/*
2bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Copyright (C) 2009 The Android Open Source Project
3bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen *
4bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
5bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * you may not use this file except in compliance with the License.
6bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * You may obtain a copy of the License at
7bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen *
8bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
9bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen *
10bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Unless required by applicable law or agreed to in writing, software
11bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
12bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * See the License for the specific language governing permissions and
14bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * limitations under the License.
15bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen */
16bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
17bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
18bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpackage com.android.musicvis;
19bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
20bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.service.wallpaper.WallpaperService;
2191197a4ba5102cabb61acec9cdf9cca61e22d075Jason Samsimport android.renderscript.RenderScriptGL;
22bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.renderscript.RenderScript;
2330bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissenimport android.view.MotionEvent;
24bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.SurfaceHolder;
25bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.Surface;
26bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
27bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
28bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    public Engine onCreateEngine() {
29bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        return new RenderScriptEngine();
30bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    }
31bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
32bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    protected abstract T createScene(int width, int height);
33bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
34bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    private class RenderScriptEngine extends Engine {
3591197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams        private RenderScriptGL mRs;
36bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        private T mRenderer;
37bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
38bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
39bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onCreate(SurfaceHolder surfaceHolder) {
40bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onCreate(surfaceHolder);
4130bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen            setTouchEventsEnabled(true);
42bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            surfaceHolder.setSizeFromLayout();
43bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
44bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
45bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
46bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onDestroy() {
47bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onDestroy();
48bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            destroyRenderer();
49bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
50bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
51bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        private void destroyRenderer() {
52bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer != null) {
53bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.stop();
54bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer = null;
55bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
56bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRs != null) {
57bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRs.destroy();
58bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRs = null;
5991197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams            }
60bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
61bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
62bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
63bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onVisibilityChanged(boolean visible) {
64bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onVisibilityChanged(visible);
65bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer != null) {
66bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                if (visible) {
6791197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams                    mRenderer.start();
68bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                } else {
69bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                    mRenderer.stop();
70bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                }
71bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
72bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
73bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
74bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
75bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
76bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceChanged(holder, format, width, height);
778eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams            if (mRs != null) {
788eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams                mRs.contextSetSurface(width, height, holder.getSurface());
798eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams            }
80bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer == null) {
81bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer = createScene(width, height);
82bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.init(mRs, getResources(), isPreview());
83bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.start();
84bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            } else {
85bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.resize(width, height);
86bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
87bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
88bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
89bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
9030bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen        public void onTouchEvent(MotionEvent event) {
913de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen            if (mRenderer != null) {
923de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen                mRenderer.onTouchEvent(event);
933de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen            }
9430bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen        }
9591197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams
9630bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen        @Override
97af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen        public void onOffsetsChanged(float xOffset, float yOffset,
98af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
993de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen            if (mRenderer != null) {
1003de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen                mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels);
1013de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen            }
102bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
103bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
104bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
105bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceCreated(SurfaceHolder holder) {
106bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceCreated(holder);
107bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
108bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            Surface surface = null;
109bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            while (surface == null) {
110bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                surface = holder.getSurface();
111bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
11291197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams            mRs = new RenderScriptGL(false, false);
1139adb410582fdb01448a9f920f1b262a806705647Marco Nelissen            mRs.contextSetPriority(RenderScript.Priority.LOW);
114bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
115bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
116bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
117bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceDestroyed(SurfaceHolder holder) {
118bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceDestroyed(holder);
119bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            destroyRenderer();
120bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
121bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    }
122bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen}
123