| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * 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.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 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) { |
| 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; |
| mRepeatCount = repeatCount; |
| mMetaState = metaState; |
| mDeviceId = device; |
| mScanCode = scanCode; |
| } |
| |
| public MonkeyKeyEvent(KeyEvent e) { |
| super(EVENT_TYPE_KEY); |
| mKeyEvent = e; |
| } |
| |
| public int getKeyCode() { |
| return mKeyEvent != null ? mKeyEvent.getKeyCode() : mKeyCode; |
| } |
| |
| public int getAction() { |
| return mKeyEvent != null ? mKeyEvent.getAction() : mAction; |
| } |
| |
| public long getDownTime() { |
| return mKeyEvent != null ? mKeyEvent.getDownTime() : mDownTime; |
| } |
| |
| public long getEventTime() { |
| 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; |
| } |
| |
| @Override |
| public boolean isThrottlable() { |
| return (getAction() == KeyEvent.ACTION_UP); |
| } |
| |
| @Override |
| public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) { |
| if (verbose > 1) { |
| String note; |
| if (mAction == KeyEvent.ACTION_UP) { |
| note = "ACTION_UP"; |
| } else { |
| note = "ACTION_DOWN"; |
| } |
| |
| try { |
| System.out.println(":Sending Key (" + note + "): " |
| + mKeyCode + " // " |
| + MonkeySourceRandom.getKeyName(mKeyCode)); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| System.out.println(":Sending Key (" + note + "): " |
| + mKeyCode + " // Unknown key event"); |
| } |
| } |
| |
| 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); |
| } |
| if (!InputManager.getInstance().injectInputEvent(keyEvent, |
| InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT)) { |
| return MonkeyEvent.INJECT_FAIL; |
| } |
| return MonkeyEvent.INJECT_SUCCESS; |
| } |
| } |