diff options
author | Ying Wang <wangying@google.com> | 2013-05-10 18:37:11 -0700 |
---|---|---|
committer | Ying Wang <wangying@google.com> | 2013-05-14 11:10:13 -0700 |
commit | 47937eb6b2669060da7526cf66a3d9e4f6e35244 (patch) | |
tree | 14cb8b0f58d4e0216bf8bf39f95f7dbaf288047e /cmds/monkey | |
parent | 51b656b597d67cc963779a47341dc859d1cb862c (diff) | |
download | android_development-47937eb6b2669060da7526cf66a3d9e4f6e35244.tar.gz android_development-47937eb6b2669060da7526cf66a3d9e4f6e35244.tar.bz2 android_development-47937eb6b2669060da7526cf66a3d9e4f6e35244.zip |
Monkey support for swipes from the sides of a device.
Bug: 8446772
Change-Id: I875f7bd083e275cce877e2168b5f580dd1d03dcd
Diffstat (limited to 'cmds/monkey')
3 files changed, 113 insertions, 14 deletions
diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java index a2655e159..d878bda6d 100644 --- a/cmds/monkey/src/com/android/commands/monkey/Monkey.java +++ b/cmds/monkey/src/com/android/commands/monkey/Monkey.java @@ -812,6 +812,9 @@ public class Monkey { } else if (opt.equals("--pct-pinchzoom")) { int i = MonkeySourceRandom.FACTOR_PINCHZOOM; mFactors[i] = -nextOptionLong("pinch zoom events percentage"); + } else if (opt.equals("--pct-fling")) { + int i = MonkeySourceRandom.FACTOR_FLING; + mFactors[i] = -nextOptionLong("fling events percentage"); } else if (opt.equals("--pkg-blacklist-file")) { mPkgBlacklistFile = nextOptionData(); } else if (opt.equals("--pkg-whitelist-file")) { @@ -1350,7 +1353,8 @@ public class Monkey { usage.append(" [--pct-trackball PERCENT] [--pct-syskeys PERCENT]\n"); usage.append(" [--pct-nav PERCENT] [--pct-majornav PERCENT]\n"); usage.append(" [--pct-appswitch PERCENT] [--pct-flip PERCENT]\n"); - usage.append(" [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]\n"); + usage.append(" [--pct-pinchzoom PERCENT] [--pct-fling PERCENT]\n"); + usage.append(" [--pct-anyevent PERCENT]\n"); usage.append(" [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]\n"); usage.append(" [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]\n"); usage.append(" [--wait-dbg] [--dbg-no-events]\n"); diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java index a7f538d85..7d9d0450d 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java @@ -75,19 +75,21 @@ public class MonkeySourceRandom implements MonkeyEventSource { public static final int FACTOR_TOUCH = 0; public static final int FACTOR_MOTION = 1; public static final int FACTOR_PINCHZOOM = 2; - public static final int FACTOR_TRACKBALL = 3; - public static final int FACTOR_ROTATION = 4; - public static final int FACTOR_NAV = 5; - public static final int FACTOR_MAJORNAV = 6; - public static final int FACTOR_SYSOPS = 7; - public static final int FACTOR_APPSWITCH = 8; - public static final int FACTOR_FLIP = 9; - public static final int FACTOR_ANYTHING = 10; - public static final int FACTORZ_COUNT = 11; // should be last+1 + public static final int FACTOR_FLING = 3; + public static final int FACTOR_TRACKBALL = 4; + public static final int FACTOR_ROTATION = 5; + public static final int FACTOR_NAV = 6; + public static final int FACTOR_MAJORNAV = 7; + public static final int FACTOR_SYSOPS = 8; + public static final int FACTOR_APPSWITCH = 9; + public static final int FACTOR_FLIP = 10; + public static final int FACTOR_ANYTHING = 11; + public static final int FACTORZ_COUNT = 12; // should be last+1 private static final int GESTURE_TAP = 0; private static final int GESTURE_DRAG = 1; private static final int GESTURE_PINCH_OR_ZOOM = 2; + private static final int GESTURE_FLING = 3; /** percentages for each type of event. These will be remapped to working * values after we read any optional values. @@ -132,8 +134,9 @@ public class MonkeySourceRandom implements MonkeyEventSource { mFactors[FACTOR_SYSOPS] = 2.0f; mFactors[FACTOR_APPSWITCH] = 2.0f; mFactors[FACTOR_FLIP] = 1.0f; - mFactors[FACTOR_ANYTHING] = 13.0f; + mFactors[FACTOR_ANYTHING] = 11.0f; mFactors[FACTOR_PINCHZOOM] = 2.0f; + mFactors[FACTOR_FLING] = 2.0f; mRandom = random; mMainApps = MainApps; @@ -259,12 +262,37 @@ public class MonkeySourceRandom implements MonkeyEventSource { * */ private void generatePointerEvent(Random random, int gesture) { - Display display = DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); + Display display = DisplayManagerGlobal.getInstance().getRealDisplay( + Display.DEFAULT_DISPLAY); + + if (gesture == GESTURE_FLING) { + PointF start, end; + // 1 out of 10 is up-and-down fling and the rest are left-and-right flings. + if (random.nextInt(10) == 0) { + if (random.nextInt(2) == 0) { + start = new PointF(display.getWidth()/2, display.getHeight()); + end = new PointF(display.getWidth()/2, 0); + } else { + start = new PointF(display.getWidth()/2, 0); + end = new PointF(display.getWidth()/2, display.getHeight()); + } + } else { + if (random.nextInt(2) == 0) { + start = new PointF(0, display.getHeight()/2); + end = new PointF(display.getWidth(), display.getHeight()/2); + } else { + start = new PointF(display.getWidth(), display.getHeight()/2); + end = new PointF(0, display.getHeight()/2); + } + } - PointF p1 = randomPoint(random, display); - PointF v1 = randomVector(random); + generateFlingEvents(start, end, mQ); + return; + } long downAt = SystemClock.uptimeMillis(); + PointF p1 = randomPoint(random, display); + PointF v1 = randomVector(random); mQ.addLast(new MonkeyTouchEvent(MotionEvent.ACTION_DOWN) .setDownTime(downAt) @@ -336,6 +364,56 @@ public class MonkeySourceRandom implements MonkeyEventSource { } /** + * Generates a fling event. This method counts a down, move, and up as multiple events. + * + * @param start The starting point. + * @param end The ending point. + * @param q The event queue to hold the results. + * + */ + static void generateFlingEvents(PointF start, PointF end, MonkeyEventQueue q) { + // Experiments showed 20 is a good step length while a random step between 0 and 50 + // doesn't work well. + float step = 20.0f; + float xSpan = Math.abs(end.x - start.x); + float ySpan = Math.abs(end.y - start.y); + float segNum, xInc, yInc; + if (xSpan > ySpan) { + segNum = xSpan / step; + if (segNum < 1.0f) { + return; + } + xInc = end.x > start.x ? step : -step; + yInc = (end.y - start.y) / segNum; + } else { + segNum = ySpan / step; + if (segNum < 1.0f) { + return; + } + yInc = end.y > start.y ? step : -step; + xInc = (end.x - start.x) / segNum; + } + long downAt = SystemClock.uptimeMillis(); + q.addLast(new MonkeyTouchEvent(MotionEvent.ACTION_DOWN) + .setDownTime(downAt) + .addPointer(0, start.x, start.y) + .setIntermediateNote(false)); + PointF point = new PointF(start.x, start.y); + for (float i = 1.0f; i < segNum; i++) { + point.x += xInc; + point.y += yInc; + q.addLast(new MonkeyTouchEvent(MotionEvent.ACTION_MOVE) + .setDownTime(downAt) + .addPointer(0, point.x, point.y) + .setIntermediateNote(true)); + } + q.addLast(new MonkeyTouchEvent(MotionEvent.ACTION_UP) + .setDownTime(downAt) + .addPointer(0, end.x, end.y) + .setIntermediateNote(false)); + } + + /** * Generates a random trackball event. This consists of a sequence of small moves, followed by * an optional single click. * @@ -404,6 +482,9 @@ public class MonkeySourceRandom implements MonkeyEventSource { } else if (cls < mFactors[FACTOR_PINCHZOOM]) { generatePointerEvent(mRandom, GESTURE_PINCH_OR_ZOOM); return; + } else if (cls < mFactors[FACTOR_FLING]) { + generatePointerEvent(mRandom, GESTURE_FLING); + return; } else if (cls < mFactors[FACTOR_TRACKBALL]) { generateTrackballEvent(mRandom); return; diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java index 59aeb5599..bebcf0125 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java @@ -17,6 +17,7 @@ package com.android.commands.monkey; import android.content.ComponentName; +import android.graphics.PointF; import android.os.SystemClock; import android.view.KeyEvent; import android.view.MotionEvent; @@ -127,6 +128,8 @@ public class MonkeySourceScript implements MonkeyEventSource { private static final String EVENT_KEYWORD_PINCH_ZOOM = "PinchZoom"; + private static final String EVENT_KEYWORD_FLING = "Fling"; + private static final String EVENT_KEYWORD_START_FRAMERATE_CAPTURE = "StartCaptureFramerate"; private static final String EVENT_KEYWORD_END_FRAMERATE_CAPTURE = "EndCaptureFramerate"; @@ -586,6 +589,17 @@ public class MonkeySourceScript implements MonkeyEventSource { } } + // Handle fling action + if ((s.indexOf(EVENT_KEYWORD_FLING) >= 0) && args.length == 4) { + float xStart = Float.parseFloat(args[0]); + float yStart = Float.parseFloat(args[1]); + float xEnd = Float.parseFloat(args[2]); + float yEnd = Float.parseFloat(args[3]); + PointF start = new PointF(xStart, yStart); + PointF end = new PointF(xEnd, yEnd); + MonkeySourceRandom.generateFlingEvents(start, end, mQ); + } + // Handle flip events if (s.indexOf(EVENT_KEYWORD_FLIP) >= 0 && args.length == 1) { boolean keyboardOpen = Boolean.parseBoolean(args[0]); |