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) { 5644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRs.destroy(); 5744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRs = null; 589182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 5944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 6044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 6144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 6244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onVisibilityChanged(boolean visible) { 6344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onVisibilityChanged(visible); 64d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy if (mRenderer != null) { 65d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy if (visible) { 669182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams mRenderer.start(); 67d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy } else { 68d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy mRenderer.stop(); 69d1151902a38696fd52b960d521ace3f6a0aa4a0dRomain Guy } 7044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 7144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 7244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 7344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 7444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 7544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceChanged(holder, format, width, height); 769182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams if (mRs != null) { 7776469b31f1bda22057330a0146d9296df92b9094Jason Sams mRs.setSurface(holder, width, height); 789182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams } 7944da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy if (mRenderer == null) { 8044da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer = createScene(width, height); 810ac0b3f704bedde5c3a117ac68e7cd4956cd73efRomain Guy mRenderer.init(mRs, getResources(), isPreview()); 8244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.start(); 8344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } else { 8444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.resize(width, height); 8544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 8744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 8844da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 899182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams public void onOffsetsChanged(float xOffset, float yOffset, 9006d2076e512e9345d31cdd1c79c4ad28d7add9bfMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 9144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); 9244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 9344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 9444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 9544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceCreated(SurfaceHolder holder) { 9644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceCreated(holder); 9744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 98258041d23145897222e9cc291ea7230eb5010f8eJason Sams RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 99bfdc438e718ee523bdbdf8871953fb42e69c9952Shih-wei Liao mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc); 10076469b31f1bda22057330a0146d9296df92b9094Jason Sams mRs.setPriority(RenderScript.Priority.LOW); 10144da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 10244da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy 10344da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy @Override 10444da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy public void onSurfaceDestroyed(SurfaceHolder holder) { 10544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy super.onSurfaceDestroyed(holder); 10644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy destroyRenderer(); 10744da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 108c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron 109c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron @Override 110c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron public Bundle onCommand(String action, int x, int y, int z, 111c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron Bundle extras, boolean resultRequested) { 112c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron return mRenderer.onCommand(action, x, y, z, extras, resultRequested); 113c9e42c271d74990016bb2824ba72237f9c3529a3Mike Cleron } 1149182eb0eed2d369f648bf06dd5db20a25ac7fa66Jason Sams 11544da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy } 11644da17844aa73a047a1f1ff67b4794ea330be3b5Romain Guy} 117