/*
* Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.ui;
import android.content.Context;
import android.view.MotionEvent;
public abstract class KonamiCodeDetector extends OnSwipeGestureTouchListener {
private enum Action {
LEFT,
RIGHT,
UP,
DOWN,
A,
B
}
private enum State {
INITIAL(Action.UP),
UP(Action.UP),
UP_UP(Action.DOWN),
UP_UP_DOWN(Action.DOWN),
UP_UP_DOWN_DOWN(Action.LEFT),
UP_UP_DOWN_DOWN_LEFT(Action.RIGHT),
UP_UP_DOWN_DOWN_LEFT_RIGHT(Action.LEFT),
UP_UP_DOWN_DOWN_LEFT_RIGHT_LEFT(Action.RIGHT),
UP_UP_DOWN_DOWN_LEFT_RIGHT_LEFT_RIGHT(Action.B),
UP_UP_DOWN_DOWN_LEFT_RIGHT_LEFT_RIGHT_B(Action.A),
FINAL(null);
private Action mNextAction;
State(Action nextAction) {
mNextAction = nextAction;
}
public State next(Action action) {
return mNextAction != null && action == mNextAction ? values()[ordinal() + 1]
: INITIAL;
}
}
private final float mHalfScreenWidth;
private State mState = State.INITIAL;
public KonamiCodeDetector(Context context) {
super(context, false);
mHalfScreenWidth = (float) context.getResources().getDisplayMetrics().widthPixels / 2;
}
@Override
public void onSwipeLeft() {
onAction(Action.LEFT);
}
@Override
public void onSwipeRight() {
onAction(Action.RIGHT);
}
@Override
public void onSwipeUp() {
onAction(Action.UP);
}
@Override
public void onSwipeDown() {
onAction(Action.DOWN);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
if (event.getX() < mHalfScreenWidth) {
onAction(Action.A);
} else {
onAction(Action.B);
}
return true;
}
private void onAction(Action action) {
mState = mState.next(action);
if (mState == State.FINAL) {
onDetected();
mState = mState.next(null);
}
}
public abstract void onDetected();
}