aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Fitchett <efitchett@google.com>2014-11-03 09:46:34 -0500
committerEric Fitchett <efitchett@google.com>2014-11-03 09:49:45 -0500
commit337fafc3b2ede7dbd1be4d1ed0bbfdfdbbbd684b (patch)
tree544571bd1ff1aec50ebf5b7648b1ba067ddde68b
parent7972b159331f4fd4cd7a13765452ef0b17d222d3 (diff)
downloaddroiddriver-337fafc3b2ede7dbd1be4d1ed0bbfdfdbbbd684b.tar.gz
Revert "Revert "fix setText and remove replaceText""
This reverts commit ddb7de5a83288bff8e682f08f4b4aa900e335965. The prerequisite for this change has now been checked in as ag/579532 Change-Id: I62f19b235ab62e0cd37d9fdcc0e90f8167eac519
-rw-r--r--src/com/google/android/droiddriver/UiElement.java18
-rw-r--r--src/com/google/android/droiddriver/actions/EventUiElementActor.java5
-rw-r--r--src/com/google/android/droiddriver/actions/SingleKeyAction.java34
-rw-r--r--src/com/google/android/droiddriver/actions/UiElementActor.java7
-rw-r--r--src/com/google/android/droiddriver/actions/accessibility/AccessibilityUiElementActor.java6
-rw-r--r--src/com/google/android/droiddriver/base/BaseUiDevice.java6
-rw-r--r--src/com/google/android/droiddriver/base/BaseUiElement.java35
-rw-r--r--src/com/google/android/droiddriver/util/Events.java32
8 files changed, 87 insertions, 56 deletions
diff --git a/src/com/google/android/droiddriver/UiElement.java b/src/com/google/android/droiddriver/UiElement.java
index 72804d8..f53c22a 100644
--- a/src/com/google/android/droiddriver/UiElement.java
+++ b/src/com/google/android/droiddriver/UiElement.java
@@ -145,20 +145,22 @@ public interface UiElement {
boolean perform(Action action);
/**
- * Sets the text of this element.
+ * Sets the text of this element. The implementation may not work on all
+ * UiElements if the underlying view is not EditText.
+ * <p>
+ * If IME is open after this call, you can call
+ *
+ * <pre>
+ * perform(SingleKeyAction.BACK);
+ * </pre>
+ *
+ * to close the IME.
*
* @param text The text to enter.
*/
void setText(String text);
/**
- * Replace the text of this element.
- *
- * @param text The text that be replaced with
- */
- void replaceText(String text);
-
- /**
* Clicks this element. The click will be at the center of the visible
* element.
*/
diff --git a/src/com/google/android/droiddriver/actions/EventUiElementActor.java b/src/com/google/android/droiddriver/actions/EventUiElementActor.java
index 1913e5d..a5414a9 100644
--- a/src/com/google/android/droiddriver/actions/EventUiElementActor.java
+++ b/src/com/google/android/droiddriver/actions/EventUiElementActor.java
@@ -27,11 +27,6 @@ public class EventUiElementActor implements UiElementActor {
public static final EventUiElementActor INSTANCE = new EventUiElementActor();
@Override
- public void setText(UiElement uiElement, String text) {
- uiElement.perform(new TextAction(text));
- }
-
- @Override
public void click(UiElement uiElement) {
uiElement.perform(ClickAction.SINGLE);
}
diff --git a/src/com/google/android/droiddriver/actions/SingleKeyAction.java b/src/com/google/android/droiddriver/actions/SingleKeyAction.java
index 853840e..3f5fe15 100644
--- a/src/com/google/android/droiddriver/actions/SingleKeyAction.java
+++ b/src/com/google/android/droiddriver/actions/SingleKeyAction.java
@@ -17,12 +17,12 @@
package com.google.android.droiddriver.actions;
import android.os.Build;
-import android.os.SystemClock;
import android.view.KeyEvent;
import com.google.android.droiddriver.UiElement;
import com.google.android.droiddriver.util.Events;
import com.google.android.droiddriver.util.Strings;
+import com.google.android.droiddriver.util.Strings.ToStringHelper;
/**
* An action to press a single key. While it is convenient for navigating the
@@ -39,30 +39,42 @@ public class SingleKeyAction extends KeyAction {
public static final SingleKeyAction SEARCH = new SingleKeyAction(KeyEvent.KEYCODE_SEARCH);
public static final SingleKeyAction BACK = new SingleKeyAction(KeyEvent.KEYCODE_BACK);
public static final SingleKeyAction DELETE = new SingleKeyAction(KeyEvent.KEYCODE_DEL);
+ public static final SingleKeyAction CTRL_MOVE_HOME = new SingleKeyAction(
+ KeyEvent.KEYCODE_MOVE_HOME, KeyEvent.META_CTRL_LEFT_ON);
+ public static final SingleKeyAction CTRL_MOVE_END = new SingleKeyAction(
+ KeyEvent.KEYCODE_MOVE_END, KeyEvent.META_CTRL_LEFT_ON);
private final int keyCode;
+ private final int metaState;
/**
- * Defaults timeoutMillis to 100.
+ * Defaults metaState to 0.
*/
public SingleKeyAction(int keyCode) {
- this(keyCode, 100L, false);
+ this(keyCode, 0);
}
- public SingleKeyAction(int keyCode, long timeoutMillis, boolean checkFocused) {
+ /**
+ * Defaults timeoutMillis to 100 and checkFocused to false.
+ */
+ public SingleKeyAction(int keyCode, int metaState) {
+ this(keyCode, metaState, 100L, false);
+ }
+
+ public SingleKeyAction(int keyCode, int metaState, long timeoutMillis, boolean checkFocused) {
super(timeoutMillis, checkFocused);
this.keyCode = keyCode;
+ this.metaState = metaState;
}
@Override
public boolean perform(InputInjector injector, UiElement element) {
maybeCheckFocused(element);
- final long downTime = SystemClock.uptimeMillis();
- KeyEvent downEvent = Events.newKeyEvent(downTime, KeyEvent.ACTION_DOWN, keyCode);
- KeyEvent upEvent = Events.newKeyEvent(downTime, KeyEvent.ACTION_UP, keyCode);
+ final long downTime = Events.keyDown(injector, keyCode, metaState);
+ Events.keyUp(injector, downTime, keyCode, metaState);
- return injector.injectInputEvent(downEvent) && injector.injectInputEvent(upEvent);
+ return true;
}
@Override
@@ -70,6 +82,10 @@ public class SingleKeyAction extends KeyAction {
String keyCodeString =
Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1 ? String.valueOf(keyCode)
: KeyEvent.keyCodeToString(keyCode);
- return Strings.toStringHelper(this).addValue(keyCodeString).toString();
+ ToStringHelper toStringHelper = Strings.toStringHelper(this);
+ if (metaState != 0) {
+ toStringHelper.add("metaState", metaState);
+ }
+ return toStringHelper.addValue(keyCodeString).toString();
}
}
diff --git a/src/com/google/android/droiddriver/actions/UiElementActor.java b/src/com/google/android/droiddriver/actions/UiElementActor.java
index abca286..80c97f4 100644
--- a/src/com/google/android/droiddriver/actions/UiElementActor.java
+++ b/src/com/google/android/droiddriver/actions/UiElementActor.java
@@ -24,13 +24,6 @@ import com.google.android.droiddriver.scroll.Direction.PhysicalDirection;
*/
public interface UiElementActor {
/**
- * Sets the text of this element.
- *
- * @param text The text to enter.
- */
- void setText(UiElement uiElement, String text);
-
- /**
* Clicks this element. The click will be at the center of the visible
* element.
*/
diff --git a/src/com/google/android/droiddriver/actions/accessibility/AccessibilityUiElementActor.java b/src/com/google/android/droiddriver/actions/accessibility/AccessibilityUiElementActor.java
index dec5979..afb91f1 100644
--- a/src/com/google/android/droiddriver/actions/accessibility/AccessibilityUiElementActor.java
+++ b/src/com/google/android/droiddriver/actions/accessibility/AccessibilityUiElementActor.java
@@ -17,7 +17,6 @@
package com.google.android.droiddriver.actions.accessibility;
import com.google.android.droiddriver.UiElement;
-import com.google.android.droiddriver.actions.TextAction;
import com.google.android.droiddriver.actions.UiElementActor;
import com.google.android.droiddriver.scroll.Direction.PhysicalDirection;
@@ -28,11 +27,6 @@ public class AccessibilityUiElementActor implements UiElementActor {
public static final AccessibilityUiElementActor INSTANCE = new AccessibilityUiElementActor();
@Override
- public void setText(UiElement uiElement, String text) {
- uiElement.perform(new TextAction(text));
- }
-
- @Override
public void click(UiElement uiElement) {
uiElement.perform(AccessibilityClickAction.SINGLE);
}
diff --git a/src/com/google/android/droiddriver/base/BaseUiDevice.java b/src/com/google/android/droiddriver/base/BaseUiDevice.java
index a48e410..d7c5afa 100644
--- a/src/com/google/android/droiddriver/base/BaseUiDevice.java
+++ b/src/com/google/android/droiddriver/base/BaseUiDevice.java
@@ -36,11 +36,11 @@ import java.io.BufferedOutputStream;
*/
public abstract class BaseUiDevice implements UiDevice {
// power off may not trigger new events
- private static final SingleKeyAction POWER_OFF = new SingleKeyAction(KeyEvent.KEYCODE_POWER, 0,
- false);
+ private static final SingleKeyAction POWER_OFF = new SingleKeyAction(KeyEvent.KEYCODE_POWER,
+ 0/* metaState */, 0/* timeoutMillis */, false);
// power on should always trigger new events
private static final SingleKeyAction POWER_ON = new SingleKeyAction(KeyEvent.KEYCODE_POWER,
- 1000L, false);
+ 0/* metaState */, 1000L/* timeoutMillis */, false);
@Override
public boolean isScreenOn() {
diff --git a/src/com/google/android/droiddriver/base/BaseUiElement.java b/src/com/google/android/droiddriver/base/BaseUiElement.java
index ef4038f..2c996f4 100644
--- a/src/com/google/android/droiddriver/base/BaseUiElement.java
+++ b/src/com/google/android/droiddriver/base/BaseUiElement.java
@@ -17,17 +17,21 @@
package com.google.android.droiddriver.base;
import android.graphics.Rect;
+import android.view.KeyEvent;
import com.google.android.droiddriver.UiElement;
import com.google.android.droiddriver.actions.Action;
import com.google.android.droiddriver.actions.EventUiElementActor;
+import com.google.android.droiddriver.actions.InputInjector;
import com.google.android.droiddriver.actions.SingleKeyAction;
+import com.google.android.droiddriver.actions.TextAction;
import com.google.android.droiddriver.actions.UiElementActor;
import com.google.android.droiddriver.exceptions.DroidDriverException;
import com.google.android.droiddriver.finders.Attribute;
import com.google.android.droiddriver.finders.Predicate;
import com.google.android.droiddriver.finders.Predicates;
import com.google.android.droiddriver.scroll.Direction.PhysicalDirection;
+import com.google.android.droiddriver.util.Events;
import com.google.android.droiddriver.util.Logs;
import com.google.android.droiddriver.util.Strings;
import com.google.android.droiddriver.util.Strings.ToStringHelper;
@@ -208,18 +212,29 @@ public abstract class BaseUiElement<R, E extends BaseUiElement<R, E>> implements
@Override
public void setText(String text) {
- uiElementActor.setText(this, text);
+ Logs.call(this, "setText", text);
+ clearText();
+ if (text == null || text.isEmpty()) {
+ return;
+ }
+
+ perform(new TextAction(text));
}
- @Override
- public void replaceText(String text) {
- if (this.getText() != null) {
- int len = this.getText().length();
- for (int i = 0; i < len; i++) {
- this.perform(SingleKeyAction.DELETE);
- }
- }
- this.setText(text);
+ private void clearText() {
+ longClick(); // Gain focus; single click always activates IME.
+ String text = getText();
+ if (text == null || text.isEmpty()) {
+ return;
+ }
+
+ InputInjector injector = getInjector();
+ SingleKeyAction.CTRL_MOVE_HOME.perform(injector, this);
+
+ final long shiftDownTime = Events.keyDown(injector, KeyEvent.KEYCODE_SHIFT_LEFT, 0);
+ SingleKeyAction.CTRL_MOVE_END.perform(injector, this);
+ Events.keyUp(injector, shiftDownTime, KeyEvent.KEYCODE_SHIFT_LEFT, 0);
+ SingleKeyAction.DELETE.perform(injector, this);
}
@Override
diff --git a/src/com/google/android/droiddriver/util/Events.java b/src/com/google/android/droiddriver/util/Events.java
index cc43ec2..a905851 100644
--- a/src/com/google/android/droiddriver/util/Events.java
+++ b/src/com/google/android/droiddriver/util/Events.java
@@ -19,6 +19,7 @@ package com.google.android.droiddriver.util;
import android.os.SystemClock;
import android.util.Log;
import android.view.InputDevice;
+import android.view.InputEvent;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -32,7 +33,7 @@ public class Events {
/**
* @return a touch down event at the specified coordinates
*/
- public static MotionEvent newTouchDownEvent(int x, int y) {
+ private static MotionEvent newTouchDownEvent(int x, int y) {
long downTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 1);
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
@@ -42,7 +43,7 @@ public class Events {
/**
* @return a touch up event at the specified coordinates
*/
- public static MotionEvent newTouchUpEvent(long downTime, int x, int y) {
+ private static MotionEvent newTouchUpEvent(long downTime, int x, int y) {
long eventTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 1);
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
@@ -52,15 +53,16 @@ public class Events {
/**
* @return a touch move event at the specified coordinates
*/
- public static MotionEvent newTouchMoveEvent(long downTime, int x, int y) {
+ private static MotionEvent newTouchMoveEvent(long downTime, int x, int y) {
long eventTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 1);
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
return event;
}
- public static KeyEvent newKeyEvent(long downTime, int action, int keyCode) {
- KeyEvent event = new KeyEvent(downTime, downTime, action, keyCode, 0 /* repeat */);
+ private static KeyEvent newKeyEvent(long downTime, long eventTime, int action, int keyCode,
+ int metaState) {
+ KeyEvent event = new KeyEvent(downTime, eventTime, action, keyCode, 0 /* repeat */, metaState);
event.setSource(InputDevice.SOURCE_KEYBOARD);
return event;
}
@@ -71,18 +73,20 @@ public class Events {
*
* @throws ActionException if injection failed
*/
- public static void injectEvent(InputInjector injector, MotionEvent event) {
+ private static void injectEvent(InputInjector injector, InputEvent event) {
injectEvent(Log.DEBUG, injector, event);
}
- public static void injectEvent(int priority, InputInjector injector, MotionEvent event) {
+ private static void injectEvent(int priority, InputInjector injector, InputEvent event) {
Logs.call(priority, injector, "injectInputEvent", event);
try {
if (!injector.injectInputEvent(event)) {
throw new ActionException("Failed to inject " + event);
}
} finally {
- event.recycle();
+ if (event instanceof MotionEvent) {
+ ((MotionEvent) event).recycle();
+ }
}
}
@@ -101,5 +105,17 @@ public class Events {
injectEvent(Log.VERBOSE, injector, newTouchMoveEvent(downTime, x, y));
}
+ public static long keyDown(InputInjector injector, int keyCode, int metaState) {
+ long downTime = SystemClock.uptimeMillis();
+ KeyEvent downEvent = newKeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN, keyCode, metaState);
+ injectEvent(injector, downEvent);
+ return downTime;
+ }
+
+ public static void keyUp(InputInjector injector, long downTime, int keyCode, int metaState) {
+ injectEvent(injector,
+ newKeyEvent(downTime, SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, keyCode, metaState));
+ }
+
private Events() {}
}