package com.novoda.wallpaper;
import java.util.Timer;
import java.util.TimerTask;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.SystemClock;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
public class ImageSwitchWallPaper extends WallpaperService {
private final Handler mHandler = new Handler();
private static final String TAG = ImageSwitchWallPaper.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public Engine onCreateEngine() {
return new OutRunEngine();
}
class OutRunEngine extends Engine {
OutRunEngine() {
Resources res = getResources();
carFrontBitmap = res.getIdentifier("day_front", "drawable", "com.novoda.wallpaper");
carRightBitmap = res.getIdentifier("day_right", "drawable", "com.novoda.wallpaper");
carLeftBitmap = res.getIdentifier("day_left", "drawable", "com.novoda.wallpaper");
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
// By default we don't get touch events, so enable them.
setTouchEventsEnabled(true);
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mDrawWallpaper);
}
@Override
public void onVisibilityChanged(boolean visible) {
mVisible = visible;
if (visible) {
drawFrame();
} else {
mHandler.removeCallbacks(mDrawWallpaper);
}
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
// store the center of the surface, so we can draw the cube in the right spot
mCenterX = width/2.0f;
mCenterY = height/2.0f;
drawFrame();
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
mVisible = false;
mHandler.removeCallbacks(mDrawWallpaper);
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) {
mOffset = xOffset;
// Log.i(TAG, "XOffset["+xOffset+"] xStep["+xStep+"] xPixels["+xPixels+"]");
drawFrame();
}
/*
* Store the position of the touch event so we can use it for drawing later
*/
@Override
public void onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mDragEventInProgress = true;
mDragEventStartX = event.getX();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.i(TAG, "X:["+event.getX()+"+] - dragStart["+mDragEventStartX+"] =" + (event.getX() - mDragEventStartX));
boolean draggedLotsRight = (mDragEventStartX - event.getX()) >=160;
boolean draggedLotsLeft = (event.getX() - mDragEventStartX) >=160;
if( (mDragEventStartX > 150) && draggedLotsRight ){
Log.d(TAG, "Driving animation started Right >");
takingACorner =true;
slidePic = carRightBitmap;
new Timer().schedule(new TimerTask(){
@Override
public void run() {
takingACorner =false;
}}, 1000);
}
if( (mDragEventStartX < 150) && draggedLotsLeft ){
Log.d(TAG, "Driving animation started < Left");
takingACorner =true;
slidePic = carLeftBitmap;
new Timer().schedule(new TimerTask(){
@Override
public void run() {
takingACorner =false;
}}, 1000);
}
mDragEventInProgress = false;
mDragEventStartX = 0;
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
mTouchX = event.getX();
mTouchY = event.getY();
if(mTouchX >= 150){
mDrivingForward = false;
mTurningLeft = false;
mTurningRight = true;
// Log.i(TAG, "Right: mTouchX ["+mTouchX+"]");
}else{
mDrivingForward = false;
mTurningLeft = true;
mTurningRight = false;
// Log.i(TAG, "Left: mTouchX ["+mTouchY+"]");
}
} else {
mDrivingForward = true;
mTurningLeft = false;
mTurningRight = false;
mTouchX = -1;
mTouchY = -1;
}
super.onTouchEvent(event);
}
void drawFrame() {
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
drawCar(c);
}
} finally {
if (c != null) holder.unlockCanvasAndPost(c);
}
// Reschedule the next redraw
mHandler.removeCallbacks(mDrawWallpaper);
if (mVisible) {
mHandler.postDelayed(mDrawWallpaper, 1000 / 25);
}
}
private void drawCar(Canvas c) {
if(takingACorner){
c.drawBitmap(BitmapFactory.decodeResource(getResources(), slidePic), 20, 120, null);
}else{
if(mDragEventInProgress){
// if(mDragEventStartX > 150){
// c.drawBitmap(carRightBitmap, 20, 0, null);
// }else{
// c.drawBitmap(carLeftBitmap, 20, 0, null);
// }
}else{
c.drawBitmap(BitmapFactory.decodeResource(getResources(), carFrontBitmap), 20, 120, null);
}
}
}
void drawTouchPoint(Canvas c) {
if (mTouchX >=0 && mTouchY >= 0) {
c.drawCircle(mTouchX, mTouchY, 80, mPaint);
}
}
private final Paint mPaint = new Paint();
private float mOffset;
private float mTouchX = -1;
private float mTouchY = -1;
private float mCenterX;
private float mCenterY;
private boolean mDrivingForward = true;
private boolean mTurningLeft = false;
private boolean mTurningRight = false;
private boolean mDragEventAnimStarted = false;
private int carRightBitmap;
private int carLeftBitmap;
private int carFrontBitmap;
private int slidePic;
private boolean duringSlide = false;
private boolean mDragEventInProgress = false;
private float mDragEventStartX = 0;
private final Runnable mDrawWallpaper = new Runnable() {
public void run() {
drawFrame();
}
};
private boolean mVisible;
private float xLastOffset;
private boolean takingACorner = false;
}
}