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; 21b418c5c443dc18fbdc7d644c407fada2be78c50fJason Samsimport android.renderscript.RenderScriptGL; 2244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.renderscript.RenderScript; 2344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.SurfaceHolder; 2444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guyimport android.view.Surface; 2544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 2644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guypublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService { 2744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public Engine onCreateEngine() { 2844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy return new RenderScriptEngine(); 2944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 3044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 3144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy protected abstract T createScene(int width, int height); 3244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 3344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy private class RenderScriptEngine extends Engine { 34b418c5c443dc18fbdc7d644c407fada2be78c50fJason Sams private RenderScriptGL mRs; 3544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy private T mRenderer; 3644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 3744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 3844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onCreate(SurfaceHolder surfaceHolder) { 3944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onCreate(surfaceHolder); 4044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy setTouchEventsEnabled(false); 4144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy surfaceHolder.setSizeFromLayout(); 4244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 4344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 4444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 4544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onDestroy() { 4644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onDestroy(); 4744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy destroyRenderer(); 4844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 4944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 5044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy private void destroyRenderer() { 5144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy if (mRenderer != null) { 5244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.stop(); 5344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer = null; 5444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 5544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy if (mRs != null) { 56c31dd3f30d02758747a40da1057a326b8bc0e01eRomain Guy mRs.setSurface(null, 0, 0); 5744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRs.destroy(); 5844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRs = null; 599182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 6044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 6144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 6244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 6344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onVisibilityChanged(boolean visible) { 6444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onVisibilityChanged(visible); 65d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy if (mRenderer != null) { 66d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy if (visible) { 679182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams mRenderer.start(); 68d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy } else { 69d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy mRenderer.stop(); 70d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy } 7144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 7244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 7344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 7444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 7544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 7644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceChanged(holder, format, width, height); 779182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams if (mRs != null) { 7876469b31f1bda22057330a0146d9296df92b9094Jason Sams mRs.setSurface(holder, width, height); 799182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 8044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy if (mRenderer == null) { 8144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer = createScene(width, height); 820ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy mRenderer.init(mRs, getResources(), isPreview()); 8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.start(); 8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } else { 8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.resize(width, height); 8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 8944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 909182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams public void onOffsetsChanged(float xOffset, float yOffset, 9106d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 92b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX if (mRenderer != null) mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); 9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceCreated(SurfaceHolder holder) { 9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceCreated(holder); 9844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 99258041d23145897222e9cc291ea7230eb5010f8eJason Sams RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 100bfdc438e718ee523bdbdf8871953fb42e69c9952Shih-wei Liao mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc); 10176469b31f1bda22057330a0146d9296df92b9094Jason Sams mRs.setPriority(RenderScript.Priority.LOW); 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) { 113b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX if (mRenderer != null) { 114b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX return mRenderer.onCommand(action, x, y, z, extras, resultRequested); 115b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX } else { 116b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX return null; 117b0c4cab243ecaa1411aaaa0b675081e0f74e01aeedingX } 118c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron } 1199182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams 12044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 12144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy} 122