package com.simplbug.sikulimonkey; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import javax.imageio.ImageIO; import org.python.core.PyInteger; import org.python.core.PyObject; import org.python.core.PyString; import org.python.core.PyTuple; import org.python.core.PyUnicode; import org.sikuli.script.Debug; import org.sikuli.script.IRobot; import org.sikuli.script.Location; import org.sikuli.script.ScreenImage; import com.android.monkeyrunner.MonkeyDevice; public class AndroidRobot implements IRobot { private MonkeyDevice _device; public AndroidRobot(MonkeyDevice dev) { _device = dev; } @Override public ScreenImage captureScreen(Rectangle rect) { try { Debug.history("Take a screenshot from the device..."); byte[] bytes = _device.takeSnapshot().convertToBytes(new PyObject[0], null); // PNG BufferedImage screen = ImageIO.read(new ByteArrayInputStream(bytes)); BufferedImage part = screen.getSubimage(rect.x, rect.y, rect.width, rect.height); return new ScreenImage(rect, part); } catch (IOException e) { throw new RuntimeException(e); } } private Rectangle _bounds; // cache public Rectangle getBounds() { if (_bounds != null) return _bounds; int width = Integer.parseInt(_device.getProperty(new PyObject[] { new PyString("display.width") }, null)); int height = Integer.parseInt(_device.getProperty(new PyObject[] { new PyString("display.height") }, null)); _bounds = new Rectangle(0, 0, width, height); return _bounds; } private String _model; // cache public String getModel() { if (_model != null) return _model; _model = _device.getProperty(new PyObject[] { new PyString("build.model") }, null); return _model; } public int type(String text) { _device.type(new PyObject[] { new PyUnicode(text) }, null); return 1; } public void tap(int x, int y) { _device.touch(new PyObject[] { new PyInteger(x), new PyInteger(y), new PyString("DOWN_AND_UP")}, null); } public void longPress(int x, int y) { PyTuple point = new PyTuple(new PyInteger(x), new PyInteger(y)); _device.drag(new PyObject[] { point, point, new PyInteger(2), new PyInteger(2) }, null); } public void pressHome() { pressHome(0); } public void pressHome(float durationSec) { press("KEYCODE_HOME", durationSec); } public void pressMenu() { press("KEYCODE_MENU", 0); } public void pressBack() { press("KEYCODE_BACK", 0); } public void pressSearch() { press("KEYCODE_SEARCH", 0); } public void pressEnter() { press("KEYCODE_ENTER", 0); } public void pressBackspace() { press("KEYCODE_DEL", 0); } public void pressDpadUp() { press("KEYCODE_DPAD_UP", 0); } public void pressDpadDown() { press("KEYCODE_DPAD_DOWN", 0); } public void pressDpadLeft() { press("KEYCODE_DPAD_LEFT", 0); } public void pressDpadRight() { press("KEYCODE_DPAD_RIGHT", 0); } public void pressDpadCenter() { pressDpadCenter(0); } public void pressDpadCenter(float durationSec) { press("KEYCODE_DPAD_CENTER", durationSec); } private void press(String keycodeName, float durationSec) { sleep(1); if (durationSec == 0) { _device.press(new PyObject[] { new PyString(keycodeName), new PyString(MonkeyDevice.DOWN_AND_UP) }, null); } else { _device.press(new PyObject[] { new PyString(keycodeName), new PyString(MonkeyDevice.DOWN) }, null); sleep(durationSec); _device.press(new PyObject[] { new PyString(keycodeName), new PyString(MonkeyDevice.UP) }, null); } } private static void sleep(float seconds) { try { Thread.sleep((long)(seconds * 1000)); } catch (InterruptedException e) { throw new RuntimeException(e); } } @Override public void delay(int ms) { try { Thread.sleep(ms); } catch (InterruptedException e) { throw new RuntimeException(e); } } @Override public Object getDevice() { return _device; } @Override public void dragDrop(Location start, Location end, int steps, long ms, int buttons) { throw new UnsupportedOperationException(); } @Override public void keyPress(int keycode) { throw new UnsupportedOperationException(); } @Override public void keyRelease(int keycode) { throw new UnsupportedOperationException(); } @Override public void mouseMove(int x, int y) { throw new UnsupportedOperationException(); } @Override public void mousePress(int buttons) { throw new UnsupportedOperationException(); } @Override public void mouseRelease(int buttons) { throw new UnsupportedOperationException(); } @Override public void mouseWheel(int wheelAmt) { throw new UnsupportedOperationException(); } @Override public void pressModifiers(int modifiers) { throw new UnsupportedOperationException(); } @Override public void releaseModifiers(int modifiers) { throw new UnsupportedOperationException(); } @Override public void setAutoDelay(int ms) { throw new UnsupportedOperationException(); } @Override public void smoothMove(Location dest) { throw new UnsupportedOperationException(); } @Override public void smoothMove(Location src, Location dest, long ms) { throw new UnsupportedOperationException(); } @Override public void typeChar(char character, KeyMode mode) { throw new UnsupportedOperationException(); } @Override public void waitForIdle() { throw new UnsupportedOperationException(); } }