RenderScriptWallpaper.java revision 06d2076e512e9345d31cdd1c79c4ad28d7add9bf
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 8506d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen public void onOffsetsChanged(float xOffset, float yOffset, 8606d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); 8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 9144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceCreated(SurfaceHolder holder) { 9244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceCreated(holder); 9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy Surface surface = null; 9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy while (surface == null) { 9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy surface = holder.getSurface(); 9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 985d43b50fb2a88c6166a7c3b25c4d39d7522cd308Jason Sams mRs = new RenderScript(surface, false, false); 9944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 10044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 10144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceDestroyed(SurfaceHolder holder) { 10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceDestroyed(holder); 10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy destroyRenderer(); 10544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 106c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron 107c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron @Override 108c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron public Bundle onCommand(String action, int x, int y, int z, 109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron Bundle extras, boolean resultRequested) { 110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron return mRenderer.onCommand(action, x, y, z, extras, resultRequested); 111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron } 112c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron 11344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 11444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy} 115