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