1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.commands.monkey; 18 19 import android.app.IActivityManager; 20 import android.os.RemoteException; 21 import android.os.SystemClock; 22 import android.view.IWindowManager; 23 import android.view.KeyEvent; 24 import android.view.MotionEvent; 25 26 27 /** 28 * monkey motion event 29 */ 30 public class MonkeyMotionEvent extends MonkeyEvent { 31 private long mDownTime = -1; 32 private long mEventTime = -1; 33 private int mAction = -1; 34 private float mX = -1; 35 private float mY = -1; 36 private float mPressure = -1; 37 private float mSize = -1; 38 private int mMetaState = -1; 39 private float mXPrecision = -1; 40 private float mYPrecision = -1; 41 private int mDeviceId = -1; 42 private int mEdgeFlags = -1; 43 44 //If true, this is an intermediate step (more verbose logging, only) 45 private boolean mIntermediateNote; 46 MonkeyMotionEvent(int type, long downAt, int action, float x, float y, int metaState)47 public MonkeyMotionEvent(int type, long downAt, int action, 48 float x, float y, int metaState) { 49 super(type); 50 mDownTime = downAt; 51 mAction = action; 52 mX = x; 53 mY = y; 54 mMetaState = metaState; 55 } 56 MonkeyMotionEvent(int type, long downTime, long eventTime, int action, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags)57 public MonkeyMotionEvent(int type, long downTime, long eventTime, int action, 58 float x, float y, float pressure, float size, int metaState, 59 float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 60 super(type); 61 mDownTime = downTime; 62 mEventTime = eventTime; 63 mAction = action; 64 mX = x; 65 mY = y; 66 mPressure = pressure; 67 mSize = size; 68 mMetaState = metaState; 69 mXPrecision = xPrecision; 70 mYPrecision = yPrecision; 71 mDeviceId = deviceId; 72 mEdgeFlags = edgeFlags; 73 } 74 setIntermediateNote(boolean b)75 public void setIntermediateNote(boolean b) { 76 mIntermediateNote = b; 77 } 78 getIntermediateNote()79 public boolean getIntermediateNote() { 80 return mIntermediateNote; 81 } 82 getX()83 public float getX() { 84 return mX; 85 } 86 getY()87 public float getY() { 88 return mY; 89 } 90 getAction()91 public int getAction() { 92 return mAction; 93 } 94 getDownTime()95 public long getDownTime() { 96 return mDownTime; 97 } 98 getEventTime()99 public long getEventTime() { 100 return mEventTime; 101 } 102 setDownTime(long downTime)103 public void setDownTime(long downTime) { 104 mDownTime = downTime; 105 } 106 setEventTime(long eventTime)107 public void setEventTime(long eventTime) { 108 mEventTime = eventTime; 109 } 110 111 /** 112 * 113 * @return instance of a motion event 114 */ getEvent()115 private MotionEvent getEvent() { 116 if (mDeviceId < 0) { 117 return MotionEvent.obtain(mDownTime, SystemClock.uptimeMillis(), 118 mAction, mX, mY, mMetaState); 119 } 120 121 // for scripts 122 return MotionEvent.obtain(mDownTime, mEventTime, 123 mAction, mX, mY, mPressure, mSize, mMetaState, 124 mXPrecision, mYPrecision, mDeviceId, mEdgeFlags); 125 } 126 127 @Override isThrottlable()128 public boolean isThrottlable() { 129 return (getAction() == KeyEvent.ACTION_UP); 130 } 131 132 @Override injectEvent(IWindowManager iwm, IActivityManager iam, int verbose)133 public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) { 134 135 String note; 136 if ((verbose > 0 && !mIntermediateNote) || verbose > 1) { 137 if (mAction == MotionEvent.ACTION_DOWN) { 138 note = "DOWN"; 139 } else if (mAction == MotionEvent.ACTION_UP) { 140 note = "UP"; 141 } else { 142 note = "MOVE"; 143 } 144 System.out.println(":Sending Pointer ACTION_" + note + 145 " x=" + mX + " y=" + mY); 146 } 147 try { 148 int type = this.getEventType(); 149 MotionEvent me = getEvent(); 150 151 if ((type == MonkeyEvent.EVENT_TYPE_POINTER && 152 !iwm.injectPointerEvent(me, false)) 153 || (type == MonkeyEvent.EVENT_TYPE_TRACKBALL && 154 !iwm.injectTrackballEvent(me, false))) { 155 return MonkeyEvent.INJECT_FAIL; 156 } 157 } catch (RemoteException ex) { 158 return MonkeyEvent.INJECT_ERROR_REMOTE_EXCEPTION; 159 } 160 return MonkeyEvent.INJECT_SUCCESS; 161 } 162 } 163