package jp.co.cyberagent.stf.compat;
import android.view.InputEvent;
import android.view.KeyEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import jp.co.cyberagent.stf.util.InternalApi;
public class InputManagerWrapper {
private EventInjector eventInjector;
public InputManagerWrapper() {
try {
eventInjector = new InputManagerEventInjector();
}
catch (UnsupportedOperationException e) {
eventInjector = new WindowManagerEventInjector();
}
}
public boolean injectKeyEvent(KeyEvent event) {
return eventInjector.injectKeyEvent(event);
}
private interface EventInjector {
public boolean injectKeyEvent(KeyEvent event);
}
/**
* EventInjector for SDK >=16
*/
private class InputManagerEventInjector implements EventInjector {
private Object inputManager;
private Method injector;
public InputManagerEventInjector() {
try {
inputManager = InternalApi.getSingleton("android.hardware.input.InputManager");
// injectInputEvent() is @hidden
injector = inputManager.getClass()
// public boolean injectInputEvent(InputEvent event, int mode)
.getMethod("injectInputEvent", InputEvent.class, int.class);
}
catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("InputManagerEventInjector is not supported");
}
}
public boolean injectKeyEvent(KeyEvent event) {
try {
injector.invoke(inputManager, event, 0);
return true;
}
catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}
}
}
/**
* EventInjector for SDK <16
*/
private class WindowManagerEventInjector implements EventInjector {
private Object windowManager;
private Method keyInjector;
public WindowManagerEventInjector() {
try {
windowManager = WindowManagerWrapper.getWindowManager();
keyInjector = windowManager.getClass()
// public boolean injectKeyEvent(android.view.KeyEvent ev, boolean sync)
// throws android.os.RemoteException
.getMethod("injectKeyEvent", KeyEvent.class, boolean.class);
}
catch (NoSuchMethodException e) {
e.printStackTrace();
throw new UnsupportedOperationException("WindowManagerEventInjector is not supported");
}
}
public boolean injectKeyEvent(KeyEvent event) {
try {
keyInjector.invoke(windowManager, event, false);
return true;
}
catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}
}
}
}