/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui; import android.content.Context; import android.graphics.Rect; import android.opengl.GLSurfaceView; import android.os.Build; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.SurfaceHolder; import com.android.systemui.glwallpaper.ImageWallpaperRenderer; /** * Default built-in wallpaper that simply shows a static image. */ @SuppressWarnings({"UnusedDeclaration"}) public class ImageWallpaper extends WallpaperService { private static final String TAG = ImageWallpaper.class.getSimpleName(); @Override public void onCreate() { super.onCreate(); } @Override public Engine onCreateEngine() { if (Build.IS_DEBUGGABLE) { Log.v(TAG, "We are using GLEngine"); } return new GLEngine(this); } class GLEngine extends Engine { private GLWallpaperSurfaceView mWallpaperSurfaceView; GLEngine(Context context) { mWallpaperSurfaceView = new GLWallpaperSurfaceView(context); mWallpaperSurfaceView.setRenderer( new ImageWallpaperRenderer(context, mWallpaperSurfaceView)); mWallpaperSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); setOffsetNotificationsEnabled(true); } @Override public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) { if (mWallpaperSurfaceView != null) { mWallpaperSurfaceView.notifyAmbientModeChanged(inAmbientMode, animationDuration); } } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) { if (mWallpaperSurfaceView != null) { mWallpaperSurfaceView.notifyOffsetsChanged(xOffset, yOffset); } } private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView { private WallpaperStatusListener mWallpaperChangedListener; GLWallpaperSurfaceView(Context context) { super(context); setEGLContextClientVersion(2); } @Override public SurfaceHolder getHolder() { return getSurfaceHolder(); } @Override public void setRenderer(Renderer renderer) { super.setRenderer(renderer); mWallpaperChangedListener = (WallpaperStatusListener) renderer; } private void notifyAmbientModeChanged(boolean inAmbient, long duration) { if (mWallpaperChangedListener != null) { mWallpaperChangedListener.onAmbientModeChanged(inAmbient, duration); } } private void notifyOffsetsChanged(float xOffset, float yOffset) { if (mWallpaperChangedListener != null) { mWallpaperChangedListener.onOffsetsChanged( xOffset, yOffset, getHolder().getSurfaceFrame()); } } @Override public void render() { requestRender(); } } } /** * A listener to trace status of image wallpaper. */ public interface WallpaperStatusListener { /** * Called back while ambient mode changes. * @param inAmbientMode true if is in ambient mode, false otherwise. * @param duration the duration of animation. */ void onAmbientModeChanged(boolean inAmbientMode, long duration); /** * Called back while wallpaper offsets. * @param xOffset The offset portion along x. * @param yOffset The offset portion along y. */ void onOffsetsChanged(float xOffset, float yOffset, Rect frame); } /** * An abstraction for view of GLRenderer. */ public interface ImageGLView { /** * Ask the view to render. */ void render(); } }