am 4bff8ab0: Merge change 20840 into donut

Merge commit '4bff8ab0e9073ae537e8a6c4ee8240a6698384f8'

* commit '4bff8ab0e9073ae537e8a6c4ee8240a6698384f8':
  Add "type" command to allow strings to be more easily typed.
This commit is contained in:
Bill Napier
2009-08-12 12:36:19 -07:00
committed by Android Git Automerger
3 changed files with 83 additions and 27 deletions

View File

@@ -87,6 +87,11 @@ The press command is a shortcut for the key command. The keycode
paramter works just like the key command and will automatically send
both the up and the down event.
type string
This command will simulate a user typing the given string on the
keyboard by generating the proper KeyEvents.
OTHER NOTES
There are some convenience features added to allow running without

View File

@@ -33,12 +33,19 @@ public class MonkeyKeyEvent extends MonkeyEvent {
private int mDeviceId = -1;
private long mEventTime = -1;
private KeyEvent keyEvent = null;
public MonkeyKeyEvent(int action, int keycode) {
super(EVENT_TYPE_KEY);
mAction = action;
mKeyCode = keycode;
}
public MonkeyKeyEvent(KeyEvent e) {
super(EVENT_TYPE_KEY);
keyEvent = e;
}
public MonkeyKeyEvent(long downTime, long eventTime, int action,
int code, int repeat, int metaState,
int device, int scancode) {
@@ -82,13 +89,16 @@ public class MonkeyKeyEvent extends MonkeyEvent {
* @return the key event
*/
private KeyEvent getEvent() {
if (mDeviceId < 0) {
return new KeyEvent(mAction, mKeyCode);
if (keyEvent == null) {
if (mDeviceId < 0) {
keyEvent = new KeyEvent(mAction, mKeyCode);
} else {
// for scripts
keyEvent = new KeyEvent(mDownTime, mEventTime, mAction,
mKeyCode, mRepeatCount, mMetaState, mDeviceId, mScancode);
}
}
// for scripts
return new KeyEvent(mDownTime, mEventTime, mAction,
mKeyCode, mRepeatCount, mMetaState, mDeviceId, mScancode);
return keyEvent;
}
@Override

View File

@@ -21,6 +21,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.Log;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -217,7 +218,7 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
try {
sleep = Integer.parseInt(sleepStr);
} catch (NumberFormatException e) {
Log.e(TAG, "Not a number: " + sleepStr, e);
Log.e(TAG, "Not a number: " + sleepStr, e);
}
return new MonkeyThrottleEvent(sleep);
}
@@ -225,6 +226,34 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
}
}
/**
* Command to type a string
*/
private static class TypeCommand implements MonkeyCommand {
// wake
public MonkeyEvent translateCommand(List<String> command,
CommandQueue queue) {
if (command.size() == 2) {
String str = command.get(1);
char[] chars = str.toString().toCharArray();
// Convert the string to an array of KeyEvent's for
// the built in keymap.
KeyCharacterMap keyCharacterMap = KeyCharacterMap.
load(KeyCharacterMap.BUILT_IN_KEYBOARD);
KeyEvent[] events = keyCharacterMap.getEvents(chars);
// enqueue all the events we just got.
for (KeyEvent event : events) {
queue.enqueueEvent(new MonkeyKeyEvent(event));
}
return new MonkeyNoopEvent();
}
return null;
}
}
/**
* Command to wake the device up
*/
@@ -325,6 +354,7 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
COMMAND_MAP.put("wake", new WakeCommand());
COMMAND_MAP.put("tap", new TapCommand());
COMMAND_MAP.put("press", new PressCommand());
COMMAND_MAP.put("type", new TypeCommand());
}
// QUIT command
@@ -400,6 +430,17 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
output = new PrintWriter(s.getOutputStream(), true);
}
/**
* Helper function for commandLineSplit that replaces quoted
* charaters with their real values.
*
* @param input the string to do replacement on.
* @returns the results with the characters replaced.
*/
private static String replaceQuotedChars(String input) {
return input.replace("\\\"", "\"");
}
/**
* This function splits the given line into String parts. It obey's quoted
* strings and returns them as a single part.
@@ -420,22 +461,22 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
String cur = tok.nextToken();
if (!insideQuote && cur.startsWith("\"")) {
// begin quote
quotedWord.append(cur);
quotedWord.append(replaceQuotedChars(cur));
insideQuote = true;
} else if (insideQuote) {
// end quote
if (cur.endsWith("\"")) {
insideQuote = false;
quotedWord.append(cur);
quotedWord.append(" ").append(replaceQuotedChars(cur));
String word = quotedWord.toString();
// trim off the quotes
result.add(word.substring(1, word.length() - 1));
} else {
quotedWord.append(cur);
quotedWord.append(" ").append(replaceQuotedChars(cur));
}
} else {
result.add(cur);
result.add(replaceQuotedChars(cur));
}
}
return result;