package org.xbmc.android.remote.presentation.controller;
import org.xbmc.android.remote.business.ManagerFactory;
import org.xbmc.api.business.IEventClientManager;
import org.xbmc.api.presentation.INotifiableController;
import org.xbmc.eventclient.ButtonCodes;
import android.app.Activity;
import android.content.Context;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class GestureController extends AbstractController implements INotifiableController, IController {
IEventClientManager mEventClientManager;
private long mTimestamp = 0;
public GestureController(Context context) {
mEventClientManager = ManagerFactory.getEventClientManager(this);
}
/**
* Sends a keyboard event
* @param button
* @return
*/
private boolean keyboardAction(String button) {
mEventClientManager.sendButton("KB", button, false, true, true, (short)0, (byte)0);
return true;
}
public boolean onTrackballEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
return keyboardAction(ButtonCodes.KEYBOARD_ENTER);
else{
// check when the last trackball move happened to avoid too speedy selections
long newstamp = System.currentTimeMillis();
if (newstamp - mTimestamp > 300){
mTimestamp = newstamp;
if (Math.abs(event.getX()) > 0.15f) {
return keyboardAction(event.getX() < 0 ? ButtonCodes.KEYBOARD_LEFT : ButtonCodes.KEYBOARD_RIGHT);
} else if (Math.abs(event.getY()) > 0.15f){
return keyboardAction(event.getY() < 0 ? ButtonCodes.KEYBOARD_UP : ButtonCodes.KEYBOARD_DOWN);
}
}
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
char key = (char)event.getUnicodeChar();
if (key > 'A' && key < 'z')
return keyboardAction("" + key);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_VOLUME_PLUS, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_VOLUME_MINUS, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_DOWN, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_DPAD_UP:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_UP, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_LEFT, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_RIGHT, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
mEventClientManager.sendButton("R1", ButtonCodes.REMOTE_ENTER, false, true, true, (short)0, (byte)0);
return true;
default:
return false;
}
}
public void onActivityPause() {
mEventClientManager.setController(null);
super.onActivityPause();
}
public void onActivityResume(Activity activity) {
super.onActivityResume(activity);
mEventClientManager.setController(this);
}
}