Home | History | Annotate | Download | only in android
      1 # SPDX-License-Identifier: Apache-2.0
      2 #
      3 # Copyright (C) 2017, ARM Limited and contributors.
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
      6 # not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 # http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 
     18 import re
     19 import os
     20 import logging
     21 
     22 from time import sleep
     23 
     24 from android import Screen, System, Workload
     25 
     26 class ViewerWorkload(Workload):
     27     """
     28     Android generic Viewer workload
     29 
     30     This workload will use a given URI and will let Android pick the best
     31     application for viewing the item designated by that URI. For instance,
     32     a Youtube video URL would lead to opening the Youtube App if Google
     33     Services are available, if not the default web browser will be used
     34     to load the Youtube page.
     35 
     36     Three methods are available for customizing the workload in a subclass,
     37     see their respective docstring for more details. At least interact() must
     38     be implemented.
     39 
     40     Here's a minimalist example use case of this class, that loads a gif
     41     and keeps it on display for 10 seconds:
     42 
     43     definition
     44     -----------
     45     class Example(ViewerWorkload):
     46         def interact(self):
     47             sleep(10)
     48 
     49     execution
     50     ----------
     51     wload = Workload.getInstance(te, 'Example')
     52     wload.run(out_dir=te.res_dir,
     53         uri="https://media.giphy.com/media/XIqCQx02E1U9W/giphy.gif")        
     54     """
     55     
     56     # Let the system pick the best package
     57     package = ''
     58 
     59     def __init__(self, test_env):
     60         super(ViewerWorkload, self).__init__(test_env)
     61 
     62         # Set of output data reported by the viewer
     63         self.db_file = None
     64 
     65     def pre_interact(self):
     66         """
     67         This method will be called right before tracing starts, but after the
     68         item-viewing app has been launched. This can be useful to configure
     69         some app-specific settings, to press buttons, start a video, etc.
     70         """
     71         pass
     72 
     73     def interact(self):
     74         """
     75         This method will be called right after the tracing starts. Tracing will
     76         continue as long as this method is running, so it can be tailored to
     77         your workload requirements. It could simply be sleeping for x seconds,
     78         or monitoring logcat to wait for a certain event, or issuing input
     79         commands to swipe around a gallery/web page/app, etc.
     80         """
     81         raise NotImplemented("interact() must be implemented")
     82 
     83     def post_interact(self):
     84         """
     85         This method will be called right after tracing stops, but before the
     86         item-viewing app has been closed. This can be useful to dump some
     87         app-specific statistics.
     88         """
     89         pass
     90 
     91     def run(self, out_dir, uri, portrait=True, collect=''):
     92         """
     93         Run viewer workload
     94 
     95         :param out_dir: Path to experiment directory where to store results.
     96         :type out_dir: str
     97 
     98         :param uri: The URI of the item to display
     99         :type location_search: str
    100 
    101         :param portrait: If True, display mode will be set to 'portrait' prior
    102             to viewing the item. If False, 'landscape' mode will be set.
    103 
    104         :param collect: Specifies what to collect. Possible values:
    105             - 'energy'
    106             - 'systrace'
    107             - 'ftrace'
    108             - any combination of the above
    109         :type collect: list(str)
    110         """
    111 
    112         # Keep track of mandatory parameters
    113         self.out_dir = out_dir
    114         self.collect = collect
    115 
    116         # Set min brightness
    117         Screen.set_brightness(self._target, auto=False, percent=0)
    118         # Unlock device screen (assume no password required)
    119         Screen.unlock(self._target)
    120 
    121         # Force screen in requested orientation
    122         Screen.set_orientation(self._target, portrait=portrait)
    123 
    124         System.gfxinfo_reset(self._target, self.package)
    125         # Wait for gfxinfo reset to be completed
    126         sleep(1)
    127 
    128         # Open the requested uri
    129         System.view_uri(self._target, uri)
    130 
    131         self.pre_interact()
    132         self.tracingStart()
    133 
    134         self.interact()
    135 
    136         self.tracingStop()
    137         self.post_interact()
    138 
    139         # Get frame stats
    140         self.db_file = os.path.join(out_dir, "framestats.txt")
    141         System.gfxinfo_get(self._target, self.package, self.db_file)
    142 
    143         # Go back to home screen
    144         System.home(self._target)
    145 
    146         # Set brightness back to auto
    147         Screen.set_brightness(self._target, auto=True)
    148 
    149         # Switch back to screen auto rotation
    150         Screen.set_orientation(self._target, auto=True)
    151 
    152 # vim :set tabstop=4 shiftwidth=4 expandtab
    153