| package com.android.testing.uiautomation; |
| |
| import android.content.Context; |
| import android.os.RemoteException; |
| import android.os.ServiceManager; |
| import android.os.SystemClock; |
| import android.util.Log; |
| import android.view.IWindowManager; |
| import android.view.KeyCharacterMap; |
| import android.view.KeyEvent; |
| import android.view.MotionEvent; |
| |
| public class InteractionProvider { |
| |
| private static final String LOGTAG = "InteractionProvider"; |
| private IWindowManager mWm; |
| private long mEventThrottle = 10; |
| |
| public InteractionProvider() { |
| mWm = IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); |
| if (mWm == null) { |
| throw new RuntimeException("Unable to connect to WindowManager, " |
| + "is the system running?"); |
| } |
| } |
| |
| public boolean tap(int x, int y) { |
| MotionEvent event = MotionEvent.obtain( |
| SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), |
| MotionEvent.ACTION_DOWN, x, y, 0); |
| |
| boolean ret = true; |
| try { |
| mWm.injectPointerEvent(event, false); |
| } catch (RemoteException e) { |
| Log.w(LOGTAG, "failed to inject DOWN event", e); |
| ret = false; |
| } |
| doEventThrottle(); |
| event.setAction(MotionEvent.ACTION_UP); |
| try { |
| mWm.injectPointerEvent(event, false); |
| } catch (RemoteException e) { |
| Log.w(LOGTAG, "failed to inject UP event", e); |
| ret = false; |
| } |
| return ret; |
| } |
| |
| public boolean sendText(String text) { |
| if (text == null) { |
| return false; |
| } |
| boolean ret = true; |
| KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); |
| |
| KeyEvent[] events = keyCharacterMap.getEvents(text.toCharArray()); |
| |
| if (events != null) { |
| for (int i = 0; i < events.length; i++) { |
| ret &= sendKey(events[i]); |
| doEventThrottle(); |
| } |
| } |
| return ret; |
| } |
| |
| public boolean sendKey(KeyEvent event) { |
| boolean ret = true; |
| try { |
| mWm.injectKeyEvent(event, false); |
| } catch (RemoteException e) { |
| ret = false; |
| } |
| return ret; |
| } |
| |
| public void setEventThrottle(long millis) { |
| mEventThrottle = millis; |
| } |
| |
| private void doEventThrottle() { |
| try { |
| Thread.sleep(mEventThrottle); |
| } catch (InterruptedException e) { |
| } |
| } |
| } |