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 207eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk 21bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.service.wallpaper.WallpaperService; 227eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchoukimport android.os.Bundle; 2391197a4ba5102cabb61acec9cdf9cca61e22d075Jason Samsimport android.renderscript.RenderScriptGL; 24bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.renderscript.RenderScript; 257eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchoukimport android.util.Log; 2630bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissenimport android.view.MotionEvent; 27bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.SurfaceHolder; 28bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenimport android.view.Surface; 29bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 30bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService { 31bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public Engine onCreateEngine() { 32bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen return new RenderScriptEngine(); 33bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 34bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 35bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen protected abstract T createScene(int width, int height); 36bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 37bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private class RenderScriptEngine extends Engine { 3891197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams private RenderScriptGL mRs; 39bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private T mRenderer; 40bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 41bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 42bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onCreate(SurfaceHolder surfaceHolder) { 43bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onCreate(surfaceHolder); 447eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk setTouchEventsEnabled(false); 45bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen surfaceHolder.setSizeFromLayout(); 46bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 47bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 48bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 49bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onDestroy() { 50bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onDestroy(); 51bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen destroyRenderer(); 52bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 53bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 54bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen private void destroyRenderer() { 55bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer != null) { 56bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.stop(); 57bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer = null; 58bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 59bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRs != null) { 60bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRs.destroy(); 61bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRs = null; 6291197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams } 63bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 64bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 65bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 66bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onVisibilityChanged(boolean visible) { 67bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onVisibilityChanged(visible); 68bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer != null) { 69bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (visible) { 7091197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams mRenderer.start(); 71bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } else { 72bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.stop(); 73bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 74bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 75bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 76bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 77bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 78bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 79bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceChanged(holder, format, width, height); 808eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams if (mRs != null) { 81570b7a66c0b415fcb534facbc04bb31987788ea1Jason Sams mRs.setSurface(holder, width, height); 828eba6b4d8b849361212b2b3fcf755a66bea06542Jason Sams } 83bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen if (mRenderer == null) { 84bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer = createScene(width, height); 85bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.init(mRs, getResources(), isPreview()); 86bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.start(); 87bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } else { 88bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen mRenderer.resize(width, height); 89bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 90bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 91bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 927eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk /*@Override 9330bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen public void onTouchEvent(MotionEvent event) { 9430bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen mRenderer.onTouchEvent(event); 957eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk }*/ 9691197a4ba5102cabb61acec9cdf9cca61e22d075Jason Sams 9730bc95b0dda7bfb08d12401eaecec9a9d3ca7b19Marco Nelissen @Override 98af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen public void onOffsetsChanged(float xOffset, float yOffset, 99af20a0f6ea8460d3d33b1d3dab405eeab3862c4cMarco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 1007eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels); 101bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 102bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 103bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 104bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceCreated(SurfaceHolder holder) { 105bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceCreated(holder); 106bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 107ab96a87621fd68e6779e9126bb79e5f59264c9cfJason Sams RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 1084f1b8501f84513e20e43834ff0a0eb4bba265cdaShih-wei Liao mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc); 109570b7a66c0b415fcb534facbc04bb31987788ea1Jason Sams mRs.setPriority(RenderScript.Priority.LOW); 110bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 111bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen 112bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen @Override 113bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen public void onSurfaceDestroyed(SurfaceHolder holder) { 114bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen super.onSurfaceDestroyed(holder); 115bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen destroyRenderer(); 116bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 1177eb6bcc2cbc062abea4f3c9d3e542215697c7b66Alex Sakhartchouk 118bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen } 119bb362b27cbcccf8f845e6ec83d0540b477fece08Marco Nelissen} 120