Source code for poco.agent

# coding=utf-8

from poco.utils.airtest import AirtestInput
from poco.sdk.interfaces.hierarchy import HierarchyInterface
from poco.sdk.interfaces.input import InputInterface
from poco.sdk.interfaces.screen import ScreenInterface
from poco.sdk.interfaces.command import CommandInterface

__author__ = 'lxn3032'


def _assign(val, default_val):
    if isinstance(val, type(None)):
        return default_val
    else:
        return val


[docs]class PocoAgent(object): """ This is the agent class for poco to communicate with target device. This class is an aggregation of 4 major interfaces for now. - :py:class:`HierarchyInterface <poco.sdk.interfaces.hierarchy.HierarchyInterface>`: defines the hierarchy accessibility methods such as dump(crawl the whole UI tree), getAttr(retrieve attribute value by name) - :py:class:`InputInterface <poco.sdk.interfaces.input.InputInterface>`: defines the simulated input methods to allow inject simulated input on target device - :py:class:`ScreenInterface <poco.sdk.interfaces.screen.ScreenInterface>`: defines methods to access the screen surface - :py:class:`CommandInterface <poco.sdk.interfaces.command.CommandInterface>`: defines methods to communicate with target device in arbitrary way. This is optional. """ def __init__(self, hierarchy, input, screen, command=None): self.hierarchy = _assign(hierarchy, HierarchyInterface()) self.input = _assign(input, InputInterface()) self.screen = _assign(screen, ScreenInterface()) self.command = _assign(command, CommandInterface()) self._driver = None
[docs] def get_sdk_version(self): """ Retrieve the sdk version from remote runtime. Each poco agent implementation should override this method. Returns: :py:obj:`str`: version string of the poco sdk. usually in "0.0.0" format. None if not provided by poco sdk. """ pass
def rpc_reconnect(self): self.rpc.close() self.rpc.connect() @property def rpc(self): """ Return the interface of this agent handled. Returns: :py:obj:`object`: the rpc interface of this agent handled. Raises: NotImplementedError: raises if the agent implementation dose not expose the rpc interface to user. """ raise NotImplementedError('This poco agent does not have a explicit rpc connection.') def on_bind_driver(self, driver): self._driver = driver if isinstance(self.input, AirtestInput): self.input.add_preaction_cb(driver) @property def driver(self): """ Return the driver of this agent related to. None if the driver is not ready to bind. Returns: :py:class:`inherit from Poco <poco.pocofw.Poco>`: the driver of this agent related to. """ if not self._driver: raise AttributeError("`driver` is not bound on this agent implementation({}). " "Do you forget to call `super().on_bind_driver` when you override the method " "`on_bind_driver` in your sub class?" .format(repr(self))) return self._driver