1# SPDX-License-Identifier: Apache-2.0 2# 3# Copyright (C) 2015, 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 18import logging 19from system import System 20from time import sleep 21 22class Screen(object): 23 """ 24 Set of utility functions to control an Android Screen 25 """ 26 27 @staticmethod 28 def set_orientation(target, auto=True, portrait=None): 29 """ 30 Set screen orientation mode 31 """ 32 log = logging.getLogger('Screen') 33 acc_mode = 1 if auto else 0 34 # Force manual orientation of portrait specified 35 if portrait is not None: 36 acc_mode = 0 37 log.info('Force manual orientation') 38 if acc_mode == 0: 39 usr_mode = 0 if portrait else 1 40 usr_mode_str = 'PORTRAIT' if portrait else 'LANDSCAPE' 41 log.info('Set orientation: %s', usr_mode_str) 42 else: 43 usr_mode = 0 44 log.info('Set orientation: AUTO') 45 46 if acc_mode == 0: 47 target.execute('content insert '\ 48 '--uri content://settings/system '\ 49 '--bind name:s:accelerometer_rotation '\ 50 '--bind value:i:{}'.format(acc_mode)) 51 target.execute('content insert '\ 52 '--uri content://settings/system '\ 53 '--bind name:s:user_rotation '\ 54 '--bind value:i:{}'.format(usr_mode)) 55 else: 56 # Force PORTRAIT mode when activation AUTO rotation 57 target.execute('content insert '\ 58 '--uri content://settings/system '\ 59 '--bind name:s:user_rotation '\ 60 '--bind value:i:{}'.format(usr_mode)) 61 target.execute('content insert '\ 62 '--uri content://settings/system '\ 63 '--bind name:s:accelerometer_rotation '\ 64 '--bind value:i:{}'.format(acc_mode)) 65 66 @staticmethod 67 def set_brightness(target, auto=True, percent=None): 68 """ 69 Set screen brightness percentage 70 """ 71 log = logging.getLogger('Screen') 72 bri_mode = 1 if auto else 0 73 # Force manual brightness if a percent specified 74 if percent: 75 bri_mode = 0 76 target.execute('content insert '\ 77 '--uri content://settings/system '\ 78 '--bind name:s:screen_brightness_mode '\ 79 '--bind value:i:{}'.format(bri_mode)) 80 if bri_mode == 0: 81 if percent<0 or percent>100: 82 msg = "Screen brightness {} out of range (0,100)"\ 83 .format(percent) 84 raise ValueError(msg) 85 value = 255 * percent / 100 86 target.execute('content insert '\ 87 '--uri content://settings/system '\ 88 '--bind name:s:screen_brightness '\ 89 '--bind value:i:{}'.format(value)) 90 log.info('Set brightness: %d%%', percent) 91 else: 92 log.info('Set brightness: AUTO') 93 94 @staticmethod 95 def set_dim(target, auto=True): 96 """ 97 Set screen dimming mode 98 """ 99 log = logging.getLogger('Screen') 100 dim_mode = 1 if auto else 0 101 dim_mode_str = 'ON' if auto else 'OFF' 102 target.execute('content insert '\ 103 '--uri content://settings/system '\ 104 '--bind name:s:dim_screen '\ 105 '--bind value:i:{}'.format(dim_mode)) 106 log.info('Dim screen mode: %s', dim_mode_str) 107 108 @staticmethod 109 def set_timeout(target, seconds=30): 110 """ 111 Set screen off timeout in seconds 112 """ 113 log = logging.getLogger('Screen') 114 if seconds<0: 115 msg = "Screen timeout {}: cannot be negative".format(seconds) 116 raise ValueError(msg) 117 value = seconds * 1000 118 target.execute('content insert '\ 119 '--uri content://settings/system '\ 120 '--bind name:s:screen_off_timeout '\ 121 '--bind value:i:{}'.format(value)) 122 log.info('Screen timeout: %d [s]', seconds) 123 124 @staticmethod 125 def set_defaults(target): 126 """ 127 Reset screen settings to a reasonable default 128 """ 129 Screen.set_orientation(target) 130 Screen.set_brightness(target) 131 Screen.set_dim(target) 132 Screen.set_timeout(target) 133 Screen.set_doze_always_on(target) 134 135 @staticmethod 136 def get_screen_density(target): 137 """ 138 Get screen density of the device. 139 """ 140 return target.execute('getprop ro.sf.lcd_density') 141 142 @staticmethod 143 def set_screen(target, on=True): 144 log = logging.getLogger('Screen') 145 if not on: 146 log.info('Setting screen OFF') 147 System.sleep(target) 148 return 149 log.info('Setting screen ON') 150 System.wakeup(target) 151 152 @staticmethod 153 def unlock(target): 154 Screen.set_screen(target, on=True) 155 sleep(1) 156 System.menu(target) 157 System.home(target) 158 159 @staticmethod 160 def set_doze_always_on(target, on=True): 161 log = logging.getLogger('Screen') 162 if not on: 163 log.info('Setting doze always on OFF') 164 target.execute('settings put secure doze_always_on 0') 165 return 166 log.info('Setting doze always on ON') 167 target.execute('settings put secure doze_always_on 1') 168 169# vim :set tabstop=4 shiftwidth=4 expandtab 170