diff options
Diffstat (limited to 'src/io/appium/droiddriver/actions/SingleKeyAction.java')
-rw-r--r-- | src/io/appium/droiddriver/actions/SingleKeyAction.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/io/appium/droiddriver/actions/SingleKeyAction.java b/src/io/appium/droiddriver/actions/SingleKeyAction.java new file mode 100644 index 0000000..e5a8268 --- /dev/null +++ b/src/io/appium/droiddriver/actions/SingleKeyAction.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2013 DroidDriver committers + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.appium.droiddriver.actions; + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.os.Build; +import android.view.KeyEvent; + +import io.appium.droiddriver.UiElement; +import io.appium.droiddriver.util.Events; +import io.appium.droiddriver.util.Strings; +import io.appium.droiddriver.util.Strings.ToStringHelper; + +/** + * An action to press a single key. While it is convenient for navigating the UI, do not overuse it + * - the application may interpret key codes in a custom way and, more importantly, application + * users may not have access to it because the device (physical or virtual keyboard) may not support + * all key codes. + */ +public class SingleKeyAction extends KeyAction { + // Common instances for convenience and memory preservation. + public static final SingleKeyAction MENU = new SingleKeyAction(KeyEvent.KEYCODE_MENU); + 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); + /** Requires SDK API 11 or higher */ + @SuppressLint("InlinedApi") + public static final SingleKeyAction CTRL_MOVE_HOME = new SingleKeyAction( + KeyEvent.KEYCODE_MOVE_HOME, KeyEvent.META_CTRL_LEFT_ON); + /** Requires SDK API 11 or higher */ + @SuppressLint("InlinedApi") + 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 metaState to 0 */ + public SingleKeyAction(int keyCode) { + this(keyCode, 0); + } + + /** 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 = Events.keyDown(injector, keyCode, metaState); + Events.keyUp(injector, downTime, keyCode, metaState); + + return true; + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) + @Override + public String toString() { + String keyCodeString = + Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1 ? String.valueOf(keyCode) + : KeyEvent.keyCodeToString(keyCode); + ToStringHelper toStringHelper = Strings.toStringHelper(this); + if (metaState != 0) { + toStringHelper.add("metaState", metaState); + } + return toStringHelper.addValue(keyCodeString).toString(); + } +} |