Skip to content

Commit a7cfb14

Browse files
committed
Issue #41: Fixed
- No getprop('display.height') or getprop('display.width') on 4.3 Nexus 7 for AndroidViewClient 4.0 - Version 4.1.0 - Added property map - Added tests
1 parent 941ff52 commit a7cfb14

File tree

6 files changed

+83
-9
lines changed

6 files changed

+83
-9
lines changed

AndroidViewClient/src/com/dtmilano/android/adb/adbclient.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import re
1010
import signal
1111
import os
12+
import types
1213
import platform
1314

1415
DEBUG = False
@@ -218,16 +219,49 @@ def shell(self, cmd=None):
218219
#return (sin, sin)
219220
sout = adbClient.socket.makefile("r")
220221
return sout
222+
223+
def __getRestrictedScreen(self):
224+
''' Gets mRestrictedScreen values from dumpsys. This is a method to obtain display dimensions '''
225+
rsRE = re.compile('\s*mRestrictedScreen=\((?P<x>\d+),(?P<y>\d+)\) (?P<w>\d+)x(?P<h>\d+)')
226+
for line in self.shell('dumpsys window').splitlines():
227+
m = rsRE.match(line)
228+
if m:
229+
return m.groups()
230+
raise RuntimeError("Couldn't find mRestrictedScreen in dumpsys")
221231

222-
def getSystemProperty(self, key, strip=True):
223-
return self.getProperty(key, strip)
224-
225-
def getProperty(self, key, strip=True):
232+
def __getProp(self, key, strip=True):
226233
prop = self.shell('getprop %s' % key)
227234
if strip:
228235
prop = prop.rstrip('\r\n')
229236
return prop
230237

238+
def __getDisplayWidth(self, key, strip=True):
239+
(x, y, w, h) = self.__getRestrictedScreen()
240+
return int(w)
241+
242+
def __getDisplayHeight(self, key, strip=True):
243+
(x, y, w, h) = self.__getRestrictedScreen()
244+
return int(h)
245+
246+
def getSystemProperty(self, key, strip=True):
247+
return self.getProperty(key, strip)
248+
249+
def getProperty(self, key, strip=True):
250+
''' Gets the property value for key '''
251+
252+
import collections
253+
MAP_KEYS = collections.OrderedDict([
254+
(re.compile('display.width'), self.__getDisplayWidth),
255+
(re.compile('display.height'), self.__getDisplayHeight),
256+
(re.compile('.*'), self.__getProp),
257+
])
258+
'''Maps properties key values (as regexps) to instance methods to obtain its values.'''
259+
260+
for kre in MAP_KEYS.keys():
261+
if kre.match(key):
262+
return MAP_KEYS[kre](key=key, strip=strip)
263+
raise ValueError("key='%s' does not match any map entry")
264+
231265
def press(self, name, eventType=DOWN_AND_UP):
232266
cmd = 'input keyevent %s' % name
233267
if DEBUG:

AndroidViewClient/src/com/dtmilano/android/viewclient.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@author: Diego Torres Milano
1919
'''
2020

21-
__version__ = '4.0.0'
21+
__version__ = '4.1.0'
2222

2323
import sys
2424
import subprocess

AndroidViewClient/tests/com/dtmilano/android/mocks.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,32 @@
130130

131131
VIEW_MAP_API_17 = {u'clickable': u'true', u'bounds': ((323, 725), (475, 881)), u'enabled': u'true', 'uniqueId': 'id/no_id/33', u'text': u'6', u'selected': u'false', u'scrollable': u'false', u'focused': u'false', u'long-clickable': u'false', u'class': u'android.widget.Button', u'focusable': u'true', u'content-desc': u'', u'package': u'com.android.calculator2', u'checked': u'false', u'password': u'false', u'checkable': u'false', u'index': u'2'}
132132

133+
DUMPSYS_WINDOW_PARTIAL = '''
134+
135+
WINDOW MANAGER LAST ANR (dumpsys window lastanr)
136+
<no ANR has occurred since boot>
137+
138+
WINDOW MANAGER POLICY STATE (dumpsys window policy)
139+
mSafeMode=false mSystemReady=true mSystemBooted=true
140+
mLidState=-1 mLidOpenRotation=-1 mHdmiPlugged=false
141+
mLastSystemUiFlags=0x400 mResettingSystemUiFlags=0x0 mForceClearedSystemUiFlags=0x0
142+
mUiMode=1 mDockMode=0 mCarDockRotation=-1 mDeskDockRotation=-1
143+
mUserRotationMode=0 mUserRotation=0 mAllowAllRotations=0
144+
mCurrentAppOrientation=5
145+
mCarDockEnablesAccelerometer=true mDeskDockEnablesAccelerometer=true
146+
mLidKeyboardAccessibility=0 mLidNavigationAccessibility=0 mLidControlsSleep=false
147+
mLongPressOnPowerBehavior=-1 mHasSoftInput=true
148+
mScreenOnEarly=true mScreenOnFully=true mOrientationSensorEnabled=true
149+
mOverscanScreen=(0,0) 768x1280
150+
mRestrictedOverscanScreen=(0,0) 768x1184
151+
mUnrestrictedScreen=(0,0) 768x1280
152+
mRestrictedScreen=(0,0) 768x1184
153+
mStableFullscreen=(0,0)-(768,1184)
154+
mStable=(0,50)-(768,1184)
155+
mSystem=(0,50)-(768,1184)
156+
157+
'''
158+
133159
DUMPSYS_WINDOW_WINDOWS = """
134160
mock data
135161
mock data
@@ -681,6 +707,8 @@ def shell(self, cmd):
681707
elif re.compile('service call window 2').match(cmd):
682708
self.service = STOPPED
683709
return TRUE_PARCEL
710+
elif cmd == 'dumpsys window':
711+
return DUMPSYS_WINDOW_PARTIAL
684712
elif cmd == 'dumpsys window windows':
685713
return DUMPSYS_WINDOW_WINDOWS
686714

@@ -705,6 +733,10 @@ def getProperty(self, property):
705733
return self.serialno
706734
elif property == 'build.version.sdk' or property == 'ro.build.version.sdk':
707735
return self.version
736+
elif property == 'display.width':
737+
return 768
738+
elif property == 'display.height':
739+
return 1184
708740
return None
709741

710742
def shutdownMockViewServer(self):

AndroidViewClient/tests/com/dtmilano/android/viewclient.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def testGetClass(self):
102102

103103
def testGetId(self):
104104
self.assertEqual('id/button_with_id', self.view.getId())
105-
105+
106106
def testTextPropertyForDifferentSdkVersions(self):
107107
VP = { -1:TEXT_PROPERTY, 8:TEXT_PROPERTY_API_10, 10:TEXT_PROPERTY_API_10, 15:TEXT_PROPERTY, 16:TEXT_PROPERTY_UI_AUTOMATOR, 17:TEXT_PROPERTY_UI_AUTOMATOR}
108108
for version, textProperty in VP.items():
@@ -361,7 +361,15 @@ def testMapSerialNo_None(self):
361361
self.fail()
362362
except ValueError:
363363
pass
364-
364+
365+
def testGetProperty_displayWidth(self):
366+
device = MockDevice()
367+
self.assertEqual(768, device.getProperty('display.width'))
368+
369+
def testGetProperty_displayHeight(self):
370+
device = MockDevice()
371+
self.assertEqual(1184, device.getProperty('display.height'))
372+
365373
def __mockTree(self, dump=DUMP, version=15, language='en'):
366374
device = MockDevice(version=version, language=language)
367375
vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False)

AndroidViewClient/tools/culebra

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ ___________________/ /__/ /__/ /__/ /________________________________
1818
1919
'''
2020

21-
__version__ = '4.0.0'
21+
__version__ = '4.1.0'
2222

2323
import re
2424
import sys

AndroidViewClient/tools/dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Created on Feb 3, 2012
66
@author: diego
77
'''
88

9-
__version__ = '4.0.0'
9+
__version__ = '4.1.0'
1010

1111
import sys
1212
import os

0 commit comments

Comments
 (0)