157e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le/* 21194ec356a16f3c6dcf408289e36e42c149d6dc8Kevin Jin * Copyright (C) 2013 DroidDriver committers 357e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * 457e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * Licensed under the Apache License, Version 2.0 (the "License"); 557e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * you may not use this file except in compliance with the License. 657e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * You may obtain a copy of the License at 757e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * 857e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * http://www.apache.org/licenses/LICENSE-2.0 957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * 1057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * Unless required by applicable law or agreed to in writing, software 1157e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * distributed under the License is distributed on an "AS IS" BASIS, 1257e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * See the License for the specific language governing permissions and 1457e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * limitations under the License. 1557e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le */ 1657e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le 171194ec356a16f3c6dcf408289e36e42c149d6dc8Kevin Jinpackage com.google.android.droiddriver.util; 1857e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le 1957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Leimport android.os.SystemClock; 2057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Leimport android.view.InputDevice; 21cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Leimport android.view.KeyEvent; 2257e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Leimport android.view.MotionEvent; 2357e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le 24f50519233078e65a056cff49d7b4989d57c3e750Kevin Jinimport com.google.android.droiddriver.actions.InputInjector; 25f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jinimport com.google.android.droiddriver.exceptions.ActionException; 26f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin 2757e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le/** 2857e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le * Helper methods to create InputEvents. 2957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le */ 3057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Lepublic class Events { 31544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le /** 32544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le * @return a touch down event at the specified coordinates 33544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le */ 3457e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le public static MotionEvent newTouchDownEvent(int x, int y) { 3531692a4134ef82a4144d25980c0c5f14bbf1bfadThanh Le long downTime = SystemClock.uptimeMillis(); 3631692a4134ef82a4144d25980c0c5f14bbf1bfadThanh Le MotionEvent event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 1); 3757e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le event.setSource(InputDevice.SOURCE_TOUCHSCREEN); 3857e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le return event; 3957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le } 4057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le 41544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le /** 42544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le * @return a touch up event at the specified coordinates 43544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le */ 44544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le public static MotionEvent newTouchUpEvent(long downTime, int x, int y) { 45544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le long eventTime = SystemClock.uptimeMillis(); 46544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 1); 47544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le event.setSource(InputDevice.SOURCE_TOUCHSCREEN); 48544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le return event; 49544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le } 50544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le 51544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le /** 52544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le * @return a touch move event at the specified coordinates 53544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le */ 54544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le public static MotionEvent newTouchMoveEvent(long downTime, int x, int y) { 55544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le long eventTime = SystemClock.uptimeMillis(); 56544e68a6af3ef73316b9994bb7a63790c19415b9Thanh Le MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 1); 5757e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le event.setSource(InputDevice.SOURCE_TOUCHSCREEN); 5857e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le return event; 5957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le } 6057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le 61cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le public static KeyEvent newKeyEvent(long downTime, int action, int keyCode) { 62cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le KeyEvent event = new KeyEvent(downTime, downTime, action, keyCode, 0 /* repeat */); 63cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le event.setSource(InputDevice.SOURCE_KEYBOARD); 64cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le return event; 65cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le } 66cce3dd4492cf04a89154e36fda1909ab4e35213aThanh Le 67f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin /** 68f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin * Injects {@code event}. {@code event} is recycled and should not be used 69f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin * after. 70f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin * 71f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin * @throws ActionException if injection failed 72f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin */ 73f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin public static void injectEvent(InputInjector injector, MotionEvent event) { 74c1a957dbec671deb711d2f69cf326dc97f339f66Kevin Jin Logs.call(injector, "injectInputEvent", event); 75f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin try { 76f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin if (!injector.injectInputEvent(event)) { 77f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin throw new ActionException("Failed to inject " + event); 78f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin } 79f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin } finally { 80f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin event.recycle(); 81f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin } 82f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin } 83f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin 84f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin public static long touchDown(InputInjector injector, int x, int y) { 85f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin MotionEvent downEvent = newTouchDownEvent(x, y); 86f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin long downTime = downEvent.getDownTime(); 87f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin injectEvent(injector, downEvent); 88f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin return downTime; 89f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin } 90f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin 91f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin public static void touchUp(InputInjector injector, long downTime, int x, int y) { 92f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin injectEvent(injector, newTouchUpEvent(downTime, x, y)); 93f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin } 94f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin 95f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin public static void touchMove(InputInjector injector, long downTime, int x, int y) { 96f9c6c5063b38b623679e47d7095cccddb0481319Kevin Jin injectEvent(injector, newTouchMoveEvent(downTime, x, y)); 97f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin } 98f9c2a591497874769b87bf492a0666cf853e0ae5Kevin Jin 9957e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le private Events() {} 10057e46577852ffa1dde4662f6018f7fbcfacb6148Thanh Le} 101