diff options
author | Ying Wang <wangying@google.com> | 2010-10-01 10:48:30 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-01 10:48:30 -0700 |
commit | 58c636c9bce624b8cdd33c910d4eb39b856a520d (patch) | |
tree | 12016046e60d2d5bbfee6b22aaf43a6ee12718ae /cmds | |
parent | 284e1954274b708f3cf60ab82cdabe0f4c31d141 (diff) | |
parent | 45550faad0f683d1393ea20144246ed43fc19899 (diff) | |
download | android_development-58c636c9bce624b8cdd33c910d4eb39b856a520d.tar.gz android_development-58c636c9bce624b8cdd33c910d4eb39b856a520d.tar.bz2 android_development-58c636c9bce624b8cdd33c910d4eb39b856a520d.zip |
am 45550faa: Merge "Don\'t send non-existent system keys." into gingerbread
Merge commit '45550faad0f683d1393ea20144246ed43fc19899' into gingerbread-plus-aosp
* commit '45550faad0f683d1393ea20144246ed43fc19899':
Don't send non-existent system keys.
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java | 80 |
1 files changed, 60 insertions, 20 deletions
diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java index 92acc7e20..f1edae11c 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java @@ -19,6 +19,7 @@ package com.android.commands.monkey; import android.content.ComponentName; import android.os.SystemClock; import android.view.Display; +import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.WindowManagerImpl; @@ -50,6 +51,18 @@ public class MonkeySourceRandom implements MonkeyEventSource { KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_MUTE, }; + /** If a physical key exists? */ + private static final boolean[] PHYSICAL_KEY_EXISTS = new boolean[KeyEvent.getMaxKeyCode() + 1]; + static { + for (int i = 0; i < PHYSICAL_KEY_EXISTS.length; ++i) { + PHYSICAL_KEY_EXISTS[i] = true; + } + // Only examine SYS_KEYS + for (int i = 0; i < SYS_KEYS.length; ++i) { + PHYSICAL_KEY_EXISTS[SYS_KEYS[i]] = KeyCharacterMap.deviceHasKey(SYS_KEYS[i]); + } + } + /** Nice names for all key events. */ private static final String[] KEY_NAMES = { "KEYCODE_UNKNOWN", @@ -282,7 +295,6 @@ public class MonkeySourceRandom implements MonkeyEventSource { } // if verbose, show factors - if (mVerbose > 0) { System.out.println("// Event percentages:"); for (int i = 0; i < FACTORZ_COUNT; ++i) { @@ -290,6 +302,10 @@ public class MonkeySourceRandom implements MonkeyEventSource { } } + if (!validateKeys()) { + return false; + } + // finally, normalize and convert to running sum float sum = 0.0f; for (int i = 0; i < FACTORZ_COUNT; ++i) { @@ -299,6 +315,28 @@ public class MonkeySourceRandom implements MonkeyEventSource { return true; } + private static boolean validateKeyCategory(String catName, int[] keys, float factor) { + if (factor < 0.1f) { + return true; + } + for (int i = 0; i < keys.length; ++i) { + if (PHYSICAL_KEY_EXISTS[keys[i]]) { + return true; + } + } + System.err.println("** " + catName + " has no physical keys but with factor " + factor + "%."); + return false; + } + + /** + * See if any key exists for non-zero factors. + */ + private boolean validateKeys() { + return validateKeyCategory("NAV_KEYS", NAV_KEYS, mFactors[FACTOR_NAV]) + && validateKeyCategory("MAJOR_NAV_KEYS", MAJOR_NAV_KEYS, mFactors[FACTOR_MAJORNAV]) + && validateKeyCategory("SYS_KEYS", SYS_KEYS, mFactors[FACTOR_SYSOPS]); + } + /** * set the factors * @@ -441,25 +479,27 @@ public class MonkeySourceRandom implements MonkeyEventSource { } // The remaining event categories are injected as key events - if (cls < mFactors[FACTOR_NAV]) { - lastKey = NAV_KEYS[mRandom.nextInt(NAV_KEYS.length)]; - } else if (cls < mFactors[FACTOR_MAJORNAV]) { - lastKey = MAJOR_NAV_KEYS[mRandom.nextInt(MAJOR_NAV_KEYS.length)]; - } else if (cls < mFactors[FACTOR_SYSOPS]) { - lastKey = SYS_KEYS[mRandom.nextInt(SYS_KEYS.length)]; - } else if (cls < mFactors[FACTOR_APPSWITCH]) { - MonkeyActivityEvent e = new MonkeyActivityEvent(mMainApps.get( - mRandom.nextInt(mMainApps.size()))); - mQ.addLast(e); - return; - } else if (cls < mFactors[FACTOR_FLIP]) { - MonkeyFlipEvent e = new MonkeyFlipEvent(mKeyboardOpen); - mKeyboardOpen = !mKeyboardOpen; - mQ.addLast(e); - return; - } else { - lastKey = 1 + mRandom.nextInt(KeyEvent.getMaxKeyCode() - 1); - } + do { + if (cls < mFactors[FACTOR_NAV]) { + lastKey = NAV_KEYS[mRandom.nextInt(NAV_KEYS.length)]; + } else if (cls < mFactors[FACTOR_MAJORNAV]) { + lastKey = MAJOR_NAV_KEYS[mRandom.nextInt(MAJOR_NAV_KEYS.length)]; + } else if (cls < mFactors[FACTOR_SYSOPS]) { + lastKey = SYS_KEYS[mRandom.nextInt(SYS_KEYS.length)]; + } else if (cls < mFactors[FACTOR_APPSWITCH]) { + MonkeyActivityEvent e = new MonkeyActivityEvent(mMainApps.get( + mRandom.nextInt(mMainApps.size()))); + mQ.addLast(e); + return; + } else if (cls < mFactors[FACTOR_FLIP]) { + MonkeyFlipEvent e = new MonkeyFlipEvent(mKeyboardOpen); + mKeyboardOpen = !mKeyboardOpen; + mQ.addLast(e); + return; + } else { + lastKey = 1 + mRandom.nextInt(KeyEvent.getMaxKeyCode() - 1); + } + } while (!PHYSICAL_KEY_EXISTS[lastKey]); MonkeyKeyEvent e = new MonkeyKeyEvent(KeyEvent.ACTION_DOWN, lastKey); mQ.addLast(e); |