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