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
207eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk
21bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.service.wallpaper.WallpaperService;
227eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchoukimport android.os.Bundle;
2391197a4ba5102cabb61acec9cdf9cca61e22d075Jason Samsimport android.renderscript.RenderScriptGL;
24bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.renderscript.RenderScript;
257eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchoukimport android.util.Log;
2630bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissenimport android.view.MotionEvent;
27bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.SurfaceHolder;
28bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.Surface;
29bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
30bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
31bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    public Engine onCreateEngine() {
32bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        return new RenderScriptEngine();
33bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    }
34bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
35bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    protected abstract T createScene(int width, int height);
36bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
37bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    private class RenderScriptEngine extends Engine {
3891197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams        private RenderScriptGL mRs;
39bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        private T mRenderer;
40bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
41bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
42bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onCreate(SurfaceHolder surfaceHolder) {
43bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onCreate(surfaceHolder);
447eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk            setTouchEventsEnabled(false);
45bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            surfaceHolder.setSizeFromLayout();
46bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
47bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
48bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
49bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onDestroy() {
50bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onDestroy();
51bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            destroyRenderer();
52bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
53bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
54bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        private void destroyRenderer() {
55bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer != null) {
56bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.stop();
57bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer = null;
58bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
59bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRs != null) {
60bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRs.destroy();
61bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRs = null;
6291197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams            }
63bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
64bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
65bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
66bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onVisibilityChanged(boolean visible) {
67bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onVisibilityChanged(visible);
68bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer != null) {
69bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                if (visible) {
7091197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams                    mRenderer.start();
71bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                } else {
72bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                    mRenderer.stop();
73bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                }
74bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
75bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
76bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
77bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
78bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
79bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceChanged(holder, format, width, height);
808eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams            if (mRs != null) {
81570b7a66c0b415fcb534facbc04bb31987788ea1Jason Sams                mRs.setSurface(holder, width, height);
828eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams            }
83bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            if (mRenderer == null) {
84bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer = createScene(width, height);
85bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.init(mRs, getResources(), isPreview());
86bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.start();
87bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            } else {
88bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen                mRenderer.resize(width, height);
89bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            }
90bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
91bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
927eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk        /*@Override
9330bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen        public void onTouchEvent(MotionEvent event) {
9430bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen            mRenderer.onTouchEvent(event);
957eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk        }*/
9691197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams
9730bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen        @Override
98af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen        public void onOffsetsChanged(float xOffset, float yOffset,
99af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen                float xStep, float yStep, int xPixels, int yPixels) {
1007eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk            mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
101bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
102bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
103bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
104bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceCreated(SurfaceHolder holder) {
105bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceCreated(holder);
106bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
107ab96a87621fd68e6779e9126bb79e5f59264c9cfJason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
1084f1b8501f84513e20e43834ff0a0eb4bba265cdaShih-wei Liao            mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc);
109570b7a66c0b415fcb534facbc04bb31987788ea1Jason Sams            mRs.setPriority(RenderScript.Priority.LOW);
110bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
111bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen
112bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        @Override
113bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        public void onSurfaceDestroyed(SurfaceHolder holder) {
114bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            super.onSurfaceDestroyed(holder);
115bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen            destroyRenderer();
116bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen        }
1177eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk
118bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen    }
119bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen}
120