Support to generate screen rotation events.

Bug: 6086016
Use "--pct-rotation <percentage>" to set the percentage.

Change-Id: If16fac45399ad50b25e211f2788a02fdc03c44b4
This commit is contained in:
Ying Wang
2012-03-14 16:05:41 -07:00
parent 26464cc1e0
commit 46b674174b
5 changed files with 140 additions and 13 deletions

View File

@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserId;
import android.view.IWindowManager;
import android.view.Surface;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -204,6 +205,8 @@ public class Monkey {
long mDroppedFlipEvents = 0;
long mDroppedRotationEvents = 0;
/** The delay between user actions. This is for the scripted monkey. **/
long mProfileWaitTime = 5000;
@@ -608,7 +611,15 @@ public class Monkey {
}
mNetworkMonitor.start();
int crashedAtCycle = runMonkeyCycles();
int crashedAtCycle = 0;
try {
crashedAtCycle = runMonkeyCycles();
} finally {
// Release the rotation lock if it's still held and restore the
// original orientation.
new MonkeyRotationEvent(Surface.ROTATION_0, false).injectEvent(
mWm, mAm, mVerbose);
}
mNetworkMonitor.stop();
synchronized (this) {
@@ -662,7 +673,9 @@ public class Monkey {
System.out.print(" trackballs=");
System.out.print(mDroppedTrackballEvents);
System.out.print(" flips=");
System.out.println(mDroppedFlipEvents);
System.out.print(mDroppedFlipEvents);
System.out.print(" rotations=");
System.out.println(mDroppedRotationEvents);
}
// report network stats
@@ -726,6 +739,9 @@ public class Monkey {
} else if (opt.equals("--pct-trackball")) {
int i = MonkeySourceRandom.FACTOR_TRACKBALL;
mFactors[i] = -nextOptionLong("trackball events percentage");
} else if (opt.equals("--pct-rotation")) {
int i = MonkeySourceRandom.FACTOR_ROTATION;
mFactors[i] = -nextOptionLong("screen rotation events percentage");
} else if (opt.equals("--pct-syskeys")) {
int i = MonkeySourceRandom.FACTOR_SYSOPS;
mFactors[i] = -nextOptionLong("system (key) operations percentage");
@@ -1082,6 +1098,8 @@ public class Monkey {
mDroppedPointerEvents++;
} else if (ev instanceof MonkeyFlipEvent) {
mDroppedFlipEvents++;
} else if (ev instanceof MonkeyRotationEvent) {
mDroppedRotationEvents++;
}
} else if (injectCode == MonkeyEvent.INJECT_ERROR_REMOTE_EXCEPTION) {
systemCrashed = true;

View File

@@ -27,10 +27,11 @@ public abstract class MonkeyEvent {
public static final int EVENT_TYPE_KEY = 0;
public static final int EVENT_TYPE_TOUCH = 1;
public static final int EVENT_TYPE_TRACKBALL = 2;
public static final int EVENT_TYPE_ACTIVITY = 3;
public static final int EVENT_TYPE_FLIP = 4; // Keyboard flip
public static final int EVENT_TYPE_THROTTLE = 5;
public static final int EVENT_TYPE_NOOP = 6;
public static final int EVENT_TYPE_ROTATION = 3; // Screen rotation
public static final int EVENT_TYPE_ACTIVITY = 4;
public static final int EVENT_TYPE_FLIP = 5; // Keyboard flip
public static final int EVENT_TYPE_THROTTLE = 6;
public static final int EVENT_TYPE_NOOP = 7;
public static final int INJECT_SUCCESS = 1;
public static final int INJECT_FAIL = 0;

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.commands.monkey;
import android.app.IActivityManager;
import android.os.RemoteException;
import android.view.IWindowManager;
/**
* monkey screen rotation event
*/
public class MonkeyRotationEvent extends MonkeyEvent {
private final int mRotationDegree;
private final boolean mPersist;
/**
* Construct a rotation Event.
*
* @param degree Possible rotation degrees, see constants in
* anroid.view.Suface.
* @param persist Should we keep the rotation lock after the orientation
* change.
*/
public MonkeyRotationEvent(int degree, boolean persist) {
super(EVENT_TYPE_ROTATION);
mRotationDegree = degree;
mPersist = persist;
}
@Override
public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) {
if (verbose > 0) {
System.out.println(":Sending rotation degree=" + mRotationDegree +
", persist=" + mPersist);
}
// inject rotation event
try {
iwm.freezeRotation(mRotationDegree);
if (!mPersist) {
iwm.thawRotation();
}
return MonkeyEvent.INJECT_SUCCESS;
} catch (RemoteException ex) {
return MonkeyEvent.INJECT_ERROR_REMOTE_EXCEPTION;
}
}
}

View File

@@ -23,6 +23,7 @@ import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.WindowManagerImpl;
import java.util.ArrayList;
@@ -63,18 +64,26 @@ public class MonkeySourceRandom implements MonkeyEventSource {
PHYSICAL_KEY_EXISTS[SYS_KEYS[i]] = KeyCharacterMap.deviceHasKey(SYS_KEYS[i]);
}
}
/** Possible screen rotation degrees **/
private static final int[] SCREEN_ROTATION_DEGREES = {
Surface.ROTATION_0,
Surface.ROTATION_90,
Surface.ROTATION_180,
Surface.ROTATION_270,
};
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_NAV = 4;
public static final int FACTOR_MAJORNAV = 5;
public static final int FACTOR_SYSOPS = 6;
public static final int FACTOR_APPSWITCH = 7;
public static final int FACTOR_FLIP = 8;
public static final int FACTOR_ANYTHING = 9;
public static final int FACTORZ_COUNT = 10; // should be last+1
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
private static final int GESTURE_TAP = 0;
private static final int GESTURE_DRAG = 1;
@@ -116,6 +125,8 @@ public class MonkeySourceRandom implements MonkeyEventSource {
mFactors[FACTOR_TOUCH] = 15.0f;
mFactors[FACTOR_MOTION] = 10.0f;
mFactors[FACTOR_TRACKBALL] = 15.0f;
// Adjust the values if we want to enable rotation by default.
mFactors[FACTOR_ROTATION] = 0.0f;
mFactors[FACTOR_NAV] = 25.0f;
mFactors[FACTOR_MAJORNAV] = 15.0f;
mFactors[FACTOR_SYSOPS] = 2.0f;
@@ -369,6 +380,18 @@ public class MonkeySourceRandom implements MonkeyEventSource {
}
}
/**
* Generates a random screen rotation event.
*
* @param random Random number source for rotation degree.
*/
private void generateRotationEvent(Random random) {
mQ.addLast(new MonkeyRotationEvent(
SCREEN_ROTATION_DEGREES[random.nextInt(
SCREEN_ROTATION_DEGREES.length)],
random.nextBoolean()));
}
/**
* generate a random event based on mFactor
*/
@@ -388,6 +411,9 @@ public class MonkeySourceRandom implements MonkeyEventSource {
} else if (cls < mFactors[FACTOR_TRACKBALL]) {
generateTrackballEvent(mRandom);
return;
} else if (cls < mFactors[FACTOR_ROTATION]) {
generateRotationEvent(mRandom);
return;
}
// The remaining event categories are injected as key events

View File

@@ -20,6 +20,7 @@ import android.content.ComponentName;
import android.os.SystemClock;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import java.io.BufferedReader;
import java.io.DataInputStream;
@@ -85,6 +86,8 @@ public class MonkeySourceScript implements MonkeyEventSource {
private static final String EVENT_KEYWORD_TRACKBALL = "DispatchTrackball";
private static final String EVENT_KEYWORD_ROTATION = "RotateScreen";
private static final String EVENT_KEYWORD_KEY = "DispatchKey";
private static final String EVENT_KEYWORD_FLIP = "DispatchFlip";
@@ -299,6 +302,23 @@ public class MonkeySourceScript implements MonkeyEventSource {
return;
}
// Handle screen rotation events
if ((s.indexOf(EVENT_KEYWORD_ROTATION) >= 0) && args.length == 2) {
try {
int rotationDegree = Integer.parseInt(args[0]);
int persist = Integer.parseInt(args[1]);
if ((rotationDegree == Surface.ROTATION_0) ||
(rotationDegree == Surface.ROTATION_90) ||
(rotationDegree == Surface.ROTATION_180) ||
(rotationDegree == Surface.ROTATION_270)) {
mQ.addLast(new MonkeyRotationEvent(rotationDegree,
persist != 0));
}
} catch (NumberFormatException e) {
}
return;
}
// Handle tap event
if ((s.indexOf(EVENT_KEYWORD_TAP) >= 0) && args.length >= 2) {
try {