From 7dd80c2f7baca1d06379ea79ed33f4fe6d9cc897 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Wed, 11 Apr 2012 16:12:54 -0700 Subject: [PATCH 1/2] Ensure Monkey uses sane timestamps for key events. Bug: 6323659 Change-Id: Idc14c36026bc8d1b612765e2da73e9b618d94ded --- .../commands/monkey/MonkeyKeyEvent.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java index b05c3a7b2..53f230c35 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java @@ -18,7 +18,6 @@ package com.android.commands.monkey; import android.app.IActivityManager; import android.hardware.input.InputManager; -import android.os.RemoteException; import android.os.SystemClock; import android.view.IWindowManager; import android.view.InputDevice; @@ -36,7 +35,7 @@ public class MonkeyKeyEvent extends MonkeyEvent { private int mDeviceId = -1; private long mEventTime = -1; - private KeyEvent keyEvent = null; + private KeyEvent mKeyEvent; public MonkeyKeyEvent(int action, int keycode) { super(EVENT_TYPE_KEY); @@ -46,7 +45,7 @@ public class MonkeyKeyEvent extends MonkeyEvent { public MonkeyKeyEvent(KeyEvent e) { super(EVENT_TYPE_KEY); - keyEvent = e; + mKeyEvent = e; } public MonkeyKeyEvent(long downTime, long eventTime, int action, @@ -113,18 +112,21 @@ public class MonkeyKeyEvent extends MonkeyEvent { } } - long eventTime = mEventTime; - if (eventTime == 0) { - eventTime = SystemClock.uptimeMillis(); + KeyEvent keyEvent = mKeyEvent; + if (keyEvent == null) { + long eventTime = mEventTime; + if (eventTime <= 0) { + eventTime = SystemClock.uptimeMillis(); + } + long downTime = mDownTime; + if (downTime <= 0) { + downTime = eventTime; + } + keyEvent = new KeyEvent(downTime, eventTime, mAction, mKeyCode, + mRepeatCount, mMetaState, mDeviceId, mScancode, + KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD); } - long downTime = mDownTime; - if (downTime == 0) { - downTime = eventTime; - } - KeyEvent newEvent = new KeyEvent(downTime, eventTime, mAction, mKeyCode, - mRepeatCount, mMetaState, mDeviceId, mScancode, - KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD); - if (!InputManager.getInstance().injectInputEvent(newEvent, + if (!InputManager.getInstance().injectInputEvent(keyEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT)) { return MonkeyEvent.INJECT_FAIL; } From 0b28341b2d3464e549dc40f350a57712ea9698e5 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Thu, 26 Apr 2012 12:11:50 -0700 Subject: [PATCH 2/2] Fix Monkey key events. Monkey should not be injecting keys with metastate of -1. Cleaned up the code to ensure it doesn't happen and to make it more obvious what's going on. Bug: 6397645 Change-Id: I7339b2fe14edb0578005f93af1f803a0ae3dec96 --- .../commands/monkey/MonkeyKeyEvent.java | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java index 53f230c35..a73296824 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyKeyEvent.java @@ -21,26 +21,39 @@ import android.hardware.input.InputManager; import android.os.SystemClock; import android.view.IWindowManager; import android.view.InputDevice; +import android.view.KeyCharacterMap; import android.view.KeyEvent; /** * monkey key event */ public class MonkeyKeyEvent extends MonkeyEvent { - private long mDownTime = -1; - private int mMetaState = -1; - private int mAction = -1; - private int mKeyCode = -1; - private int mScancode = -1; - private int mRepeatCount = -1; - private int mDeviceId = -1; - private long mEventTime = -1; + private int mDeviceId; + private long mEventTime; + private long mDownTime; + private int mAction; + private int mKeyCode; + private int mScanCode; + private int mMetaState; + private int mRepeatCount; private KeyEvent mKeyEvent; - public MonkeyKeyEvent(int action, int keycode) { + public MonkeyKeyEvent(int action, int keyCode) { + this(-1, -1, action, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0); + } + + public MonkeyKeyEvent(long downTime, long eventTime, int action, + int keyCode, int repeatCount, int metaState, + int device, int scanCode) { super(EVENT_TYPE_KEY); + mDownTime = downTime; + mEventTime = eventTime; mAction = action; - mKeyCode = keycode; + mKeyCode = keyCode; + mRepeatCount = repeatCount; + mMetaState = metaState; + mDeviceId = device; + mScanCode = scanCode; } public MonkeyKeyEvent(KeyEvent e) { @@ -48,42 +61,33 @@ public class MonkeyKeyEvent extends MonkeyEvent { mKeyEvent = e; } - public MonkeyKeyEvent(long downTime, long eventTime, int action, - int code, int repeat, int metaState, - int device, int scancode) { - super(EVENT_TYPE_KEY); - - mAction = action; - mKeyCode = code; - mMetaState = metaState; - mScancode = scancode; - mRepeatCount = repeat; - mDeviceId = device; - mDownTime = downTime; - mEventTime = eventTime; - } - public int getKeyCode() { - return mKeyCode; + return mKeyEvent != null ? mKeyEvent.getKeyCode() : mKeyCode; } public int getAction() { - return mAction; + return mKeyEvent != null ? mKeyEvent.getAction() : mAction; } public long getDownTime() { - return mDownTime; + return mKeyEvent != null ? mKeyEvent.getDownTime() : mDownTime; } public long getEventTime() { - return mEventTime; + return mKeyEvent != null ? mKeyEvent.getEventTime() : mEventTime; } public void setDownTime(long downTime) { + if (mKeyEvent != null) { + throw new IllegalStateException("Cannot modify down time of this key event."); + } mDownTime = downTime; } public void setEventTime(long eventTime) { + if (mKeyEvent != null) { + throw new IllegalStateException("Cannot modify event time of this key event."); + } mEventTime = eventTime; } @@ -123,7 +127,7 @@ public class MonkeyKeyEvent extends MonkeyEvent { downTime = eventTime; } keyEvent = new KeyEvent(downTime, eventTime, mAction, mKeyCode, - mRepeatCount, mMetaState, mDeviceId, mScancode, + mRepeatCount, mMetaState, mDeviceId, mScanCode, KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD); } if (!InputManager.getInstance().injectInputEvent(keyEvent,