package org.sikuli.android; import org.sikuli.basics.Debug; import org.sikuli.basics.Settings; import org.sikuli.script.*; import org.sikuli.util.*; import java.awt.*; /** * Created by Törcsi on 2016. 06. 26. * Revised by RaiMan */ public class ADBScreen extends Region implements EventObserver, IScreen { static { RunTime.loadLibrary("VisionProxy"); } private static String me = "ADBScreen: "; private static void log(int level, String message, Object... args) { Debug.logx(level, me + message, args); } private static boolean isFake = false; protected IRobot robot = null; private static int logLvl = 3; private ScreenImage lastScreenImage = null; private Rectangle bounds; private boolean waitPrompt = false; protected OverlayCapturePrompt prompt; private String promptMsg = "Select a region on the screen"; private static int waitForScreenshot = 300; public boolean needsUnLock = false; public int waitAfterAction = 1; //---------------------------Inits private ADBDevice device = null; private static ADBScreen screen = null; public static ADBScreen start() { if (screen == null) { try { screen = new ADBScreen(); } catch (Exception e) { log(-1, "start: No devices attached"); screen = null; } } return screen; } public static void stop() { ADBDevice.reset(); screen = null; } public ADBScreen() { super(); setOtherScreen(this); device = ADBDevice.init(); if (device != null) { robot = device.getRobot(this); robot.setAutoDelay(10); bounds = device.getBounds(); w = bounds.width; h = bounds.height; } } public boolean isValid() { return null != device; } public ADBDevice getDevice() { return device; } public String toString() { if (null == device) { return "ADBScreen: No Android device attached"; } else { return String.format("ADBScreen: Android device: %s", getDeviceDescription()); } } public String getDeviceDescription() { return String.format("%s (%d x %d)", device.getDeviceSerial(), bounds.width, bounds.height); } public void wakeUp(int seconds) { if (null == device) { return; } if (null == device.isDisplayOn()) { log(-1, "wakeUp: not possible - see log"); return; } if (!device.isDisplayOn()) { device.wakeUp(seconds); if (needsUnLock) { aSwipeUp(); } } } public String exec(String command, String... args) { if (device == null) { return null; } return device.exec(command, args); } //-----------------------------Overrides @Override public IScreen getScreen() { return this; } @Override public void update(EventSubject s) { waitPrompt = false; } @Override public IRobot getRobot() { return robot; } @Override public Rectangle getBounds() { return bounds; } @Override public ScreenImage capture() { return capture(x, y, w, h); } @Override public ScreenImage capture(int x, int y, int w, int h) { ScreenImage simg = null; if (device != null) { log(logLvl, "ADBScreen.capture: (%d,%d) %dx%d", x, y, w, h); simg = device.captureScreen(new Rectangle(x, y, w, h)); } else { log(-1, "capture: no ADBRobot available"); } lastScreenImage = simg; return simg; } @Override public ScreenImage capture(Region reg) { return capture(reg.x, reg.y, reg.w, reg.h); } @Override public ScreenImage capture(Rectangle rect) { return capture(rect.x, rect.y, rect.width, rect.height); } public void showTarget(Location loc) { showTarget(loc, Settings.SlowMotionDelay); } protected void showTarget(Location loc, double secs) { if (Settings.isShowActions()) { ScreenHighlighter overlay = new ScreenHighlighter(this, null); overlay.showTarget(loc, (float) secs); } } @Override public int getID() { return 0; } public String getIDString() { return "Android"; } @Override public ScreenImage getLastScreenImageFromScreen() { return lastScreenImage; } private EventObserver captureObserver = null; @Override public ScreenImage userCapture(final String msg) { if (robot == null) { return null; } waitPrompt = true; Thread th = new Thread() { @Override public void run() { prompt = new OverlayCapturePrompt(ADBScreen.this); prompt.prompt(msg); } }; th.start(); boolean hasShot = false; ScreenImage simg = null; int count = 0; while (!hasShot) { this.wait(0.1f); if (count++ > waitForScreenshot) { break; } if (prompt == null) { continue; } if (prompt.isComplete()) { simg = prompt.getSelection(); if (simg != null) { lastScreenImage = simg; hasShot = true; } prompt.close(); } } prompt.close(); prompt = null; return simg; } @Override public int getIdFromPoint(int srcx, int srcy) { return 0; } public Region newRegion(Location loc, int width, int height) { return new Region(loc.x, loc.y, width, height, this); } public Region newRegion(int _x, int _y, int width, int height) { return new Region(_x, _y, width, height, this); } public Location newLocation(int _x, int _y) { return new Location(_x, _y).setOtherScreen(this); } }