1bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen/* 2bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Copyright (C) 2009 The Android Open Source Project 3bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * 4bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * you may not use this file except in compliance with the License. 6bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * You may obtain a copy of the License at 7bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * 8bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * 10bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * See the License for the specific language governing permissions and 14bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen * limitations under the License. 15bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen */ 16bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 17bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 18bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpackage com.android.musicvis; 19bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 20bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.service.wallpaper.WallpaperService; 2191197a4ba5102cabb61acec9cdf9cca61e22d075Jason Samsimport android.renderscript.RenderScriptGL; 22bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.renderscript.RenderScript; 2330bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissenimport android.view.MotionEvent; 24bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.SurfaceHolder; 25bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.Surface; 26bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 27bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService { 28bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public Engine onCreateEngine() { 29bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen return new RenderScriptEngine(); 30bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 31bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 32bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen protected abstract T createScene(int width, int height); 33bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 34bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private class RenderScriptEngine extends Engine { 3591197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams private RenderScriptGL mRs; 36bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private T mRenderer; 37bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 38bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 39bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onCreate(SurfaceHolder surfaceHolder) { 40bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onCreate(surfaceHolder); 4130bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen setTouchEventsEnabled(true); 42bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen surfaceHolder.setSizeFromLayout(); 43bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 44bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 45bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 46bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onDestroy() { 47bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onDestroy(); 48bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen destroyRenderer(); 49bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 50bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 51bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private void destroyRenderer() { 52bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer != null) { 53bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.stop(); 54bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer = null; 55bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 56bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRs != null) { 57bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRs.destroy(); 58bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRs = null; 5991197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams } 60bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 61bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 62bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 63bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onVisibilityChanged(boolean visible) { 64bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onVisibilityChanged(visible); 65bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer != null) { 66bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (visible) { 6791197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams mRenderer.start(); 68bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } else { 69bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.stop(); 70bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 71bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 72bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 73bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 74bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 75bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 76bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceChanged(holder, format, width, height); 778eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams if (mRs != null) { 788eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams mRs.contextSetSurface(width, height, holder.getSurface()); 798eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams } 80bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer == null) { 81bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer = createScene(width, height); 82bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.init(mRs, getResources(), isPreview()); 83bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.start(); 84bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } else { 85bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.resize(width, height); 86bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 87bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 88bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 89bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 9030bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen public void onTouchEvent(MotionEvent event) { 913de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen if (mRenderer != null) { 923de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen mRenderer.onTouchEvent(event); 933de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen } 9430bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen } 9591197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams 9630bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen @Override 97af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen public void onOffsetsChanged(float xOffset, float yOffset, 98af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 993de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen if (mRenderer != null) { 1003de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels); 1013de8e68e84c9a142ae647fc00d9c9549d2e59e50Marco Nelissen } 102bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 103bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 104bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 105bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceCreated(SurfaceHolder holder) { 106bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceCreated(holder); 107bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 108bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen Surface surface = null; 109bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen while (surface == null) { 110bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen surface = holder.getSurface(); 111bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 11291197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams mRs = new RenderScriptGL(false, false); 1139adb410582fdb01448a9f920f1b262a806705647Marco Nelissen mRs.contextSetPriority(RenderScript.Priority.LOW); 114bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 115bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 116bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 117bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceDestroyed(SurfaceHolder holder) { 118bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceDestroyed(holder); 119bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen destroyRenderer(); 120bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 121bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 122bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen} 123