1
0
mirror of https://github.com/ARM-software/devlib.git synced 2025-02-26 06:27:50 +00:00

Merge pull request #157 from marcbonnici/airplane/brightness

Adds additional Android methods
This commit is contained in:
setrofim 2017-08-17 10:59:27 +01:00 committed by GitHub
commit 2a0d110012
2 changed files with 201 additions and 23 deletions

View File

@ -1061,20 +1061,25 @@ class AndroidTarget(Target):
# Android-specific # Android-specific
def swipe_to_unlock(self, direction="horizontal"): def swipe_to_unlock(self, direction="diagonal"):
width, height = self.screen_resolution width, height = self.screen_resolution
command = 'input swipe {} {} {} {}' command = 'input swipe {} {} {} {}'
if direction == "horizontal": if direction == "diagonal":
swipe_heigh = height * 2 // 3
start = 100 start = 100
stop = width - start stop = width - start
self.execute(command.format(start, swipe_heigh, stop, swipe_heigh)) swipe_height = height * 2 // 3
if direction == "vertical": self.execute(command.format(start, swipe_height, stop, 0))
swipe_middle = height / 2 elif direction == "horizontal":
swipe_heigh = height * 2 // 3 swipe_height = height * 2 // 3
self.execute(command.format(swipe_middle, swipe_heigh, swipe_middle, 0)) start = 100
stop = width - start
self.execute(command.format(start, swipe_height, stop, swipe_height))
elif direction == "vertical":
swipe_middle = width / 2
swipe_height = height * 2 // 3
self.execute(command.format(swipe_middle, swipe_height, swipe_middle, 0))
else: else:
raise DeviceError("Invalid swipe direction: {}".format(self.swipe_to_unlock)) raise TargetError("Invalid swipe direction: {}".format(direction))
def getprop(self, prop=None): def getprop(self, prop=None):
props = AndroidProperties(self.execute('getprop')) props = AndroidProperties(self.execute('getprop'))
@ -1186,6 +1191,69 @@ class AndroidTarget(Target):
if self.is_screen_on(): if self.is_screen_on():
self.execute('input keyevent 26') self.execute('input keyevent 26')
def set_auto_brightness(self, auto_brightness):
cmd = 'settings put system screen_brightness_mode {}'
self.execute(cmd.format(int(boolean(auto_brightness))))
def get_auto_brightness(self):
cmd = 'settings get system screen_brightness_mode'
return boolean(self.execute(cmd).strip())
def set_brightness(self, value):
if not 0 <= value <= 255:
msg = 'Invalid brightness "{}"; Must be between 0 and 255'
raise ValueError(msg.format(value))
self.set_auto_brightness(False)
cmd = 'settings put system screen_brightness {}'
self.execute(cmd.format(int(value)))
def get_brightness(self):
cmd = 'settings get system screen_brightness'
return integer(self.execute(cmd).strip())
def get_airplane_mode(self):
cmd = 'settings get global airplane_mode_on'
return boolean(self.execute(cmd).strip())
def set_airplane_mode(self, mode):
root_required = self.get_sdk_version() > 23
if root_required and not self.is_rooted:
raise TargetError('Root is required to toggle airplane mode on Android 7+')
cmd = 'settings put global airplane_mode_on {}'
self.execute(cmd.format(int(boolean(mode))))
self.execute('am broadcast -a android.intent.action.AIRPLANE_MODE', as_root=root_required)
def get_auto_rotation(self):
cmd = 'settings get system accelerometer_rotation'
return boolean(self.execute(cmd).strip())
def set_auto_rotation(self, autorotate):
cmd = 'settings put system accelerometer_rotation {}'
self.execute(cmd.format(int(boolean(autorotate))))
def set_natural_rotation(self):
self.set_rotation(0)
def set_left_rotation(self):
self.set_rotation(1)
def set_inverted_rotation(self):
self.set_rotation(2)
def set_right_rotation(self):
self.set_rotation(3)
def get_rotation(self):
cmd = 'settings get system user_rotation'
return self.execute(cmd).strip()
def set_rotation(self, rotation):
if not 0 <= rotation <= 3:
raise ValueError('Rotation value must be between 0 and 3')
self.set_auto_rotation(False)
cmd = 'settings put system user_rotation {}'
self.execute(cmd.format(rotation))
def homescreen(self): def homescreen(self):
self.execute('am start -a android.intent.action.MAIN -c android.intent.category.HOME') self.execute('am start -a android.intent.action.MAIN -c android.intent.category.HOME')

View File

@ -2,18 +2,18 @@ Target
====== ======
.. class:: Target(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT) .. class:: Target(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=None)
:class:`Target` is the primary interface to the remote device. All interactions :class:`Target` is the primary interface to the remote device. All interactions
with the device are performed via a :class:`Target` instance, either with the device are performed via a :class:`Target` instance, either
directly, or via its modules or a wrapper interface (such as an directly, or via its modules or a wrapper interface (such as an
:class:`Instrument`). :class:`Instrument`).
:param connection_settings: A ``dict`` that specifies how to connect to the remote :param connection_settings: A ``dict`` that specifies how to connect to the remote
device. Its contents depend on the specific :class:`Target` type (used see device. Its contents depend on the specific :class:`Target` type (used see
:ref:`connection-types`\ ). :ref:`connection-types`\ ).
:param platform: A :class:`Target` defines interactions at Operating System level. A :param platform: A :class:`Target` defines interactions at Operating System level. A
:class:`Platform` describes the underlying hardware (such as CPUs :class:`Platform` describes the underlying hardware (such as CPUs
available). If a :class:`Platform` instance is not specified on available). If a :class:`Platform` instance is not specified on
:class:`Target` creation, one will be created automatically and it will :class:`Target` creation, one will be created automatically and it will
@ -22,8 +22,8 @@ Target
:param working_directory: This is primary location for on-target file system :param working_directory: This is primary location for on-target file system
interactions performed by ``devlib``. This location *must* be readable and interactions performed by ``devlib``. This location *must* be readable and
writable directly (i.e. without sudo) by the connection's user account. writable directly (i.e. without sudo) by the connection's user account.
It may or may not allow execution. This location will be created, It may or may not allow execution. This location will be created,
if necessary, during ``setup()``. if necessary, during ``setup()``.
If not explicitly specified, this will be set to a default value If not explicitly specified, this will be set to a default value
@ -35,7 +35,7 @@ Target
(obviously). It should also be possible to write to this location, (obviously). It should also be possible to write to this location,
possibly with elevated privileges (i.e. on a rooted Linux target, it possibly with elevated privileges (i.e. on a rooted Linux target, it
should be possible to write here with sudo, but not necessarily directly should be possible to write here with sudo, but not necessarily directly
by the connection's account). This location will be created, by the connection's account). This location will be created,
if necessary, during ``setup()``. if necessary, during ``setup()``.
This location does *not* need to be same as the system's executables This location does *not* need to be same as the system's executables
@ -52,7 +52,7 @@ Target
:param modules: a list of additional modules to be installed. Some modules will :param modules: a list of additional modules to be installed. Some modules will
try to install by default (if supported by the underlying target). try to install by default (if supported by the underlying target).
Current default modules are ``hotplug``, ``cpufreq``, ``cpuidle``, Current default modules are ``hotplug``, ``cpufreq``, ``cpuidle``,
``cgroups``, and ``hwmon`` (See :ref:`modules`\ ). ``cgroups``, and ``hwmon`` (See :ref:`modules`\ ).
See modules documentation for more detail. See modules documentation for more detail.
@ -68,6 +68,9 @@ Target
prompted on the target. This may be used by some modules that establish prompted on the target. This may be used by some modules that establish
auxiliary connections to a target over UART. auxiliary connections to a target over UART.
:param conn_cls: This is the type of connection that will be used to communicate
with the device.
.. attribute:: Target.core_names .. attribute:: Target.core_names
This is a list containing names of CPU cores on the target, in the order in This is a list containing names of CPU cores on the target, in the order in
@ -94,7 +97,7 @@ Target
.. attribute:: Target.is_connected .. attribute:: Target.is_connected
A boolean value that indicates whether an active connection exists to the A boolean value that indicates whether an active connection exists to the
target device. target device.
.. attribute:: Target.connected_as_root .. attribute:: Target.connected_as_root
@ -146,7 +149,7 @@ Target
thread. thread.
.. method:: Target.connect([timeout]) .. method:: Target.connect([timeout])
Establish a connection to the target. It is usually not necessary to call Establish a connection to the target. It is usually not necessary to call
this explicitly, as a connection gets automatically established on this explicitly, as a connection gets automatically established on
instantiation. instantiation.
@ -225,7 +228,7 @@ Target
:param timeout: Timeout (in seconds) for the execution of the command. If :param timeout: Timeout (in seconds) for the execution of the command. If
specified, an exception will be raised if execution does not complete specified, an exception will be raised if execution does not complete
with the specified period. with the specified period.
:param check_exit_code: If ``True`` (the default) the exit code (on target) :param check_exit_code: If ``True`` (the default) the exit code (on target)
from execution of the command will be checked, and an exception will be from execution of the command will be checked, and an exception will be
raised if it is not ``0``. raised if it is not ``0``.
:param as_root: The command will be executed as root. This will fail on :param as_root: The command will be executed as root. This will fail on
@ -262,7 +265,7 @@ Target
will be interpreted as a comma-separated list of cpu ranges, e.g. will be interpreted as a comma-separated list of cpu ranges, e.g.
``"0,4-7"``. ``"0,4-7"``.
:param as_root: Specify whether the command should be run as root :param as_root: Specify whether the command should be run as root
:param timeout: If this is specified and invocation does not terminate within this number :param timeout: If this is specified and invocation does not terminate within this number
of seconds, an exception will be raised. of seconds, an exception will be raised.
.. method:: Target.background_invoke(binary [, args [, in_directory [, on_cpus [, as_root ]]]]) .. method:: Target.background_invoke(binary [, args [, in_directory [, on_cpus [, as_root ]]]])
@ -314,13 +317,13 @@ Target
.. method:: Target.write_value(path, value [, verify]) .. method:: Target.write_value(path, value [, verify])
Write the value to the specified path on the target. This is primarily Write the value to the specified path on the target. This is primarily
intended for sysfs/procfs/debugfs etc. intended for sysfs/procfs/debugfs etc.
:param path: file to write into :param path: file to write into
:param value: value to be written :param value: value to be written
:param verify: If ``True`` (the default) the value will be read back after :param verify: If ``True`` (the default) the value will be read back after
it is written to make sure it has been written successfully. This due to it is written to make sure it has been written successfully. This due to
some sysfs entries silently failing to set the written value without some sysfs entries silently failing to set the written value without
returning an error code. returning an error code.
@ -450,3 +453,110 @@ Target
Returns the path to the extracted contents. In case of files (gzip and Returns the path to the extracted contents. In case of files (gzip and
bzip2), the path to the decompressed file is returned; for archives, the bzip2), the path to the decompressed file is returned; for archives, the
path to the directory with the archive's contents is returned. path to the directory with the archive's contents is returned.
Android Target
---------------
.. class:: AndroidTarget(connection_settings=None, platform=None, working_directory=None, executables_directory=None, connect=True, modules=None, load_default_modules=True, shell_prompt=DEFAULT_SHELL_PROMPT, conn_cls=AdbConnection, package_data_directory="/data/data")
:class:`AndroidTarget` is a subclass of :class:`Target` with additional features specific to a device running Android.
:param package_data_directory: This is the location of the data stored
for installed Android packages on the device.
.. method:: AndroidTarget.set_rotation(rotation)
Specify an integer representing the desired screen rotation with the
following mappings: Natural: ``0``, Rotated Left: ``1``, Inverted : ``2``
and Rotated Right : ``3``.
.. method:: AndroidTarget.get_rotation(rotation)
Returns an integer value representing the orientation of the devices
screen. ``0`` : Natural, ``1`` : Rotated Left, ``2`` : Inverted
and ``3`` : Rotated Right.
.. method:: AndroidTarget.set_natural_rotation()
Sets the screen orientation of the device to its natural (0 degrees)
orientation.
.. method:: AndroidTarget.set_left_rotation()
Sets the screen orientation of the device to 90 degrees.
.. method:: AndroidTarget.set_inverted_rotation()
Sets the screen orientation of the device to its inverted (180 degrees)
orientation.
.. method:: AndroidTarget.set_right_rotation()
Sets the screen orientation of the device to 270 degrees.
.. method:: AndroidTarget.set_auto_rotation(autorotate)
Specify a boolean value for whether the devices auto-rotation should
be enabled.
.. method:: AndroidTarget.get_auto_rotation()
Returns ``True`` if the targets auto rotation is currently enabled and
``False`` otherwise.
.. method:: AndroidTarget.set_airplane_mode(mode)
Specify a boolean value for whether the device should be in airplane mode.
.. note:: Requires the device to be rooted if the device is running Android 7+.
.. method:: AndroidTarget.get_airplane_mode()
Returns ``True`` if the target is currently in airplane mode and
``False`` otherwise.
.. method:: AndroidTarget.set_brightness(value)
Sets the devices screen brightness to a specified integer between ``0`` and
``255``.
.. method:: AndroidTarget.get_brightness()
Returns an integer between ``0`` and ``255`` representing the devices
current screen brightness.
.. method:: AndroidTarget.set_auto_brightness(auto_brightness)
Specify a boolean value for whether the devices auto brightness
should be enabled.
.. method:: AndroidTarget.get_auto_brightness()
Returns ``True`` if the targets auto brightness is currently
enabled and ``False`` otherwise.
.. method:: AndroidTarget.ensure_screen_is_off()
Checks if the devices screen is on and if so turns it off.
.. method:: AndroidTarget.ensure_screen_is_on()
Checks if the devices screen is off and if so turns it on.
.. method:: AndroidTarget.is_screen_on()
Returns ``True`` if the targets screen is currently on and ``False``
otherwise.
.. method:: AndroidTarget.homescreen()
Returns the device to its home screen.
.. method:: AndroidTarget.swipe_to_unlock(direction="diagonal")
Performs a swipe input on the device to try and unlock the device.
A direction of ``"horizontal"``, ``"vertical"`` or ``"diagonal"``
can be supplied to specify in which direction the swipe should be
performed. By default ``"diagonal"`` will be used to try and
support the majority of newer devices.