1423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen/* 2423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Copyright (C) 2009 The Android Open Source Project 3423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 4423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * you may not use this file except in compliance with the License. 6423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * You may obtain a copy of the License at 7423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 8423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 10423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * See the License for the specific language governing permissions and 14423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * limitations under the License. 15423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen */ 16423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 17423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 18423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpackage com.android.magicsmoke; 19423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 20423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.WallpaperService; 2131be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchoukimport android.os.Bundle; 22896a34b4dbb770fc55f3ff71ab80fa9813c64a2dMarco Nelissenimport android.graphics.PixelFormat; 231cac273ca3dc02971458785fe4d6d27cfa3f613eJason Samsimport android.renderscript.RenderScriptGL; 24423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.renderscript.RenderScript; 25423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.util.Log; 26423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.MotionEvent; 27423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.SurfaceHolder; 28423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.Surface; 29423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 30423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpublic abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService { 31423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public Engine onCreateEngine() { 32423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return new RenderScriptEngine(); 33423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 34423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 35423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen protected abstract T createScene(int width, int height); 36423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 37423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private class RenderScriptEngine extends Engine { 381cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams private RenderScriptGL mRs; 39423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private T mRenderer; 40423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 41423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 42423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onCreate(SurfaceHolder surfaceHolder) { 43423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onCreate(surfaceHolder); 4431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk setTouchEventsEnabled(false); 45423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen surfaceHolder.setSizeFromLayout(); 46229c496d4a47bd610c97af0578ce6b1e2a982c57Fredrik Ehnbom surfaceHolder.setFormat(PixelFormat.RGB_565); 47423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 48423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 49423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 50423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onDestroy() { 51423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onDestroy(); 52423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen destroyRenderer(); 53423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 54423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 55423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private void destroyRenderer() { 56423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mRenderer != null) { 57ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen mRenderer.stop(true); 58423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRenderer = null; 59423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 60423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mRs != null) { 61423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRs.destroy(); 62423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRs = null; 631cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams } 64423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 65423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 66423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 67423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onVisibilityChanged(boolean visible) { 68423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onVisibilityChanged(visible); 69423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mRenderer != null) { 70423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (visible) { 711cac273ca3dc02971458785fe4d6d27cfa3f613eJason Sams mRenderer.start(); 72423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } else { 73ce631a529b74ae79acc0d37da34a5ce8722fbc8cMarco Nelissen mRenderer.stop(false); 74423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 75423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 76423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 77423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 78423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 79423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 80423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onSurfaceChanged(holder, format, width, height); 819c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams if (mRs != null) { 82c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams mRs.setSurface(holder, width, height); 839c238a2abbd8f4d61b8a0c2faf8abdabbf91b40eJason Sams } 84423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mRenderer == null) { 85423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRenderer = createScene(width, height); 86423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRenderer.init(mRs, getResources(), isPreview()); 87423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRenderer.start(); 88423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } else { 89423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mRenderer.resize(width, height); 90423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 91423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 92423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 93423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 94423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onOffsetsChanged(float xOffset, float yOffset, 95423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen float xStep, float yStep, int xPixels, int yPixels) { 968d57c78704797dff5df2df2b10a08dec885fe489Marco Nelissen mRenderer.setOffset(xOffset, yOffset, xStep, yStep, xPixels, yPixels); 97423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 98423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 99423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 100423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onSurfaceCreated(SurfaceHolder holder) { 101423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onSurfaceCreated(holder); 102423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 103ca13e07c26186e2b82721564f63108c286b5216dJason Sams RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 10492c671bb7fcc492c62256a477729fca8faf30f6bShih-wei Liao mRs = new RenderScriptGL(RenderScriptWallpaper.this, sc); 105c71a2cb5b010ef13edba639bd214d9fa9922567aJason Sams mRs.setPriority(RenderScript.Priority.LOW); 106423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 107423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 108423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 109423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onSurfaceDestroyed(SurfaceHolder holder) { 110423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onSurfaceDestroyed(holder); 111423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen destroyRenderer(); 112423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 11331be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk 11431be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk @Override 11531be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk public Bundle onCommand(String action, int x, int y, int z, 11631be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk Bundle extras, boolean resultRequested) { 11731be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk return mRenderer.onCommand(action, x, y, z, extras, resultRequested); 11831be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk } 11931be678ff706bdf7e7c9f34c9ffcd8d2794643e2Alex Sakhartchouk 120423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 121423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen} 122