RenderScriptWallpaper.java revision 9182eb0eed2d369f648bf06dd5db20a25ac7fa66
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; 579182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 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) { 659182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams 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); 759182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams if (mRs != null) { 769182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams mRs.contextSetSurface(width, height, holder.getSurface()); 779182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 7844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy if (mRenderer == null) { 7944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer = createScene(width, height); 800ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy mRenderer.init(mRs, getResources(), isPreview()); 8144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.start(); 8244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } else { 8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.resize(width, height); 8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 889182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams public void onOffsetsChanged(float xOffset, float yOffset, 8906d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 9044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); 9144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 9244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceCreated(SurfaceHolder holder) { 9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceCreated(holder); 9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy Surface surface = null; 9844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy while (surface == null) { 9944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy surface = holder.getSurface(); 10044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 1019182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams mRs = new RenderScript(false, false); 10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 10544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceDestroyed(SurfaceHolder holder) { 10644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceDestroyed(holder); 10744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy destroyRenderer(); 10844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron 110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron @Override 111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron public Bundle onCommand(String action, int x, int y, int z, 112c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron Bundle extras, boolean resultRequested) { 113c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron return mRenderer.onCommand(action, x, y, z, extras, resultRequested); 114c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron } 1159182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams 11644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 11744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy} 118