109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/*
209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Copyright (C) 2009 The Android Open Source Project
309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * you may not use this file except in compliance with the License.
609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * You may obtain a copy of the License at
709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
1009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Unless required by applicable law or agreed to in writing, software
1109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
1209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * See the License for the specific language governing permissions and
1409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * limitations under the License.
1509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */
1609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
1709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypackage com.android.wallpaper;
1809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
1909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.service.wallpaper.WallpaperService;
2009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.os.Bundle;
2109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.renderscript.RenderScriptGL;
2209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.renderscript.RenderScript;
2309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.SurfaceHolder;
2409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.Surface;
2509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
2609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
2709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public Engine onCreateEngine() {
2809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        return new RenderScriptEngine();
2909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
3009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    protected abstract T createScene(int width, int height);
3209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private class RenderScriptEngine extends Engine {
3409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        private RenderScriptGL mRs;
3509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        private T mRenderer;
3609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
3809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onCreate(SurfaceHolder surfaceHolder) {
3909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            super.onCreate(surfaceHolder);
4009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            setTouchEventsEnabled(false);
4109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            surfaceHolder.setSizeFromLayout();
4209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
4309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
4409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
4509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onDestroy() {
4609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            super.onDestroy();
4752236de777c23788df8147de15912a57e8bc36ddTao Liejun            destroyRenderer();
4809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
4909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        private void destroyRenderer() {
5109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRenderer != null) {
5209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer.stop();
5309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer = null;
5409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
5509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRs != null) {
5609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRs.setSurface(null, 0, 0);
5709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRs.destroy();
5809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRs = null;
5909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
6009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
6109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6274ae04c73312403e89db0f8e9bd9601d403b4783fredc        @Override
63ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        public void onVisibilityChanged(boolean visible) {
64ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly            super.onVisibilityChanged(visible);
6509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRenderer != null) {
6609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                if (visible) {
6709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    mRenderer.start();
6809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                } else {
6909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    mRenderer.stop();
7009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                }
7109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
7209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
7309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
7509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
7609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            super.onSurfaceChanged(holder, format, width, height);
7709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRs != null) {
7809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRs.setSurface(holder, width, height);
7909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
8009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRenderer == null) {
8109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer = createScene(width, height);
8209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer.init(mRs, getResources(), isPreview());
8309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer.start();
8409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            } else {
8509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                mRenderer.resize(width, height);
8609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
87ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        }
8809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
9009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onOffsetsChanged(float xOffset, float yOffset,
9109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                float xStep, float yStep, int xPixels, int yPixels) {
9209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mRenderer != null) mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
9309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
94ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly
9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onSurfaceCreated(SurfaceHolder holder) {
9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            super.onSurfaceCreated(holder);
9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
99ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc);
10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            mRs.setPriority(RenderScript.Priority.LOW);
10209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
103ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly
10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onSurfaceDestroyed(SurfaceHolder holder) {
10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            super.onSurfaceDestroyed(holder);
10709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            destroyRenderer();
10809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
11009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        @Override
11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public Bundle onCommand(String action, int x, int y, int z,
11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Bundle extras, boolean resultRequested) {
1130ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang            if (mRenderer != null) {
1140ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang                return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
1150ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang            } else {
1160ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang                return null;
1170ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang            }
1180ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang        }
1190ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang
1200ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang    }
1210ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang}
1220ac98162ff293fdaa23f93f9839aaad5428af537Chih-Chung Chang