airtest.core.android.ime 源代码

# coding=utf-8
import re
from airtest.core.android.yosemite import Yosemite
from airtest.core.error import AdbError
from .constant import YOSEMITE_IME_SERVICE
from six import text_type


[文档]def ensure_unicode(value): """ Decode UTF-8 values Args: value: value to be decoded Returns: decoded valued """ if type(value) is not text_type: try: value = value.decode('utf-8') except UnicodeDecodeError: value = value.decode('gbk') return value
[文档]class CustomIme(object): """ Input Methods Class Object """ def __init__(self, adb, apk_path, service_name): super(CustomIme, self).__init__() self.adb = adb self.apk_path = apk_path self.service_name = service_name self.started = False def _get_ime_list(self): """ Return all the input methods on the device Returns: list of all input methods on the device """ out = self.adb.shell("ime list -a") m = re.findall("mId=(.*?/.*?) ", out) return m def __enter__(self): self.start() def __exit__(self, exc_type, exc_val, exc_tb): self.end()
[文档] def start(self): """ Enable input method Returns: None """ try: self.default_ime = self.adb.shell("settings get secure default_input_method").strip() except AdbError: # settings cmd not found for older phones, e.g. Xiaomi 2A # /system/bin/sh: settings: not found self.default_ime = None self.ime_list = self._get_ime_list() if self.service_name not in self.ime_list: if self.apk_path: self.device.install_app(self.apk_path) if self.default_ime != self.service_name: self.adb.shell("ime enable %s" % self.service_name) self.adb.shell("ime set %s" % self.service_name) self.started = True
[文档] def end(self): """ Disable input method Returns: None """ if self.default_ime and self.default_ime != self.service_name: self.adb.shell("ime disable %s" % self.service_name) self.adb.shell("ime set %s" % self.default_ime) self.started = False
[文档] def text(self, value): raise NotImplementedError
[文档]class YosemiteIme(CustomIme): """ Yosemite Input Method Class Object """ def __init__(self, adb): super(YosemiteIme, self).__init__(adb, None, YOSEMITE_IME_SERVICE) self.yosemite = Yosemite(adb)
[文档] def start(self): self.yosemite.get_ready() super(YosemiteIme, self).start()
[文档] def text(self, value): """ Input text with Yosemite input method Args: value: text to be inputted Returns: output form `adb shell` command """ if not self.started: self.start() # 更多的输入用法请见 https://github.com/macacajs/android-unicode#use-in-adb-shell value = ensure_unicode(value) self.adb.shell(u"am broadcast -a ADB_INPUT_TEXT --es msg '{}'".format(value))
[文档] def code(self, code): """ Sending editor action Args: code: editor action code, e.g., 2 = IME_ACTION_GO, 3 = IME_ACTION_SEARCH Editor Action Code Ref: http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html Returns: output form `adb shell` command """ if not self.started: self.start() self.adb.shell("am broadcast -a ADB_EDITOR_CODE --ei code {}".format(str(code)))