package com.robotium.solo; import android.app.Instrumentation; import android.os.SystemClock; import android.view.InputDevice; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; import java.util.ArrayList; /** * A class that draws Illustrations to the screen * * @author Jake Kuli, 3kajjak3@gmail.com */ class Illustrator { private Instrumentation inst; public Illustrator(Instrumentation inst) { this.inst = inst; } public void illustrate(Illustration illustration) { if (illustration == null || illustration.getPoints().isEmpty()) { throw new IllegalArgumentException("Illustration must not be null and requires at least one point."); } MotionEvent event; int currentAction; long downTime = SystemClock.uptimeMillis(); long eventTime = SystemClock.uptimeMillis(); PointerCoords[] coords = new PointerCoords[1]; PointerCoords coord = new PointerCoords(); PointerProperties[] properties = new PointerProperties[1]; PointerProperties prop = new PointerProperties(); prop.id = 0; prop.toolType = illustration.getToolType(); properties[0] = prop; coords[0] = coord; ArrayList<PressurePoint> points = illustration.getPoints(); for (int i = 0; i < points.size(); i++) { PressurePoint currentPoint = points.get(i); coord.x = currentPoint.x; coord.y = currentPoint.y; coord.pressure = currentPoint.pressure; coord.size = 1; if (i == 0) { currentAction = MotionEvent.ACTION_DOWN; } else { currentAction = MotionEvent.ACTION_MOVE; } eventTime = SystemClock.uptimeMillis(); event = MotionEvent.obtain(downTime, eventTime, currentAction, 1, properties, coords, 0, 0, 1, 1, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0); try { inst.sendPointerSync(event); } catch (SecurityException ignored) {} } currentAction = MotionEvent.ACTION_UP; coords[0] = coord; PressurePoint currentPoint = points.get(points.size() - 1); coord.x = currentPoint.x; coord.y = currentPoint.y; coord.pressure = currentPoint.pressure; coord.size = 1; eventTime = SystemClock.uptimeMillis(); event = MotionEvent.obtain(downTime, eventTime, currentAction, 1, properties, coords, 0, 0, 1, 1, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0); try { inst.sendPointerSync(event); } catch (SecurityException ignored) {} } }