luma_third_party: Add AndroidViewClient.
Used to connect to Android devices/emulators and extract view
hierarchies.
Change-Id: I67ed2aee9d7630ec5bcd2e0cfc9aaf4cbdc28602
diff --git a/AndroidViewClient/.gitignore b/AndroidViewClient/.gitignore
new file mode 100755
index 0000000..455e397
--- /dev/null
+++ b/AndroidViewClient/.gitignore
@@ -0,0 +1,25 @@
+# Compiled classes #
+####################
+*$py.class
+*.pyc
+
+# Mac files #
+#############
+.DS_Store
+
+# vi files #
+############
+.*.swp
+
+# other files #
+###############
+*~
+build/
+dist/
+**/*.egg-info/
+
+# idea #
+########
+*.iws
+**/.idea/workspace.xml
+**/.idea/tasks.xml
diff --git a/AndroidViewClient/.idea/.name b/AndroidViewClient/.idea/.name
new file mode 100755
index 0000000..0bef555
--- /dev/null
+++ b/AndroidViewClient/.idea/.name
@@ -0,0 +1 @@
+AndroidViewClient
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/AndroidViewClient.iml b/AndroidViewClient/.idea/AndroidViewClient.iml
new file mode 100755
index 0000000..a0052f3
--- /dev/null
+++ b/AndroidViewClient/.idea/AndroidViewClient.iml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ </content>
+ <orderEntry type="jdk" jdkName="Python 2.7.6 (/usr/bin/python2.7)" jdkType="Python SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/encodings.xml b/AndroidViewClient/.idea/encodings.xml
new file mode 100755
index 0000000..f758959
--- /dev/null
+++ b/AndroidViewClient/.idea/encodings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false">
+ <file url="PROJECT" charset="UTF-8" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/misc.xml b/AndroidViewClient/.idea/misc.xml
new file mode 100755
index 0000000..cd9d35b
--- /dev/null
+++ b/AndroidViewClient/.idea/misc.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+ <OptionsSetting value="true" id="Add" />
+ <OptionsSetting value="true" id="Remove" />
+ <OptionsSetting value="true" id="Checkout" />
+ <OptionsSetting value="true" id="Update" />
+ <OptionsSetting value="true" id="Status" />
+ <OptionsSetting value="true" id="Edit" />
+ <ConfirmationsSetting value="0" id="Add" />
+ <ConfirmationsSetting value="0" id="Remove" />
+ </component>
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.6 (/usr/bin/python2.7)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/modules.xml b/AndroidViewClient/.idea/modules.xml
new file mode 100755
index 0000000..c1ab586
--- /dev/null
+++ b/AndroidViewClient/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/AndroidViewClient.iml" filepath="$PROJECT_DIR$/.idea/AndroidViewClient.iml" />
+ </modules>
+ </component>
+</project>
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/scopes/scope_settings.xml b/AndroidViewClient/.idea/scopes/scope_settings.xml
new file mode 100755
index 0000000..922003b
--- /dev/null
+++ b/AndroidViewClient/.idea/scopes/scope_settings.xml
@@ -0,0 +1,5 @@
+<component name="DependencyValidationManager">
+ <state>
+ <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+ </state>
+</component>
\ No newline at end of file
diff --git a/AndroidViewClient/.idea/vcs.xml b/AndroidViewClient/.idea/vcs.xml
new file mode 100755
index 0000000..94a25f7
--- /dev/null
+++ b/AndroidViewClient/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/AndroidViewClient/.project b/AndroidViewClient/.project
new file mode 100755
index 0000000..3f13051
--- /dev/null
+++ b/AndroidViewClient/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>AndroidViewClient</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.python.pydev.PyDevBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.python.pydev.pythonNature</nature>
+ </natures>
+</projectDescription>
diff --git a/AndroidViewClient/.pydevproject b/AndroidViewClient/.pydevproject
new file mode 100755
index 0000000..85f5914
--- /dev/null
+++ b/AndroidViewClient/.pydevproject
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python 2.7</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
+<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
+<path>/AndroidViewClient/src</path>
+<path>/AndroidViewClient/examples</path>
+</pydev_pathproperty>
+
+</pydev_project>
diff --git a/AndroidViewClient/.settings/org.eclipse.core.resources.prefs b/AndroidViewClient/.settings/org.eclipse.core.resources.prefs
new file mode 100755
index 0000000..d0203b2
--- /dev/null
+++ b/AndroidViewClient/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+encoding//src/com/dtmilano/android/common.py=utf-8
+encoding//src/com/dtmilano/android/controlpanel.py=utf-8
+encoding//src/com/dtmilano/android/culebron.py=utf-8
+encoding//src/com/dtmilano/android/viewclient.py=utf-8
+encoding//src/com/dtmilano/android/window.py=utf-8
+encoding//tests/com/dtmilano/android/mocks.py=utf-8
+encoding//tests/com/dtmilano/android/viewclienttests.py=utf-8
+encoding//tools/culebra=utf-8
diff --git a/AndroidViewClient/.settings/org.eclipse.ltk.core.refactoring.prefs b/AndroidViewClient/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100755
index 0000000..b196c64
--- /dev/null
+++ b/AndroidViewClient/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/AndroidViewClient/LICENSE b/AndroidViewClient/LICENSE
new file mode 100755
index 0000000..d645695
--- /dev/null
+++ b/AndroidViewClient/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/AndroidViewClient/README.google b/AndroidViewClient/README.google
new file mode 100644
index 0000000..cf06533
--- /dev/null
+++ b/AndroidViewClient/README.google
@@ -0,0 +1,10 @@
+URL: https://github.com/dtmilano/AndroidViewClient
+Version: 30e48e27f194f607817747710d83c884b7f74f73
+License: Apache License, Version 2.0
+License File: LICENSE
+
+Description:
+Android ViewServer client
+
+Local Modifications:
+No modifications
\ No newline at end of file
diff --git a/AndroidViewClient/README.md b/AndroidViewClient/README.md
new file mode 100755
index 0000000..74ad248
--- /dev/null
+++ b/AndroidViewClient/README.md
@@ -0,0 +1,25 @@
+AndroidViewClient
+=================
+<a href="#"><img src="https://github.com/dtmilano/AndroidViewClient/wiki/images/culebra-logo-transparent-204x209-rb-border.png" align="left" hspace="0" vspace="6"></a>
+**AndroidViewClient** was originally conceived as an extension to [monkeyrunner](http://developer.android.com/tools/help/monkeyrunner_concepts.html) but lately evolved
+as a pure python tool that automates or simplifies test script creation.
+It is a test framework for Android applications that:
+<ul><ul>
+ <li>Automates driving Android applications</li>
+ <li><b>Generates</b> re-usable scripts</li>
+ <li>Provides view-based <i>device independent</i> UI interaction</li>
+ <li>Uses 'logical' screen comparison (UI Automator Hierarchy based) over image comparison (Avoiding extraneous
+ detail issues, such as time or data changes)</li>
+ <li>Supports running on multiple devices</li>
+ <li>Provides simple control for high level operations like language change and activity start</li>
+ <li>Supports all Android APIs</li>
+ <li>Is written in python</li>
+</ul></ul>
+
+:rage: **NOTE**: Pypi statistics are broken see [here](https://github.com/aclark4life/vanity/issues/22). This does not reflect the number of downloads.
+
+[![Downloads](https://img.shields.io/pypi/dm/androidviewclient.svg)](https://pypi.python.org/pypi/androidviewclient/)
+[![Latest Version](https://img.shields.io/pypi/v/androidviewclient.svg)](https://pypi.python.org/pypi/androidviewclient/)
+
+Want to learn more? Detailed information can be found in the [AndroidViewClient/culebra wiki](https://github.com/dtmilano/AndroidViewClient/wiki)
+
diff --git a/AndroidViewClient/avc-version b/AndroidViewClient/avc-version
new file mode 100755
index 0000000..06e6b9f
--- /dev/null
+++ b/AndroidViewClient/avc-version
@@ -0,0 +1,73 @@
+#! /bin/bash
+
+usage()
+{
+ echo "usage: $0 {get | set <version>}"
+ exit 1
+}
+
+
+set +x
+if [[ $# < 1 ]]
+then
+ usage
+fi
+
+version_str='__version__ ='
+
+case "$1" in
+ get)
+ (
+ for f in $(find src tools -type f -exec grep -l "$version_str" {} \;)
+ do
+ echo -n "$f: "
+ grep "$version_str" $f
+ done
+ echo -n "setup.py: "
+ grep version setup.py
+ ) | awk "
+ BEGIN { FS = \"[=:]+\"; max=-1 };
+ { gsub(/[,' ]+/, \"\", \$NF); files[NR]=\$1; v=\$NF; versions[NR]=v; if (v > max) max=v;}
+ END {
+ for (i in files) {
+ if (versions[i] == max) {
+ s=\" MAX\"
+ } else {
+ s = \"\"};
+ printf(\"%-45s: %s%s\\n\", files[i], versions[i], s)};
+ }
+ "
+ ;;
+
+ set)
+ if [[ $# != 2 ]]
+ then
+ usage
+ fi
+ version="$2"
+ for f in $(find src tools -type f -exec grep -l "$version_str" {} \;)
+ do
+ echo "<<< $f >>>"
+ case "$(uname)" in
+ Darwin)
+ sed -E -i '' -e "s@$version_str \'[0-9r.]+\'@$version_str \'$version\'@" $f
+ ;;
+
+ Linux)
+ sed -E -i -e "s@$version_str '[0-9r.]+'@$version_str '$version'@" $f
+ ;;
+ esac
+ done
+
+ echo "<<< setup.py >>>"
+ case "$(uname)" in
+ Darwin)
+ sed -E -i '' -e "s@version='[0-9r.]+'@version='$version'@" setup.py
+ ;;
+
+ Linux)
+ sed -E -i -e "s@version='[0-9r.]+'@version='$version'@" setup.py
+ ;;
+ esac
+ ;;
+ esac
diff --git a/AndroidViewClient/build.xml b/AndroidViewClient/build.xml
new file mode 100755
index 0000000..504f101
--- /dev/null
+++ b/AndroidViewClient/build.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Culebra" default="deprecated">
+ <property file="ant.properties" />
+ <loadproperties srcFile="project.properties" />
+
+ <target name="deprecated">
+ <echo message="NOTICE:" />
+ <echo message="Jar file and monkeyrunner use are deprecated as of AndroidViewClient >= 4.0.0" />
+ </target>
+
+ <property name="versionRE" value="^\s*__version__\s*=\s*'(.*)'\s*$" />
+ <loadfile srcfile="src/com/dtmilano/android/viewclient.py"
+ property="avc.version">
+ <filterchain>
+ <linecontainsregexp>
+ <regexp pattern="${versionRE}" />
+ </linecontainsregexp>
+ <tokenfilter>
+ <replaceregex pattern="${versionRE}" replace="\1" />
+ </tokenfilter>
+ <striplinebreaks />
+ </filterchain>
+ </loadfile>
+
+ <property name="avc.jar" value="bin/${avc.jarname}-${avc.version}.jar" />
+ <target name="jar" depends="compile">
+ <echo message="Creating ${avc.jarname} ${avc.version} jar ..." />
+ <jar destfile="${avc.jar}">
+ <fileset dir="src/" excludes="**/*.java" />
+ <fileset dir="." includes="tools/*" />
+ <fileset dir="bin/classes" />
+ <manifest>
+ <attribute name="Main-Class"
+ value="com.dtmilano.android.viewclient.ViewClient" />
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="clean">
+ <delete dir="bin" />
+ </target>
+
+ <target name="compile">
+ <mkdir dir="bin/classes" />
+ <javac srcdir="src" destdir="bin/classes" />
+ </target>
+
+ <target name="install" depends="jar,doc-jar">
+ <mkdir dir="${gdrive.bin.dest.dir}" />
+ <copy file="${avc.jar}" todir="${gdrive.bin.dest.dir}" />
+ <mkdir dir="${gdrive.doc.dest.dir}" />
+ <copy file="${avc.doc.jar}" todir="${gdrive.doc.dest.dir}" />
+ </target>
+
+ <target name="doc" >
+ <mkdir dir="doc" />
+ <exec executable="epydoc">
+ <arg value="--config=viewclient.epydoc" />
+ </exec>
+ </target>
+
+ <property name="avc.doc.jar" value="bin/${avc.doc.jarname}-${avc.version}.jar" />
+ <target name="doc-jar" depends="doc">
+ <echo message="Creating ${avc.doc.jarname} ${avc.version} jar ..." />
+ <jar destfile="${avc.doc.jar}">
+ <fileset dir="doc/" />
+ </jar>
+ </target>
+</project>
diff --git a/AndroidViewClient/doc/api-objects.txt b/AndroidViewClient/doc/api-objects.txt
new file mode 100755
index 0000000..e655627
--- /dev/null
+++ b/AndroidViewClient/doc/api-objects.txt
@@ -0,0 +1,346 @@
+com.dtmilano.android com.dtmilano.android-module.html
+com.dtmilano.android.__package__ com.dtmilano.android-module.html#__package__
+com.dtmilano.android.adb com.dtmilano.android.adb-module.html
+com.dtmilano.android.adb.__package__ com.dtmilano.android.adb-module.html#__package__
+com.dtmilano.android.adb.adbclient com.dtmilano.android.adb.adbclient-module.html
+com.dtmilano.android.adb.adbclient.DOWN com.dtmilano.android.adb.adbclient-module.html#DOWN
+com.dtmilano.android.adb.adbclient.DEBUG com.dtmilano.android.adb.adbclient-module.html#DEBUG
+com.dtmilano.android.adb.adbclient.TIMEOUT com.dtmilano.android.adb.adbclient-module.html#TIMEOUT
+com.dtmilano.android.adb.adbclient.PORT com.dtmilano.android.adb.adbclient-module.html#PORT
+com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY
+com.dtmilano.android.adb.adbclient.DOWN_AND_UP com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP
+com.dtmilano.android.adb.adbclient.__package__ com.dtmilano.android.adb.adbclient-module.html#__package__
+com.dtmilano.android.adb.adbclient.OKAY com.dtmilano.android.adb.adbclient-module.html#OKAY
+com.dtmilano.android.adb.adbclient.FAIL com.dtmilano.android.adb.adbclient-module.html#FAIL
+com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY
+com.dtmilano.android.adb.adbclient.HOSTNAME com.dtmilano.android.adb.adbclient-module.html#HOSTNAME
+com.dtmilano.android.adb.adbclient.UP com.dtmilano.android.adb.adbclient-module.html#UP
+com.dtmilano.android.viewclient com.dtmilano.android.viewclient-module.html
+com.dtmilano.android.viewclient.HEIGHT_PROPERTY com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY
+com.dtmilano.android.viewclient.GONE com.dtmilano.android.viewclient-module.html#GONE
+com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8 com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8
+com.dtmilano.android.viewclient.TEXT_PROPERTY com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY
+com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8 com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8
+com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10 com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10
+com.dtmilano.android.viewclient._nd com.dtmilano.android.viewclient-module.html#_nd
+com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED
+com.dtmilano.android.viewclient.DEBUG_COORDS com.dtmilano.android.viewclient-module.html#DEBUG_COORDS
+com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8 com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8
+com.dtmilano.android.viewclient.__package__ com.dtmilano.android.viewclient-module.html#__package__
+com.dtmilano.android.viewclient.DEBUG_DEVICE com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE
+com.dtmilano.android.viewclient.DEBUG_GETATTR com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR
+com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY
+com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR
+com.dtmilano.android.viewclient._ns com.dtmilano.android.viewclient-module.html#_ns
+com.dtmilano.android.viewclient.ID_PROPERTY com.dtmilano.android.viewclient-module.html#ID_PROPERTY
+com.dtmilano.android.viewclient.VIEW_SERVER_PORT com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT
+com.dtmilano.android.viewclient._nh com.dtmilano.android.viewclient-module.html#_nh
+com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY
+com.dtmilano.android.viewclient.VISIBLE com.dtmilano.android.viewclient-module.html#VISIBLE
+com.dtmilano.android.viewclient.DEBUG_CALL com.dtmilano.android.viewclient-module.html#DEBUG_CALL
+com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES
+com.dtmilano.android.viewclient.INVISIBLE com.dtmilano.android.viewclient-module.html#INVISIBLE
+com.dtmilano.android.viewclient.DEBUG_TREE com.dtmilano.android.viewclient-module.html#DEBUG_TREE
+com.dtmilano.android.viewclient.ID_RE com.dtmilano.android.viewclient-module.html#ID_RE
+com.dtmilano.android.viewclient.DEBUG_DISTANCE com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE
+com.dtmilano.android.viewclient.TOP_PROPERTY com.dtmilano.android.viewclient-module.html#TOP_PROPERTY
+com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR
+com.dtmilano.android.viewclient.WARNINGS com.dtmilano.android.viewclient-module.html#WARNINGS
+com.dtmilano.android.viewclient.IP_RE com.dtmilano.android.viewclient-module.html#IP_RE
+com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY
+com.dtmilano.android.viewclient.ADB_DEFAULT_PORT com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT
+com.dtmilano.android.viewclient.DEBUG_STATUSBAR com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR
+com.dtmilano.android.viewclient.OFFSET com.dtmilano.android.viewclient-module.html#OFFSET
+com.dtmilano.android.viewclient.DEBUG com.dtmilano.android.viewclient-module.html#DEBUG
+com.dtmilano.android.viewclient.DEBUG_WINDOWS com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS
+com.dtmilano.android.viewclient.TOP_PROPERTY_API_8 com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8
+com.dtmilano.android.viewclient.VIEW_SERVER_HOST com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.LEFT_PROPERTY com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY
+com.dtmilano.android.viewclient.VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED
+com.dtmilano.android.viewclient.WIDTH_PROPERTY com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY
+com.dtmilano.android.viewclient.DEBUG_RECEIVED com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED
+com.dtmilano.android.viewclient.WS com.dtmilano.android.viewclient-module.html#WS
+com.dtmilano.android.viewclient.DEBUG_BOUNDS com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS
+com.dtmilano.android.viewclient.DEBUG_TOUCH com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH
+com.dtmilano.android.adb.adbclient.AdbClient com.dtmilano.android.adb.adbclient.AdbClient-class.html
+com.dtmilano.android.adb.adbclient.AdbClient.__getProp com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getProp
+com.dtmilano.android.adb.adbclient.AdbClient.checkVersion com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkVersion
+com.dtmilano.android.adb.adbclient.AdbClient.sameAs com.dtmilano.android.adb.adbclient.AdbClient-class.html#sameAs
+com.dtmilano.android.adb.adbclient.AdbClient.unlock com.dtmilano.android.adb.adbclient.AdbClient-class.html#unlock
+com.dtmilano.android.adb.adbclient.AdbClient.percentSame com.dtmilano.android.adb.adbclient.AdbClient-class.html#percentSame
+com.dtmilano.android.adb.adbclient.AdbClient.close com.dtmilano.android.adb.adbclient.AdbClient-class.html#close
+com.dtmilano.android.adb.adbclient.AdbClient.touch com.dtmilano.android.adb.adbclient.AdbClient-class.html#touch
+com.dtmilano.android.adb.adbclient.AdbClient.getSystemProperty com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSystemProperty
+com.dtmilano.android.adb.adbclient.AdbClient.__init__ com.dtmilano.android.adb.adbclient.AdbClient-class.html#__init__
+com.dtmilano.android.adb.adbclient.AdbClient.startActivity com.dtmilano.android.adb.adbclient.AdbClient-class.html#startActivity
+com.dtmilano.android.adb.adbclient.AdbClient.__receive com.dtmilano.android.adb.adbclient.AdbClient-class.html#__receive
+com.dtmilano.android.adb.adbclient.AdbClient.setSerialno com.dtmilano.android.adb.adbclient.AdbClient-class.html#setSerialno
+com.dtmilano.android.adb.adbclient.AdbClient.isLocked com.dtmilano.android.adb.adbclient.AdbClient-class.html#isLocked
+com.dtmilano.android.adb.adbclient.AdbClient.build com.dtmilano.android.adb.adbclient.AdbClient-class.html#build
+com.dtmilano.android.adb.adbclient.AdbClient.type com.dtmilano.android.adb.adbclient.AdbClient-class.html#type
+com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayWidth com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayWidth
+com.dtmilano.android.adb.adbclient.AdbClient.getRestrictedScreen com.dtmilano.android.adb.adbclient.AdbClient-class.html#getRestrictedScreen
+com.dtmilano.android.adb.adbclient.AdbClient.shell com.dtmilano.android.adb.adbclient.AdbClient-class.html#shell
+com.dtmilano.android.adb.adbclient.AdbClient.longPress com.dtmilano.android.adb.adbclient.AdbClient-class.html#longPress
+com.dtmilano.android.adb.adbclient.AdbClient.setAlarm com.dtmilano.android.adb.adbclient.AdbClient-class.html#setAlarm
+com.dtmilano.android.adb.adbclient.AdbClient.__del__ com.dtmilano.android.adb.adbclient.AdbClient-class.html#__del__
+com.dtmilano.android.adb.adbclient.AdbClient.drag com.dtmilano.android.adb.adbclient.AdbClient-class.html#drag
+com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayHeight com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayHeight
+com.dtmilano.android.adb.adbclient.AdbClient.wake com.dtmilano.android.adb.adbclient.AdbClient-class.html#wake
+com.dtmilano.android.adb.adbclient.AdbClient.__connect com.dtmilano.android.adb.adbclient.AdbClient-class.html#__connect
+com.dtmilano.android.adb.adbclient.AdbClient.__setTransport com.dtmilano.android.adb.adbclient.AdbClient-class.html#__setTransport
+com.dtmilano.android.adb.adbclient.AdbClient.press com.dtmilano.android.adb.adbclient.AdbClient-class.html#press
+com.dtmilano.android.adb.adbclient.AdbClient.getSdkVersion com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSdkVersion
+com.dtmilano.android.adb.adbclient.AdbClient.checkConnected com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkConnected
+com.dtmilano.android.adb.adbclient.AdbClient.takeSnapshot com.dtmilano.android.adb.adbclient.AdbClient-class.html#takeSnapshot
+com.dtmilano.android.adb.adbclient.AdbClient.__send com.dtmilano.android.adb.adbclient.AdbClient-class.html#__send
+com.dtmilano.android.adb.adbclient.AdbClient.getProperty com.dtmilano.android.adb.adbclient.AdbClient-class.html#getProperty
+com.dtmilano.android.adb.adbclient.AdbClient.__checkOk com.dtmilano.android.adb.adbclient.AdbClient-class.html#__checkOk
+com.dtmilano.android.adb.adbclient.AdbClient.isScreenOn com.dtmilano.android.adb.adbclient.AdbClient-class.html#isScreenOn
+com.dtmilano.android.adb.adbclient.AdbClient.getDevices com.dtmilano.android.adb.adbclient.AdbClient-class.html#getDevices
+com.dtmilano.android.adb.adbclient.AdbClient.setReconnect com.dtmilano.android.adb.adbclient.AdbClient-class.html#setReconnect
+com.dtmilano.android.adb.adbclient.Device com.dtmilano.android.adb.adbclient.Device-class.html
+com.dtmilano.android.adb.adbclient.Device.__str__ com.dtmilano.android.adb.adbclient.Device-class.html#__str__
+com.dtmilano.android.adb.adbclient.Device.factory com.dtmilano.android.adb.adbclient.Device-class.html#factory
+com.dtmilano.android.adb.adbclient.Device.__init__ com.dtmilano.android.adb.adbclient.Device-class.html#__init__
+com.dtmilano.android.viewclient.EditText com.dtmilano.android.viewclient.EditText-class.html
+com.dtmilano.android.viewclient.View.getPositionAndSize com.dtmilano.android.viewclient.View-class.html#getPositionAndSize
+com.dtmilano.android.viewclient.View.getClass com.dtmilano.android.viewclient.View-class.html#getClass
+com.dtmilano.android.viewclient.View.getCoords com.dtmilano.android.viewclient.View-class.html#getCoords
+com.dtmilano.android.viewclient.View.__str__ com.dtmilano.android.viewclient.View-class.html#__str__
+com.dtmilano.android.viewclient.View.currentFocus com.dtmilano.android.viewclient.View-class.html#currentFocus
+com.dtmilano.android.viewclient.View.getText com.dtmilano.android.viewclient.View-class.html#getText
+com.dtmilano.android.viewclient.View.getWidth com.dtmilano.android.viewclient.View-class.html#getWidth
+com.dtmilano.android.viewclient.View.getY com.dtmilano.android.viewclient.View-class.html#getY
+com.dtmilano.android.viewclient.View.widthProperty com.dtmilano.android.viewclient.View-class.html#widthProperty
+com.dtmilano.android.viewclient.View.variableNameFromId com.dtmilano.android.viewclient.View-class.html#variableNameFromId
+com.dtmilano.android.viewclient.View.getId com.dtmilano.android.viewclient.View-class.html#getId
+com.dtmilano.android.viewclient.View.touch com.dtmilano.android.viewclient.View-class.html#touch
+com.dtmilano.android.viewclient.View.writeImageToFile com.dtmilano.android.viewclient.View-class.html#writeImageToFile
+com.dtmilano.android.viewclient.View.idProperty com.dtmilano.android.viewclient.View-class.html#idProperty
+com.dtmilano.android.viewclient.View.children com.dtmilano.android.viewclient.View-class.html#children
+com.dtmilano.android.viewclient.View.__init__ com.dtmilano.android.viewclient.View-class.html#__init__
+com.dtmilano.android.viewclient.View.getUniqueId com.dtmilano.android.viewclient.View-class.html#getUniqueId
+com.dtmilano.android.viewclient.View.isClickable com.dtmilano.android.viewclient.View-class.html#isClickable
+com.dtmilano.android.viewclient.View.__getitem__ com.dtmilano.android.viewclient.View-class.html#__getitem__
+com.dtmilano.android.viewclient.View.forceviewserveruse com.dtmilano.android.viewclient.View-class.html#forceviewserveruse
+com.dtmilano.android.viewclient.View.getHeight com.dtmilano.android.viewclient.View-class.html#getHeight
+com.dtmilano.android.viewclient.View.factory com.dtmilano.android.viewclient.View-class.html#factory
+com.dtmilano.android.viewclient.View.__getattr__ com.dtmilano.android.viewclient.View-class.html#__getattr__
+com.dtmilano.android.viewclient.View.add com.dtmilano.android.viewclient.View-class.html#add
+com.dtmilano.android.viewclient.View.version com.dtmilano.android.viewclient.View-class.html#version
+com.dtmilano.android.viewclient.EditText.backspace com.dtmilano.android.viewclient.EditText-class.html#backspace
+com.dtmilano.android.viewclient.View.build com.dtmilano.android.viewclient.View-class.html#build
+com.dtmilano.android.viewclient.View.__call__ com.dtmilano.android.viewclient.View-class.html#__call__
+com.dtmilano.android.viewclient.EditText.type com.dtmilano.android.viewclient.EditText-class.html#type
+com.dtmilano.android.viewclient.View.__smallStr__ com.dtmilano.android.viewclient.View-class.html#__smallStr__
+com.dtmilano.android.viewclient.View.allPossibleNamesWithColon com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon
+com.dtmilano.android.viewclient.View.map com.dtmilano.android.viewclient.View-class.html#map
+com.dtmilano.android.viewclient.View.parent com.dtmilano.android.viewclient.View-class.html#parent
+com.dtmilano.android.viewclient.View.getContentDescription com.dtmilano.android.viewclient.View-class.html#getContentDescription
+com.dtmilano.android.viewclient.View.topProperty com.dtmilano.android.viewclient.View-class.html#topProperty
+com.dtmilano.android.viewclient.View.getCenter com.dtmilano.android.viewclient.View-class.html#getCenter
+com.dtmilano.android.viewclient.View.textProperty com.dtmilano.android.viewclient.View-class.html#textProperty
+com.dtmilano.android.viewclient.View.device com.dtmilano.android.viewclient.View-class.html#device
+com.dtmilano.android.viewclient.View.intersection com.dtmilano.android.viewclient.View-class.html#intersection
+com.dtmilano.android.viewclient.View.__microStr__ com.dtmilano.android.viewclient.View-class.html#__microStr__
+com.dtmilano.android.viewclient.View.getXY com.dtmilano.android.viewclient.View-class.html#getXY
+com.dtmilano.android.viewclient.View.getX com.dtmilano.android.viewclient.View-class.html#getX
+com.dtmilano.android.viewclient.View.getParent com.dtmilano.android.viewclient.View-class.html#getParent
+com.dtmilano.android.viewclient.View.heightProperty com.dtmilano.android.viewclient.View-class.html#heightProperty
+com.dtmilano.android.viewclient.View.leftProperty com.dtmilano.android.viewclient.View-class.html#leftProperty
+com.dtmilano.android.viewclient.View.__tinyStr__ com.dtmilano.android.viewclient.View-class.html#__tinyStr__
+com.dtmilano.android.viewclient.View.useUiAutomator com.dtmilano.android.viewclient.View-class.html#useUiAutomator
+com.dtmilano.android.viewclient.View.containsPoint com.dtmilano.android.viewclient.View-class.html#containsPoint
+com.dtmilano.android.viewclient.View.getVisibility com.dtmilano.android.viewclient.View-class.html#getVisibility
+com.dtmilano.android.viewclient.Excerpt2Code com.dtmilano.android.viewclient.Excerpt2Code-class.html
+com.dtmilano.android.viewclient.Excerpt2Code.CharacterData com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData
+com.dtmilano.android.viewclient.Excerpt2Code.StartElement com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement
+com.dtmilano.android.viewclient.Excerpt2Code.__init__ com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__
+com.dtmilano.android.viewclient.Excerpt2Code.Parse com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse
+com.dtmilano.android.viewclient.Excerpt2Code.EndElement com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement
+com.dtmilano.android.viewclient.TextView com.dtmilano.android.viewclient.TextView-class.html
+com.dtmilano.android.viewclient.View.getPositionAndSize com.dtmilano.android.viewclient.View-class.html#getPositionAndSize
+com.dtmilano.android.viewclient.View.getClass com.dtmilano.android.viewclient.View-class.html#getClass
+com.dtmilano.android.viewclient.View.getCoords com.dtmilano.android.viewclient.View-class.html#getCoords
+com.dtmilano.android.viewclient.View.__str__ com.dtmilano.android.viewclient.View-class.html#__str__
+com.dtmilano.android.viewclient.View.currentFocus com.dtmilano.android.viewclient.View-class.html#currentFocus
+com.dtmilano.android.viewclient.View.getText com.dtmilano.android.viewclient.View-class.html#getText
+com.dtmilano.android.viewclient.View.getWidth com.dtmilano.android.viewclient.View-class.html#getWidth
+com.dtmilano.android.viewclient.View.getY com.dtmilano.android.viewclient.View-class.html#getY
+com.dtmilano.android.viewclient.View.widthProperty com.dtmilano.android.viewclient.View-class.html#widthProperty
+com.dtmilano.android.viewclient.View.variableNameFromId com.dtmilano.android.viewclient.View-class.html#variableNameFromId
+com.dtmilano.android.viewclient.View.getId com.dtmilano.android.viewclient.View-class.html#getId
+com.dtmilano.android.viewclient.View.touch com.dtmilano.android.viewclient.View-class.html#touch
+com.dtmilano.android.viewclient.View.writeImageToFile com.dtmilano.android.viewclient.View-class.html#writeImageToFile
+com.dtmilano.android.viewclient.View.idProperty com.dtmilano.android.viewclient.View-class.html#idProperty
+com.dtmilano.android.viewclient.View.children com.dtmilano.android.viewclient.View-class.html#children
+com.dtmilano.android.viewclient.View.__init__ com.dtmilano.android.viewclient.View-class.html#__init__
+com.dtmilano.android.viewclient.View.getUniqueId com.dtmilano.android.viewclient.View-class.html#getUniqueId
+com.dtmilano.android.viewclient.View.isClickable com.dtmilano.android.viewclient.View-class.html#isClickable
+com.dtmilano.android.viewclient.View.__getitem__ com.dtmilano.android.viewclient.View-class.html#__getitem__
+com.dtmilano.android.viewclient.View.forceviewserveruse com.dtmilano.android.viewclient.View-class.html#forceviewserveruse
+com.dtmilano.android.viewclient.View.getHeight com.dtmilano.android.viewclient.View-class.html#getHeight
+com.dtmilano.android.viewclient.View.factory com.dtmilano.android.viewclient.View-class.html#factory
+com.dtmilano.android.viewclient.View.__getattr__ com.dtmilano.android.viewclient.View-class.html#__getattr__
+com.dtmilano.android.viewclient.View.add com.dtmilano.android.viewclient.View-class.html#add
+com.dtmilano.android.viewclient.View.version com.dtmilano.android.viewclient.View-class.html#version
+com.dtmilano.android.viewclient.View.build com.dtmilano.android.viewclient.View-class.html#build
+com.dtmilano.android.viewclient.View.__call__ com.dtmilano.android.viewclient.View-class.html#__call__
+com.dtmilano.android.viewclient.View.__smallStr__ com.dtmilano.android.viewclient.View-class.html#__smallStr__
+com.dtmilano.android.viewclient.View.allPossibleNamesWithColon com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon
+com.dtmilano.android.viewclient.View.map com.dtmilano.android.viewclient.View-class.html#map
+com.dtmilano.android.viewclient.View.parent com.dtmilano.android.viewclient.View-class.html#parent
+com.dtmilano.android.viewclient.View.getContentDescription com.dtmilano.android.viewclient.View-class.html#getContentDescription
+com.dtmilano.android.viewclient.View.topProperty com.dtmilano.android.viewclient.View-class.html#topProperty
+com.dtmilano.android.viewclient.View.getCenter com.dtmilano.android.viewclient.View-class.html#getCenter
+com.dtmilano.android.viewclient.View.textProperty com.dtmilano.android.viewclient.View-class.html#textProperty
+com.dtmilano.android.viewclient.View.device com.dtmilano.android.viewclient.View-class.html#device
+com.dtmilano.android.viewclient.View.intersection com.dtmilano.android.viewclient.View-class.html#intersection
+com.dtmilano.android.viewclient.View.__microStr__ com.dtmilano.android.viewclient.View-class.html#__microStr__
+com.dtmilano.android.viewclient.View.getXY com.dtmilano.android.viewclient.View-class.html#getXY
+com.dtmilano.android.viewclient.View.getX com.dtmilano.android.viewclient.View-class.html#getX
+com.dtmilano.android.viewclient.View.getParent com.dtmilano.android.viewclient.View-class.html#getParent
+com.dtmilano.android.viewclient.View.heightProperty com.dtmilano.android.viewclient.View-class.html#heightProperty
+com.dtmilano.android.viewclient.View.leftProperty com.dtmilano.android.viewclient.View-class.html#leftProperty
+com.dtmilano.android.viewclient.View.__tinyStr__ com.dtmilano.android.viewclient.View-class.html#__tinyStr__
+com.dtmilano.android.viewclient.View.useUiAutomator com.dtmilano.android.viewclient.View-class.html#useUiAutomator
+com.dtmilano.android.viewclient.View.containsPoint com.dtmilano.android.viewclient.View-class.html#containsPoint
+com.dtmilano.android.viewclient.View.getVisibility com.dtmilano.android.viewclient.View-class.html#getVisibility
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.__init__ com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement
+com.dtmilano.android.viewclient.View com.dtmilano.android.viewclient.View-class.html
+com.dtmilano.android.viewclient.View.getPositionAndSize com.dtmilano.android.viewclient.View-class.html#getPositionAndSize
+com.dtmilano.android.viewclient.View.getClass com.dtmilano.android.viewclient.View-class.html#getClass
+com.dtmilano.android.viewclient.View.version com.dtmilano.android.viewclient.View-class.html#version
+com.dtmilano.android.viewclient.View.__obtainVwVh com.dtmilano.android.viewclient.View-class.html#__obtainVwVh
+com.dtmilano.android.viewclient.View.getCoords com.dtmilano.android.viewclient.View-class.html#getCoords
+com.dtmilano.android.viewclient.View.__str__ com.dtmilano.android.viewclient.View-class.html#__str__
+com.dtmilano.android.viewclient.View.currentFocus com.dtmilano.android.viewclient.View-class.html#currentFocus
+com.dtmilano.android.viewclient.View.getText com.dtmilano.android.viewclient.View-class.html#getText
+com.dtmilano.android.viewclient.View.getWidth com.dtmilano.android.viewclient.View-class.html#getWidth
+com.dtmilano.android.viewclient.View.getY com.dtmilano.android.viewclient.View-class.html#getY
+com.dtmilano.android.viewclient.View.widthProperty com.dtmilano.android.viewclient.View-class.html#widthProperty
+com.dtmilano.android.viewclient.View.variableNameFromId com.dtmilano.android.viewclient.View-class.html#variableNameFromId
+com.dtmilano.android.viewclient.View.__getattr__ com.dtmilano.android.viewclient.View-class.html#__getattr__
+com.dtmilano.android.viewclient.View.touch com.dtmilano.android.viewclient.View-class.html#touch
+com.dtmilano.android.viewclient.View.writeImageToFile com.dtmilano.android.viewclient.View-class.html#writeImageToFile
+com.dtmilano.android.viewclient.View.idProperty com.dtmilano.android.viewclient.View-class.html#idProperty
+com.dtmilano.android.viewclient.View.children com.dtmilano.android.viewclient.View-class.html#children
+com.dtmilano.android.viewclient.View.__init__ com.dtmilano.android.viewclient.View-class.html#__init__
+com.dtmilano.android.viewclient.View.getUniqueId com.dtmilano.android.viewclient.View-class.html#getUniqueId
+com.dtmilano.android.viewclient.View.isClickable com.dtmilano.android.viewclient.View-class.html#isClickable
+com.dtmilano.android.viewclient.View.__obtainVxVy com.dtmilano.android.viewclient.View-class.html#__obtainVxVy
+com.dtmilano.android.viewclient.View.parent com.dtmilano.android.viewclient.View-class.html#parent
+com.dtmilano.android.viewclient.View.forceviewserveruse com.dtmilano.android.viewclient.View-class.html#forceviewserveruse
+com.dtmilano.android.viewclient.View.getHeight com.dtmilano.android.viewclient.View-class.html#getHeight
+com.dtmilano.android.viewclient.View.factory com.dtmilano.android.viewclient.View-class.html#factory
+com.dtmilano.android.viewclient.View.getId com.dtmilano.android.viewclient.View-class.html#getId
+com.dtmilano.android.viewclient.View.__copy com.dtmilano.android.viewclient.View-class.html#__copy
+com.dtmilano.android.viewclient.View.add com.dtmilano.android.viewclient.View-class.html#add
+com.dtmilano.android.viewclient.View.__dumpWindowsInformation com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation
+com.dtmilano.android.viewclient.View.__obtainPxPy com.dtmilano.android.viewclient.View-class.html#__obtainPxPy
+com.dtmilano.android.viewclient.View.build com.dtmilano.android.viewclient.View-class.html#build
+com.dtmilano.android.viewclient.View.__call__ com.dtmilano.android.viewclient.View-class.html#__call__
+com.dtmilano.android.viewclient.View.__smallStr__ com.dtmilano.android.viewclient.View-class.html#__smallStr__
+com.dtmilano.android.viewclient.View.allPossibleNamesWithColon com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon
+com.dtmilano.android.viewclient.View.map com.dtmilano.android.viewclient.View-class.html#map
+com.dtmilano.android.viewclient.View.__getitem__ com.dtmilano.android.viewclient.View-class.html#__getitem__
+com.dtmilano.android.viewclient.View.getContentDescription com.dtmilano.android.viewclient.View-class.html#getContentDescription
+com.dtmilano.android.viewclient.View.topProperty com.dtmilano.android.viewclient.View-class.html#topProperty
+com.dtmilano.android.viewclient.View.getCenter com.dtmilano.android.viewclient.View-class.html#getCenter
+com.dtmilano.android.viewclient.View.textProperty com.dtmilano.android.viewclient.View-class.html#textProperty
+com.dtmilano.android.viewclient.View.device com.dtmilano.android.viewclient.View-class.html#device
+com.dtmilano.android.viewclient.View.intersection com.dtmilano.android.viewclient.View-class.html#intersection
+com.dtmilano.android.viewclient.View.__microStr__ com.dtmilano.android.viewclient.View-class.html#__microStr__
+com.dtmilano.android.viewclient.View.getXY com.dtmilano.android.viewclient.View-class.html#getXY
+com.dtmilano.android.viewclient.View.getX com.dtmilano.android.viewclient.View-class.html#getX
+com.dtmilano.android.viewclient.View.getParent com.dtmilano.android.viewclient.View-class.html#getParent
+com.dtmilano.android.viewclient.View.heightProperty com.dtmilano.android.viewclient.View-class.html#heightProperty
+com.dtmilano.android.viewclient.View.leftProperty com.dtmilano.android.viewclient.View-class.html#leftProperty
+com.dtmilano.android.viewclient.View.__obtainStatusBarDimensionsIfVisible com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible
+com.dtmilano.android.viewclient.View.__tinyStr__ com.dtmilano.android.viewclient.View-class.html#__tinyStr__
+com.dtmilano.android.viewclient.View.useUiAutomator com.dtmilano.android.viewclient.View-class.html#useUiAutomator
+com.dtmilano.android.viewclient.View.containsPoint com.dtmilano.android.viewclient.View-class.html#containsPoint
+com.dtmilano.android.viewclient.View.getVisibility com.dtmilano.android.viewclient.View-class.html#getVisibility
+com.dtmilano.android.viewclient.ViewClient com.dtmilano.android.viewclient.ViewClient-class.html
+com.dtmilano.android.viewclient.ViewClient.__pickleable com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable
+com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree
+com.dtmilano.android.viewclient.ViewClient.traverse com.dtmilano.android.viewclient.ViewClient-class.html#traverse
+com.dtmilano.android.viewclient.ViewClient.TRAVERSE_CIT com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CIT
+com.dtmilano.android.viewclient.ViewClient.dump com.dtmilano.android.viewclient.ViewClient-class.html#dump
+com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute
+com.dtmilano.android.viewclient.ViewClient.excerpt com.dtmilano.android.viewclient.ViewClient-class.html#excerpt
+com.dtmilano.android.viewclient.ViewClient.findViewByTag com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTag
+com.dtmilano.android.viewclient.ViewClient.ignoreUiAutomatorKilled com.dtmilano.android.viewclient.ViewClient-class.html#ignoreUiAutomatorKilled
+com.dtmilano.android.viewclient.ViewClient.adb com.dtmilano.android.viewclient.ViewClient-class.html#adb
+com.dtmilano.android.viewclient.ViewClient.findViewByTagOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTagOrRaise
+com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndCenter com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter
+com.dtmilano.android.viewclient.ViewClient.sleep com.dtmilano.android.viewclient.ViewClient-class.html#sleep
+com.dtmilano.android.viewclient.ViewClient.findViewByIdOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise
+com.dtmilano.android.viewclient.ViewClient.writeImageToFile com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile
+com.dtmilano.android.viewclient.ViewClient.TRAVERSE_CITUI com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITUI
+com.dtmilano.android.viewclient.ViewClient.views com.dtmilano.android.viewclient.ViewClient-class.html#views
+com.dtmilano.android.viewclient.ViewClient.__init__ com.dtmilano.android.viewclient.ViewClient-class.html#__init__
+com.dtmilano.android.viewclient.ViewClient.findViewWithTextOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise
+com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextPositionAndSize com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize
+com.dtmilano.android.viewclient.ViewClient.TRAVERSE_CITC com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITC
+com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches
+com.dtmilano.android.viewclient.ViewClient.__traverse com.dtmilano.android.viewclient.ViewClient-class.html#__traverse
+com.dtmilano.android.viewclient.ViewClient.setViewsFromUiAutomatorDump com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump
+com.dtmilano.android.viewclient.ViewClient.TRAVERSE_CITPS com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITPS
+com.dtmilano.android.viewclient.ViewClient.hammingDistance com.dtmilano.android.viewclient.ViewClient-class.html#hammingDistance
+com.dtmilano.android.viewclient.ViewClient.display com.dtmilano.android.viewclient.ViewClient-class.html#display
+com.dtmilano.android.viewclient.ViewClient.isKeyboardShown com.dtmilano.android.viewclient.ViewClient-class.html#isKeyboardShown
+com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath
+com.dtmilano.android.viewclient.ViewClient.findViewWithContentDescriptionOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescriptionOrRaise
+com.dtmilano.android.viewclient.ViewClient.build com.dtmilano.android.viewclient.ViewClient-class.html#build
+com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance
+com.dtmilano.android.viewclient.ViewClient.__parseTreeFromUiAutomatorDump com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump
+com.dtmilano.android.viewclient.ViewClient.ro com.dtmilano.android.viewclient.ViewClient-class.html#ro
+com.dtmilano.android.viewclient.ViewClient.TRAVERSE_CITCD com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITCD
+com.dtmilano.android.viewclient.ViewClient.__splitAttrs com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs
+com.dtmilano.android.viewclient.ViewClient.assertServiceResponse com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse
+com.dtmilano.android.viewclient.ViewClient.findViewWithText com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText
+com.dtmilano.android.viewclient.ViewClient.__getFocusedWindowPosition com.dtmilano.android.viewclient.ViewClient-class.html#__getFocusedWindowPosition
+com.dtmilano.android.viewclient.ViewClient.setAlarm com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm
+com.dtmilano.android.viewclient.ViewClient.__del__ com.dtmilano.android.viewclient.ViewClient-class.html#__del__
+com.dtmilano.android.viewclient.ViewClient.serialno com.dtmilano.android.viewclient.ViewClient-class.html#serialno
+com.dtmilano.android.viewclient.ViewClient.forceViewServerUse com.dtmilano.android.viewclient.ViewClient-class.html#forceViewServerUse
+com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndUniqueId com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId
+com.dtmilano.android.viewclient.ViewClient.findViewById com.dtmilano.android.viewclient.ViewClient-class.html#findViewById
+com.dtmilano.android.viewclient.ViewClient.findViewsContainingPoint com.dtmilano.android.viewclient.ViewClient-class.html#findViewsContainingPoint
+com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise
+com.dtmilano.android.viewclient.ViewClient.__parseTree com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree
+com.dtmilano.android.viewclient.ViewClient.levenshteinDistance com.dtmilano.android.viewclient.ViewClient-class.html#levenshteinDistance
+com.dtmilano.android.viewclient.ViewClient.device com.dtmilano.android.viewclient.ViewClient-class.html#device
+com.dtmilano.android.viewclient.ViewClient.getSdkVersion com.dtmilano.android.viewclient.ViewClient-class.html#getSdkVersion
+com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeOrRaise com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise
+com.dtmilano.android.viewclient.ViewClient.__mapSerialNo com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo
+com.dtmilano.android.viewclient.ViewClient.connectToDeviceOrExit com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit
+com.dtmilano.android.viewclient.ViewClient.serviceResponse com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse
+com.dtmilano.android.viewclient.ViewClient.distance com.dtmilano.android.viewclient.ViewClient-class.html#distance
+com.dtmilano.android.viewclient.ViewClient.getRoot com.dtmilano.android.viewclient.ViewClient-class.html#getRoot
+com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText
+com.dtmilano.android.viewclient.ViewClient.windows com.dtmilano.android.viewclient.ViewClient-class.html#windows
+com.dtmilano.android.viewclient.ViewClient.getViewIds com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds
+com.dtmilano.android.viewclient.ViewClient.__obtainDeviceSerialNumber com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber
+com.dtmilano.android.viewclient.ViewClient.list com.dtmilano.android.viewclient.ViewClient-class.html#list
+com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndContentDescription com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription
+com.dtmilano.android.viewclient.ViewClient.findViewWithContentDescription com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescription
+com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeThatMatches com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches
+com.dtmilano.android.viewclient.ViewClient.viewsById com.dtmilano.android.viewclient.ViewClient-class.html#viewsById
+com.dtmilano.android.viewclient.ViewClient.root com.dtmilano.android.viewclient.ViewClient-class.html#root
+com.dtmilano.android.viewclient.ViewClient.setViews com.dtmilano.android.viewclient.ViewClient-class.html#setViews
+com.dtmilano.android.viewclient.ViewClient.getViewsById com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById
+com.dtmilano.android.viewclient.ViewClient.__hammingDistance com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance
+com.dtmilano.android.viewclient.ViewNotFoundException com.dtmilano.android.viewclient.ViewNotFoundException-class.html
+com.dtmilano.android.viewclient.ViewNotFoundException.__init__ com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__
+com.dtmilano.android.viewclient.Window com.dtmilano.android.viewclient.Window-class.html
+com.dtmilano.android.viewclient.Window.__str__ com.dtmilano.android.viewclient.Window-class.html#__str__
+com.dtmilano.android.viewclient.Window.__init__ com.dtmilano.android.viewclient.Window-class.html#__init__
diff --git a/AndroidViewClient/doc/class-tree.html b/AndroidViewClient/doc/class-tree.html
new file mode 100755
index 0000000..39a4370
--- /dev/null
+++ b/AndroidViewClient/doc/class-tree.html
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Class Hierarchy</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Trees </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%"> </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="class-tree.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<center><b>
+ [ <a href="module-tree.html">Module Hierarchy</a>
+ | <a href="class-tree.html">Class Hierarchy</a> ]
+</b></center><br />
+<h1 class="epydoc">Class Hierarchy</h1>
+<ul class="nomargin-top">
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">com.dtmilano.android.adb.adbclient.AdbClient</a></strong>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb.adbclient.Device-class.html">com.dtmilano.android.adb.adbclient.Device</a></strong>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">com.dtmilano.android.viewclient.Excerpt2Code</a></strong>:
+ <em class="summary">Excerpt XML to code</em>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient</a></strong>:
+ <em class="summary">UiAutomator XML to AndroidViewClient</em>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.View-class.html">com.dtmilano.android.viewclient.View</a></strong>:
+ <em class="summary">View class</em>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.TextView-class.html">com.dtmilano.android.viewclient.TextView</a></strong>:
+ <em class="summary">TextView class.</em>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.EditText-class.html">com.dtmilano.android.viewclient.EditText</a></strong>:
+ <em class="summary">EditText class.</em>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.ViewClient-class.html">com.dtmilano.android.viewclient.ViewClient</a></strong>:
+ <em class="summary">ViewClient is a <i>ViewServer</i> client.</em>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.Window-class.html">com.dtmilano.android.viewclient.Window</a></strong>:
+ <em class="summary">Window class</em>
+ </li>
+ <li> <strong class="uidlink">object</strong>:
+ <em class="summary">The most base type</em>
+ <ul>
+ <li> <strong class="uidlink">exceptions.BaseException</strong>:
+ <em class="summary">Common base class for all exceptions</em>
+ <ul>
+ <li> <strong class="uidlink">exceptions.Exception</strong>:
+ <em class="summary">Common base class for all non-exit exceptions.</em>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">com.dtmilano.android.viewclient.ViewNotFoundException</a></strong>:
+ <em class="summary">ViewNotFoundException is raised when a View is not found.</em>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Trees </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:57 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android-module.html b/AndroidViewClient/doc/com.dtmilano.android-module.html
new file mode 100755
index 0000000..cbbd60d
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android-module.html
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ Package android
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== PACKAGE DESCRIPTION ==================== -->
+<h1 class="epydoc">Package android</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android-pysrc.html">source code</a></span></p>
+<!-- ==================== SUBMODULES ==================== -->
+<a name="section-Submodules"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Submodules</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Submodules"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr><td class="summary">
+ <ul class="nomargin">
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb-module.html">com.dtmilano.android.adb</a></strong>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a></strong>: <em class="summary">Copyright (C) 2012-2013 Diego Torres Milano
+Created on Dec 1, 2012</em> </li>
+ </ul>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a></strong>: <em class="summary">Copyright (C) 2012-2014 Diego Torres Milano
+Created on Feb 2, 2012</em> </li>
+ </ul></td></tr>
+</table>
+
+<br />
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="None">None</code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android-pysrc.html b/AndroidViewClient/doc/com.dtmilano.android-pysrc.html
new file mode 100755
index 0000000..c0ed412
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android-pysrc.html
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ Package android
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="com.dtmilano.android-module.html">Package com.dtmilano.android</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno">1</tt> <tt class="py-line"> </tt>
+<a name="L2"></a><tt class="py-lineno">2</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:02 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb-module.html b/AndroidViewClient/doc/com.dtmilano.android.adb-module.html
new file mode 100755
index 0000000..7586057
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb-module.html
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ Package adb
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== PACKAGE DESCRIPTION ==================== -->
+<h1 class="epydoc">Package adb</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.adb-pysrc.html">source code</a></span></p>
+<!-- ==================== SUBMODULES ==================== -->
+<a name="section-Submodules"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Submodules</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Submodules"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr><td class="summary">
+ <ul class="nomargin">
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a></strong>: <em class="summary">Copyright (C) 2012-2013 Diego Torres Milano
+Created on Dec 1, 2012</em> </li>
+ </ul></td></tr>
+</table>
+
+<br />
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="None">None</code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb-pysrc.html b/AndroidViewClient/doc/com.dtmilano.android.adb-pysrc.html
new file mode 100755
index 0000000..7e204aa
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb-pysrc.html
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ Package adb
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="com.dtmilano.android.adb-module.html">Package com.dtmilano.android.adb</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno">1</tt> <tt class="py-line"> </tt>
+<a name="L2"></a><tt class="py-lineno">2</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:02 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-module.html b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-module.html
new file mode 100755
index 0000000..ade1048
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-module.html
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb.adbclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.adb-module.html">Package adb</a> ::
+ Module adbclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb.adbclient-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module adbclient</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html">source code</a></span></p>
+<pre class="literalblock">
+
+Copyright (C) 2012-2013 Diego Torres Milano
+Created on Dec 1, 2012
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+
+</pre>
+
+<hr />
+<div class="fields"> <p><strong>Version:</strong>
+ 5.7.0
+ </p>
+</div><!-- ==================== CLASSES ==================== -->
+<a name="section-Classes"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Classes</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Classes"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.adb.adbclient.Device-class.html" class="summary-name">Device</a>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html" class="summary-name">AdbClient</a>
+ </td>
+ </tr>
+</table>
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG"></a><span class="summary-name">DEBUG</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="HOSTNAME"></a><span class="summary-name">HOSTNAME</span> = <code title="'localhost'"><code class="variable-quote">'</code><code class="variable-string">localhost</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="PORT"></a><span class="summary-name">PORT</span> = <code title="5037">5037</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="OKAY"></a><span class="summary-name">OKAY</span> = <code title="'OKAY'"><code class="variable-quote">'</code><code class="variable-string">OKAY</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="FAIL"></a><span class="summary-name">FAIL</span> = <code title="'FAIL'"><code class="variable-quote">'</code><code class="variable-string">FAIL</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="UP"></a><span class="summary-name">UP</span> = <code title="0">0</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DOWN"></a><span class="summary-name">DOWN</span> = <code title="1">1</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DOWN_AND_UP"></a><span class="summary-name">DOWN_AND_UP</span> = <code title="2">2</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TIMEOUT"></a><span class="summary-name">TIMEOUT</span> = <code title="15">15</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VERSION_SDK_PROPERTY"></a><span class="summary-name">VERSION_SDK_PROPERTY</span> = <code title="'ro.build.version.sdk'"><code class="variable-quote">'</code><code class="variable-string">ro.build.version.sdk</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VERSION_RELEASE_PROPERTY"></a><span class="summary-name">VERSION_RELEASE_PROPERTY</span> = <code title="'ro.build.version.release'"><code class="variable-quote">'</code><code class="variable-string">ro.build.version.release</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="'com.dtmilano.android.adb'"><code class="variable-quote">'</code><code class="variable-string">com.dtmilano.android.adb</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-pysrc.html b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-pysrc.html
new file mode 100755
index 0000000..02eccaa
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient-pysrc.html
@@ -0,0 +1,717 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb.adbclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.adb-module.html">Package adb</a> ::
+ Module adbclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb.adbclient-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="com.dtmilano.android.adb.adbclient-module.html">Module com.dtmilano.android.adb.adbclient</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt> <tt class="py-line"><tt class="py-docstring">Copyright (C) 2012-2013 Diego Torres Milano</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt> <tt class="py-line"><tt class="py-docstring">Created on Dec 1, 2012</tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt> <tt class="py-line"><tt class="py-docstring">Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt> <tt class="py-line"><tt class="py-docstring">you may not use this file except in compliance with the License.</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt> <tt class="py-line"><tt class="py-docstring">You may obtain a copy of the License at</tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt> <tt class="py-line"><tt class="py-docstring"> http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
+<a name="L10"></a><tt class="py-lineno"> 10</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L11"></a><tt class="py-lineno"> 11</tt> <tt class="py-line"><tt class="py-docstring">Unless required by applicable law or agreed to in writing, software</tt> </tt>
+<a name="L12"></a><tt class="py-lineno"> 12</tt> <tt class="py-line"><tt class="py-docstring">distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
+<a name="L13"></a><tt class="py-lineno"> 13</tt> <tt class="py-line"><tt class="py-docstring">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
+<a name="L14"></a><tt class="py-lineno"> 14</tt> <tt class="py-line"><tt class="py-docstring">See the License for the specific language governing permissions and</tt> </tt>
+<a name="L15"></a><tt class="py-lineno"> 15</tt> <tt class="py-line"><tt class="py-docstring">limitations under the License.</tt> </tt>
+<a name="L16"></a><tt class="py-lineno"> 16</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L17"></a><tt class="py-lineno"> 17</tt> <tt class="py-line"><tt class="py-docstring">@author: Diego Torres Milano</tt> </tt>
+<a name="L18"></a><tt class="py-lineno"> 18</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L19"></a><tt class="py-lineno"> 19</tt> <tt class="py-line"> </tt>
+<a name="L20"></a><tt class="py-lineno"> 20</tt> <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'5.7.0'</tt> </tt>
+<a name="L21"></a><tt class="py-lineno"> 21</tt> <tt class="py-line"> </tt>
+<a name="L22"></a><tt class="py-lineno"> 22</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> </tt>
+<a name="L23"></a><tt class="py-lineno"> 23</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">warnings</tt> </tt>
+<a name="L24"></a><tt class="py-lineno"> 24</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">executable</tt><tt class="py-op">:</tt> </tt>
+<a name="L25"></a><tt class="py-lineno"> 25</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">'monkeyrunner'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">executable</tt><tt class="py-op">:</tt> </tt>
+<a name="L26"></a><tt class="py-lineno"> 26</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt> </tt>
+<a name="L27"></a><tt class="py-lineno"> 27</tt> <tt class="py-line"> <tt class="py-string">'''</tt> </tt>
+<a name="L28"></a><tt class="py-lineno"> 28</tt> <tt class="py-line"><tt class="py-string"></tt> </tt>
+<a name="L29"></a><tt class="py-lineno"> 29</tt> <tt class="py-line"><tt class="py-string"> You should use a 'python' interpreter, not 'monkeyrunner' for this module</tt> </tt>
+<a name="L30"></a><tt class="py-lineno"> 30</tt> <tt class="py-line"><tt class="py-string"></tt> </tt>
+<a name="L31"></a><tt class="py-lineno"> 31</tt> <tt class="py-line"><tt class="py-string"> '''</tt><tt class="py-op">,</tt> <tt class="py-name">RuntimeWarning</tt><tt class="py-op">)</tt> </tt>
+<a name="L32"></a><tt class="py-lineno"> 32</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">socket</tt> </tt>
+<a name="L33"></a><tt class="py-lineno"> 33</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">time</tt> </tt>
+<a name="L34"></a><tt class="py-lineno"> 34</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> </tt>
+<a name="L35"></a><tt class="py-lineno"> 35</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">signal</tt> </tt>
+<a name="L36"></a><tt class="py-lineno"> 36</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">os</tt> </tt>
+<a name="L37"></a><tt class="py-lineno"> 37</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">types</tt> </tt>
+<a name="L38"></a><tt class="py-lineno"> 38</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">platform</tt> </tt>
+<a name="L39"></a><tt class="py-lineno"> 39</tt> <tt class="py-line"> </tt>
+<a name="L40"></a><tt class="py-lineno"> 40</tt> <tt class="py-line"><tt id="link-0" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DEBUG=com.dtmilano.android.adb.adbclient-module.html#DEBUG,Variable com.dtmilano.android.viewclient.DEBUG=com.dtmilano.android.viewclient-module.html#DEBUG"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-0', 'DEBUG', 'link-0');">DEBUG</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L41"></a><tt class="py-lineno"> 41</tt> <tt class="py-line"> </tt>
+<a name="L42"></a><tt class="py-lineno"> 42</tt> <tt class="py-line"><tt id="link-1" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.HOSTNAME=com.dtmilano.android.adb.adbclient-module.html#HOSTNAME"><a title="com.dtmilano.android.adb.adbclient.HOSTNAME" class="py-name" href="#" onclick="return doclink('link-1', 'HOSTNAME', 'link-1');">HOSTNAME</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'localhost'</tt> </tt>
+<a name="L43"></a><tt class="py-lineno"> 43</tt> <tt class="py-line"><tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L44"></a><tt class="py-lineno"> 44</tt> <tt class="py-line"> <tt id="link-2" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.PORT=com.dtmilano.android.adb.adbclient-module.html#PORT"><a title="com.dtmilano.android.adb.adbclient.PORT" class="py-name" href="#" onclick="return doclink('link-2', 'PORT', 'link-2');">PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_ADB_SERVER_PORT'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L45"></a><tt class="py-lineno"> 45</tt> <tt class="py-line"><tt class="py-keyword">except</tt> <tt class="py-name">KeyError</tt><tt class="py-op">:</tt> </tt>
+<a name="L46"></a><tt class="py-lineno"> 46</tt> <tt class="py-line"> <tt id="link-3" class="py-name"><a title="com.dtmilano.android.adb.adbclient.PORT" class="py-name" href="#" onclick="return doclink('link-3', 'PORT', 'link-2');">PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">5037</tt> </tt>
+<a name="L47"></a><tt class="py-lineno"> 47</tt> <tt class="py-line"> </tt>
+<a name="L48"></a><tt class="py-lineno"> 48</tt> <tt class="py-line"><tt id="link-4" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.OKAY=com.dtmilano.android.adb.adbclient-module.html#OKAY"><a title="com.dtmilano.android.adb.adbclient.OKAY" class="py-name" href="#" onclick="return doclink('link-4', 'OKAY', 'link-4');">OKAY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'OKAY'</tt> </tt>
+<a name="L49"></a><tt class="py-lineno"> 49</tt> <tt class="py-line"><tt id="link-5" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.FAIL=com.dtmilano.android.adb.adbclient-module.html#FAIL"><a title="com.dtmilano.android.adb.adbclient.FAIL" class="py-name" href="#" onclick="return doclink('link-5', 'FAIL', 'link-5');">FAIL</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'FAIL'</tt> </tt>
+<a name="L50"></a><tt class="py-lineno"> 50</tt> <tt class="py-line"> </tt>
+<a name="L51"></a><tt class="py-lineno"> 51</tt> <tt class="py-line"><tt id="link-6" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.UP=com.dtmilano.android.adb.adbclient-module.html#UP"><a title="com.dtmilano.android.adb.adbclient.UP" class="py-name" href="#" onclick="return doclink('link-6', 'UP', 'link-6');">UP</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L52"></a><tt class="py-lineno"> 52</tt> <tt class="py-line"><tt id="link-7" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DOWN=com.dtmilano.android.adb.adbclient-module.html#DOWN"><a title="com.dtmilano.android.adb.adbclient.DOWN" class="py-name" href="#" onclick="return doclink('link-7', 'DOWN', 'link-7');">DOWN</a></tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L53"></a><tt class="py-lineno"> 53</tt> <tt class="py-line"><tt id="link-8" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DOWN_AND_UP=com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-8', 'DOWN_AND_UP', 'link-8');">DOWN_AND_UP</a></tt> <tt class="py-op">=</tt> <tt class="py-number">2</tt> </tt>
+<a name="L54"></a><tt class="py-lineno"> 54</tt> <tt class="py-line"> </tt>
+<a name="L55"></a><tt class="py-lineno"> 55</tt> <tt class="py-line"><tt id="link-9" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.TIMEOUT=com.dtmilano.android.adb.adbclient-module.html#TIMEOUT"><a title="com.dtmilano.android.adb.adbclient.TIMEOUT" class="py-name" href="#" onclick="return doclink('link-9', 'TIMEOUT', 'link-9');">TIMEOUT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">15</tt> </tt>
+<a name="L56"></a><tt class="py-lineno"> 56</tt> <tt class="py-line"> </tt>
+<a name="L57"></a><tt class="py-lineno"> 57</tt> <tt class="py-line"><tt class="py-comment"># some device properties</tt> </tt>
+<a name="L58"></a><tt class="py-lineno"> 58</tt> <tt class="py-line"><tt id="link-10" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY=com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY,Variable com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY=com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-10', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'ro.build.version.sdk'</tt> </tt>
+<a name="L59"></a><tt class="py-lineno"> 59</tt> <tt class="py-line"><tt id="link-11" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY=com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY,Variable com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY=com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY"><a title="com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY
+com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY" class="py-name" href="#" onclick="return doclink('link-11', 'VERSION_RELEASE_PROPERTY', 'link-11');">VERSION_RELEASE_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'ro.build.version.release'</tt> </tt>
+<a name="Device"></a><div id="Device-def"><a name="L60"></a><tt class="py-lineno"> 60</tt> <tt class="py-line"> </tt>
+<a name="L61"></a><tt class="py-lineno"> 61</tt> <tt class="py-line"> </tt>
+<a name="L62"></a><tt class="py-lineno"> 62</tt> <a class="py-toggle" href="#" id="Device-toggle" onclick="return toggle('Device');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.Device-class.html">Device</a><tt class="py-op">:</tt> </tt>
+</div><div id="Device-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="Device-expanded"><a name="L63"></a><tt class="py-lineno"> 63</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="Device.factory"></a><div id="Device.factory-def"><a name="L64"></a><tt class="py-lineno"> 64</tt> <a class="py-toggle" href="#" id="Device.factory-toggle" onclick="return toggle('Device.factory');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.Device-class.html#factory">factory</a><tt class="py-op">(</tt><tt class="py-param">_str</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Device.factory-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="Device.factory-expanded"><a name="L65"></a><tt class="py-lineno"> 65</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-12" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-12', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L66"></a><tt class="py-lineno"> 66</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Device.factory("</tt><tt class="py-op">,</tt> <tt class="py-name">_str</tt><tt class="py-op">,</tt> <tt class="py-string">")"</tt> </tt>
+<a name="L67"></a><tt class="py-lineno"> 67</tt> <tt class="py-line"> <tt class="py-name">values</tt> <tt class="py-op">=</tt> <tt class="py-name">_str</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-number">2</tt><tt class="py-op">)</tt> </tt>
+<a name="L68"></a><tt class="py-lineno"> 68</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-13" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-13', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L69"></a><tt class="py-lineno"> 69</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"values="</tt><tt class="py-op">,</tt> <tt class="py-name">values</tt> </tt>
+<a name="L70"></a><tt class="py-lineno"> 70</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-14" class="py-name" targets="Class com.dtmilano.android.adb.adbclient.Device=com.dtmilano.android.adb.adbclient.Device-class.html"><a title="com.dtmilano.android.adb.adbclient.Device" class="py-name" href="#" onclick="return doclink('link-14', 'Device', 'link-14');">Device</a></tt><tt class="py-op">(</tt><tt class="py-op">*</tt><tt class="py-name">values</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L71"></a><tt class="py-lineno"> 71</tt> <tt class="py-line"> </tt>
+<a name="Device.__init__"></a><div id="Device.__init__-def"><a name="L72"></a><tt class="py-lineno"> 72</tt> <a class="py-toggle" href="#" id="Device.__init__-toggle" onclick="return toggle('Device.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.Device-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">,</tt> <tt class="py-param">status</tt><tt class="py-op">,</tt> <tt class="py-param">qualifiers</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Device.__init__-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="Device.__init__-expanded"><a name="L73"></a><tt class="py-lineno"> 73</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L74"></a><tt class="py-lineno"> 74</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">status</tt> <tt class="py-op">=</tt> <tt class="py-name">status</tt> </tt>
+<a name="L75"></a><tt class="py-lineno"> 75</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">qualifiers</tt> <tt class="py-op">=</tt> <tt class="py-name">qualifiers</tt> </tt>
+</div><a name="L76"></a><tt class="py-lineno"> 76</tt> <tt class="py-line"> </tt>
+<a name="Device.__str__"></a><div id="Device.__str__-def"><a name="L77"></a><tt class="py-lineno"> 77</tt> <a class="py-toggle" href="#" id="Device.__str__-toggle" onclick="return toggle('Device.__str__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.Device-class.html#__str__">__str__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Device.__str__-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="Device.__str__-expanded"><a name="L78"></a><tt class="py-lineno"> 78</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"<<<"</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">+</tt> <tt class="py-string">", "</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">status</tt> <tt class="py-op">+</tt> <tt class="py-string">", %s>>>"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">qualifiers</tt> </tt>
+</div></div><a name="L79"></a><tt class="py-lineno"> 79</tt> <tt class="py-line"> </tt>
+<a name="AdbClient"></a><div id="AdbClient-def"><a name="L80"></a><tt class="py-lineno"> 80</tt> <tt class="py-line"> </tt>
+<a name="L81"></a><tt class="py-lineno"> 81</tt> <a class="py-toggle" href="#" id="AdbClient-toggle" onclick="return toggle('AdbClient');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="AdbClient-expanded"><a name="L82"></a><tt class="py-lineno"> 82</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__init__"></a><div id="AdbClient.__init__-def"><a name="L83"></a><tt class="py-lineno"> 83</tt> <a class="py-toggle" href="#" id="AdbClient.__init__-toggle" onclick="return toggle('AdbClient.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">hostname</tt><tt class="py-op">=</tt><tt id="link-15" class="py-name"><a title="com.dtmilano.android.adb.adbclient.HOSTNAME" class="py-name" href="#" onclick="return doclink('link-15', 'HOSTNAME', 'link-1');">HOSTNAME</a></tt><tt class="py-op">,</tt> <tt class="py-param">port</tt><tt class="py-op">=</tt><tt id="link-16" class="py-name"><a title="com.dtmilano.android.adb.adbclient.PORT" class="py-name" href="#" onclick="return doclink('link-16', 'PORT', 'link-2');">PORT</a></tt><tt class="py-op">,</tt> <tt class="py-param">settransport</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__init__-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__init__-expanded"><a name="L84"></a><tt class="py-lineno"> 84</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L85"></a><tt class="py-lineno"> 85</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">hostname</tt> <tt class="py-op">=</tt> <tt class="py-name">hostname</tt> </tt>
+<a name="L86"></a><tt class="py-lineno"> 86</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">port</tt> <tt class="py-op">=</tt> <tt class="py-name">port</tt> </tt>
+<a name="L87"></a><tt class="py-lineno"> 87</tt> <tt class="py-line"> </tt>
+<a name="L88"></a><tt class="py-lineno"> 88</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">reconnect</tt> <tt class="py-op">=</tt> <tt class="py-name">reconnect</tt> </tt>
+<a name="L89"></a><tt class="py-lineno"> 89</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-17" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__connect()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__connect"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-17', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L90"></a><tt class="py-lineno"> 90</tt> <tt class="py-line"> </tt>
+<a name="L91"></a><tt class="py-lineno"> 91</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-18" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.checkVersion()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkVersion"><a title="com.dtmilano.android.adb.adbclient.AdbClient.checkVersion" class="py-name" href="#" onclick="return doclink('link-18', 'checkVersion', 'link-18');">checkVersion</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L92"></a><tt class="py-lineno"> 92</tt> <tt class="py-line"> </tt>
+<a name="L93"></a><tt class="py-lineno"> 93</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L94"></a><tt class="py-lineno"> 94</tt> <tt class="py-line"> <tt class="py-string">''' Build properties '''</tt> </tt>
+<a name="L95"></a><tt class="py-lineno"> 95</tt> <tt class="py-line"> </tt>
+<a name="L96"></a><tt class="py-lineno"> 96</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">isTransportSet</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L97"></a><tt class="py-lineno"> 97</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">settransport</tt> <tt class="py-keyword">and</tt> <tt class="py-name">serialno</tt> <tt class="py-op">!=</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L98"></a><tt class="py-lineno"> 98</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-19" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__setTransport()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__setTransport"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-19', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L99"></a><tt class="py-lineno"> 99</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-20" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-20', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-21" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__getProp()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getProp"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__getProp" class="py-name" href="#" onclick="return doclink('link-21', '__getProp', 'link-21');">__getProp</a></tt><tt class="py-op">(</tt><tt id="link-22" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-22', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L100"></a><tt class="py-lineno">100</tt> <tt class="py-line"> </tt>
+<a name="L101"></a><tt class="py-lineno">101</tt> <tt class="py-line"> </tt>
+<a name="L102"></a><tt class="py-lineno">102</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="AdbClient.setAlarm"></a><div id="AdbClient.setAlarm-def"><a name="L103"></a><tt class="py-lineno">103</tt> <a class="py-toggle" href="#" id="AdbClient.setAlarm-toggle" onclick="return toggle('AdbClient.setAlarm');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setAlarm">setAlarm</a><tt class="py-op">(</tt><tt class="py-param">timeout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.setAlarm-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.setAlarm-expanded"><a name="L104"></a><tt class="py-lineno">104</tt> <tt class="py-line"> <tt class="py-name">osName</tt> <tt class="py-op">=</tt> <tt class="py-name">platform</tt><tt class="py-op">.</tt><tt class="py-name">system</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L105"></a><tt class="py-lineno">105</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> <tt class="py-comment"># alarm is not implemented in Windows</tt> </tt>
+<a name="L106"></a><tt class="py-lineno">106</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L107"></a><tt class="py-lineno">107</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-23" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-23', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L108"></a><tt class="py-lineno">108</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"setAlarm(%d)"</tt> <tt class="py-op">%</tt> <tt class="py-name">timeout</tt> </tt>
+<a name="L109"></a><tt class="py-lineno">109</tt> <tt class="py-line"> <tt class="py-name">signal</tt><tt class="py-op">.</tt><tt class="py-name">alarm</tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L110"></a><tt class="py-lineno">110</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.setSerialno"></a><div id="AdbClient.setSerialno-def"><a name="L111"></a><tt class="py-lineno">111</tt> <a class="py-toggle" href="#" id="AdbClient.setSerialno-toggle" onclick="return toggle('AdbClient.setSerialno');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setSerialno">setSerialno</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.setSerialno-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.setSerialno-expanded"><a name="L112"></a><tt class="py-lineno">112</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">isTransportSet</tt><tt class="py-op">:</tt> </tt>
+<a name="L113"></a><tt class="py-lineno">113</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Transport is already set, serialno cannot be set once this is done."</tt><tt class="py-op">)</tt> </tt>
+<a name="L114"></a><tt class="py-lineno">114</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L115"></a><tt class="py-lineno">115</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-24" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-24', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L116"></a><tt class="py-lineno">116</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-25" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-25', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-26" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__getProp" class="py-name" href="#" onclick="return doclink('link-26', '__getProp', 'link-21');">__getProp</a></tt><tt class="py-op">(</tt><tt id="link-27" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-27', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L117"></a><tt class="py-lineno">117</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.setReconnect"></a><div id="AdbClient.setReconnect-def"><a name="L118"></a><tt class="py-lineno">118</tt> <a class="py-toggle" href="#" id="AdbClient.setReconnect-toggle" onclick="return toggle('AdbClient.setReconnect');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setReconnect">setReconnect</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.setReconnect-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.setReconnect-expanded"><a name="L119"></a><tt class="py-lineno">119</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">reconnect</tt> <tt class="py-op">=</tt> <tt class="py-name">val</tt> </tt>
+</div><a name="L120"></a><tt class="py-lineno">120</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__connect"></a><div id="AdbClient.__connect-def"><a name="L121"></a><tt class="py-lineno">121</tt> <a class="py-toggle" href="#" id="AdbClient.__connect-toggle" onclick="return toggle('AdbClient.__connect');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__connect">__connect</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__connect-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__connect-expanded"><a name="L122"></a><tt class="py-lineno">122</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-28" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-28', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L123"></a><tt class="py-lineno">123</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__connect()"</tt> </tt>
+<a name="L124"></a><tt class="py-lineno">124</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt> <tt class="py-op">=</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">(</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">AF_INET</tt><tt class="py-op">,</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">SOCK_STREAM</tt><tt class="py-op">)</tt> </tt>
+<a name="L125"></a><tt class="py-lineno">125</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">settimeout</tt><tt class="py-op">(</tt><tt id="link-29" class="py-name"><a title="com.dtmilano.android.adb.adbclient.TIMEOUT" class="py-name" href="#" onclick="return doclink('link-29', 'TIMEOUT', 'link-9');">TIMEOUT</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L126"></a><tt class="py-lineno">126</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L127"></a><tt class="py-lineno">127</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">connect</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">hostname</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">port</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L128"></a><tt class="py-lineno">128</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">error</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L129"></a><tt class="py-lineno">129</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Connecting to %s:%d: %s.\nIs adb running on your computer?"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">port</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L130"></a><tt class="py-lineno">130</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.close"></a><div id="AdbClient.close-def"><a name="L131"></a><tt class="py-lineno">131</tt> <a class="py-toggle" href="#" id="AdbClient.close-toggle" onclick="return toggle('AdbClient.close');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#close">close</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.close-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.close-expanded"><a name="L132"></a><tt class="py-lineno">132</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-30" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-30', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L133"></a><tt class="py-lineno">133</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Closing socket..."</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt> </tt>
+<a name="L134"></a><tt class="py-lineno">134</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">:</tt> </tt>
+<a name="L135"></a><tt class="py-lineno">135</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt id="link-31" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.close()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#close"><a title="com.dtmilano.android.adb.adbclient.AdbClient.close" class="py-name" href="#" onclick="return doclink('link-31', 'close', 'link-31');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L136"></a><tt class="py-lineno">136</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__del__"></a><div id="AdbClient.__del__-def"><a name="L137"></a><tt class="py-lineno">137</tt> <a class="py-toggle" href="#" id="AdbClient.__del__-toggle" onclick="return toggle('AdbClient.__del__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__del__">__del__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__del__-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__del__-expanded"><a name="L138"></a><tt class="py-lineno">138</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L139"></a><tt class="py-lineno">139</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-32" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.close" class="py-name" href="#" onclick="return doclink('link-32', 'close', 'link-31');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L140"></a><tt class="py-lineno">140</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L141"></a><tt class="py-lineno">141</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L142"></a><tt class="py-lineno">142</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__send"></a><div id="AdbClient.__send-def"><a name="L143"></a><tt class="py-lineno">143</tt> <a class="py-toggle" href="#" id="AdbClient.__send-toggle" onclick="return toggle('AdbClient.__send');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__send">__send</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">msg</tt><tt class="py-op">,</tt> <tt class="py-param">checkok</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__send-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__send-expanded"><a name="L144"></a><tt class="py-lineno">144</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-33" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-33', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L145"></a><tt class="py-lineno">145</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__send(%s, checkok=%s, reconnect=%s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">,</tt> <tt class="py-name">checkok</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">)</tt> </tt>
+<a name="L146"></a><tt class="py-lineno">146</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">'^host:'</tt><tt class="py-op">,</tt> <tt class="py-name">msg</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L147"></a><tt class="py-lineno">147</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">isTransportSet</tt><tt class="py-op">:</tt> </tt>
+<a name="L148"></a><tt class="py-lineno">148</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-34" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-34', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L149"></a><tt class="py-lineno">149</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L150"></a><tt class="py-lineno">150</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-35" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.checkConnected()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkConnected"><a title="com.dtmilano.android.adb.adbclient.AdbClient.checkConnected" class="py-name" href="#" onclick="return doclink('link-35', 'checkConnected', 'link-35');">checkConnected</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L151"></a><tt class="py-lineno">151</tt> <tt class="py-line"> <tt class="py-name">b</tt> <tt class="py-op">=</tt> <tt class="py-name">bytearray</tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">)</tt> </tt>
+<a name="L152"></a><tt class="py-lineno">152</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">send</tt><tt class="py-op">(</tt><tt class="py-string">'%04X%s'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">b</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">b</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L153"></a><tt class="py-lineno">153</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">checkok</tt><tt class="py-op">:</tt> </tt>
+<a name="L154"></a><tt class="py-lineno">154</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-36" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__checkOk()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__checkOk"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__checkOk" class="py-name" href="#" onclick="return doclink('link-36', '__checkOk', 'link-36');">__checkOk</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L155"></a><tt class="py-lineno">155</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">reconnect</tt><tt class="py-op">:</tt> </tt>
+<a name="L156"></a><tt class="py-lineno">156</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-37" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-37', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L157"></a><tt class="py-lineno">157</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __send: reconnecting"</tt> </tt>
+<a name="L158"></a><tt class="py-lineno">158</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-38" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-38', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L159"></a><tt class="py-lineno">159</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-39" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-39', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L160"></a><tt class="py-lineno">160</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__receive"></a><div id="AdbClient.__receive-def"><a name="L161"></a><tt class="py-lineno">161</tt> <a class="py-toggle" href="#" id="AdbClient.__receive-toggle" onclick="return toggle('AdbClient.__receive');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__receive">__receive</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">nob</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__receive-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__receive-expanded"><a name="L162"></a><tt class="py-lineno">162</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-40" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-40', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L163"></a><tt class="py-lineno">163</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__receive()"</tt> </tt>
+<a name="L164"></a><tt class="py-lineno">164</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-41" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.checkConnected" class="py-name" href="#" onclick="return doclink('link-41', 'checkConnected', 'link-35');">checkConnected</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L165"></a><tt class="py-lineno">165</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">nob</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L166"></a><tt class="py-lineno">166</tt> <tt class="py-line"> <tt class="py-name">nob</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> </tt>
+<a name="L167"></a><tt class="py-lineno">167</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-42" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-42', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L168"></a><tt class="py-lineno">168</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __receive: receiving"</tt><tt class="py-op">,</tt> <tt class="py-name">nob</tt><tt class="py-op">,</tt> <tt class="py-string">"bytes"</tt> </tt>
+<a name="L169"></a><tt class="py-lineno">169</tt> <tt class="py-line"> <tt class="py-name">recv</tt> <tt class="py-op">=</tt> <tt class="py-name">bytearray</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L170"></a><tt class="py-lineno">170</tt> <tt class="py-line"> <tt class="py-name">nr</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L171"></a><tt class="py-lineno">171</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">nr</tt> <tt class="py-op"><</tt> <tt class="py-name">nob</tt><tt class="py-op">:</tt> </tt>
+<a name="L172"></a><tt class="py-lineno">172</tt> <tt class="py-line"> <tt class="py-name">chunk</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-name">min</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">nob</tt> <tt class="py-op">-</tt> <tt class="py-name">nr</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-number">4096</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L173"></a><tt class="py-lineno">173</tt> <tt class="py-line"> <tt class="py-name">recv</tt><tt class="py-op">.</tt><tt class="py-name">extend</tt><tt class="py-op">(</tt><tt class="py-name">chunk</tt><tt class="py-op">)</tt> </tt>
+<a name="L174"></a><tt class="py-lineno">174</tt> <tt class="py-line"> <tt class="py-name">nr</tt> <tt class="py-op">+=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">chunk</tt><tt class="py-op">)</tt> </tt>
+<a name="L175"></a><tt class="py-lineno">175</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-43" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-43', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L176"></a><tt class="py-lineno">176</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __receive: returning len="</tt><tt class="py-op">,</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">recv</tt><tt class="py-op">)</tt> </tt>
+<a name="L177"></a><tt class="py-lineno">177</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">str</tt><tt class="py-op">(</tt><tt class="py-name">recv</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L178"></a><tt class="py-lineno">178</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__checkOk"></a><div id="AdbClient.__checkOk-def"><a name="L179"></a><tt class="py-lineno">179</tt> <a class="py-toggle" href="#" id="AdbClient.__checkOk-toggle" onclick="return toggle('AdbClient.__checkOk');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__checkOk">__checkOk</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__checkOk-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__checkOk-expanded"><a name="L180"></a><tt class="py-lineno">180</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-44" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-44', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L181"></a><tt class="py-lineno">181</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__checkOk()"</tt> </tt>
+<a name="L182"></a><tt class="py-lineno">182</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-45" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.checkConnected" class="py-name" href="#" onclick="return doclink('link-45', 'checkConnected', 'link-35');">checkConnected</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L183"></a><tt class="py-lineno">183</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-46" class="py-name" targets="Static Method com.dtmilano.android.adb.adbclient.AdbClient.setAlarm()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#setAlarm,Static Method com.dtmilano.android.viewclient.ViewClient.setAlarm()=com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-46', 'setAlarm', 'link-46');">setAlarm</a></tt><tt class="py-op">(</tt><tt id="link-47" class="py-name"><a title="com.dtmilano.android.adb.adbclient.TIMEOUT" class="py-name" href="#" onclick="return doclink('link-47', 'TIMEOUT', 'link-9');">TIMEOUT</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L184"></a><tt class="py-lineno">184</tt> <tt class="py-line"> <tt class="py-name">recv</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt> </tt>
+<a name="L185"></a><tt class="py-lineno">185</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-48" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-48', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L186"></a><tt class="py-lineno">186</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __checkOk: recv="</tt><tt class="py-op">,</tt> <tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">recv</tt><tt class="py-op">)</tt> </tt>
+<a name="L187"></a><tt class="py-lineno">187</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L188"></a><tt class="py-lineno">188</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">recv</tt> <tt class="py-op">!=</tt> <tt id="link-49" class="py-name"><a title="com.dtmilano.android.adb.adbclient.OKAY" class="py-name" href="#" onclick="return doclink('link-49', 'OKAY', 'link-4');">OKAY</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L189"></a><tt class="py-lineno">189</tt> <tt class="py-line"> <tt class="py-name">error</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">1024</tt><tt class="py-op">)</tt> </tt>
+<a name="L190"></a><tt class="py-lineno">190</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: %s %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">recv</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">error</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L191"></a><tt class="py-lineno">191</tt> <tt class="py-line"> <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
+<a name="L192"></a><tt class="py-lineno">192</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-50" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-50', 'setAlarm', 'link-46');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L193"></a><tt class="py-lineno">193</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-51" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-51', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L194"></a><tt class="py-lineno">194</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __checkOk: returning True"</tt> </tt>
+<a name="L195"></a><tt class="py-lineno">195</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">True</tt> </tt>
+</div><a name="L196"></a><tt class="py-lineno">196</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.checkConnected"></a><div id="AdbClient.checkConnected-def"><a name="L197"></a><tt class="py-lineno">197</tt> <a class="py-toggle" href="#" id="AdbClient.checkConnected-toggle" onclick="return toggle('AdbClient.checkConnected');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkConnected">checkConnected</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.checkConnected-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.checkConnected-expanded"><a name="L198"></a><tt class="py-lineno">198</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-52" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-52', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L199"></a><tt class="py-lineno">199</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"checkConnected()"</tt> </tt>
+<a name="L200"></a><tt class="py-lineno">200</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">:</tt> </tt>
+<a name="L201"></a><tt class="py-lineno">201</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Not connected"</tt><tt class="py-op">)</tt> </tt>
+<a name="L202"></a><tt class="py-lineno">202</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-53" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-53', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L203"></a><tt class="py-lineno">203</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" checkConnected: returning True"</tt> </tt>
+<a name="L204"></a><tt class="py-lineno">204</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">True</tt> </tt>
+</div><a name="L205"></a><tt class="py-lineno">205</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.checkVersion"></a><div id="AdbClient.checkVersion-def"><a name="L206"></a><tt class="py-lineno">206</tt> <a class="py-toggle" href="#" id="AdbClient.checkVersion-toggle" onclick="return toggle('AdbClient.checkVersion');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkVersion">checkVersion</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.checkVersion-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.checkVersion-expanded"><a name="L207"></a><tt class="py-lineno">207</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-54" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-54', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L208"></a><tt class="py-lineno">208</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"checkVersion(reconnect=%s)"</tt> <tt class="py-op">%</tt> <tt class="py-name">reconnect</tt> </tt>
+<a name="L209"></a><tt class="py-lineno">209</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-55" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__send()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__send"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-55', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'host:version'</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L210"></a><tt class="py-lineno">210</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">8</tt><tt class="py-op">)</tt> </tt>
+<a name="L211"></a><tt class="py-lineno">211</tt> <tt class="py-line"> <tt class="py-name">VERSION</tt> <tt class="py-op">=</tt> <tt class="py-string">'0004001f'</tt> </tt>
+<a name="L212"></a><tt class="py-lineno">212</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">!=</tt> <tt class="py-name">VERSION</tt><tt class="py-op">:</tt> </tt>
+<a name="L213"></a><tt class="py-lineno">213</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Incorrect ADB server version %s (expecting %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">VERSION</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L214"></a><tt class="py-lineno">214</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">reconnect</tt><tt class="py-op">:</tt> </tt>
+<a name="L215"></a><tt class="py-lineno">215</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-56" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-56', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L216"></a><tt class="py-lineno">216</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__setTransport"></a><div id="AdbClient.__setTransport-def"><a name="L217"></a><tt class="py-lineno">217</tt> <a class="py-toggle" href="#" id="AdbClient.__setTransport-toggle" onclick="return toggle('AdbClient.__setTransport');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__setTransport">__setTransport</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__setTransport-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__setTransport-expanded"><a name="L218"></a><tt class="py-lineno">218</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-57" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-57', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L219"></a><tt class="py-lineno">219</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__setTransport()"</tt> </tt>
+<a name="L220"></a><tt class="py-lineno">220</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L221"></a><tt class="py-lineno">221</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"serialno not set, empty or None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L222"></a><tt class="py-lineno">222</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-58" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.checkConnected" class="py-name" href="#" onclick="return doclink('link-58', 'checkConnected', 'link-35');">checkConnected</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L223"></a><tt class="py-lineno">223</tt> <tt class="py-line"> <tt class="py-name">serialnoRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L224"></a><tt class="py-lineno">224</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L225"></a><tt class="py-lineno">225</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">device</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-59" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getDevices()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getDevices"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getDevices" class="py-name" href="#" onclick="return doclink('link-59', 'getDevices', 'link-59');">getDevices</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L226"></a><tt class="py-lineno">226</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">serialnoRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L227"></a><tt class="py-lineno">227</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L228"></a><tt class="py-lineno">228</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L229"></a><tt class="py-lineno">229</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">found</tt><tt class="py-op">:</tt> </tt>
+<a name="L230"></a><tt class="py-lineno">230</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: couldn't find device that matches '%s'"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L231"></a><tt class="py-lineno">231</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> </tt>
+<a name="L232"></a><tt class="py-lineno">232</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">'host:transport:%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> </tt>
+<a name="L233"></a><tt class="py-lineno">233</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-60" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-60', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L234"></a><tt class="py-lineno">234</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __setTransport: msg="</tt><tt class="py-op">,</tt> <tt class="py-name">msg</tt> </tt>
+<a name="L235"></a><tt class="py-lineno">235</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-61" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-61', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L236"></a><tt class="py-lineno">236</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">isTransportSet</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+</div><a name="L237"></a><tt class="py-lineno">237</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.getDevices"></a><div id="AdbClient.getDevices-def"><a name="L238"></a><tt class="py-lineno">238</tt> <a class="py-toggle" href="#" id="AdbClient.getDevices-toggle" onclick="return toggle('AdbClient.getDevices');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getDevices">getDevices</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.getDevices-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.getDevices-expanded"><a name="L239"></a><tt class="py-lineno">239</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-62" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-62', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L240"></a><tt class="py-lineno">240</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getDevices()"</tt> </tt>
+<a name="L241"></a><tt class="py-lineno">241</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-63" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-63', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'host:devices-l'</tt><tt class="py-op">,</tt> <tt class="py-name">checkok</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L242"></a><tt class="py-lineno">242</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L243"></a><tt class="py-lineno">243</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-64" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__checkOk" class="py-name" href="#" onclick="return doclink('link-64', '__checkOk', 'link-36');">__checkOk</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L244"></a><tt class="py-lineno">244</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L245"></a><tt class="py-lineno">245</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"**ERROR:"</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt> </tt>
+<a name="L246"></a><tt class="py-lineno">246</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L247"></a><tt class="py-lineno">247</tt> <tt class="py-line"> <tt class="py-name">devices</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L248"></a><tt class="py-lineno">248</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">line</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-65" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__receive()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__receive"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__receive" class="py-name" href="#" onclick="return doclink('link-65', '__receive', 'link-65');">__receive</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">splitlines</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L249"></a><tt class="py-lineno">249</tt> <tt class="py-line"> <tt class="py-name">devices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt id="link-66" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device" class="py-name" href="#" onclick="return doclink('link-66', 'Device', 'link-14');">Device</a></tt><tt class="py-op">.</tt><tt id="link-67" class="py-name" targets="Static Method com.dtmilano.android.adb.adbclient.Device.factory()=com.dtmilano.android.adb.adbclient.Device-class.html#factory,Static Method com.dtmilano.android.viewclient.View.factory()=com.dtmilano.android.viewclient.View-class.html#factory"><a title="com.dtmilano.android.adb.adbclient.Device.factory
+com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-67', 'factory', 'link-67');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">line</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L250"></a><tt class="py-lineno">250</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-68" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-68', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L251"></a><tt class="py-lineno">251</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">devices</tt> </tt>
+</div><a name="L252"></a><tt class="py-lineno">252</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.shell"></a><div id="AdbClient.shell-def"><a name="L253"></a><tt class="py-lineno">253</tt> <a class="py-toggle" href="#" id="AdbClient.shell-toggle" onclick="return toggle('AdbClient.shell');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#shell">shell</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">cmd</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.shell-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.shell-expanded"><a name="L254"></a><tt class="py-lineno">254</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-69" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-69', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L255"></a><tt class="py-lineno">255</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"shell(cmd=%s)"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L256"></a><tt class="py-lineno">256</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">cmd</tt><tt class="py-op">:</tt> </tt>
+<a name="L257"></a><tt class="py-lineno">257</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-70" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-70', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'shell:%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt><tt class="py-op">,</tt> <tt class="py-name">checkok</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L258"></a><tt class="py-lineno">258</tt> <tt class="py-line"> <tt class="py-name">out</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt> </tt>
+<a name="L259"></a><tt class="py-lineno">259</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L260"></a><tt class="py-lineno">260</tt> <tt class="py-line"> <tt class="py-name">_str</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L261"></a><tt class="py-lineno">261</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L262"></a><tt class="py-lineno">262</tt> <tt class="py-line"> <tt class="py-name">_str</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">4096</tt><tt class="py-op">)</tt> </tt>
+<a name="L263"></a><tt class="py-lineno">263</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">Exception</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L264"></a><tt class="py-lineno">264</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR:"</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt> </tt>
+<a name="L265"></a><tt class="py-lineno">265</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">_str</tt><tt class="py-op">:</tt> </tt>
+<a name="L266"></a><tt class="py-lineno">266</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L267"></a><tt class="py-lineno">267</tt> <tt class="py-line"> <tt class="py-name">out</tt> <tt class="py-op">+=</tt> <tt class="py-name">_str</tt> </tt>
+<a name="L268"></a><tt class="py-lineno">268</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">reconnect</tt><tt class="py-op">:</tt> </tt>
+<a name="L269"></a><tt class="py-lineno">269</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-71" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-71', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L270"></a><tt class="py-lineno">270</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Reconnecting..."</tt> </tt>
+<a name="L271"></a><tt class="py-lineno">271</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-72" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.close" class="py-name" href="#" onclick="return doclink('link-72', 'close', 'link-31');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L272"></a><tt class="py-lineno">272</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-73" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-73', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L273"></a><tt class="py-lineno">273</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-74" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-74', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L274"></a><tt class="py-lineno">274</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">out</tt> </tt>
+<a name="L275"></a><tt class="py-lineno">275</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L276"></a><tt class="py-lineno">276</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-75" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-75', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'shell:'</tt><tt class="py-op">)</tt> </tt>
+<a name="L277"></a><tt class="py-lineno">277</tt> <tt class="py-line"> <tt class="py-comment"># sin = self.socket.makefile("rw")</tt> </tt>
+<a name="L278"></a><tt class="py-lineno">278</tt> <tt class="py-line"> <tt class="py-comment"># sout = self.socket.makefile("r")</tt> </tt>
+<a name="L279"></a><tt class="py-lineno">279</tt> <tt class="py-line"> <tt class="py-comment"># return (sin, sin)</tt> </tt>
+<a name="L280"></a><tt class="py-lineno">280</tt> <tt class="py-line"> <tt class="py-name">sout</tt> <tt class="py-op">=</tt> <tt class="py-name">adbClient</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">makefile</tt><tt class="py-op">(</tt><tt class="py-string">"r"</tt><tt class="py-op">)</tt> </tt>
+<a name="L281"></a><tt class="py-lineno">281</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">sout</tt> </tt>
+</div><a name="L282"></a><tt class="py-lineno">282</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.getRestrictedScreen"></a><div id="AdbClient.getRestrictedScreen-def"><a name="L283"></a><tt class="py-lineno">283</tt> <a class="py-toggle" href="#" id="AdbClient.getRestrictedScreen-toggle" onclick="return toggle('AdbClient.getRestrictedScreen');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getRestrictedScreen">getRestrictedScreen</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.getRestrictedScreen-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.getRestrictedScreen-expanded"><a name="L284"></a><tt class="py-lineno">284</tt> <tt class="py-line"> <tt class="py-docstring">''' Gets C{mRestrictedScreen} values from dumpsys. This is a method to obtain display dimensions '''</tt> </tt>
+<a name="L285"></a><tt class="py-lineno">285</tt> <tt class="py-line"> </tt>
+<a name="L286"></a><tt class="py-lineno">286</tt> <tt class="py-line"> <tt class="py-name">rsRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'\s*mRestrictedScreen=\((?P<x>\d+),(?P<y>\d+)\) (?P<w>\d+)x(?P<h>\d+)'</tt><tt class="py-op">)</tt> </tt>
+<a name="L287"></a><tt class="py-lineno">287</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">line</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-76" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.shell()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#shell"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-76', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys window'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">splitlines</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L288"></a><tt class="py-lineno">288</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">rsRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">line</tt><tt class="py-op">)</tt> </tt>
+<a name="L289"></a><tt class="py-lineno">289</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L290"></a><tt class="py-lineno">290</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L291"></a><tt class="py-lineno">291</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't find mRestrictedScreen in dumpsys"</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L292"></a><tt class="py-lineno">292</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__getProp"></a><div id="AdbClient.__getProp-def"><a name="L293"></a><tt class="py-lineno">293</tt> <a class="py-toggle" href="#" id="AdbClient.__getProp-toggle" onclick="return toggle('AdbClient.__getProp');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getProp">__getProp</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">,</tt> <tt class="py-param">strip</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__getProp-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__getProp-expanded"><a name="L294"></a><tt class="py-lineno">294</tt> <tt class="py-line"> <tt class="py-name">prop</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-77" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-77', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">key</tt><tt class="py-op">)</tt> </tt>
+<a name="L295"></a><tt class="py-lineno">295</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">strip</tt><tt class="py-op">:</tt> </tt>
+<a name="L296"></a><tt class="py-lineno">296</tt> <tt class="py-line"> <tt class="py-name">prop</tt> <tt class="py-op">=</tt> <tt class="py-name">prop</tt><tt class="py-op">.</tt><tt class="py-name">rstrip</tt><tt class="py-op">(</tt><tt class="py-string">'\r\n'</tt><tt class="py-op">)</tt> </tt>
+<a name="L297"></a><tt class="py-lineno">297</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">prop</tt> </tt>
+</div><a name="L298"></a><tt class="py-lineno">298</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__getDisplayWidth"></a><div id="AdbClient.__getDisplayWidth-def"><a name="L299"></a><tt class="py-lineno">299</tt> <a class="py-toggle" href="#" id="AdbClient.__getDisplayWidth-toggle" onclick="return toggle('AdbClient.__getDisplayWidth');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayWidth">__getDisplayWidth</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">,</tt> <tt class="py-param">strip</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__getDisplayWidth-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__getDisplayWidth-expanded"><a name="L300"></a><tt class="py-lineno">300</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">h</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-78" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getRestrictedScreen()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getRestrictedScreen"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getRestrictedScreen" class="py-name" href="#" onclick="return doclink('link-78', 'getRestrictedScreen', 'link-78');">getRestrictedScreen</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L301"></a><tt class="py-lineno">301</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">w</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L302"></a><tt class="py-lineno">302</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.__getDisplayHeight"></a><div id="AdbClient.__getDisplayHeight-def"><a name="L303"></a><tt class="py-lineno">303</tt> <a class="py-toggle" href="#" id="AdbClient.__getDisplayHeight-toggle" onclick="return toggle('AdbClient.__getDisplayHeight');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayHeight">__getDisplayHeight</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">,</tt> <tt class="py-param">strip</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.__getDisplayHeight-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.__getDisplayHeight-expanded"><a name="L304"></a><tt class="py-lineno">304</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">h</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-79" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getRestrictedScreen" class="py-name" href="#" onclick="return doclink('link-79', 'getRestrictedScreen', 'link-78');">getRestrictedScreen</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L305"></a><tt class="py-lineno">305</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">h</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L306"></a><tt class="py-lineno">306</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.getSystemProperty"></a><div id="AdbClient.getSystemProperty-def"><a name="L307"></a><tt class="py-lineno">307</tt> <a class="py-toggle" href="#" id="AdbClient.getSystemProperty-toggle" onclick="return toggle('AdbClient.getSystemProperty');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSystemProperty">getSystemProperty</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">,</tt> <tt class="py-param">strip</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.getSystemProperty-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.getSystemProperty-expanded"><a name="L308"></a><tt class="py-lineno">308</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-80" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getProperty()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getProperty"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-80', 'getProperty', 'link-80');">getProperty</a></tt><tt class="py-op">(</tt><tt class="py-name">key</tt><tt class="py-op">,</tt> <tt class="py-name">strip</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L309"></a><tt class="py-lineno">309</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.getProperty"></a><div id="AdbClient.getProperty-def"><a name="L310"></a><tt class="py-lineno">310</tt> <a class="py-toggle" href="#" id="AdbClient.getProperty-toggle" onclick="return toggle('AdbClient.getProperty');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getProperty">getProperty</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">,</tt> <tt class="py-param">strip</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.getProperty-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.getProperty-expanded"><a name="L311"></a><tt class="py-lineno">311</tt> <tt class="py-line"> <tt class="py-docstring">''' Gets the property value for key '''</tt> </tt>
+<a name="L312"></a><tt class="py-lineno">312</tt> <tt class="py-line"> </tt>
+<a name="L313"></a><tt class="py-lineno">313</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">collections</tt> </tt>
+<a name="L314"></a><tt class="py-lineno">314</tt> <tt class="py-line"> <tt class="py-name">MAP_KEYS</tt> <tt class="py-op">=</tt> <tt class="py-name">collections</tt><tt class="py-op">.</tt><tt class="py-name">OrderedDict</tt><tt class="py-op">(</tt><tt class="py-op">[</tt> </tt>
+<a name="L315"></a><tt class="py-lineno">315</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'display.width'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-81" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayWidth()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayWidth"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayWidth" class="py-name" href="#" onclick="return doclink('link-81', '__getDisplayWidth', 'link-81');">__getDisplayWidth</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L316"></a><tt class="py-lineno">316</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'display.height'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-82" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayHeight()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayHeight"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__getDisplayHeight" class="py-name" href="#" onclick="return doclink('link-82', '__getDisplayHeight', 'link-82');">__getDisplayHeight</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L317"></a><tt class="py-lineno">317</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'.*'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-83" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__getProp" class="py-name" href="#" onclick="return doclink('link-83', '__getProp', 'link-21');">__getProp</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L318"></a><tt class="py-lineno">318</tt> <tt class="py-line"> <tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L319"></a><tt class="py-lineno">319</tt> <tt class="py-line"> <tt class="py-string">'''Maps properties key values (as regexps) to instance methods to obtain its values.'''</tt> </tt>
+<a name="L320"></a><tt class="py-lineno">320</tt> <tt class="py-line"> </tt>
+<a name="L321"></a><tt class="py-lineno">321</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">kre</tt> <tt class="py-keyword">in</tt> <tt class="py-name">MAP_KEYS</tt><tt class="py-op">.</tt><tt class="py-name">keys</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L322"></a><tt class="py-lineno">322</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">kre</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">key</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L323"></a><tt class="py-lineno">323</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">MAP_KEYS</tt><tt class="py-op">[</tt><tt class="py-name">kre</tt><tt class="py-op">]</tt><tt class="py-op">(</tt><tt class="py-name">key</tt><tt class="py-op">=</tt><tt class="py-name">key</tt><tt class="py-op">,</tt> <tt class="py-name">strip</tt><tt class="py-op">=</tt><tt class="py-name">strip</tt><tt class="py-op">)</tt> </tt>
+<a name="L324"></a><tt class="py-lineno">324</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"key='%s' does not match any map entry"</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L325"></a><tt class="py-lineno">325</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.getSdkVersion"></a><div id="AdbClient.getSdkVersion-def"><a name="L326"></a><tt class="py-lineno">326</tt> <a class="py-toggle" href="#" id="AdbClient.getSdkVersion-toggle" onclick="return toggle('AdbClient.getSdkVersion');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSdkVersion">getSdkVersion</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.getSdkVersion-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.getSdkVersion-expanded"><a name="L327"></a><tt class="py-lineno">327</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L328"></a><tt class="py-lineno">328</tt> <tt class="py-line"><tt class="py-docstring"> Gets the SDK version.</tt> </tt>
+<a name="L329"></a><tt class="py-lineno">329</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L330"></a><tt class="py-lineno">330</tt> <tt class="py-line"> </tt>
+<a name="L331"></a><tt class="py-lineno">331</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-84" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-84', 'VERSION_SDK_PROPERTY', 'link-10');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> </tt>
+</div><a name="L332"></a><tt class="py-lineno">332</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.press"></a><div id="AdbClient.press-def"><a name="L333"></a><tt class="py-lineno">333</tt> <a class="py-toggle" href="#" id="AdbClient.press-toggle" onclick="return toggle('AdbClient.press');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#press">press</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">eventType</tt><tt class="py-op">=</tt><tt id="link-85" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-85', 'DOWN_AND_UP', 'link-8');">DOWN_AND_UP</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.press-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.press-expanded"><a name="L334"></a><tt class="py-lineno">334</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-string">'input keyevent %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+<a name="L335"></a><tt class="py-lineno">335</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-86" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-86', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L336"></a><tt class="py-lineno">336</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"press(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L337"></a><tt class="py-lineno">337</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-87" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-87', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L338"></a><tt class="py-lineno">338</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.longPress"></a><div id="AdbClient.longPress-def"><a name="L339"></a><tt class="py-lineno">339</tt> <a class="py-toggle" href="#" id="AdbClient.longPress-toggle" onclick="return toggle('AdbClient.longPress');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#longPress">longPress</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.longPress-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.longPress-expanded"><a name="L340"></a><tt class="py-lineno">340</tt> <tt class="py-line"> <tt class="py-comment"># WORKAROUND:</tt> </tt>
+<a name="L341"></a><tt class="py-lineno">341</tt> <tt class="py-line"> <tt class="py-comment"># Using 'input keyevent --longpress POWER' does not work correctly in</tt> </tt>
+<a name="L342"></a><tt class="py-lineno">342</tt> <tt class="py-line"> <tt class="py-comment"># KitKat (API 19), it sends a short instead of a long press.</tt> </tt>
+<a name="L343"></a><tt class="py-lineno">343</tt> <tt class="py-line"> <tt class="py-comment"># This uses the events instead, but it may vary from device to device.</tt> </tt>
+<a name="L344"></a><tt class="py-lineno">344</tt> <tt class="py-line"> <tt class="py-comment"># The events sent are device dependent and may not work on other devices.</tt> </tt>
+<a name="L345"></a><tt class="py-lineno">345</tt> <tt class="py-line"> <tt class="py-comment"># If this does not work on your device please do:</tt> </tt>
+<a name="L346"></a><tt class="py-lineno">346</tt> <tt class="py-line"> <tt class="py-comment"># $ adb shell getevent -l</tt> </tt>
+<a name="L347"></a><tt class="py-lineno">347</tt> <tt class="py-line"> <tt class="py-comment"># and post the output to https://github.com/dtmilano/AndroidViewClient/issues</tt> </tt>
+<a name="L348"></a><tt class="py-lineno">348</tt> <tt class="py-line"> <tt class="py-comment"># specifying the device and API level.</tt> </tt>
+<a name="L349"></a><tt class="py-lineno">349</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'POWER'</tt> <tt class="py-keyword">or</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'KEY_POWER'</tt><tt class="py-op">:</tt> </tt>
+<a name="L350"></a><tt class="py-lineno">350</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-88" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-88', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'sendevent /dev/input/event0 1 116 1'</tt><tt class="py-op">)</tt> </tt>
+<a name="L351"></a><tt class="py-lineno">351</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-89" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-89', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'sendevent /dev/input/event0 0 0 0'</tt><tt class="py-op">)</tt> </tt>
+<a name="L352"></a><tt class="py-lineno">352</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-90" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.sleep()=com.dtmilano.android.viewclient.ViewClient-class.html#sleep"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-90', 'sleep', 'link-90');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">0.5</tt><tt class="py-op">)</tt> </tt>
+<a name="L353"></a><tt class="py-lineno">353</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-91" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-91', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'sendevent /dev/input/event0 1 116 0'</tt><tt class="py-op">)</tt> </tt>
+<a name="L354"></a><tt class="py-lineno">354</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-92" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-92', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'sendevent /dev/input/event0 0 0 0'</tt><tt class="py-op">)</tt> </tt>
+<a name="L355"></a><tt class="py-lineno">355</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L356"></a><tt class="py-lineno">356</tt> <tt class="py-line"> </tt>
+<a name="L357"></a><tt class="py-lineno">357</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-93" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getSdkVersion()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSdkVersion,Method com.dtmilano.android.viewclient.ViewClient.getSdkVersion()=com.dtmilano.android.viewclient.ViewClient-class.html#getSdkVersion"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getSdkVersion
+com.dtmilano.android.viewclient.ViewClient.getSdkVersion" class="py-name" href="#" onclick="return doclink('link-93', 'getSdkVersion', 'link-93');">getSdkVersion</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L358"></a><tt class="py-lineno">358</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">19</tt><tt class="py-op">:</tt> </tt>
+<a name="L359"></a><tt class="py-lineno">359</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-string">'input keyevent --longpress %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+<a name="L360"></a><tt class="py-lineno">360</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-94" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-94', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L361"></a><tt class="py-lineno">361</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"longPress(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L362"></a><tt class="py-lineno">362</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-95" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-95', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt><tt class="py-op">)</tt> </tt>
+<a name="L363"></a><tt class="py-lineno">363</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L364"></a><tt class="py-lineno">364</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"longpress: not supported for API < 19 (version=%d)"</tt> <tt class="py-op">%</tt> <tt class="py-name">version</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L365"></a><tt class="py-lineno">365</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.startActivity"></a><div id="AdbClient.startActivity-def"><a name="L366"></a><tt class="py-lineno">366</tt> <a class="py-toggle" href="#" id="AdbClient.startActivity-toggle" onclick="return toggle('AdbClient.startActivity');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#startActivity">startActivity</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">component</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">flags</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">uri</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.startActivity-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.startActivity-expanded"><a name="L367"></a><tt class="py-lineno">367</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-string">'am start'</tt> </tt>
+<a name="L368"></a><tt class="py-lineno">368</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">component</tt><tt class="py-op">:</tt> </tt>
+<a name="L369"></a><tt class="py-lineno">369</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">+=</tt> <tt class="py-string">' -n %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">component</tt> </tt>
+<a name="L370"></a><tt class="py-lineno">370</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">flags</tt><tt class="py-op">:</tt> </tt>
+<a name="L371"></a><tt class="py-lineno">371</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">+=</tt> <tt class="py-string">' -f %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">flags</tt> </tt>
+<a name="L372"></a><tt class="py-lineno">372</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">uri</tt><tt class="py-op">:</tt> </tt>
+<a name="L373"></a><tt class="py-lineno">373</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">+=</tt> <tt class="py-string">' %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">uri</tt> </tt>
+<a name="L374"></a><tt class="py-lineno">374</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-96" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-96', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L375"></a><tt class="py-lineno">375</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Starting activity: %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L376"></a><tt class="py-lineno">376</tt> <tt class="py-line"> <tt class="py-name">out</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-97" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-97', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt><tt class="py-op">)</tt> </tt>
+<a name="L377"></a><tt class="py-lineno">377</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">r"(Error type)|(Error: )|(Cannot find 'App')"</tt><tt class="py-op">,</tt> <tt class="py-name">out</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">IGNORECASE</tt> <tt class="py-op">|</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L378"></a><tt class="py-lineno">378</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-name">out</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L379"></a><tt class="py-lineno">379</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.takeSnapshot"></a><div id="AdbClient.takeSnapshot-def"><a name="L380"></a><tt class="py-lineno">380</tt> <a class="py-toggle" href="#" id="AdbClient.takeSnapshot-toggle" onclick="return toggle('AdbClient.takeSnapshot');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#takeSnapshot">takeSnapshot</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.takeSnapshot-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.takeSnapshot-expanded"><a name="L381"></a><tt class="py-lineno">381</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L382"></a><tt class="py-lineno">382</tt> <tt class="py-line"><tt class="py-docstring"> Takes a snapshot of the device and return it as a PIL Image.</tt> </tt>
+<a name="L383"></a><tt class="py-lineno">383</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L384"></a><tt class="py-lineno">384</tt> <tt class="py-line"> </tt>
+<a name="L385"></a><tt class="py-lineno">385</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L386"></a><tt class="py-lineno">386</tt> <tt class="py-line"> <tt class="py-keyword">from</tt> <tt class="py-name">PIL</tt> <tt class="py-keyword">import</tt> <tt class="py-name">Image</tt> </tt>
+<a name="L387"></a><tt class="py-lineno">387</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L388"></a><tt class="py-lineno">388</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"You have to install PIL to use takeSnapshot()"</tt><tt class="py-op">)</tt> </tt>
+<a name="L389"></a><tt class="py-lineno">389</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-98" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-98', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'framebuffer:'</tt><tt class="py-op">,</tt> <tt class="py-name">checkok</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L390"></a><tt class="py-lineno">390</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">struct</tt> </tt>
+<a name="L391"></a><tt class="py-lineno">391</tt> <tt class="py-line"> <tt class="py-comment"># case 1: // version</tt> </tt>
+<a name="L392"></a><tt class="py-lineno">392</tt> <tt class="py-line"> <tt class="py-comment"># return 12; // bpp, size, width, height, 4*(length, offset)</tt> </tt>
+<a name="L393"></a><tt class="py-lineno">393</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-99" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__receive" class="py-name" href="#" onclick="return doclink('link-99', '__receive', 'link-65');">__receive</a></tt><tt class="py-op">(</tt><tt class="py-number">1</tt> <tt class="py-op">*</tt> <tt class="py-number">4</tt> <tt class="py-op">+</tt> <tt class="py-number">12</tt> <tt class="py-op">*</tt> <tt class="py-number">4</tt><tt class="py-op">)</tt> </tt>
+<a name="L394"></a><tt class="py-lineno">394</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">bpp</tt><tt class="py-op">,</tt> <tt class="py-name">size</tt><tt class="py-op">,</tt> <tt class="py-name">width</tt><tt class="py-op">,</tt> <tt class="py-name">height</tt><tt class="py-op">,</tt> <tt class="py-name">roffset</tt><tt class="py-op">,</tt> <tt class="py-name">rlen</tt><tt class="py-op">,</tt> <tt class="py-name">boffset</tt><tt class="py-op">,</tt> <tt class="py-name">blen</tt><tt class="py-op">,</tt> <tt class="py-name">goffset</tt><tt class="py-op">,</tt> <tt class="py-name">glen</tt><tt class="py-op">,</tt> <tt class="py-name">aoffset</tt><tt class="py-op">,</tt> <tt class="py-name">alen</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">struct</tt><tt class="py-op">.</tt><tt class="py-name">unpack</tt><tt class="py-op">(</tt><tt class="py-string">'<'</tt> <tt class="py-op">+</tt> <tt class="py-string">'L'</tt> <tt class="py-op">*</tt> <tt class="py-number">13</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L395"></a><tt class="py-lineno">395</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-100" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-100', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L396"></a><tt class="py-lineno">396</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" takeSnapshot:"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">bpp</tt><tt class="py-op">,</tt> <tt class="py-name">size</tt><tt class="py-op">,</tt> <tt class="py-name">width</tt><tt class="py-op">,</tt> <tt class="py-name">height</tt><tt class="py-op">,</tt> <tt class="py-name">roffset</tt><tt class="py-op">,</tt> <tt class="py-name">rlen</tt><tt class="py-op">,</tt> <tt class="py-name">boffset</tt><tt class="py-op">,</tt> <tt class="py-name">blen</tt><tt class="py-op">,</tt> <tt class="py-name">goffset</tt><tt class="py-op">,</tt> <tt class="py-name">glen</tt><tt class="py-op">,</tt> <tt class="py-name">aoffset</tt><tt class="py-op">,</tt> <tt class="py-name">alen</tt><tt class="py-op">)</tt> </tt>
+<a name="L397"></a><tt class="py-lineno">397</tt> <tt class="py-line"> <tt class="py-name">offsets</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-name">roffset</tt><tt class="py-op">:</tt><tt class="py-string">'R'</tt><tt class="py-op">,</tt> <tt class="py-name">goffset</tt><tt class="py-op">:</tt><tt class="py-string">'G'</tt><tt class="py-op">,</tt> <tt class="py-name">boffset</tt><tt class="py-op">:</tt><tt class="py-string">'B'</tt><tt class="py-op">}</tt> </tt>
+<a name="L398"></a><tt class="py-lineno">398</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">bpp</tt> <tt class="py-op">==</tt> <tt class="py-number">32</tt><tt class="py-op">:</tt> </tt>
+<a name="L399"></a><tt class="py-lineno">399</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">alen</tt> <tt class="py-op">!=</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L400"></a><tt class="py-lineno">400</tt> <tt class="py-line"> <tt class="py-name">offsets</tt><tt class="py-op">[</tt><tt class="py-name">aoffset</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-string">'A'</tt> </tt>
+<a name="L401"></a><tt class="py-lineno">401</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L402"></a><tt class="py-lineno">402</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">'''framebuffer is specified as 32bpp but alpha length is 0'''</tt><tt class="py-op">)</tt> </tt>
+<a name="L403"></a><tt class="py-lineno">403</tt> <tt class="py-line"> <tt class="py-name">argMode</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt class="py-name">offsets</tt><tt class="py-op">[</tt><tt class="py-name">o</tt><tt class="py-op">]</tt> <tt class="py-keyword">for</tt> <tt class="py-name">o</tt> <tt class="py-keyword">in</tt> <tt class="py-name">sorted</tt><tt class="py-op">(</tt><tt class="py-name">offsets</tt><tt class="py-op">)</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L404"></a><tt class="py-lineno">404</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-101" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-101', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L405"></a><tt class="py-lineno">405</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" takeSnapshot:"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">bpp</tt><tt class="py-op">,</tt> <tt class="py-name">size</tt><tt class="py-op">,</tt> <tt class="py-name">width</tt><tt class="py-op">,</tt> <tt class="py-name">height</tt><tt class="py-op">,</tt> <tt class="py-name">roffset</tt><tt class="py-op">,</tt> <tt class="py-name">rlen</tt><tt class="py-op">,</tt> <tt class="py-name">boffset</tt><tt class="py-op">,</tt> <tt class="py-name">blen</tt><tt class="py-op">,</tt> <tt class="py-name">goffset</tt><tt class="py-op">,</tt> <tt class="py-name">blen</tt><tt class="py-op">,</tt> <tt class="py-name">aoffset</tt><tt class="py-op">,</tt> <tt class="py-name">alen</tt><tt class="py-op">,</tt> <tt class="py-name">argMode</tt><tt class="py-op">)</tt> </tt>
+<a name="L406"></a><tt class="py-lineno">406</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">argMode</tt> <tt class="py-op">==</tt> <tt class="py-string">'BGRA'</tt><tt class="py-op">:</tt> </tt>
+<a name="L407"></a><tt class="py-lineno">407</tt> <tt class="py-line"> <tt class="py-name">argMode</tt> <tt class="py-op">=</tt> <tt class="py-string">'RGBA'</tt> </tt>
+<a name="L408"></a><tt class="py-lineno">408</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">bpp</tt> <tt class="py-op">==</tt> <tt class="py-number">16</tt><tt class="py-op">:</tt> </tt>
+<a name="L409"></a><tt class="py-lineno">409</tt> <tt class="py-line"> <tt class="py-name">mode</tt> <tt class="py-op">=</tt> <tt class="py-string">'RGB'</tt> </tt>
+<a name="L410"></a><tt class="py-lineno">410</tt> <tt class="py-line"> <tt class="py-name">argMode</tt> <tt class="py-op">+=</tt> <tt class="py-string">';16'</tt> </tt>
+<a name="L411"></a><tt class="py-lineno">411</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L412"></a><tt class="py-lineno">412</tt> <tt class="py-line"> <tt class="py-name">mode</tt> <tt class="py-op">=</tt> <tt class="py-name">argMode</tt> </tt>
+<a name="L413"></a><tt class="py-lineno">413</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-102" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-102', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-string">'\0'</tt><tt class="py-op">,</tt> <tt class="py-name">checkok</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
+<a name="L414"></a><tt class="py-lineno">414</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-103" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-103', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L415"></a><tt class="py-lineno">415</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" takeSnapshot: reading %d bytes"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
+<a name="L416"></a><tt class="py-lineno">416</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-104" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__receive" class="py-name" href="#" onclick="return doclink('link-104', '__receive', 'link-65');">__receive</a></tt><tt class="py-op">(</tt><tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
+<a name="L417"></a><tt class="py-lineno">417</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">reconnect</tt><tt class="py-op">:</tt> </tt>
+<a name="L418"></a><tt class="py-lineno">418</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-105" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__connect" class="py-name" href="#" onclick="return doclink('link-105', '__connect', 'link-17');">__connect</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L419"></a><tt class="py-lineno">419</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-106" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__setTransport" class="py-name" href="#" onclick="return doclink('link-106', '__setTransport', 'link-19');">__setTransport</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L420"></a><tt class="py-lineno">420</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-107" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-107', 'DEBUG', 'link-0');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L421"></a><tt class="py-lineno">421</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" takeSnapshot: Image.frombuffer(%s, %s, %s, %s, %s, %s, %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">mode</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">width</tt><tt class="py-op">,</tt> <tt class="py-name">height</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-string">'data'</tt><tt class="py-op">,</tt> <tt class="py-string">'raw'</tt><tt class="py-op">,</tt> <tt class="py-name">argMode</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L422"></a><tt class="py-lineno">422</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">Image</tt><tt class="py-op">.</tt><tt class="py-name">frombuffer</tt><tt class="py-op">(</tt><tt class="py-name">mode</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">width</tt><tt class="py-op">,</tt> <tt class="py-name">height</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">,</tt> <tt class="py-string">'raw'</tt><tt class="py-op">,</tt> <tt class="py-name">argMode</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L423"></a><tt class="py-lineno">423</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.touch"></a><div id="AdbClient.touch-def"><a name="L424"></a><tt class="py-lineno">424</tt> <a class="py-toggle" href="#" id="AdbClient.touch-toggle" onclick="return toggle('AdbClient.touch');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#touch">touch</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">x</tt><tt class="py-op">,</tt> <tt class="py-param">y</tt><tt class="py-op">,</tt> <tt class="py-param">eventType</tt><tt class="py-op">=</tt><tt id="link-108" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-108', 'DOWN_AND_UP', 'link-8');">DOWN_AND_UP</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.touch-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.touch-expanded"><a name="L425"></a><tt class="py-lineno">425</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-109" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-109', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input tap %d %d'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L426"></a><tt class="py-lineno">426</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.drag"></a><div id="AdbClient.drag-def"><a name="L427"></a><tt class="py-lineno">427</tt> <a class="py-toggle" href="#" id="AdbClient.drag-toggle" onclick="return toggle('AdbClient.drag');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#drag">drag</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x0</tt><tt class="py-op">,</tt> <tt class="py-param">y0</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x1</tt><tt class="py-op">,</tt> <tt class="py-param">y1</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-param">duration</tt><tt class="py-op">,</tt> <tt class="py-param">steps</tt><tt class="py-op">=</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.drag-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.drag-expanded"><a name="L428"></a><tt class="py-lineno">428</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L429"></a><tt class="py-lineno">429</tt> <tt class="py-line"><tt class="py-docstring"> Sends drag event (actually it's using C{input swipe} command.</tt> </tt>
+<a name="L430"></a><tt class="py-lineno">430</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L431"></a><tt class="py-lineno">431</tt> <tt class="py-line"><tt class="py-docstring"> @param (x0, y0): starting point</tt> </tt>
+<a name="L432"></a><tt class="py-lineno">432</tt> <tt class="py-line"><tt class="py-docstring"> @param (x1, y1): ending point</tt> </tt>
+<a name="L433"></a><tt class="py-lineno">433</tt> <tt class="py-line"><tt class="py-docstring"> @param duration: duration of the event in ms</tt> </tt>
+<a name="L434"></a><tt class="py-lineno">434</tt> <tt class="py-line"><tt class="py-docstring"> @param steps: number of steps (currently ignored by @{input swipe}</tt> </tt>
+<a name="L435"></a><tt class="py-lineno">435</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L436"></a><tt class="py-lineno">436</tt> <tt class="py-line"> </tt>
+<a name="L437"></a><tt class="py-lineno">437</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-110" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getSdkVersion
+com.dtmilano.android.viewclient.ViewClient.getSdkVersion" class="py-name" href="#" onclick="return doclink('link-110', 'getSdkVersion', 'link-93');">getSdkVersion</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L438"></a><tt class="py-lineno">438</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op"><=</tt> <tt class="py-number">15</tt><tt class="py-op">:</tt> </tt>
+<a name="L439"></a><tt class="py-lineno">439</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'drag: API <= 15 not supported (version=%d)'</tt> <tt class="py-op">%</tt> <tt class="py-name">version</tt><tt class="py-op">)</tt> </tt>
+<a name="L440"></a><tt class="py-lineno">440</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op"><=</tt> <tt class="py-number">17</tt><tt class="py-op">:</tt> </tt>
+<a name="L441"></a><tt class="py-lineno">441</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-111" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-111', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input swipe %d %d %d %d'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x0</tt><tt class="py-op">,</tt> <tt class="py-name">y0</tt><tt class="py-op">,</tt> <tt class="py-name">x1</tt><tt class="py-op">,</tt> <tt class="py-name">y1</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L442"></a><tt class="py-lineno">442</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L443"></a><tt class="py-lineno">443</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-112" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-112', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input swipe %d %d %d %d %d'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x0</tt><tt class="py-op">,</tt> <tt class="py-name">y0</tt><tt class="py-op">,</tt> <tt class="py-name">x1</tt><tt class="py-op">,</tt> <tt class="py-name">y1</tt><tt class="py-op">,</tt> <tt class="py-name">duration</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L444"></a><tt class="py-lineno">444</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.type"></a><div id="AdbClient.type-def"><a name="L445"></a><tt class="py-lineno">445</tt> <a class="py-toggle" href="#" id="AdbClient.type-toggle" onclick="return toggle('AdbClient.type');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#type">type</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.type-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.type-expanded"><a name="L446"></a><tt class="py-lineno">446</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-113" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-113', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">u'input text "%s"'</tt> <tt class="py-op">%</tt> <tt class="py-name">text</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L447"></a><tt class="py-lineno">447</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.wake"></a><div id="AdbClient.wake-def"><a name="L448"></a><tt class="py-lineno">448</tt> <a class="py-toggle" href="#" id="AdbClient.wake-toggle" onclick="return toggle('AdbClient.wake');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#wake">wake</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.wake-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.wake-expanded"><a name="L449"></a><tt class="py-lineno">449</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-114" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.isScreenOn()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#isScreenOn"><a title="com.dtmilano.android.adb.adbclient.AdbClient.isScreenOn" class="py-name" href="#" onclick="return doclink('link-114', 'isScreenOn', 'link-114');">isScreenOn</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L450"></a><tt class="py-lineno">450</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-115" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-115', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input keyevent POWER'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L451"></a><tt class="py-lineno">451</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.isLocked"></a><div id="AdbClient.isLocked-def"><a name="L452"></a><tt class="py-lineno">452</tt> <a class="py-toggle" href="#" id="AdbClient.isLocked-toggle" onclick="return toggle('AdbClient.isLocked');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isLocked">isLocked</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.isLocked-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.isLocked-expanded"><a name="L453"></a><tt class="py-lineno">453</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L454"></a><tt class="py-lineno">454</tt> <tt class="py-line"><tt class="py-docstring"> Checks if the device screen is locked.</tt> </tt>
+<a name="L455"></a><tt class="py-lineno">455</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L456"></a><tt class="py-lineno">456</tt> <tt class="py-line"><tt class="py-docstring"> @return True if the device screen is locked</tt> </tt>
+<a name="L457"></a><tt class="py-lineno">457</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L458"></a><tt class="py-lineno">458</tt> <tt class="py-line"> </tt>
+<a name="L459"></a><tt class="py-lineno">459</tt> <tt class="py-line"> <tt class="py-name">lockScreenRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'mShowingLockscreen=(true|false)'</tt><tt class="py-op">)</tt> </tt>
+<a name="L460"></a><tt class="py-lineno">460</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">lockScreenRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-116" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-116', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys window policy'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L461"></a><tt class="py-lineno">461</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L462"></a><tt class="py-lineno">462</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt><tt class="py-op">)</tt> </tt>
+<a name="L463"></a><tt class="py-lineno">463</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine screen lock state"</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L464"></a><tt class="py-lineno">464</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.isScreenOn"></a><div id="AdbClient.isScreenOn-def"><a name="L465"></a><tt class="py-lineno">465</tt> <a class="py-toggle" href="#" id="AdbClient.isScreenOn-toggle" onclick="return toggle('AdbClient.isScreenOn');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isScreenOn">isScreenOn</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.isScreenOn-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.isScreenOn-expanded"><a name="L466"></a><tt class="py-lineno">466</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L467"></a><tt class="py-lineno">467</tt> <tt class="py-line"><tt class="py-docstring"> Checks if the screen is ON.</tt> </tt>
+<a name="L468"></a><tt class="py-lineno">468</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L469"></a><tt class="py-lineno">469</tt> <tt class="py-line"><tt class="py-docstring"> @return True if the device screen is ON</tt> </tt>
+<a name="L470"></a><tt class="py-lineno">470</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L471"></a><tt class="py-lineno">471</tt> <tt class="py-line"> </tt>
+<a name="L472"></a><tt class="py-lineno">472</tt> <tt class="py-line"> <tt class="py-name">screenOnRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'mScreenOnFully=(true|false)'</tt><tt class="py-op">)</tt> </tt>
+<a name="L473"></a><tt class="py-lineno">473</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">screenOnRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-117" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-117', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys window policy'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L474"></a><tt class="py-lineno">474</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L475"></a><tt class="py-lineno">475</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt><tt class="py-op">)</tt> </tt>
+<a name="L476"></a><tt class="py-lineno">476</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine screen ON state"</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L477"></a><tt class="py-lineno">477</tt> <tt class="py-line"> </tt>
+<a name="AdbClient.unlock"></a><div id="AdbClient.unlock-def"><a name="L478"></a><tt class="py-lineno">478</tt> <a class="py-toggle" href="#" id="AdbClient.unlock-toggle" onclick="return toggle('AdbClient.unlock');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#unlock">unlock</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.unlock-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.unlock-expanded"><a name="L479"></a><tt class="py-lineno">479</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L480"></a><tt class="py-lineno">480</tt> <tt class="py-line"><tt class="py-docstring"> Unlocks the screen of the device.</tt> </tt>
+<a name="L481"></a><tt class="py-lineno">481</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L482"></a><tt class="py-lineno">482</tt> <tt class="py-line"> </tt>
+<a name="L483"></a><tt class="py-lineno">483</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-118" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-118', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input keyevent MENU'</tt><tt class="py-op">)</tt> </tt>
+<a name="L484"></a><tt class="py-lineno">484</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-119" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-119', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'input keyevent BACK'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L485"></a><tt class="py-lineno">485</tt> <tt class="py-line"> </tt>
+<a name="L486"></a><tt class="py-lineno">486</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="AdbClient.percentSame"></a><div id="AdbClient.percentSame-def"><a name="L487"></a><tt class="py-lineno">487</tt> <a class="py-toggle" href="#" id="AdbClient.percentSame-toggle" onclick="return toggle('AdbClient.percentSame');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#percentSame">percentSame</a><tt class="py-op">(</tt><tt class="py-param">image1</tt><tt class="py-op">,</tt> <tt class="py-param">image2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.percentSame-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.percentSame-expanded"><a name="L488"></a><tt class="py-lineno">488</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L489"></a><tt class="py-lineno">489</tt> <tt class="py-line"><tt class="py-docstring"> Returns the percent of pixels that are equal</tt> </tt>
+<a name="L490"></a><tt class="py-lineno">490</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L491"></a><tt class="py-lineno">491</tt> <tt class="py-line"><tt class="py-docstring"> @author: catshoes</tt> </tt>
+<a name="L492"></a><tt class="py-lineno">492</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L493"></a><tt class="py-lineno">493</tt> <tt class="py-line"> </tt>
+<a name="L494"></a><tt class="py-lineno">494</tt> <tt class="py-line"> <tt class="py-comment"># If the images differ in size, return 0% same.</tt> </tt>
+<a name="L495"></a><tt class="py-lineno">495</tt> <tt class="py-line"> <tt class="py-name">size_x1</tt><tt class="py-op">,</tt> <tt class="py-name">size_y1</tt> <tt class="py-op">=</tt> <tt class="py-name">image1</tt><tt class="py-op">.</tt><tt class="py-name">size</tt> </tt>
+<a name="L496"></a><tt class="py-lineno">496</tt> <tt class="py-line"> <tt class="py-name">size_x2</tt><tt class="py-op">,</tt> <tt class="py-name">size_y2</tt> <tt class="py-op">=</tt> <tt class="py-name">image2</tt><tt class="py-op">.</tt><tt class="py-name">size</tt> </tt>
+<a name="L497"></a><tt class="py-lineno">497</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">size_x1</tt> <tt class="py-op">!=</tt> <tt class="py-name">size_x2</tt> <tt class="py-keyword">or</tt> </tt>
+<a name="L498"></a><tt class="py-lineno">498</tt> <tt class="py-line"> <tt class="py-name">size_y1</tt> <tt class="py-op">!=</tt> <tt class="py-name">size_y2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L499"></a><tt class="py-lineno">499</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-number">0</tt> </tt>
+<a name="L500"></a><tt class="py-lineno">500</tt> <tt class="py-line"> </tt>
+<a name="L501"></a><tt class="py-lineno">501</tt> <tt class="py-line"> <tt class="py-comment"># Images are the same size</tt> </tt>
+<a name="L502"></a><tt class="py-lineno">502</tt> <tt class="py-line"> <tt class="py-comment"># Return the percent of pixels that are equal.</tt> </tt>
+<a name="L503"></a><tt class="py-lineno">503</tt> <tt class="py-line"> <tt class="py-name">numPixelsSame</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L504"></a><tt class="py-lineno">504</tt> <tt class="py-line"> <tt class="py-name">numPixelsTotal</tt> <tt class="py-op">=</tt> <tt class="py-name">size_x1</tt> <tt class="py-op">*</tt> <tt class="py-name">size_y1</tt> </tt>
+<a name="L505"></a><tt class="py-lineno">505</tt> <tt class="py-line"> <tt class="py-name">image1Pixels</tt> <tt class="py-op">=</tt> <tt class="py-name">image1</tt><tt class="py-op">.</tt><tt class="py-name">load</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L506"></a><tt class="py-lineno">506</tt> <tt class="py-line"> <tt class="py-name">image2Pixels</tt> <tt class="py-op">=</tt> <tt class="py-name">image2</tt><tt class="py-op">.</tt><tt class="py-name">load</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L507"></a><tt class="py-lineno">507</tt> <tt class="py-line"> </tt>
+<a name="L508"></a><tt class="py-lineno">508</tt> <tt class="py-line"> <tt class="py-comment"># Loop over all pixels, comparing pixel in image1 to image2</tt> </tt>
+<a name="L509"></a><tt class="py-lineno">509</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">x</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">size_x1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L510"></a><tt class="py-lineno">510</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">y</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">size_y1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L511"></a><tt class="py-lineno">511</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">image1Pixels</tt><tt class="py-op">[</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-name">image2Pixels</tt><tt class="py-op">[</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L512"></a><tt class="py-lineno">512</tt> <tt class="py-line"> <tt class="py-name">numPixelsSame</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L513"></a><tt class="py-lineno">513</tt> <tt class="py-line"> </tt>
+<a name="L514"></a><tt class="py-lineno">514</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">numPixelsSame</tt> <tt class="py-op">/</tt> <tt class="py-name">float</tt><tt class="py-op">(</tt><tt class="py-name">numPixelsTotal</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L515"></a><tt class="py-lineno">515</tt> <tt class="py-line"> </tt>
+<a name="L516"></a><tt class="py-lineno">516</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="AdbClient.sameAs"></a><div id="AdbClient.sameAs-def"><a name="L517"></a><tt class="py-lineno">517</tt> <a class="py-toggle" href="#" id="AdbClient.sameAs-toggle" onclick="return toggle('AdbClient.sameAs');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#sameAs">sameAs</a><tt class="py-op">(</tt><tt class="py-param">image1</tt><tt class="py-op">,</tt> <tt class="py-param">image2</tt><tt class="py-op">,</tt> <tt class="py-param">percent</tt><tt class="py-op">=</tt><tt class="py-number">1.0</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="AdbClient.sameAs-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="AdbClient.sameAs-expanded"><a name="L518"></a><tt class="py-lineno">518</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L519"></a><tt class="py-lineno">519</tt> <tt class="py-line"><tt class="py-docstring"> Compares 2 images</tt> </tt>
+<a name="L520"></a><tt class="py-lineno">520</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L521"></a><tt class="py-lineno">521</tt> <tt class="py-line"><tt class="py-docstring"> @author: catshoes</tt> </tt>
+<a name="L522"></a><tt class="py-lineno">522</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L523"></a><tt class="py-lineno">523</tt> <tt class="py-line"> </tt>
+<a name="L524"></a><tt class="py-lineno">524</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt id="link-120" class="py-name" targets="Class com.dtmilano.android.adb.adbclient.AdbClient=com.dtmilano.android.adb.adbclient.AdbClient-class.html"><a title="com.dtmilano.android.adb.adbclient.AdbClient" class="py-name" href="#" onclick="return doclink('link-120', 'AdbClient', 'link-120');">AdbClient</a></tt><tt class="py-op">.</tt><tt id="link-121" class="py-name" targets="Static Method com.dtmilano.android.adb.adbclient.AdbClient.percentSame()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#percentSame"><a title="com.dtmilano.android.adb.adbclient.AdbClient.percentSame" class="py-name" href="#" onclick="return doclink('link-121', 'percentSame', 'link-121');">percentSame</a></tt><tt class="py-op">(</tt><tt class="py-name">image1</tt><tt class="py-op">,</tt> <tt class="py-name">image2</tt><tt class="py-op">)</tt> <tt class="py-op">>=</tt> <tt class="py-name">percent</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L525"></a><tt class="py-lineno">525</tt> <tt class="py-line"> </tt>
+<a name="L526"></a><tt class="py-lineno">526</tt> <tt class="py-line"> </tt>
+<a name="L527"></a><tt class="py-lineno">527</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">'__main__'</tt><tt class="py-op">:</tt> </tt>
+<a name="L528"></a><tt class="py-lineno">528</tt> <tt class="py-line"> <tt class="py-name">adbClient</tt> <tt class="py-op">=</tt> <tt id="link-122" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient" class="py-name" href="#" onclick="return doclink('link-122', 'AdbClient', 'link-120');">AdbClient</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_SERIAL'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L529"></a><tt class="py-lineno">529</tt> <tt class="py-line"> <tt class="py-name">INTERACTIVE</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L530"></a><tt class="py-lineno">530</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">INTERACTIVE</tt><tt class="py-op">:</tt> </tt>
+<a name="L531"></a><tt class="py-lineno">531</tt> <tt class="py-line"> <tt class="py-name">sout</tt> <tt class="py-op">=</tt> <tt class="py-name">adbClient</tt><tt class="py-op">.</tt><tt id="link-123" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-123', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L532"></a><tt class="py-lineno">532</tt> <tt class="py-line"> <tt class="py-name">prompt</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">".+@android:(.*) [$#] \r\r\n"</tt><tt class="py-op">)</tt> </tt>
+<a name="L533"></a><tt class="py-lineno">533</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L534"></a><tt class="py-lineno">534</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L535"></a><tt class="py-lineno">535</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-name">raw_input</tt><tt class="py-op">(</tt><tt class="py-string">'adb $ '</tt><tt class="py-op">)</tt> </tt>
+<a name="L536"></a><tt class="py-lineno">536</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">EOFError</tt><tt class="py-op">:</tt> </tt>
+<a name="L537"></a><tt class="py-lineno">537</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L538"></a><tt class="py-lineno">538</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">cmd</tt> <tt class="py-op">==</tt> <tt class="py-string">'exit'</tt><tt class="py-op">:</tt> </tt>
+<a name="L539"></a><tt class="py-lineno">539</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L540"></a><tt class="py-lineno">540</tt> <tt class="py-line"> <tt class="py-name">adbClient</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt id="link-124" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__send" class="py-name" href="#" onclick="return doclink('link-124', '__send', 'link-55');">__send</a></tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt> <tt class="py-op">+</tt> <tt class="py-string">"\r\n"</tt><tt class="py-op">)</tt> </tt>
+<a name="L541"></a><tt class="py-lineno">541</tt> <tt class="py-line"> <tt class="py-name">sout</tt><tt class="py-op">.</tt><tt class="py-name">readline</tt><tt class="py-op">(</tt><tt class="py-number">4096</tt><tt class="py-op">)</tt> <tt class="py-comment"># eat first line, which is the command</tt> </tt>
+<a name="L542"></a><tt class="py-lineno">542</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L543"></a><tt class="py-lineno">543</tt> <tt class="py-line"> <tt class="py-name">line</tt> <tt class="py-op">=</tt> <tt class="py-name">sout</tt><tt class="py-op">.</tt><tt class="py-name">readline</tt><tt class="py-op">(</tt><tt class="py-number">4096</tt><tt class="py-op">)</tt> </tt>
+<a name="L544"></a><tt class="py-lineno">544</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">prompt</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">line</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L545"></a><tt class="py-lineno">545</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L546"></a><tt class="py-lineno">546</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-name">line</tt><tt class="py-op">,</tt> </tt>
+<a name="L547"></a><tt class="py-lineno">547</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">line</tt><tt class="py-op">:</tt> </tt>
+<a name="L548"></a><tt class="py-lineno">548</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L549"></a><tt class="py-lineno">549</tt> <tt class="py-line"> </tt>
+<a name="L550"></a><tt class="py-lineno">550</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"\nBye"</tt> </tt>
+<a name="L551"></a><tt class="py-lineno">551</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L552"></a><tt class="py-lineno">552</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">'date:'</tt><tt class="py-op">,</tt> <tt class="py-name">adbClient</tt><tt class="py-op">.</tt><tt id="link-125" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-125', 'shell', 'link-76');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'date'</tt><tt class="py-op">)</tt> </tt>
+<a name="L553"></a><tt class="py-lineno">553</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:02 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.AdbClient-class.html b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.AdbClient-class.html
new file mode 100755
index 0000000..3add511
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.AdbClient-class.html
@@ -0,0 +1,951 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb.adbclient.AdbClient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.adb-module.html">Package adb</a> ::
+ <a href="com.dtmilano.android.adb.adbclient-module.html">Module adbclient</a> ::
+ Class AdbClient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class AdbClient</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient">source code</a></span></p>
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">serialno</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">hostname</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">localhost</code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">port</span>=<span class="summary-sig-default">5037</span>,
+ <span class="summary-sig-arg">settransport</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">reconnect</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="setSerialno"></a><span class="summary-sig-name">setSerialno</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">serialno</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.setSerialno">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="setReconnect"></a><span class="summary-sig-name">setReconnect</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">val</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.setReconnect">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__connect"></a><span class="summary-sig-name">__connect</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__connect">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="close"></a><span class="summary-sig-name">close</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.close">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__del__"></a><span class="summary-sig-name">__del__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__del__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__send"></a><span class="summary-sig-name">__send</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">msg</span>,
+ <span class="summary-sig-arg">checkok</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">reconnect</span>=<span class="summary-sig-default">False</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__send">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__receive"></a><span class="summary-sig-name">__receive</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">nob</span>=<span class="summary-sig-default">None</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__receive">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__checkOk"></a><span class="summary-sig-name">__checkOk</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__checkOk">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="checkConnected"></a><span class="summary-sig-name">checkConnected</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.checkConnected">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="checkVersion"></a><span class="summary-sig-name">checkVersion</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">reconnect</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.checkVersion">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__setTransport"></a><span class="summary-sig-name">__setTransport</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__setTransport">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getDevices"></a><span class="summary-sig-name">getDevices</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getDevices">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="shell"></a><span class="summary-sig-name">shell</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">cmd</span>=<span class="summary-sig-default">None</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.shell">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getRestrictedScreen" class="summary-sig-name">getRestrictedScreen</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets <code>mRestrictedScreen</code> values from dumpsys.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getRestrictedScreen">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getProp"></a><span class="summary-sig-name">__getProp</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>,
+ <span class="summary-sig-arg">strip</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__getProp">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getDisplayWidth"></a><span class="summary-sig-name">__getDisplayWidth</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>,
+ <span class="summary-sig-arg">strip</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__getDisplayWidth">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getDisplayHeight"></a><span class="summary-sig-name">__getDisplayHeight</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>,
+ <span class="summary-sig-arg">strip</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.__getDisplayHeight">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getSystemProperty"></a><span class="summary-sig-name">getSystemProperty</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>,
+ <span class="summary-sig-arg">strip</span>=<span class="summary-sig-default">True</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getSystemProperty">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getProperty"></a><span class="summary-sig-name">getProperty</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>,
+ <span class="summary-sig-arg">strip</span>=<span class="summary-sig-default">True</span>)</span><br />
+ Gets the property value for key</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getProperty">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getSdkVersion"></a><span class="summary-sig-name">getSdkVersion</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the SDK version.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getSdkVersion">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="press"></a><span class="summary-sig-name">press</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">eventType</span>=<span class="summary-sig-default">2</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.press">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="longPress"></a><span class="summary-sig-name">longPress</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.longPress">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="startActivity"></a><span class="summary-sig-name">startActivity</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">component</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">flags</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">uri</span>=<span class="summary-sig-default">None</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.startActivity">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="takeSnapshot"></a><span class="summary-sig-name">takeSnapshot</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">reconnect</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Takes a snapshot of the device and return it as a PIL Image.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.takeSnapshot">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="touch"></a><span class="summary-sig-name">touch</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">x</span>,
+ <span class="summary-sig-arg">y</span>,
+ <span class="summary-sig-arg">eventType</span>=<span class="summary-sig-default">2</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.touch">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#drag" class="summary-sig-name">drag</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">(x0, y0)</span>,
+ <span class="summary-sig-arg">(x1, y1)</span>,
+ <span class="summary-sig-arg">duration</span>,
+ <span class="summary-sig-arg">steps</span>=<span class="summary-sig-default">1</span>)</span><br />
+ Sends drag event (actually it's using <code>input swipe</code>
+ command.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.drag">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="type"></a><span class="summary-sig-name">type</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.type">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="wake"></a><span class="summary-sig-name">wake</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.wake">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isLocked" class="summary-sig-name">isLocked</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Checks if the device screen is locked.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.isLocked">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isScreenOn" class="summary-sig-name">isScreenOn</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Checks if the screen is ON.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.isScreenOn">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="unlock"></a><span class="summary-sig-name">unlock</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Unlocks the screen of the device.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.unlock">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="setAlarm"></a><span class="summary-sig-name">setAlarm</span>(<span class="summary-sig-arg">timeout</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.setAlarm">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#percentSame" class="summary-sig-name">percentSame</a>(<span class="summary-sig-arg">image1</span>,
+ <span class="summary-sig-arg">image2</span>)</span><br />
+ Returns the percent of pixels that are equal</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.percentSame">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#sameAs" class="summary-sig-name">sameAs</a>(<span class="summary-sig-arg">image1</span>,
+ <span class="summary-sig-arg">image2</span>,
+ <span class="summary-sig-arg">percent</span>=<span class="summary-sig-default">1.0</span>)</span><br />
+ Compares 2 images</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.sameAs">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="build"></a><span class="summary-name">build</span><br />
+ Build properties
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="getRestrictedScreen"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getRestrictedScreen</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.getRestrictedScreen">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets <code>mRestrictedScreen</code> values from dumpsys. This is a
+ method to obtain display dimensions</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="drag"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">drag</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">(x0, y0)</span>,
+ <span class="sig-arg">(x1, y1)</span>,
+ <span class="sig-arg">duration</span>,
+ <span class="sig-arg">steps</span>=<span class="sig-default">1</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.drag">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sends drag event (actually it's using <code>input swipe</code>
+ command.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>(x0</code></strong>, <strong class="pname"><code>y0)</code></strong> - starting point</li>
+ <li><strong class="pname"><code>(x1</code></strong>, <strong class="pname"><code>y1)</code></strong> - ending point</li>
+ <li><strong class="pname"><code>duration</code></strong> - duration of the event in ms</li>
+ <li><strong class="pname"><code>steps</code></strong> - number of steps (currently ignored by @{input swipe}</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="isLocked"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">isLocked</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.isLocked">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks if the device screen is locked.</p>
+ <p>@return True if the device screen is locked</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="isScreenOn"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">isScreenOn</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.isScreenOn">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks if the screen is ON.</p>
+ <p>@return True if the device screen is ON</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="percentSame"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">percentSame</span>(<span class="sig-arg">image1</span>,
+ <span class="sig-arg">image2</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.percentSame">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Returns the percent of pixels that are equal</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Author:</strong>
+ catshoes
+ </p>
+</div></td></tr></table>
+</div>
+<a name="sameAs"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">sameAs</span>(<span class="sig-arg">image1</span>,
+ <span class="sig-arg">image2</span>,
+ <span class="sig-arg">percent</span>=<span class="sig-default">1.0</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#AdbClient.sameAs">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Compares 2 images</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Author:</strong>
+ catshoes
+ </p>
+</div></td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.Device-class.html b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.Device-class.html
new file mode 100755
index 0000000..b294dee
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.adb.adbclient.Device-class.html
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.adb.adbclient.Device</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.adb-module.html">Package adb</a> ::
+ <a href="com.dtmilano.android.adb.adbclient-module.html">Module adbclient</a> ::
+ Class Device
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.adb.adbclient.Device-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class Device</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#Device">source code</a></span></p>
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">serialno</span>,
+ <span class="summary-sig-arg">status</span>,
+ <span class="summary-sig-arg">qualifiers</span>=<span class="summary-sig-default">None</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#Device.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__str__"></a><span class="summary-sig-name">__str__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#Device.__str__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="factory"></a><span class="summary-sig-name">factory</span>(<span class="summary-sig-arg">_str</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.adb.adbclient-pysrc.html#Device.factory">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient-module.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient-module.html
new file mode 100755
index 0000000..ab2043d
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient-module.html
@@ -0,0 +1,799 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ Module viewclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module viewclient</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html">source code</a></span></p>
+<pre class="literalblock">
+
+Copyright (C) 2012-2014 Diego Torres Milano
+Created on Feb 2, 2012
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+
+</pre>
+
+<hr />
+<div class="fields"> <p><strong>Version:</strong>
+ 5.6.3
+ </p>
+</div><!-- ==================== CLASSES ==================== -->
+<a name="section-Classes"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Classes</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Classes"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.Window-class.html" class="summary-name">Window</a><br />
+ Window class
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html" class="summary-name">ViewNotFoundException</a><br />
+ ViewNotFoundException is raised when a View is not found.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.View-class.html" class="summary-name">View</a><br />
+ View class
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.TextView-class.html" class="summary-name">TextView</a><br />
+ TextView class.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.EditText-class.html" class="summary-name">EditText</a><br />
+ EditText class.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html" class="summary-name">UiAutomator2AndroidViewClient</a><br />
+ UiAutomator XML to AndroidViewClient
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html" class="summary-name">Excerpt2Code</a><br />
+ Excerpt XML to code
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.ViewClient-class.html" class="summary-name">ViewClient</a><br />
+ ViewClient is a <i>ViewServer</i> client.
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTIONS ==================== -->
+<a name="section-Functions"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Functions</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Functions"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient-module.html#_nd" class="summary-sig-name" onclick="show_private();">_nd</a>(<span class="summary-sig-arg">name</span>)</span><br />
+ Returns:
+ Returns a named decimal regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_nd">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient-module.html#_nh" class="summary-sig-name" onclick="show_private();">_nh</a>(<span class="summary-sig-arg">name</span>)</span><br />
+ Returns:
+ Returns a named hex regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_nh">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient-module.html#_ns" class="summary-sig-name" onclick="show_private();">_ns</a>(<span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">greedy</span>=<span class="summary-sig-default">False</span>)</span><br />
+ NOTICE: this is using a non-greedy (or minimal) regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_ns">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG"></a><span class="summary-name">DEBUG</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_DEVICE"></a><span class="summary-name">DEBUG_DEVICE</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_RECEIVED"></a><span class="summary-name">DEBUG_RECEIVED</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_TREE"></a><span class="summary-name">DEBUG_TREE</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_GETATTR"></a><span class="summary-name">DEBUG_GETATTR</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_CALL"></a><span class="summary-name">DEBUG_CALL</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_COORDS"></a><span class="summary-name">DEBUG_COORDS</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_TOUCH"></a><span class="summary-name">DEBUG_TOUCH</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_STATUSBAR"></a><span class="summary-name">DEBUG_STATUSBAR</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_WINDOWS"></a><span class="summary-name">DEBUG_WINDOWS</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_BOUNDS"></a><span class="summary-name">DEBUG_BOUNDS</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_DISTANCE"></a><span class="summary-name">DEBUG_DISTANCE</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WARNINGS"></a><span class="summary-name">WARNINGS</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VIEW_SERVER_HOST"></a><span class="summary-name">VIEW_SERVER_HOST</span> = <code title="'localhost'"><code class="variable-quote">'</code><code class="variable-string">localhost</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VIEW_SERVER_PORT"></a><span class="summary-name">VIEW_SERVER_PORT</span> = <code title="4939">4939</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ADB_DEFAULT_PORT"></a><span class="summary-name">ADB_DEFAULT_PORT</span> = <code title="5555">5555</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="OFFSET"></a><span class="summary-name">OFFSET</span> = <code title="25">25</code><br />
+ This assumes the smallest touchable view on the screen is
+ approximately 50px x 50px and touches it at <i
+ class="math">(x+OFFSET, y+OFFSET)</i>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES" class="summary-name">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a> = <code title="True">True</code><br />
+ Use <code>AdbClient</code> to obtain the needed properties.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="summary-name">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a> = <code title="False">False</code><br />
+ Skips some classes related with the Action Bar and the
+ PhoneWindow$DecorView in the coordinates calculation
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED" class="summary-name">VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a> = <code title="False">False</code><br />
+ Under some conditions the touch event should be longer [t(DOWN)
+ << t(UP)].
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VERSION_SDK_PROPERTY"></a><span class="summary-name">VERSION_SDK_PROPERTY</span> = <code title="'ro.build.version.sdk'"><code class="variable-quote">'</code><code class="variable-string">ro.build.version.sdk</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VERSION_RELEASE_PROPERTY"></a><span class="summary-name">VERSION_RELEASE_PROPERTY</span> = <code title="'ro.build.version.release'"><code class="variable-quote">'</code><code class="variable-string">ro.build.version.release</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_PROPERTY"></a><span class="summary-name">ID_PROPERTY</span> = <code title="'mID'"><code class="variable-quote">'</code><code class="variable-string">mID</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_PROPERTY_UI_AUTOMATOR"></a><span class="summary-name">ID_PROPERTY_UI_AUTOMATOR</span> = <code title="'uniqueId'"><code class="variable-quote">'</code><code class="variable-string">uniqueId</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY"></a><span class="summary-name">TEXT_PROPERTY</span> = <code title="'text:mText'"><code class="variable-quote">'</code><code class="variable-string">text:mText</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY_API_10"></a><span class="summary-name">TEXT_PROPERTY_API_10</span> = <code title="'mText'"><code class="variable-quote">'</code><code class="variable-string">mText</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY_UI_AUTOMATOR"></a><span class="summary-name">TEXT_PROPERTY_UI_AUTOMATOR</span> = <code title="'text'"><code class="variable-quote">'</code><code class="variable-string">text</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WS"></a><span class="summary-name">WS</span> = <code title="'\xfe'"><code class="variable-quote">'</code><code class="variable-string">\xfe</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LEFT_PROPERTY"></a><span class="summary-name">LEFT_PROPERTY</span> = <code title="'layout:mLeft'"><code class="variable-quote">'</code><code class="variable-string">layout:mLeft</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LEFT_PROPERTY_API_8"></a><span class="summary-name">LEFT_PROPERTY_API_8</span> = <code title="'mLeft'"><code class="variable-quote">'</code><code class="variable-string">mLeft</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TOP_PROPERTY"></a><span class="summary-name">TOP_PROPERTY</span> = <code title="'layout:mTop'"><code class="variable-quote">'</code><code class="variable-string">layout:mTop</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TOP_PROPERTY_API_8"></a><span class="summary-name">TOP_PROPERTY_API_8</span> = <code title="'mTop'"><code class="variable-quote">'</code><code class="variable-string">mTop</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WIDTH_PROPERTY"></a><span class="summary-name">WIDTH_PROPERTY</span> = <code title="'layout:getWidth()'"><code class="variable-quote">'</code><code class="variable-string">layout:getWidth()</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WIDTH_PROPERTY_API_8"></a><span class="summary-name">WIDTH_PROPERTY_API_8</span> = <code title="'getWidth()'"><code class="variable-quote">'</code><code class="variable-string">getWidth()</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="HEIGHT_PROPERTY"></a><span class="summary-name">HEIGHT_PROPERTY</span> = <code title="'layout:getHeight()'"><code class="variable-quote">'</code><code class="variable-string">layout:getHeight()</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="HEIGHT_PROPERTY_API_8"></a><span class="summary-name">HEIGHT_PROPERTY_API_8</span> = <code title="'getHeight()'"><code class="variable-quote">'</code><code class="variable-string">getHeight()</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="GET_VISIBILITY_PROPERTY"></a><span class="summary-name">GET_VISIBILITY_PROPERTY</span> = <code title="'getVisibility()'"><code class="variable-quote">'</code><code class="variable-string">getVisibility()</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LAYOUT_TOP_MARGIN_PROPERTY"></a><span class="summary-name">LAYOUT_TOP_MARGIN_PROPERTY</span> = <code title="'layout:layout_topMargin'"><code class="variable-quote">'</code><code class="variable-string">layout:layout_topMargin</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VISIBLE"></a><span class="summary-name">VISIBLE</span> = <code title="0">0</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="INVISIBLE"></a><span class="summary-name">INVISIBLE</span> = <code title="4">4</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="GONE"></a><span class="summary-name">GONE</span> = <code title="8">8</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="IP_RE"></a><span class="summary-name">IP_RE</span> = <code title="re.compile(r'^(\d{1,3}\.){3}\d{1,3}$')">re.compile(r'^<code class="re-group">(</code>\d<code class="re-op">{1,3}</code>\.<code class="re-group">)</code><code class="re-op">{3}</code>\d<code class="re-op">{1,3}</code>$')</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_RE"></a><span class="summary-name">ID_RE</span> = <code title="re.compile(r'id/([^/]*)(/(\d+))?')">re.compile(r'id/<code class="re-group">(</code><code class="re-group">[^</code>/<code class="re-group">]</code><code class="re-op">*</code><code class="re-group">)</code><code class="re-group">(</code>/<code class="re-group">(</code>\d<code class="re-op">+</code><code class="re-group">)</code><code class="re-group">)</code><code class="re-op">?</code>')</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="'com.dtmilano.android'"><code class="variable-quote">'</code><code class="variable-string">com.dtmilano.android</code><code class="variable-quote">'</code></code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTION DETAILS ==================== -->
+<a name="section-FunctionDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Function Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-FunctionDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="_nd"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">_nd</span>(<span class="sig-arg">name</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_nd">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>Returns a named decimal regex</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="_nh"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">_nh</span>(<span class="sig-arg">name</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_nh">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>Returns a named hex regex</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="_ns"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">_ns</span>(<span class="sig-arg">name</span>,
+ <span class="sig-arg">greedy</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#_ns">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>NOTICE: this is using a non-greedy (or minimal) regex</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>name</code></strong> (str) - the name used to tag the expression</li>
+ <li><strong class="pname"><code>greedy</code></strong> (bool) - Whether the regex is greedy or not</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>Returns a named string regex (only non-whitespace characters
+ allowed)</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== VARIABLES DETAILS ==================== -->
+<a name="section-VariablesDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-VariablesDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</h3>
+ <p>Use <code>AdbClient</code> to obtain the needed properties. If this is
+ <code>False</code> then <code>adb shell getprop</code> is used</p>
+ <dl class="fields">
+ </dl>
+ <dl class="fields">
+ <dt>Value:</dt>
+ <dd><table><tr><td><pre class="variable">
+True
+</pre></td></tr></table>
+</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</h3>
+ <p>Skips some classes related with the Action Bar and the
+ PhoneWindow$DecorView in the coordinates calculation</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a href="com.dtmilano.android.viewclient.View-class.html#getXY"
+ class="link">View.getXY()</a>
+ </p>
+</div> <dl class="fields">
+ <dt>Value:</dt>
+ <dd><table><tr><td><pre class="variable">
+False
+</pre></td></tr></table>
+</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</h3>
+ <p>Under some conditions the touch event should be longer [t(DOWN)
+ << t(UP)]. <code>True</code> enables a workaround to delay the
+ events.</p>
+ <dl class="fields">
+ </dl>
+ <dl class="fields">
+ <dt>Value:</dt>
+ <dd><table><tr><td><pre class="variable">
+False
+</pre></td></tr></table>
+</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:58 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient-pysrc.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient-pysrc.html
new file mode 100755
index 0000000..3831274
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient-pysrc.html
@@ -0,0 +1,2742 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ Module viewclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="com.dtmilano.android.viewclient-module.html">Module com.dtmilano.android.viewclient</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt> <tt class="py-line"><tt class="py-comment"># -*- coding: utf-8 -*-</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt> <tt class="py-line"><tt class="py-docstring">Copyright (C) 2012-2014 Diego Torres Milano</tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt> <tt class="py-line"><tt class="py-docstring">Created on Feb 2, 2012</tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt> <tt class="py-line"><tt class="py-docstring">Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt> <tt class="py-line"><tt class="py-docstring">you may not use this file except in compliance with the License.</tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt> <tt class="py-line"><tt class="py-docstring">You may obtain a copy of the License at</tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L10"></a><tt class="py-lineno"> 10</tt> <tt class="py-line"><tt class="py-docstring"> http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
+<a name="L11"></a><tt class="py-lineno"> 11</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L12"></a><tt class="py-lineno"> 12</tt> <tt class="py-line"><tt class="py-docstring">Unless required by applicable law or agreed to in writing, software</tt> </tt>
+<a name="L13"></a><tt class="py-lineno"> 13</tt> <tt class="py-line"><tt class="py-docstring">distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
+<a name="L14"></a><tt class="py-lineno"> 14</tt> <tt class="py-line"><tt class="py-docstring">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
+<a name="L15"></a><tt class="py-lineno"> 15</tt> <tt class="py-line"><tt class="py-docstring">See the License for the specific language governing permissions and</tt> </tt>
+<a name="L16"></a><tt class="py-lineno"> 16</tt> <tt class="py-line"><tt class="py-docstring">limitations under the License.</tt> </tt>
+<a name="L17"></a><tt class="py-lineno"> 17</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L18"></a><tt class="py-lineno"> 18</tt> <tt class="py-line"><tt class="py-docstring">@author: Diego Torres Milano</tt> </tt>
+<a name="L19"></a><tt class="py-lineno"> 19</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L20"></a><tt class="py-lineno"> 20</tt> <tt class="py-line"> </tt>
+<a name="L21"></a><tt class="py-lineno"> 21</tt> <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'5.6.3'</tt> </tt>
+<a name="L22"></a><tt class="py-lineno"> 22</tt> <tt class="py-line"> </tt>
+<a name="L23"></a><tt class="py-lineno"> 23</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> </tt>
+<a name="L24"></a><tt class="py-lineno"> 24</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">warnings</tt> </tt>
+<a name="L25"></a><tt class="py-lineno"> 25</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">executable</tt><tt class="py-op">:</tt> </tt>
+<a name="L26"></a><tt class="py-lineno"> 26</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">'monkeyrunner'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">executable</tt><tt class="py-op">:</tt> </tt>
+<a name="L27"></a><tt class="py-lineno"> 27</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt> </tt>
+<a name="L28"></a><tt class="py-lineno"> 28</tt> <tt class="py-line"> <tt class="py-string">'''</tt> </tt>
+<a name="L29"></a><tt class="py-lineno"> 29</tt> <tt class="py-line"><tt class="py-string"></tt> </tt>
+<a name="L30"></a><tt class="py-lineno"> 30</tt> <tt class="py-line"><tt class="py-string"> You should use a 'python' interpreter, not 'monkeyrunner' for this module</tt> </tt>
+<a name="L31"></a><tt class="py-lineno"> 31</tt> <tt class="py-line"><tt class="py-string"></tt> </tt>
+<a name="L32"></a><tt class="py-lineno"> 32</tt> <tt class="py-line"><tt class="py-string"> '''</tt><tt class="py-op">,</tt> <tt class="py-name">RuntimeWarning</tt><tt class="py-op">)</tt> </tt>
+<a name="L33"></a><tt class="py-lineno"> 33</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">subprocess</tt> </tt>
+<a name="L34"></a><tt class="py-lineno"> 34</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> </tt>
+<a name="L35"></a><tt class="py-lineno"> 35</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">socket</tt> </tt>
+<a name="L36"></a><tt class="py-lineno"> 36</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">os</tt> </tt>
+<a name="L37"></a><tt class="py-lineno"> 37</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">types</tt> </tt>
+<a name="L38"></a><tt class="py-lineno"> 38</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">time</tt> </tt>
+<a name="L39"></a><tt class="py-lineno"> 39</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">signal</tt> </tt>
+<a name="L40"></a><tt class="py-lineno"> 40</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">copy</tt> </tt>
+<a name="L41"></a><tt class="py-lineno"> 41</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">pickle</tt> </tt>
+<a name="L42"></a><tt class="py-lineno"> 42</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">platform</tt> </tt>
+<a name="L43"></a><tt class="py-lineno"> 43</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt> </tt>
+<a name="L44"></a><tt class="py-lineno"> 44</tt> <tt class="py-line"><tt class="py-keyword">from</tt> <tt class="py-name">com</tt><tt class="py-op">.</tt><tt class="py-name">dtmilano</tt><tt class="py-op">.</tt><tt id="link-0" class="py-name" targets="Package com.dtmilano.android=com.dtmilano.android-module.html"><a title="com.dtmilano.android" class="py-name" href="#" onclick="return doclink('link-0', 'android', 'link-0');">android</a></tt><tt class="py-op">.</tt><tt id="link-1" class="py-name" targets="Package com.dtmilano.android.adb=com.dtmilano.android.adb-module.html"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-1', 'adb', 'link-1');">adb</a></tt> <tt class="py-keyword">import</tt> <tt id="link-2" class="py-name" targets="Module com.dtmilano.android.adb.adbclient=com.dtmilano.android.adb.adbclient-module.html"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-2', 'adbclient', 'link-2');">adbclient</a></tt> </tt>
+<a name="L45"></a><tt class="py-lineno"> 45</tt> <tt class="py-line"> </tt>
+<a name="L46"></a><tt class="py-lineno"> 46</tt> <tt class="py-line"><tt id="link-3" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DEBUG=com.dtmilano.android.adb.adbclient-module.html#DEBUG,Variable com.dtmilano.android.viewclient.DEBUG=com.dtmilano.android.viewclient-module.html#DEBUG"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-3', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L47"></a><tt class="py-lineno"> 47</tt> <tt class="py-line"><tt id="link-4" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_DEVICE=com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-4', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt> <tt class="py-op">=</tt> <tt id="link-5" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-5', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L48"></a><tt class="py-lineno"> 48</tt> <tt class="py-line"><tt id="link-6" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_RECEIVED=com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-6', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt> <tt class="py-op">=</tt> <tt id="link-7" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-7', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L49"></a><tt class="py-lineno"> 49</tt> <tt class="py-line"><tt id="link-8" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_TREE=com.dtmilano.android.viewclient-module.html#DEBUG_TREE"><a title="com.dtmilano.android.viewclient.DEBUG_TREE" class="py-name" href="#" onclick="return doclink('link-8', 'DEBUG_TREE', 'link-8');">DEBUG_TREE</a></tt> <tt class="py-op">=</tt> <tt id="link-9" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-9', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L50"></a><tt class="py-lineno"> 50</tt> <tt class="py-line"><tt id="link-10" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_GETATTR=com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR"><a title="com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-10', 'DEBUG_GETATTR', 'link-10');">DEBUG_GETATTR</a></tt> <tt class="py-op">=</tt> <tt id="link-11" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-11', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L51"></a><tt class="py-lineno"> 51</tt> <tt class="py-line"><tt id="link-12" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_CALL=com.dtmilano.android.viewclient-module.html#DEBUG_CALL"><a title="com.dtmilano.android.viewclient.DEBUG_CALL" class="py-name" href="#" onclick="return doclink('link-12', 'DEBUG_CALL', 'link-12');">DEBUG_CALL</a></tt> <tt class="py-op">=</tt> <tt id="link-13" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-13', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L52"></a><tt class="py-lineno"> 52</tt> <tt class="py-line"><tt id="link-14" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_COORDS=com.dtmilano.android.viewclient-module.html#DEBUG_COORDS"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-14', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-op">=</tt> <tt id="link-15" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-15', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L53"></a><tt class="py-lineno"> 53</tt> <tt class="py-line"><tt id="link-16" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_TOUCH=com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH"><a title="com.dtmilano.android.viewclient.DEBUG_TOUCH" class="py-name" href="#" onclick="return doclink('link-16', 'DEBUG_TOUCH', 'link-16');">DEBUG_TOUCH</a></tt> <tt class="py-op">=</tt> <tt id="link-17" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-17', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L54"></a><tt class="py-lineno"> 54</tt> <tt class="py-line"><tt id="link-18" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_STATUSBAR=com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-18', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt> <tt class="py-op">=</tt> <tt id="link-19" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-19', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L55"></a><tt class="py-lineno"> 55</tt> <tt class="py-line"><tt id="link-20" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_WINDOWS=com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS"><a title="com.dtmilano.android.viewclient.DEBUG_WINDOWS" class="py-name" href="#" onclick="return doclink('link-20', 'DEBUG_WINDOWS', 'link-20');">DEBUG_WINDOWS</a></tt> <tt class="py-op">=</tt> <tt id="link-21" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-21', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L56"></a><tt class="py-lineno"> 56</tt> <tt class="py-line"><tt id="link-22" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_BOUNDS=com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS"><a title="com.dtmilano.android.viewclient.DEBUG_BOUNDS" class="py-name" href="#" onclick="return doclink('link-22', 'DEBUG_BOUNDS', 'link-22');">DEBUG_BOUNDS</a></tt> <tt class="py-op">=</tt> <tt id="link-23" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-23', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L57"></a><tt class="py-lineno"> 57</tt> <tt class="py-line"><tt id="link-24" class="py-name" targets="Variable com.dtmilano.android.viewclient.DEBUG_DISTANCE=com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-24', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt> <tt class="py-op">=</tt> <tt id="link-25" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-25', 'DEBUG', 'link-3');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L58"></a><tt class="py-lineno"> 58</tt> <tt class="py-line"> </tt>
+<a name="L59"></a><tt class="py-lineno"> 59</tt> <tt class="py-line"><tt id="link-26" class="py-name" targets="Variable com.dtmilano.android.viewclient.WARNINGS=com.dtmilano.android.viewclient-module.html#WARNINGS"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-26', 'WARNINGS', 'link-26');">WARNINGS</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L60"></a><tt class="py-lineno"> 60</tt> <tt class="py-line"> </tt>
+<a name="L61"></a><tt class="py-lineno"> 61</tt> <tt class="py-line"><tt id="link-27" class="py-name" targets="Variable com.dtmilano.android.viewclient.VIEW_SERVER_HOST=com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-27', 'VIEW_SERVER_HOST', 'link-27');">VIEW_SERVER_HOST</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'localhost'</tt> </tt>
+<a name="L62"></a><tt class="py-lineno"> 62</tt> <tt class="py-line"><tt id="link-28" class="py-name" targets="Variable com.dtmilano.android.viewclient.VIEW_SERVER_PORT=com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-28', 'VIEW_SERVER_PORT', 'link-28');">VIEW_SERVER_PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">4939</tt> </tt>
+<a name="L63"></a><tt class="py-lineno"> 63</tt> <tt class="py-line"> </tt>
+<a name="L64"></a><tt class="py-lineno"> 64</tt> <tt class="py-line"><tt id="link-29" class="py-name" targets="Variable com.dtmilano.android.viewclient.ADB_DEFAULT_PORT=com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT"><a title="com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-29', 'ADB_DEFAULT_PORT', 'link-29');">ADB_DEFAULT_PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">5555</tt> </tt>
+<a name="L65"></a><tt class="py-lineno"> 65</tt> <tt class="py-line"> </tt>
+<a name="L66"></a><tt class="py-lineno"> 66</tt> <tt class="py-line"><tt id="link-30" class="py-name" targets="Variable com.dtmilano.android.viewclient.OFFSET=com.dtmilano.android.viewclient-module.html#OFFSET"><a title="com.dtmilano.android.viewclient.OFFSET" class="py-name" href="#" onclick="return doclink('link-30', 'OFFSET', 'link-30');">OFFSET</a></tt> <tt class="py-op">=</tt> <tt class="py-number">25</tt> </tt>
+<a name="L67"></a><tt class="py-lineno"> 67</tt> <tt class="py-line"><tt class="py-string">''' This assumes the smallest touchable view on the screen is approximately 50px x 50px</tt> </tt>
+<a name="L68"></a><tt class="py-lineno"> 68</tt> <tt class="py-line"><tt class="py-string"> and touches it at M{(x+OFFSET, y+OFFSET)} '''</tt> </tt>
+<a name="L69"></a><tt class="py-lineno"> 69</tt> <tt class="py-line"> </tt>
+<a name="L70"></a><tt class="py-lineno"> 70</tt> <tt class="py-line"><tt id="link-31" class="py-name" targets="Variable com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES=com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES"><a title="com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-31', 'USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES', 'link-31');">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a></tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L71"></a><tt class="py-lineno"> 71</tt> <tt class="py-line"><tt class="py-string">''' Use C{AdbClient} to obtain the needed properties. If this is</tt> </tt>
+<a name="L72"></a><tt class="py-lineno"> 72</tt> <tt class="py-line"><tt class="py-string"> C{False} then C{adb shell getprop} is used '''</tt> </tt>
+<a name="L73"></a><tt class="py-lineno"> 73</tt> <tt class="py-line"> </tt>
+<a name="L74"></a><tt class="py-lineno"> 74</tt> <tt class="py-line"><tt id="link-32" class="py-name" targets="Variable com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED=com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"><a title="com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="py-name" href="#" onclick="return doclink('link-32', 'SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED', 'link-32');">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L75"></a><tt class="py-lineno"> 75</tt> <tt class="py-line"><tt class="py-string">''' Skips some classes related with the Action Bar and the PhoneWindow$DecorView in the</tt> </tt>
+<a name="L76"></a><tt class="py-lineno"> 76</tt> <tt class="py-line"><tt class="py-string"> coordinates calculation</tt> </tt>
+<a name="L77"></a><tt class="py-lineno"> 77</tt> <tt class="py-line"><tt class="py-string"> @see: L{View.getXY()} '''</tt> </tt>
+<a name="L78"></a><tt class="py-lineno"> 78</tt> <tt class="py-line"> </tt>
+<a name="L79"></a><tt class="py-lineno"> 79</tt> <tt class="py-line"><tt id="link-33" class="py-name" targets="Variable com.dtmilano.android.viewclient.VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED=com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED"><a title="com.dtmilano.android.viewclient.VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED" class="py-name" href="#" onclick="return doclink('link-33', 'VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED', 'link-33');">VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L80"></a><tt class="py-lineno"> 80</tt> <tt class="py-line"><tt class="py-string">''' Under some conditions the touch event should be longer [t(DOWN) << t(UP)]. C{True} enables a</tt> </tt>
+<a name="L81"></a><tt class="py-lineno"> 81</tt> <tt class="py-line"><tt class="py-string"> workaround to delay the events.'''</tt> </tt>
+<a name="L82"></a><tt class="py-lineno"> 82</tt> <tt class="py-line"> </tt>
+<a name="L83"></a><tt class="py-lineno"> 83</tt> <tt class="py-line"><tt class="py-comment"># some device properties</tt> </tt>
+<a name="L84"></a><tt class="py-lineno"> 84</tt> <tt class="py-line"><tt id="link-34" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY=com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY,Variable com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY=com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-34', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'ro.build.version.sdk'</tt> </tt>
+<a name="L85"></a><tt class="py-lineno"> 85</tt> <tt class="py-line"><tt id="link-35" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY=com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY,Variable com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY=com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY"><a title="com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY
+com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY" class="py-name" href="#" onclick="return doclink('link-35', 'VERSION_RELEASE_PROPERTY', 'link-35');">VERSION_RELEASE_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'ro.build.version.release'</tt> </tt>
+<a name="L86"></a><tt class="py-lineno"> 86</tt> <tt class="py-line"> </tt>
+<a name="L87"></a><tt class="py-lineno"> 87</tt> <tt class="py-line"><tt class="py-comment"># some constants for the attributes</tt> </tt>
+<a name="L88"></a><tt class="py-lineno"> 88</tt> <tt class="py-line"><tt id="link-36" class="py-name" targets="Variable com.dtmilano.android.viewclient.ID_PROPERTY=com.dtmilano.android.viewclient-module.html#ID_PROPERTY"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-36', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mID'</tt> </tt>
+<a name="L89"></a><tt class="py-lineno"> 89</tt> <tt class="py-line"><tt id="link-37" class="py-name" targets="Variable com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR=com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR"><a title="com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-37', 'ID_PROPERTY_UI_AUTOMATOR', 'link-37');">ID_PROPERTY_UI_AUTOMATOR</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'uniqueId'</tt> </tt>
+<a name="L90"></a><tt class="py-lineno"> 90</tt> <tt class="py-line"><tt id="link-38" class="py-name" targets="Variable com.dtmilano.android.viewclient.TEXT_PROPERTY=com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-38', 'TEXT_PROPERTY', 'link-38');">TEXT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'text:mText'</tt> </tt>
+<a name="L91"></a><tt class="py-lineno"> 91</tt> <tt class="py-line"><tt id="link-39" class="py-name" targets="Variable com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10=com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-39', 'TEXT_PROPERTY_API_10', 'link-39');">TEXT_PROPERTY_API_10</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mText'</tt> </tt>
+<a name="L92"></a><tt class="py-lineno"> 92</tt> <tt class="py-line"><tt id="link-40" class="py-name" targets="Variable com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR=com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-40', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-40');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'text'</tt> </tt>
+<a name="L93"></a><tt class="py-lineno"> 93</tt> <tt class="py-line"><tt id="link-41" class="py-name" targets="Variable com.dtmilano.android.viewclient.WS=com.dtmilano.android.viewclient-module.html#WS"><a title="com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-41', 'WS', 'link-41');">WS</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"\xfe"</tt> <tt class="py-comment"># the whitespace replacement char for TEXT_PROPERTY</tt> </tt>
+<a name="L94"></a><tt class="py-lineno"> 94</tt> <tt class="py-line"><tt id="link-42" class="py-name" targets="Variable com.dtmilano.android.viewclient.LEFT_PROPERTY=com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-42', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:mLeft'</tt> </tt>
+<a name="L95"></a><tt class="py-lineno"> 95</tt> <tt class="py-line"><tt id="link-43" class="py-name" targets="Variable com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8=com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-43', 'LEFT_PROPERTY_API_8', 'link-43');">LEFT_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mLeft'</tt> </tt>
+<a name="L96"></a><tt class="py-lineno"> 96</tt> <tt class="py-line"><tt id="link-44" class="py-name" targets="Variable com.dtmilano.android.viewclient.TOP_PROPERTY=com.dtmilano.android.viewclient-module.html#TOP_PROPERTY"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-44', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:mTop'</tt> </tt>
+<a name="L97"></a><tt class="py-lineno"> 97</tt> <tt class="py-line"><tt id="link-45" class="py-name" targets="Variable com.dtmilano.android.viewclient.TOP_PROPERTY_API_8=com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-45', 'TOP_PROPERTY_API_8', 'link-45');">TOP_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mTop'</tt> </tt>
+<a name="L98"></a><tt class="py-lineno"> 98</tt> <tt class="py-line"><tt id="link-46" class="py-name" targets="Variable com.dtmilano.android.viewclient.WIDTH_PROPERTY=com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-46', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:getWidth()'</tt> </tt>
+<a name="L99"></a><tt class="py-lineno"> 99</tt> <tt class="py-line"><tt id="link-47" class="py-name" targets="Variable com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8=com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-47', 'WIDTH_PROPERTY_API_8', 'link-47');">WIDTH_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getWidth()'</tt> </tt>
+<a name="L100"></a><tt class="py-lineno"> 100</tt> <tt class="py-line"><tt id="link-48" class="py-name" targets="Variable com.dtmilano.android.viewclient.HEIGHT_PROPERTY=com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-48', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:getHeight()'</tt> </tt>
+<a name="L101"></a><tt class="py-lineno"> 101</tt> <tt class="py-line"><tt id="link-49" class="py-name" targets="Variable com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8=com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-49', 'HEIGHT_PROPERTY_API_8', 'link-49');">HEIGHT_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getHeight()'</tt> </tt>
+<a name="L102"></a><tt class="py-lineno"> 102</tt> <tt class="py-line"><tt id="link-50" class="py-name" targets="Variable com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY=com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-50', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getVisibility()'</tt> </tt>
+<a name="L103"></a><tt class="py-lineno"> 103</tt> <tt class="py-line"><tt id="link-51" class="py-name" targets="Variable com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY=com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY"><a title="com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY" class="py-name" href="#" onclick="return doclink('link-51', 'LAYOUT_TOP_MARGIN_PROPERTY', 'link-51');">LAYOUT_TOP_MARGIN_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:layout_topMargin'</tt> </tt>
+<a name="L104"></a><tt class="py-lineno"> 104</tt> <tt class="py-line"> </tt>
+<a name="L105"></a><tt class="py-lineno"> 105</tt> <tt class="py-line"><tt class="py-comment"># visibility</tt> </tt>
+<a name="L106"></a><tt class="py-lineno"> 106</tt> <tt class="py-line"><tt id="link-52" class="py-name" targets="Variable com.dtmilano.android.viewclient.VISIBLE=com.dtmilano.android.viewclient-module.html#VISIBLE"><a title="com.dtmilano.android.viewclient.VISIBLE" class="py-name" href="#" onclick="return doclink('link-52', 'VISIBLE', 'link-52');">VISIBLE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> </tt>
+<a name="L107"></a><tt class="py-lineno"> 107</tt> <tt class="py-line"><tt id="link-53" class="py-name" targets="Variable com.dtmilano.android.viewclient.INVISIBLE=com.dtmilano.android.viewclient-module.html#INVISIBLE"><a title="com.dtmilano.android.viewclient.INVISIBLE" class="py-name" href="#" onclick="return doclink('link-53', 'INVISIBLE', 'link-53');">INVISIBLE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x4</tt> </tt>
+<a name="L108"></a><tt class="py-lineno"> 108</tt> <tt class="py-line"><tt id="link-54" class="py-name" targets="Variable com.dtmilano.android.viewclient.GONE=com.dtmilano.android.viewclient-module.html#GONE"><a title="com.dtmilano.android.viewclient.GONE" class="py-name" href="#" onclick="return doclink('link-54', 'GONE', 'link-54');">GONE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x8</tt> </tt>
+<a name="L109"></a><tt class="py-lineno"> 109</tt> <tt class="py-line"> </tt>
+<a name="L110"></a><tt class="py-lineno"> 110</tt> <tt class="py-line"><tt class="py-name">RegexType</tt> <tt class="py-op">=</tt> <tt id="link-55" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.type()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#type,Method com.dtmilano.android.viewclient.EditText.type()=com.dtmilano.android.viewclient.EditText-class.html#type"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-55', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L111"></a><tt class="py-lineno"> 111</tt> <tt class="py-line"><tt id="link-56" class="py-name" targets="Variable com.dtmilano.android.viewclient.IP_RE=com.dtmilano.android.viewclient-module.html#IP_RE"><a title="com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-56', 'IP_RE', 'link-56');">IP_RE</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^(\d{1,3}\.){3}\d{1,3}$'</tt><tt class="py-op">)</tt> </tt>
+<a name="L112"></a><tt class="py-lineno"> 112</tt> <tt class="py-line"><tt id="link-57" class="py-name" targets="Variable com.dtmilano.android.viewclient.ID_RE=com.dtmilano.android.viewclient-module.html#ID_RE"><a title="com.dtmilano.android.viewclient.ID_RE" class="py-name" href="#" onclick="return doclink('link-57', 'ID_RE', 'link-57');">ID_RE</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'id/([^/]*)(/(\d+))?'</tt><tt class="py-op">)</tt> </tt>
+<a name="_nd"></a><div id="_nd-def"><a name="L113"></a><tt class="py-lineno"> 113</tt> <tt class="py-line"> </tt>
+<a name="L114"></a><tt class="py-lineno"> 114</tt> <a class="py-toggle" href="#" id="_nd-toggle" onclick="return toggle('_nd');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient-module.html#_nd">_nd</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="_nd-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="_nd-expanded"><a name="L115"></a><tt class="py-lineno"> 115</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L116"></a><tt class="py-lineno"> 116</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named decimal regex</tt> </tt>
+<a name="L117"></a><tt class="py-lineno"> 117</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L118"></a><tt class="py-lineno"> 118</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>\d+)'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+</div><a name="L119"></a><tt class="py-lineno"> 119</tt> <tt class="py-line"> </tt>
+<a name="_nh"></a><div id="_nh-def"><a name="L120"></a><tt class="py-lineno"> 120</tt> <a class="py-toggle" href="#" id="_nh-toggle" onclick="return toggle('_nh');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient-module.html#_nh">_nh</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="_nh-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="_nh-expanded"><a name="L121"></a><tt class="py-lineno"> 121</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L122"></a><tt class="py-lineno"> 122</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named hex regex</tt> </tt>
+<a name="L123"></a><tt class="py-lineno"> 123</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L124"></a><tt class="py-lineno"> 124</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>[0-9a-f]+)'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+</div><a name="L125"></a><tt class="py-lineno"> 125</tt> <tt class="py-line"> </tt>
+<a name="_ns"></a><div id="_ns-def"><a name="L126"></a><tt class="py-lineno"> 126</tt> <a class="py-toggle" href="#" id="_ns-toggle" onclick="return toggle('_ns');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient-module.html#_ns">_ns</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">greedy</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="_ns-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="_ns-expanded"><a name="L127"></a><tt class="py-lineno"> 127</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L128"></a><tt class="py-lineno"> 128</tt> <tt class="py-line"><tt class="py-docstring"> NOTICE: this is using a non-greedy (or minimal) regex</tt> </tt>
+<a name="L129"></a><tt class="py-lineno"> 129</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L130"></a><tt class="py-lineno"> 130</tt> <tt class="py-line"><tt class="py-docstring"> @type name: str</tt> </tt>
+<a name="L131"></a><tt class="py-lineno"> 131</tt> <tt class="py-line"><tt class="py-docstring"> @param name: the name used to tag the expression</tt> </tt>
+<a name="L132"></a><tt class="py-lineno"> 132</tt> <tt class="py-line"><tt class="py-docstring"> @type greedy: bool</tt> </tt>
+<a name="L133"></a><tt class="py-lineno"> 133</tt> <tt class="py-line"><tt class="py-docstring"> @param greedy: Whether the regex is greedy or not</tt> </tt>
+<a name="L134"></a><tt class="py-lineno"> 134</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L135"></a><tt class="py-lineno"> 135</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named string regex (only non-whitespace characters allowed)</tt> </tt>
+<a name="L136"></a><tt class="py-lineno"> 136</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L137"></a><tt class="py-lineno"> 137</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>\S+%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt> <tt class="py-keyword">if</tt> <tt class="py-name">greedy</tt> <tt class="py-keyword">else</tt> <tt class="py-string">'?'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L138"></a><tt class="py-lineno"> 138</tt> <tt class="py-line"> </tt>
+<a name="Window"></a><div id="Window-def"><a name="L139"></a><tt class="py-lineno"> 139</tt> <tt class="py-line"> </tt>
+<a name="L140"></a><tt class="py-lineno"> 140</tt> <a class="py-toggle" href="#" id="Window-toggle" onclick="return toggle('Window');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Window-class.html">Window</a><tt class="py-op">:</tt> </tt>
+</div><div id="Window-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="Window-expanded"><a name="L141"></a><tt class="py-lineno"> 141</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L142"></a><tt class="py-lineno"> 142</tt> <tt class="py-line"><tt class="py-docstring"> Window class</tt> </tt>
+<a name="L143"></a><tt class="py-lineno"> 143</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L144"></a><tt class="py-lineno"> 144</tt> <tt class="py-line"> </tt>
+<a name="Window.__init__"></a><div id="Window.__init__-def"><a name="L145"></a><tt class="py-lineno"> 145</tt> <a class="py-toggle" href="#" id="Window.__init__-toggle" onclick="return toggle('Window.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Window-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">num</tt><tt class="py-op">,</tt> <tt class="py-param">winId</tt><tt class="py-op">,</tt> <tt class="py-param">activity</tt><tt class="py-op">,</tt> <tt class="py-param">wvx</tt><tt class="py-op">,</tt> <tt class="py-param">wvy</tt><tt class="py-op">,</tt> <tt class="py-param">wvw</tt><tt class="py-op">,</tt> <tt class="py-param">wvh</tt><tt class="py-op">,</tt> <tt class="py-param">px</tt><tt class="py-op">,</tt> <tt class="py-param">py</tt><tt class="py-op">,</tt> <tt class="py-param">visibility</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Window.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Window.__init__-expanded"><a name="L146"></a><tt class="py-lineno"> 146</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L147"></a><tt class="py-lineno"> 147</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L148"></a><tt class="py-lineno"> 148</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L149"></a><tt class="py-lineno"> 149</tt> <tt class="py-line"><tt class="py-docstring"> @type num: int</tt> </tt>
+<a name="L150"></a><tt class="py-lineno"> 150</tt> <tt class="py-line"><tt class="py-docstring"> @param num: Ordering number in Window Manager</tt> </tt>
+<a name="L151"></a><tt class="py-lineno"> 151</tt> <tt class="py-line"><tt class="py-docstring"> @type winId: str</tt> </tt>
+<a name="L152"></a><tt class="py-lineno"> 152</tt> <tt class="py-line"><tt class="py-docstring"> @param winId: the window ID</tt> </tt>
+<a name="L153"></a><tt class="py-lineno"> 153</tt> <tt class="py-line"><tt class="py-docstring"> @type activity: str</tt> </tt>
+<a name="L154"></a><tt class="py-lineno"> 154</tt> <tt class="py-line"><tt class="py-docstring"> @param activity: the activity (or sometimes other component) owning the window</tt> </tt>
+<a name="L155"></a><tt class="py-lineno"> 155</tt> <tt class="py-line"><tt class="py-docstring"> @type wvx: int</tt> </tt>
+<a name="L156"></a><tt class="py-lineno"> 156</tt> <tt class="py-line"><tt class="py-docstring"> @param wvx: window's virtual X</tt> </tt>
+<a name="L157"></a><tt class="py-lineno"> 157</tt> <tt class="py-line"><tt class="py-docstring"> @type wvy: int</tt> </tt>
+<a name="L158"></a><tt class="py-lineno"> 158</tt> <tt class="py-line"><tt class="py-docstring"> @param wvy: window's virtual Y</tt> </tt>
+<a name="L159"></a><tt class="py-lineno"> 159</tt> <tt class="py-line"><tt class="py-docstring"> @type wvw: int</tt> </tt>
+<a name="L160"></a><tt class="py-lineno"> 160</tt> <tt class="py-line"><tt class="py-docstring"> @param wvw: window's virtual width</tt> </tt>
+<a name="L161"></a><tt class="py-lineno"> 161</tt> <tt class="py-line"><tt class="py-docstring"> @type wvh: int</tt> </tt>
+<a name="L162"></a><tt class="py-lineno"> 162</tt> <tt class="py-line"><tt class="py-docstring"> @param wvh: window's virtual height</tt> </tt>
+<a name="L163"></a><tt class="py-lineno"> 163</tt> <tt class="py-line"><tt class="py-docstring"> @type px: int</tt> </tt>
+<a name="L164"></a><tt class="py-lineno"> 164</tt> <tt class="py-line"><tt class="py-docstring"> @param px: parent's X</tt> </tt>
+<a name="L165"></a><tt class="py-lineno"> 165</tt> <tt class="py-line"><tt class="py-docstring"> @type py: int</tt> </tt>
+<a name="L166"></a><tt class="py-lineno"> 166</tt> <tt class="py-line"><tt class="py-docstring"> @param py: parent's Y</tt> </tt>
+<a name="L167"></a><tt class="py-lineno"> 167</tt> <tt class="py-line"><tt class="py-docstring"> @type visibility: int</tt> </tt>
+<a name="L168"></a><tt class="py-lineno"> 168</tt> <tt class="py-line"><tt class="py-docstring"> @param visibility: visibility of the window</tt> </tt>
+<a name="L169"></a><tt class="py-lineno"> 169</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L170"></a><tt class="py-lineno"> 170</tt> <tt class="py-line"> </tt>
+<a name="L171"></a><tt class="py-lineno"> 171</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-58" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-58', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Window(%d, %s, %s, %d, %d, %d, %d, %d, %d, %d)"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L172"></a><tt class="py-lineno"> 172</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt><tt class="py-op">)</tt> </tt>
+<a name="L173"></a><tt class="py-lineno"> 173</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">num</tt> <tt class="py-op">=</tt> <tt class="py-name">num</tt> </tt>
+<a name="L174"></a><tt class="py-lineno"> 174</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">winId</tt> <tt class="py-op">=</tt> <tt class="py-name">winId</tt> </tt>
+<a name="L175"></a><tt class="py-lineno"> 175</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt> <tt class="py-op">=</tt> <tt class="py-name">activity</tt> </tt>
+<a name="L176"></a><tt class="py-lineno"> 176</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-name">wvx</tt> </tt>
+<a name="L177"></a><tt class="py-lineno"> 177</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">wvy</tt> </tt>
+<a name="L178"></a><tt class="py-lineno"> 178</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt> <tt class="py-op">=</tt> <tt class="py-name">wvw</tt> </tt>
+<a name="L179"></a><tt class="py-lineno"> 179</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">wvh</tt> </tt>
+<a name="L180"></a><tt class="py-lineno"> 180</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-name">px</tt> </tt>
+<a name="L181"></a><tt class="py-lineno"> 181</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">py</tt> </tt>
+<a name="L182"></a><tt class="py-lineno"> 182</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-name">visibility</tt> </tt>
+</div><a name="L183"></a><tt class="py-lineno"> 183</tt> <tt class="py-line"> </tt>
+<a name="Window.__str__"></a><div id="Window.__str__-def"><a name="L184"></a><tt class="py-lineno"> 184</tt> <a class="py-toggle" href="#" id="Window.__str__-toggle" onclick="return toggle('Window.__str__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Window-class.html#__str__">__str__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Window.__str__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Window.__str__-expanded"><a name="L185"></a><tt class="py-lineno"> 185</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"Window(%d, wid=%s, a=%s, x=%d, y=%d, w=%d, h=%d, px=%d, py=%d, v=%d)"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L186"></a><tt class="py-lineno"> 186</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L187"></a><tt class="py-lineno"> 187</tt> <tt class="py-line"> </tt>
+<a name="ViewNotFoundException"></a><div id="ViewNotFoundException-def"><a name="L188"></a><tt class="py-lineno"> 188</tt> <tt class="py-line"> </tt>
+<a name="L189"></a><tt class="py-lineno"> 189</tt> <a class="py-toggle" href="#" id="ViewNotFoundException-toggle" onclick="return toggle('ViewNotFoundException');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a><tt class="py-op">(</tt><tt class="py-base-class">Exception</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewNotFoundException-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="ViewNotFoundException-expanded"><a name="L190"></a><tt class="py-lineno"> 190</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L191"></a><tt class="py-lineno"> 191</tt> <tt class="py-line"><tt class="py-docstring"> ViewNotFoundException is raised when a View is not found.</tt> </tt>
+<a name="L192"></a><tt class="py-lineno"> 192</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L193"></a><tt class="py-lineno"> 193</tt> <tt class="py-line"> </tt>
+<a name="ViewNotFoundException.__init__"></a><div id="ViewNotFoundException.__init__-def"><a name="L194"></a><tt class="py-lineno"> 194</tt> <a class="py-toggle" href="#" id="ViewNotFoundException.__init__-toggle" onclick="return toggle('ViewNotFoundException.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewNotFoundException.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewNotFoundException.__init__-expanded"><a name="L195"></a><tt class="py-lineno"> 195</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">value</tt><tt class="py-op">,</tt> <tt class="py-name">RegexType</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L196"></a><tt class="py-lineno"> 196</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">"Couldn't find View with %s that matches '%s' in tree with root=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">value</tt><tt class="py-op">.</tt><tt class="py-name">pattern</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L197"></a><tt class="py-lineno"> 197</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L198"></a><tt class="py-lineno"> 198</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">"Couldn't find View with %s='%s' in tree with root=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">value</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L199"></a><tt class="py-lineno"> 199</tt> <tt class="py-line"> <tt class="py-name">super</tt><tt class="py-op">(</tt><tt class="py-name">Exception</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-59" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.__init__()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#__init__,Method com.dtmilano.android.adb.adbclient.Device.__init__()=com.dtmilano.android.adb.adbclient.Device-class.html#__init__,Method com.dtmilano.android.viewclient.Excerpt2Code.__init__()=com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__,Method com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.__init__()=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__,Method com.dtmilano.android.viewclient.View.__init__()=com.dtmilano.android.viewclient.View-class.html#__init__,Method com.dtmilano.android.viewclient.ViewClient.__init__()=com.dtmilano.android.viewclient.ViewClient-class.html#__init__,Method com.dtmilano.android.viewclient.ViewNotFoundException.__init__()=com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__,Method com.dtmilano.android.viewclient.Window.__init__()=com.dtmilano.android.viewclient.Window-class.html#__init__"><a title="com.dtmilano.android.adb.adbclient.AdbClient.__init__
+com.dtmilano.android.adb.adbclient.Device.__init__
+com.dtmilano.android.viewclient.Excerpt2Code.__init__
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.__init__
+com.dtmilano.android.viewclient.View.__init__
+com.dtmilano.android.viewclient.ViewClient.__init__
+com.dtmilano.android.viewclient.ViewNotFoundException.__init__
+com.dtmilano.android.viewclient.Window.__init__" class="py-name" href="#" onclick="return doclink('link-59', '__init__', 'link-59');">__init__</a></tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L200"></a><tt class="py-lineno"> 200</tt> <tt class="py-line"> </tt>
+<a name="View"></a><div id="View-def"><a name="L201"></a><tt class="py-lineno"> 201</tt> <a class="py-toggle" href="#" id="View-toggle" onclick="return toggle('View');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html">View</a><tt class="py-op">:</tt> </tt>
+</div><div id="View-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="View-expanded"><a name="L202"></a><tt class="py-lineno"> 202</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L203"></a><tt class="py-lineno"> 203</tt> <tt class="py-line"><tt class="py-docstring"> View class</tt> </tt>
+<a name="L204"></a><tt class="py-lineno"> 204</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L205"></a><tt class="py-lineno"> 205</tt> <tt class="py-line"> </tt>
+<a name="L206"></a><tt class="py-lineno"> 206</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="View.factory"></a><div id="View.factory-def"><a name="L207"></a><tt class="py-lineno"> 207</tt> <a class="py-toggle" href="#" id="View.factory-toggle" onclick="return toggle('View.factory');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#factory">factory</a><tt class="py-op">(</tt><tt class="py-param">arg1</tt><tt class="py-op">,</tt> <tt class="py-param">arg2</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.factory-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.factory-expanded"><a name="L208"></a><tt class="py-lineno"> 208</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L209"></a><tt class="py-lineno"> 209</tt> <tt class="py-line"><tt class="py-docstring"> View factory</tt> </tt>
+<a name="L210"></a><tt class="py-lineno"> 210</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L211"></a><tt class="py-lineno"> 211</tt> <tt class="py-line"><tt class="py-docstring"> @type arg1: ClassType or dict</tt> </tt>
+<a name="L212"></a><tt class="py-lineno"> 212</tt> <tt class="py-line"><tt class="py-docstring"> @type arg2: View instance or AdbClient</tt> </tt>
+<a name="L213"></a><tt class="py-lineno"> 213</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L214"></a><tt class="py-lineno"> 214</tt> <tt class="py-line"> </tt>
+<a name="L215"></a><tt class="py-lineno"> 215</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-60" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-60', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">arg1</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">ClassType</tt><tt class="py-op">:</tt> </tt>
+<a name="L216"></a><tt class="py-lineno"> 216</tt> <tt class="py-line"> <tt class="py-name">cls</tt> <tt class="py-op">=</tt> <tt class="py-name">arg1</tt> </tt>
+<a name="L217"></a><tt class="py-lineno"> 217</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L218"></a><tt class="py-lineno"> 218</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L219"></a><tt class="py-lineno"> 219</tt> <tt class="py-line"> <tt class="py-name">cls</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L220"></a><tt class="py-lineno"> 220</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-name">arg1</tt> </tt>
+<a name="L221"></a><tt class="py-lineno"> 221</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">arg2</tt><tt class="py-op">,</tt> <tt id="link-61" class="py-name" targets="Class com.dtmilano.android.viewclient.View=com.dtmilano.android.viewclient.View-class.html"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-61', 'View', 'link-61');">View</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L222"></a><tt class="py-lineno"> 222</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">arg2</tt> </tt>
+<a name="L223"></a><tt class="py-lineno"> 223</tt> <tt class="py-line"> <tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L224"></a><tt class="py-lineno"> 224</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L225"></a><tt class="py-lineno"> 225</tt> <tt class="py-line"> <tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">arg2</tt> </tt>
+<a name="L226"></a><tt class="py-lineno"> 226</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L227"></a><tt class="py-lineno"> 227</tt> <tt class="py-line"> </tt>
+<a name="L228"></a><tt class="py-lineno"> 228</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">attrs</tt> <tt class="py-keyword">and</tt> <tt class="py-name">attrs</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L229"></a><tt class="py-lineno"> 229</tt> <tt class="py-line"> <tt class="py-name">clazz</tt> <tt class="py-op">=</tt> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L230"></a><tt class="py-lineno"> 230</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">clazz</tt> <tt class="py-op">==</tt> <tt class="py-string">'android.widget.TextView'</tt><tt class="py-op">:</tt> </tt>
+<a name="L231"></a><tt class="py-lineno"> 231</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-62" class="py-name" targets="Class com.dtmilano.android.viewclient.TextView=com.dtmilano.android.viewclient.TextView-class.html"><a title="com.dtmilano.android.viewclient.TextView" class="py-name" href="#" onclick="return doclink('link-62', 'TextView', 'link-62');">TextView</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L232"></a><tt class="py-lineno"> 232</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">clazz</tt> <tt class="py-op">==</tt> <tt class="py-string">'android.widget.EditText'</tt><tt class="py-op">:</tt> </tt>
+<a name="L233"></a><tt class="py-lineno"> 233</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-63" class="py-name" targets="Class com.dtmilano.android.viewclient.EditText=com.dtmilano.android.viewclient.EditText-class.html"><a title="com.dtmilano.android.viewclient.EditText" class="py-name" href="#" onclick="return doclink('link-63', 'EditText', 'link-63');">EditText</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L234"></a><tt class="py-lineno"> 234</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L235"></a><tt class="py-lineno"> 235</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-64" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-64', 'View', 'link-61');">View</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L236"></a><tt class="py-lineno"> 236</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">cls</tt><tt class="py-op">:</tt> </tt>
+<a name="L237"></a><tt class="py-lineno"> 237</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L238"></a><tt class="py-lineno"> 238</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">cls</tt><tt class="py-op">.</tt><tt id="link-65" class="py-name" targets="Class Method com.dtmilano.android.viewclient.View.__copy()=com.dtmilano.android.viewclient.View-class.html#__copy"><a title="com.dtmilano.android.viewclient.View.__copy" class="py-name" href="#" onclick="return doclink('link-65', '__copy', 'link-65');">__copy</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">)</tt> </tt>
+<a name="L239"></a><tt class="py-lineno"> 239</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L240"></a><tt class="py-lineno"> 240</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">cls</tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L241"></a><tt class="py-lineno"> 241</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L242"></a><tt class="py-lineno"> 242</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">copy</tt><tt class="py-op">.</tt><tt class="py-name">copy</tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">)</tt> </tt>
+<a name="L243"></a><tt class="py-lineno"> 243</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L244"></a><tt class="py-lineno"> 244</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-66" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-66', 'View', 'link-61');">View</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L245"></a><tt class="py-lineno"> 245</tt> <tt class="py-line"> </tt>
+<a name="L246"></a><tt class="py-lineno"> 246</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">classmethod</tt> </tt>
+<a name="View.__copy"></a><div id="View.__copy-def"><a name="L247"></a><tt class="py-lineno"> 247</tt> <a class="py-toggle" href="#" id="View.__copy-toggle" onclick="return toggle('View.__copy');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__copy">__copy</a><tt class="py-op">(</tt><tt class="py-param">cls</tt><tt class="py-op">,</tt> <tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__copy-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__copy-expanded"><a name="L248"></a><tt class="py-lineno"> 248</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L249"></a><tt class="py-lineno"> 249</tt> <tt class="py-line"><tt class="py-docstring"> Copy constructor</tt> </tt>
+<a name="L250"></a><tt class="py-lineno"> 250</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L251"></a><tt class="py-lineno"> 251</tt> <tt class="py-line"> </tt>
+<a name="L252"></a><tt class="py-lineno"> 252</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">cls</tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L253"></a><tt class="py-lineno"> 253</tt> <tt class="py-line"> </tt>
+<a name="View.__init__"></a><div id="View.__init__-def"><a name="L254"></a><tt class="py-lineno"> 254</tt> <a class="py-toggle" href="#" id="View.__init__-toggle" onclick="return toggle('View.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">map</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__init__-expanded"><a name="L255"></a><tt class="py-lineno"> 255</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L256"></a><tt class="py-lineno"> 256</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L257"></a><tt class="py-lineno"> 257</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L258"></a><tt class="py-lineno"> 258</tt> <tt class="py-line"><tt class="py-docstring"> @type map: map</tt> </tt>
+<a name="L259"></a><tt class="py-lineno"> 259</tt> <tt class="py-line"><tt class="py-docstring"> @param map: the map containing the (attribute, value) pairs</tt> </tt>
+<a name="L260"></a><tt class="py-lineno"> 260</tt> <tt class="py-line"><tt class="py-docstring"> @type device: MonkeyDevice</tt> </tt>
+<a name="L261"></a><tt class="py-lineno"> 261</tt> <tt class="py-line"><tt class="py-docstring"> @param device: the device containing this View</tt> </tt>
+<a name="L262"></a><tt class="py-lineno"> 262</tt> <tt class="py-line"><tt class="py-docstring"> @type version: int</tt> </tt>
+<a name="L263"></a><tt class="py-lineno"> 263</tt> <tt class="py-line"><tt class="py-docstring"> @param version: the Android SDK version number of the platform where this View belongs. If</tt> </tt>
+<a name="L264"></a><tt class="py-lineno"> 264</tt> <tt class="py-line"><tt class="py-docstring"> this is C{-1} then the Android SDK version will be obtained in this</tt> </tt>
+<a name="L265"></a><tt class="py-lineno"> 265</tt> <tt class="py-line"><tt class="py-docstring"> constructor.</tt> </tt>
+<a name="L266"></a><tt class="py-lineno"> 266</tt> <tt class="py-line"><tt class="py-docstring"> @type forceviewserveruse: boolean</tt> </tt>
+<a name="L267"></a><tt class="py-lineno"> 267</tt> <tt class="py-line"><tt class="py-docstring"> @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions were given</tt> </tt>
+<a name="L268"></a><tt class="py-lineno"> 268</tt> <tt class="py-line"><tt class="py-docstring"> to use C{UiAutomator}.</tt> </tt>
+<a name="L269"></a><tt class="py-lineno"> 269</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L270"></a><tt class="py-lineno"> 270</tt> <tt class="py-line"> </tt>
+<a name="L271"></a><tt class="py-lineno"> 271</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-op">=</tt> <tt class="py-name">map</tt> </tt>
+<a name="L272"></a><tt class="py-lineno"> 272</tt> <tt class="py-line"> <tt class="py-string">''' The map that contains the C{attr},C{value} pairs '''</tt> </tt>
+<a name="L273"></a><tt class="py-lineno"> 273</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L274"></a><tt class="py-lineno"> 274</tt> <tt class="py-line"> <tt class="py-string">''' The MonkeyDevice '''</tt> </tt>
+<a name="L275"></a><tt class="py-lineno"> 275</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">children</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L276"></a><tt class="py-lineno"> 276</tt> <tt class="py-line"> <tt class="py-string">''' The children of this View '''</tt> </tt>
+<a name="L277"></a><tt class="py-lineno"> 277</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L278"></a><tt class="py-lineno"> 278</tt> <tt class="py-line"> <tt class="py-string">''' The parent of this View '''</tt> </tt>
+<a name="L279"></a><tt class="py-lineno"> 279</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L280"></a><tt class="py-lineno"> 280</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L281"></a><tt class="py-lineno"> 281</tt> <tt class="py-line"> <tt class="py-string">''' The current focus '''</tt> </tt>
+<a name="L282"></a><tt class="py-lineno"> 282</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L283"></a><tt class="py-lineno"> 283</tt> <tt class="py-line"> <tt class="py-string">''' Build properties '''</tt> </tt>
+<a name="L284"></a><tt class="py-lineno"> 284</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">version</tt> </tt>
+<a name="L285"></a><tt class="py-lineno"> 285</tt> <tt class="py-line"> <tt class="py-string">''' API version number '''</tt> </tt>
+<a name="L286"></a><tt class="py-lineno"> 286</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceviewserveruse</tt> <tt class="py-op">=</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L287"></a><tt class="py-lineno"> 287</tt> <tt class="py-line"> <tt class="py-string">''' Force ViewServer use '''</tt> </tt>
+<a name="L288"></a><tt class="py-lineno"> 288</tt> <tt class="py-line"> </tt>
+<a name="L289"></a><tt class="py-lineno"> 289</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">!=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L290"></a><tt class="py-lineno"> 290</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-67" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-67', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">version</tt> </tt>
+<a name="L291"></a><tt class="py-lineno"> 291</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L292"></a><tt class="py-lineno"> 292</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L293"></a><tt class="py-lineno"> 293</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-68" class="py-name"><a title="com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-68', 'USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES', 'link-31');">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L294"></a><tt class="py-lineno"> 294</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-69" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-69', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-70" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getProperty()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getProperty"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-70', 'getProperty', 'link-70');">getProperty</a></tt><tt class="py-op">(</tt><tt id="link-71" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-71', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L295"></a><tt class="py-lineno"> 295</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L296"></a><tt class="py-lineno"> 296</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-72" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-72', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-73" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.shell()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#shell"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-73', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop '</tt> <tt class="py-op">+</tt> <tt id="link-74" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-74', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L297"></a><tt class="py-lineno"> 297</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L298"></a><tt class="py-lineno"> 298</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-75" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-75', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L299"></a><tt class="py-lineno"> 299</tt> <tt class="py-line"> </tt>
+<a name="L300"></a><tt class="py-lineno"> 300</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-76" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-76', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> </tt>
+<a name="L301"></a><tt class="py-lineno"> 301</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L302"></a><tt class="py-lineno"> 302</tt> <tt class="py-line"> <tt class="py-string">''' Whether to use UIAutomator or ViewServer '''</tt> </tt>
+<a name="L303"></a><tt class="py-lineno"> 303</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L304"></a><tt class="py-lineno"> 304</tt> <tt class="py-line"> <tt class="py-string">''' The id property depending on the View attribute format '''</tt> </tt>
+<a name="L305"></a><tt class="py-lineno"> 305</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L306"></a><tt class="py-lineno"> 306</tt> <tt class="py-line"> <tt class="py-string">''' The text property depending on the View attribute format '''</tt> </tt>
+<a name="L307"></a><tt class="py-lineno"> 307</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L308"></a><tt class="py-lineno"> 308</tt> <tt class="py-line"> <tt class="py-string">''' The left property depending on the View attribute format '''</tt> </tt>
+<a name="L309"></a><tt class="py-lineno"> 309</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L310"></a><tt class="py-lineno"> 310</tt> <tt class="py-line"> <tt class="py-string">''' The top property depending on the View attribute format '''</tt> </tt>
+<a name="L311"></a><tt class="py-lineno"> 311</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L312"></a><tt class="py-lineno"> 312</tt> <tt class="py-line"> <tt class="py-string">''' The width property depending on the View attribute format '''</tt> </tt>
+<a name="L313"></a><tt class="py-lineno"> 313</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L314"></a><tt class="py-lineno"> 314</tt> <tt class="py-line"> <tt class="py-string">''' The height property depending on the View attribute format '''</tt> </tt>
+<a name="L315"></a><tt class="py-lineno"> 315</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L316"></a><tt class="py-lineno"> 316</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-77" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-77', 'ID_PROPERTY_UI_AUTOMATOR', 'link-37');">ID_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L317"></a><tt class="py-lineno"> 317</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-78" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-78', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-40');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L318"></a><tt class="py-lineno"> 318</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-79" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-79', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L319"></a><tt class="py-lineno"> 319</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-80" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-80', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L320"></a><tt class="py-lineno"> 320</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-81" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-81', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L321"></a><tt class="py-lineno"> 321</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-82" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-82', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L322"></a><tt class="py-lineno"> 322</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">></tt> <tt class="py-number">10</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">16</tt> <tt class="py-keyword">or</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L323"></a><tt class="py-lineno"> 323</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-83" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-83', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L324"></a><tt class="py-lineno"> 324</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-84" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-84', 'TEXT_PROPERTY', 'link-38');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L325"></a><tt class="py-lineno"> 325</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-85" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-85', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L326"></a><tt class="py-lineno"> 326</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-86" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-86', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L327"></a><tt class="py-lineno"> 327</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-87" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-87', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L328"></a><tt class="py-lineno"> 328</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-88" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-88', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L329"></a><tt class="py-lineno"> 329</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">==</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L330"></a><tt class="py-lineno"> 330</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-89" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-89', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L331"></a><tt class="py-lineno"> 331</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-90" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-90', 'TEXT_PROPERTY_API_10', 'link-39');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L332"></a><tt class="py-lineno"> 332</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-91" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-91', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L333"></a><tt class="py-lineno"> 333</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-92" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-92', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L334"></a><tt class="py-lineno"> 334</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-93" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-93', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L335"></a><tt class="py-lineno"> 335</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-94" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-94', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L336"></a><tt class="py-lineno"> 336</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">7</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L337"></a><tt class="py-lineno"> 337</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-95" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-95', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L338"></a><tt class="py-lineno"> 338</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-96" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-96', 'TEXT_PROPERTY_API_10', 'link-39');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L339"></a><tt class="py-lineno"> 339</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-97" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-97', 'LEFT_PROPERTY_API_8', 'link-43');">LEFT_PROPERTY_API_8</a></tt> </tt>
+<a name="L340"></a><tt class="py-lineno"> 340</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-98" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-98', 'TOP_PROPERTY_API_8', 'link-45');">TOP_PROPERTY_API_8</a></tt> </tt>
+<a name="L341"></a><tt class="py-lineno"> 341</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-99" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-99', 'WIDTH_PROPERTY_API_8', 'link-47');">WIDTH_PROPERTY_API_8</a></tt> </tt>
+<a name="L342"></a><tt class="py-lineno"> 342</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-100" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-100', 'HEIGHT_PROPERTY_API_8', 'link-49');">HEIGHT_PROPERTY_API_8</a></tt> </tt>
+<a name="L343"></a><tt class="py-lineno"> 343</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">7</tt><tt class="py-op">:</tt> </tt>
+<a name="L344"></a><tt class="py-lineno"> 344</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-101" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-101', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L345"></a><tt class="py-lineno"> 345</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-102" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-102', 'TEXT_PROPERTY_API_10', 'link-39');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L346"></a><tt class="py-lineno"> 346</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-103" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-103', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L347"></a><tt class="py-lineno"> 347</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-104" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-104', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L348"></a><tt class="py-lineno"> 348</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-105" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-105', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L349"></a><tt class="py-lineno"> 349</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-106" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-106', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L350"></a><tt class="py-lineno"> 350</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">==</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L351"></a><tt class="py-lineno"> 351</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-107" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-107', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L352"></a><tt class="py-lineno"> 352</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-108" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-108', 'TEXT_PROPERTY', 'link-38');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L353"></a><tt class="py-lineno"> 353</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-109" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-109', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L354"></a><tt class="py-lineno"> 354</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-110" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-110', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L355"></a><tt class="py-lineno"> 355</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-111" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-111', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L356"></a><tt class="py-lineno"> 356</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-112" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-112', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L357"></a><tt class="py-lineno"> 357</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L358"></a><tt class="py-lineno"> 358</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-113" class="py-name"><a title="com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-113', 'ID_PROPERTY', 'link-36');">ID_PROPERTY</a></tt> </tt>
+<a name="L359"></a><tt class="py-lineno"> 359</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-114" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-114', 'TEXT_PROPERTY', 'link-38');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L360"></a><tt class="py-lineno"> 360</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-115" class="py-name"><a title="com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-115', 'LEFT_PROPERTY', 'link-42');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L361"></a><tt class="py-lineno"> 361</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-116" class="py-name"><a title="com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-116', 'TOP_PROPERTY', 'link-44');">TOP_PROPERTY</a></tt> </tt>
+<a name="L362"></a><tt class="py-lineno"> 362</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-117" class="py-name"><a title="com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-117', 'WIDTH_PROPERTY', 'link-46');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L363"></a><tt class="py-lineno"> 363</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-118" class="py-name"><a title="com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-118', 'HEIGHT_PROPERTY', 'link-48');">HEIGHT_PROPERTY</a></tt> </tt>
+</div><a name="L364"></a><tt class="py-lineno"> 364</tt> <tt class="py-line"> </tt>
+<a name="View.__getitem__"></a><div id="View.__getitem__-def"><a name="L365"></a><tt class="py-lineno"> 365</tt> <a class="py-toggle" href="#" id="View.__getitem__-toggle" onclick="return toggle('View.__getitem__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__getitem__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__getitem__-expanded"><a name="L366"></a><tt class="py-lineno"> 366</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">key</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L367"></a><tt class="py-lineno"> 367</tt> <tt class="py-line"> </tt>
+<a name="View.__getattr__"></a><div id="View.__getattr__-def"><a name="L368"></a><tt class="py-lineno"> 368</tt> <a class="py-toggle" href="#" id="View.__getattr__-toggle" onclick="return toggle('View.__getattr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__getattr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__getattr__-expanded"><a name="L369"></a><tt class="py-lineno"> 369</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-119" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-119', 'DEBUG_GETATTR', 'link-10');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L370"></a><tt class="py-lineno"> 370</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__getattr__(%s) version: %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-120" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-120', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L371"></a><tt class="py-lineno"> 371</tt> <tt class="py-line"> </tt>
+<a name="L372"></a><tt class="py-lineno"> 372</tt> <tt class="py-line"> <tt class="py-comment"># NOTE:</tt> </tt>
+<a name="L373"></a><tt class="py-lineno"> 373</tt> <tt class="py-line"> <tt class="py-comment"># I should try to see if 'name' is a defined method</tt> </tt>
+<a name="L374"></a><tt class="py-lineno"> 374</tt> <tt class="py-line"> <tt class="py-comment"># but it seems that if I call locals() here an infinite loop is entered</tt> </tt>
+<a name="L375"></a><tt class="py-lineno"> 375</tt> <tt class="py-line"> </tt>
+<a name="L376"></a><tt class="py-lineno"> 376</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L377"></a><tt class="py-lineno"> 377</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">name</tt><tt class="py-op">]</tt> </tt>
+<a name="L378"></a><tt class="py-lineno"> 378</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">name</tt> <tt class="py-op">+</tt> <tt class="py-string">'()'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L379"></a><tt class="py-lineno"> 379</tt> <tt class="py-line"> <tt class="py-comment"># the method names are stored in the map with their trailing '()'</tt> </tt>
+<a name="L380"></a><tt class="py-lineno"> 380</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">name</tt> <tt class="py-op">+</tt> <tt class="py-string">'()'</tt><tt class="py-op">]</tt> </tt>
+<a name="L381"></a><tt class="py-lineno"> 381</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">count</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L382"></a><tt class="py-lineno"> 382</tt> <tt class="py-line"> <tt class="py-name">mangledList</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-121" class="py-name" targets="Method com.dtmilano.android.viewclient.View.allPossibleNamesWithColon()=com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon"><a title="com.dtmilano.android.viewclient.View.allPossibleNamesWithColon" class="py-name" href="#" onclick="return doclink('link-121', 'allPossibleNamesWithColon', 'link-121');">allPossibleNamesWithColon</a></tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+<a name="L383"></a><tt class="py-lineno"> 383</tt> <tt class="py-line"> <tt class="py-name">mangledName</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-122" class="py-name" targets="Method com.dtmilano.android.viewclient.View.intersection()=com.dtmilano.android.viewclient.View-class.html#intersection"><a title="com.dtmilano.android.viewclient.View.intersection" class="py-name" href="#" onclick="return doclink('link-122', 'intersection', 'link-122');">intersection</a></tt><tt class="py-op">(</tt><tt class="py-name">mangledList</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">keys</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L384"></a><tt class="py-lineno"> 384</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">mangledName</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">mangledName</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L385"></a><tt class="py-lineno"> 385</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">mangledName</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">]</tt> </tt>
+<a name="L386"></a><tt class="py-lineno"> 386</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L387"></a><tt class="py-lineno"> 387</tt> <tt class="py-line"> <tt class="py-comment"># Default behavior</tt> </tt>
+<a name="L388"></a><tt class="py-lineno"> 388</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">AttributeError</tt><tt class="py-op">,</tt> <tt class="py-name">name</tt> </tt>
+<a name="L389"></a><tt class="py-lineno"> 389</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L390"></a><tt class="py-lineno"> 390</tt> <tt class="py-line"> <tt class="py-comment"># try removing 'is' prefix</tt> </tt>
+<a name="L391"></a><tt class="py-lineno"> 391</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-123" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-123', 'DEBUG_GETATTR', 'link-10');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L392"></a><tt class="py-lineno"> 392</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __getattr__: trying without 'is' prefix"</tt> </tt>
+<a name="L393"></a><tt class="py-lineno"> 393</tt> <tt class="py-line"> <tt class="py-name">suffix</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L394"></a><tt class="py-lineno"> 394</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">suffix</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L395"></a><tt class="py-lineno"> 395</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">suffix</tt><tt class="py-op">]</tt> </tt>
+<a name="L396"></a><tt class="py-lineno"> 396</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L397"></a><tt class="py-lineno"> 397</tt> <tt class="py-line"> <tt class="py-comment"># Default behavior</tt> </tt>
+<a name="L398"></a><tt class="py-lineno"> 398</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">AttributeError</tt><tt class="py-op">,</tt> <tt class="py-name">name</tt> </tt>
+<a name="L399"></a><tt class="py-lineno"> 399</tt> <tt class="py-line"> </tt>
+<a name="L400"></a><tt class="py-lineno"> 400</tt> <tt class="py-line"> <tt class="py-comment"># if the method name starts with 'is' let's assume its return value is boolean</tt> </tt>
+<a name="L401"></a><tt class="py-lineno"> 401</tt> <tt class="py-line"><tt class="py-comment"># if name[:2] == 'is':</tt> </tt>
+<a name="L402"></a><tt class="py-lineno"> 402</tt> <tt class="py-line"><tt class="py-comment"># r = True if r == 'true' else False</tt> </tt>
+<a name="L403"></a><tt class="py-lineno"> 403</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">r</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt><tt class="py-op">:</tt> </tt>
+<a name="L404"></a><tt class="py-lineno"> 404</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L405"></a><tt class="py-lineno"> 405</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">r</tt> <tt class="py-op">==</tt> <tt class="py-string">'false'</tt><tt class="py-op">:</tt> </tt>
+<a name="L406"></a><tt class="py-lineno"> 406</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L407"></a><tt class="py-lineno"> 407</tt> <tt class="py-line"> </tt>
+<a name="L408"></a><tt class="py-lineno"> 408</tt> <tt class="py-line"> <tt class="py-comment"># this should not cached in some way</tt> </tt>
+<a name="L409"></a><tt class="py-lineno"> 409</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">innerMethod</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L410"></a><tt class="py-lineno"> 410</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-124" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-124', 'DEBUG_GETATTR', 'link-10');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L411"></a><tt class="py-lineno"> 411</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"innerMethod: %s returning %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">innerMethod</tt><tt class="py-op">.</tt><tt class="py-name">__name__</tt><tt class="py-op">,</tt> <tt class="py-name">r</tt><tt class="py-op">)</tt> </tt>
+<a name="L412"></a><tt class="py-lineno"> 412</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">r</tt> </tt>
+</div><a name="L413"></a><tt class="py-lineno"> 413</tt> <tt class="py-line"> </tt>
+<a name="L414"></a><tt class="py-lineno"> 414</tt> <tt class="py-line"> <tt class="py-name">innerMethod</tt><tt class="py-op">.</tt><tt class="py-name">__name__</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt> </tt>
+<a name="L415"></a><tt class="py-lineno"> 415</tt> <tt class="py-line"> </tt>
+<a name="L416"></a><tt class="py-lineno"> 416</tt> <tt class="py-line"> <tt class="py-comment"># this should work, but then there's problems with the arguments of innerMethod</tt> </tt>
+<a name="L417"></a><tt class="py-lineno"> 417</tt> <tt class="py-line"> <tt class="py-comment"># even if innerMethod(self) is added</tt> </tt>
+<a name="L418"></a><tt class="py-lineno"> 418</tt> <tt class="py-line"> <tt class="py-comment">#setattr(View, innerMethod.__name__, innerMethod)</tt> </tt>
+<a name="L419"></a><tt class="py-lineno"> 419</tt> <tt class="py-line"> <tt class="py-comment">#setattr(self, innerMethod.__name__, innerMethod)</tt> </tt>
+<a name="L420"></a><tt class="py-lineno"> 420</tt> <tt class="py-line"> </tt>
+<a name="L421"></a><tt class="py-lineno"> 421</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">innerMethod</tt> </tt>
+</div><a name="L422"></a><tt class="py-lineno"> 422</tt> <tt class="py-line"> </tt>
+<a name="View.__call__"></a><div id="View.__call__-def"><a name="L423"></a><tt class="py-lineno"> 423</tt> <a class="py-toggle" href="#" id="View.__call__-toggle" onclick="return toggle('View.__call__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">*</tt><tt class="py-param">args</tt><tt class="py-op">,</tt> <tt class="py-op">**</tt><tt class="py-param">kwargs</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__call__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__call__-expanded"><a name="L424"></a><tt class="py-lineno"> 424</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-125" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_CALL" class="py-name" href="#" onclick="return doclink('link-125', 'DEBUG_CALL', 'link-12');">DEBUG_CALL</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L425"></a><tt class="py-lineno"> 425</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__call__(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">args</tt> <tt class="py-keyword">if</tt> <tt class="py-name">args</tt> <tt class="py-keyword">else</tt> <tt class="py-name">None</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L426"></a><tt class="py-lineno"> 426</tt> <tt class="py-line"> </tt>
+<a name="View.getClass"></a><div id="View.getClass-def"><a name="L427"></a><tt class="py-lineno"> 427</tt> <a class="py-toggle" href="#" id="View.getClass-toggle" onclick="return toggle('View.getClass');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getClass-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getClass-expanded"><a name="L428"></a><tt class="py-lineno"> 428</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L429"></a><tt class="py-lineno"> 429</tt> <tt class="py-line"><tt class="py-docstring"> Gets the L{View} class</tt> </tt>
+<a name="L430"></a><tt class="py-lineno"> 430</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L431"></a><tt class="py-lineno"> 431</tt> <tt class="py-line"><tt class="py-docstring"> @return: the L{View} class or C{None} if not defined</tt> </tt>
+<a name="L432"></a><tt class="py-lineno"> 432</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L433"></a><tt class="py-lineno"> 433</tt> <tt class="py-line"> </tt>
+<a name="L434"></a><tt class="py-lineno"> 434</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L435"></a><tt class="py-lineno"> 435</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L436"></a><tt class="py-lineno"> 436</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L437"></a><tt class="py-lineno"> 437</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L438"></a><tt class="py-lineno"> 438</tt> <tt class="py-line"> </tt>
+<a name="View.getId"></a><div id="View.getId-def"><a name="L439"></a><tt class="py-lineno"> 439</tt> <a class="py-toggle" href="#" id="View.getId-toggle" onclick="return toggle('View.getId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getId">getId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getId-expanded"><a name="L440"></a><tt class="py-lineno"> 440</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L441"></a><tt class="py-lineno"> 441</tt> <tt class="py-line"><tt class="py-docstring"> Gets the L{View} Id</tt> </tt>
+<a name="L442"></a><tt class="py-lineno"> 442</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L443"></a><tt class="py-lineno"> 443</tt> <tt class="py-line"><tt class="py-docstring"> @return: the L{View} C{Id} or C{None} if not defined</tt> </tt>
+<a name="L444"></a><tt class="py-lineno"> 444</tt> <tt class="py-line"><tt class="py-docstring"> @see: L{getUniqueId()}</tt> </tt>
+<a name="L445"></a><tt class="py-lineno"> 445</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L446"></a><tt class="py-lineno"> 446</tt> <tt class="py-line"> </tt>
+<a name="L447"></a><tt class="py-lineno"> 447</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L448"></a><tt class="py-lineno"> 448</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'resource-id'</tt><tt class="py-op">]</tt> </tt>
+<a name="L449"></a><tt class="py-lineno"> 449</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L450"></a><tt class="py-lineno"> 450</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L451"></a><tt class="py-lineno"> 451</tt> <tt class="py-line"> </tt>
+<a name="L452"></a><tt class="py-lineno"> 452</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L453"></a><tt class="py-lineno"> 453</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt><tt class="py-op">]</tt> </tt>
+<a name="L454"></a><tt class="py-lineno"> 454</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L455"></a><tt class="py-lineno"> 455</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L456"></a><tt class="py-lineno"> 456</tt> <tt class="py-line"> </tt>
+<a name="View.getContentDescription"></a><div id="View.getContentDescription-def"><a name="L457"></a><tt class="py-lineno"> 457</tt> <a class="py-toggle" href="#" id="View.getContentDescription-toggle" onclick="return toggle('View.getContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getContentDescription-expanded"><a name="L458"></a><tt class="py-lineno"> 458</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L459"></a><tt class="py-lineno"> 459</tt> <tt class="py-line"><tt class="py-docstring"> Gets the content description.</tt> </tt>
+<a name="L460"></a><tt class="py-lineno"> 460</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L461"></a><tt class="py-lineno"> 461</tt> <tt class="py-line"> </tt>
+<a name="L462"></a><tt class="py-lineno"> 462</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L463"></a><tt class="py-lineno"> 463</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">]</tt> </tt>
+<a name="L464"></a><tt class="py-lineno"> 464</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L465"></a><tt class="py-lineno"> 465</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L466"></a><tt class="py-lineno"> 466</tt> <tt class="py-line"> </tt>
+<a name="View.getParent"></a><div id="View.getParent-def"><a name="L467"></a><tt class="py-lineno"> 467</tt> <a class="py-toggle" href="#" id="View.getParent-toggle" onclick="return toggle('View.getParent');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getParent-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getParent-expanded"><a name="L468"></a><tt class="py-lineno"> 468</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L469"></a><tt class="py-lineno"> 469</tt> <tt class="py-line"><tt class="py-docstring"> Gets the parent.</tt> </tt>
+<a name="L470"></a><tt class="py-lineno"> 470</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L471"></a><tt class="py-lineno"> 471</tt> <tt class="py-line"> </tt>
+<a name="L472"></a><tt class="py-lineno"> 472</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+</div><a name="L473"></a><tt class="py-lineno"> 473</tt> <tt class="py-line"> </tt>
+<a name="View.getText"></a><div id="View.getText-def"><a name="L474"></a><tt class="py-lineno"> 474</tt> <a class="py-toggle" href="#" id="View.getText-toggle" onclick="return toggle('View.getText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getText">getText</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getText-expanded"><a name="L475"></a><tt class="py-lineno"> 475</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L476"></a><tt class="py-lineno"> 476</tt> <tt class="py-line"><tt class="py-docstring"> Gets the text attribute.</tt> </tt>
+<a name="L477"></a><tt class="py-lineno"> 477</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L478"></a><tt class="py-lineno"> 478</tt> <tt class="py-line"><tt class="py-docstring"> @return: the text attribute or C{None} if not defined</tt> </tt>
+<a name="L479"></a><tt class="py-lineno"> 479</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L480"></a><tt class="py-lineno"> 480</tt> <tt class="py-line"> </tt>
+<a name="L481"></a><tt class="py-lineno"> 481</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L482"></a><tt class="py-lineno"> 482</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">]</tt> </tt>
+<a name="L483"></a><tt class="py-lineno"> 483</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">Exception</tt><tt class="py-op">:</tt> </tt>
+<a name="L484"></a><tt class="py-lineno"> 484</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L485"></a><tt class="py-lineno"> 485</tt> <tt class="py-line"> </tt>
+<a name="View.getHeight"></a><div id="View.getHeight-def"><a name="L486"></a><tt class="py-lineno"> 486</tt> <a class="py-toggle" href="#" id="View.getHeight-toggle" onclick="return toggle('View.getHeight');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getHeight-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getHeight-expanded"><a name="L487"></a><tt class="py-lineno"> 487</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L488"></a><tt class="py-lineno"> 488</tt> <tt class="py-line"><tt class="py-docstring"> Gets the height.</tt> </tt>
+<a name="L489"></a><tt class="py-lineno"> 489</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L490"></a><tt class="py-lineno"> 490</tt> <tt class="py-line"> </tt>
+<a name="L491"></a><tt class="py-lineno"> 491</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L492"></a><tt class="py-lineno"> 492</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-op">-</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L493"></a><tt class="py-lineno"> 493</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L494"></a><tt class="py-lineno"> 494</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L495"></a><tt class="py-lineno"> 495</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L496"></a><tt class="py-lineno"> 496</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L497"></a><tt class="py-lineno"> 497</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-number">0</tt> </tt>
+</div><a name="L498"></a><tt class="py-lineno"> 498</tt> <tt class="py-line"> </tt>
+<a name="View.getWidth"></a><div id="View.getWidth-def"><a name="L499"></a><tt class="py-lineno"> 499</tt> <a class="py-toggle" href="#" id="View.getWidth-toggle" onclick="return toggle('View.getWidth');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getWidth-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getWidth-expanded"><a name="L500"></a><tt class="py-lineno"> 500</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L501"></a><tt class="py-lineno"> 501</tt> <tt class="py-line"><tt class="py-docstring"> Gets the width.</tt> </tt>
+<a name="L502"></a><tt class="py-lineno"> 502</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L503"></a><tt class="py-lineno"> 503</tt> <tt class="py-line"> </tt>
+<a name="L504"></a><tt class="py-lineno"> 504</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L505"></a><tt class="py-lineno"> 505</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">-</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L506"></a><tt class="py-lineno"> 506</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L507"></a><tt class="py-lineno"> 507</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L508"></a><tt class="py-lineno"> 508</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L509"></a><tt class="py-lineno"> 509</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L510"></a><tt class="py-lineno"> 510</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-number">0</tt> </tt>
+</div><a name="L511"></a><tt class="py-lineno"> 511</tt> <tt class="py-line"> </tt>
+<a name="View.getUniqueId"></a><div id="View.getUniqueId-def"><a name="L512"></a><tt class="py-lineno"> 512</tt> <a class="py-toggle" href="#" id="View.getUniqueId-toggle" onclick="return toggle('View.getUniqueId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getUniqueId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getUniqueId-expanded"><a name="L513"></a><tt class="py-lineno"> 513</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L514"></a><tt class="py-lineno"> 514</tt> <tt class="py-line"><tt class="py-docstring"> Gets the unique Id of this View.</tt> </tt>
+<a name="L515"></a><tt class="py-lineno"> 515</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L516"></a><tt class="py-lineno"> 516</tt> <tt class="py-line"><tt class="py-docstring"> @see: L{ViewClient.__splitAttrs()} for a discussion on B{Unique Ids}</tt> </tt>
+<a name="L517"></a><tt class="py-lineno"> 517</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L518"></a><tt class="py-lineno"> 518</tt> <tt class="py-line"> </tt>
+<a name="L519"></a><tt class="py-lineno"> 519</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L520"></a><tt class="py-lineno"> 520</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> </tt>
+<a name="L521"></a><tt class="py-lineno"> 521</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L522"></a><tt class="py-lineno"> 522</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L523"></a><tt class="py-lineno"> 523</tt> <tt class="py-line"> </tt>
+<a name="View.getVisibility"></a><div id="View.getVisibility-def"><a name="L524"></a><tt class="py-lineno"> 524</tt> <a class="py-toggle" href="#" id="View.getVisibility-toggle" onclick="return toggle('View.getVisibility');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getVisibility-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getVisibility-expanded"><a name="L525"></a><tt class="py-lineno"> 525</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L526"></a><tt class="py-lineno"> 526</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View visibility</tt> </tt>
+<a name="L527"></a><tt class="py-lineno"> 527</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L528"></a><tt class="py-lineno"> 528</tt> <tt class="py-line"> </tt>
+<a name="L529"></a><tt class="py-lineno"> 529</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L530"></a><tt class="py-lineno"> 530</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-126" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-126', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L531"></a><tt class="py-lineno"> 531</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-127" class="py-name"><a title="com.dtmilano.android.viewclient.VISIBLE" class="py-name" href="#" onclick="return doclink('link-127', 'VISIBLE', 'link-52');">VISIBLE</a></tt> </tt>
+<a name="L532"></a><tt class="py-lineno"> 532</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-128" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-128', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'INVISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L533"></a><tt class="py-lineno"> 533</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-129" class="py-name"><a title="com.dtmilano.android.viewclient.INVISIBLE" class="py-name" href="#" onclick="return doclink('link-129', 'INVISIBLE', 'link-53');">INVISIBLE</a></tt> </tt>
+<a name="L534"></a><tt class="py-lineno"> 534</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-130" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-130', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'GONE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L535"></a><tt class="py-lineno"> 535</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-131" class="py-name"><a title="com.dtmilano.android.viewclient.GONE" class="py-name" href="#" onclick="return doclink('link-131', 'GONE', 'link-54');">GONE</a></tt> </tt>
+<a name="L536"></a><tt class="py-lineno"> 536</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L537"></a><tt class="py-lineno"> 537</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">-</tt><tt class="py-number">2</tt> </tt>
+<a name="L538"></a><tt class="py-lineno"> 538</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L539"></a><tt class="py-lineno"> 539</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+</div><a name="L540"></a><tt class="py-lineno"> 540</tt> <tt class="py-line"> </tt>
+<a name="View.getX"></a><div id="View.getX-def"><a name="L541"></a><tt class="py-lineno"> 541</tt> <a class="py-toggle" href="#" id="View.getX-toggle" onclick="return toggle('View.getX');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getX">getX</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getX-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getX-expanded"><a name="L542"></a><tt class="py-lineno"> 542</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L543"></a><tt class="py-lineno"> 543</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View X coordinate</tt> </tt>
+<a name="L544"></a><tt class="py-lineno"> 544</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L545"></a><tt class="py-lineno"> 545</tt> <tt class="py-line"> </tt>
+<a name="L546"></a><tt class="py-lineno"> 546</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-132" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-132', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L547"></a><tt class="py-lineno"> 547</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getX(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-133" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getClass()=com.dtmilano.android.viewclient.View-class.html#getClass"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-133', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-134" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getId()=com.dtmilano.android.viewclient.View-class.html#getId"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-134', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-135" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getUniqueId()=com.dtmilano.android.viewclient.View-class.html#getUniqueId"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-135', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L548"></a><tt class="py-lineno"> 548</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L549"></a><tt class="py-lineno"> 549</tt> <tt class="py-line"> </tt>
+<a name="L550"></a><tt class="py-lineno"> 550</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L551"></a><tt class="py-lineno"> 551</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L552"></a><tt class="py-lineno"> 552</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L553"></a><tt class="py-lineno"> 553</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L554"></a><tt class="py-lineno"> 554</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-136" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-136', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-137" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-137', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L555"></a><tt class="py-lineno"> 555</tt> <tt class="py-line"> <tt class="py-name">_x</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L556"></a><tt class="py-lineno"> 556</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-138" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-138', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getX: VISIBLE adding %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">_x</tt> </tt>
+<a name="L557"></a><tt class="py-lineno"> 557</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">+=</tt> <tt class="py-name">_x</tt> </tt>
+<a name="L558"></a><tt class="py-lineno"> 558</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L559"></a><tt class="py-lineno"> 559</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"View %s has no '%s' property"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-139" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-139', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L560"></a><tt class="py-lineno"> 560</tt> <tt class="py-line"> </tt>
+<a name="L561"></a><tt class="py-lineno"> 561</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-140" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-140', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getX: returning %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">)</tt> </tt>
+<a name="L562"></a><tt class="py-lineno"> 562</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">x</tt> </tt>
+</div><a name="L563"></a><tt class="py-lineno"> 563</tt> <tt class="py-line"> </tt>
+<a name="View.getY"></a><div id="View.getY-def"><a name="L564"></a><tt class="py-lineno"> 564</tt> <a class="py-toggle" href="#" id="View.getY-toggle" onclick="return toggle('View.getY');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getY">getY</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getY-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getY-expanded"><a name="L565"></a><tt class="py-lineno"> 565</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L566"></a><tt class="py-lineno"> 566</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View Y coordinate</tt> </tt>
+<a name="L567"></a><tt class="py-lineno"> 567</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L568"></a><tt class="py-lineno"> 568</tt> <tt class="py-line"> </tt>
+<a name="L569"></a><tt class="py-lineno"> 569</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-141" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-141', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L570"></a><tt class="py-lineno"> 570</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getY(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-142" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-142', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-143" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-143', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-144" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-144', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L571"></a><tt class="py-lineno"> 571</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L572"></a><tt class="py-lineno"> 572</tt> <tt class="py-line"> </tt>
+<a name="L573"></a><tt class="py-lineno"> 573</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L574"></a><tt class="py-lineno"> 574</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L575"></a><tt class="py-lineno"> 575</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L576"></a><tt class="py-lineno"> 576</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L577"></a><tt class="py-lineno"> 577</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-145" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-145', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-146" class="py-name"><a title="com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-146', 'GET_VISIBILITY_PROPERTY', 'link-50');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L578"></a><tt class="py-lineno"> 578</tt> <tt class="py-line"> <tt class="py-name">_y</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L579"></a><tt class="py-lineno"> 579</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-147" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-147', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getY: VISIBLE adding %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">_y</tt> </tt>
+<a name="L580"></a><tt class="py-lineno"> 580</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">+=</tt> <tt class="py-name">_y</tt> </tt>
+<a name="L581"></a><tt class="py-lineno"> 581</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L582"></a><tt class="py-lineno"> 582</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"View %s has no '%s' property"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-148" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-148', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L583"></a><tt class="py-lineno"> 583</tt> <tt class="py-line"> </tt>
+<a name="L584"></a><tt class="py-lineno"> 584</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-149" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-149', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getY: returning %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+<a name="L585"></a><tt class="py-lineno"> 585</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">y</tt> </tt>
+</div><a name="L586"></a><tt class="py-lineno"> 586</tt> <tt class="py-line"> </tt>
+<a name="View.getXY"></a><div id="View.getXY-def"><a name="L587"></a><tt class="py-lineno"> 587</tt> <a class="py-toggle" href="#" id="View.getXY-toggle" onclick="return toggle('View.getXY');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">debug</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getXY-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getXY-expanded"><a name="L588"></a><tt class="py-lineno"> 588</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L589"></a><tt class="py-lineno"> 589</tt> <tt class="py-line"><tt class="py-docstring"> Returns the I{screen} coordinates of this C{View}.</tt> </tt>
+<a name="L590"></a><tt class="py-lineno"> 590</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L591"></a><tt class="py-lineno"> 591</tt> <tt class="py-line"><tt class="py-docstring"> @return: The I{screen} coordinates of this C{View}</tt> </tt>
+<a name="L592"></a><tt class="py-lineno"> 592</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L593"></a><tt class="py-lineno"> 593</tt> <tt class="py-line"> </tt>
+<a name="L594"></a><tt class="py-lineno"> 594</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-150" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-150', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L595"></a><tt class="py-lineno"> 595</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L596"></a><tt class="py-lineno"> 596</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-151" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-151', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L597"></a><tt class="py-lineno"> 597</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L598"></a><tt class="py-lineno"> 598</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-string">"NO_ID"</tt> </tt>
+<a name="L599"></a><tt class="py-lineno"> 599</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getXY(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-152" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-152', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">id</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-153" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-153', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L600"></a><tt class="py-lineno"> 600</tt> <tt class="py-line"> </tt>
+<a name="L601"></a><tt class="py-lineno"> 601</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-154" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getX()=com.dtmilano.android.viewclient.View-class.html#getX"><a title="com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-154', 'getX', 'link-154');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L602"></a><tt class="py-lineno"> 602</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-155" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getY()=com.dtmilano.android.viewclient.View-class.html#getY"><a title="com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-155', 'getY', 'link-155');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L603"></a><tt class="py-lineno"> 603</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L604"></a><tt class="py-lineno"> 604</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+<a name="L605"></a><tt class="py-lineno"> 605</tt> <tt class="py-line"> </tt>
+<a name="L606"></a><tt class="py-lineno"> 606</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L607"></a><tt class="py-lineno"> 607</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-156" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-156', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: x=%s y=%s parent=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-157" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-157', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt> <tt class="py-keyword">else</tt> <tt class="py-string">"None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L608"></a><tt class="py-lineno"> 608</tt> <tt class="py-line"> <tt class="py-name">hx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L609"></a><tt class="py-lineno"> 609</tt> <tt class="py-line"> <tt class="py-string">''' Hierarchy accumulated X '''</tt> </tt>
+<a name="L610"></a><tt class="py-lineno"> 610</tt> <tt class="py-line"> <tt class="py-name">hy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L611"></a><tt class="py-lineno"> 611</tt> <tt class="py-line"> <tt class="py-string">''' Hierarchy accumulated Y '''</tt> </tt>
+<a name="L612"></a><tt class="py-lineno"> 612</tt> <tt class="py-line"> </tt>
+<a name="L613"></a><tt class="py-lineno"> 613</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-158" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-158', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: not using UiAutomator, calculating parent coordinates"</tt> </tt>
+<a name="L614"></a><tt class="py-lineno"> 614</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">parent</tt> <tt class="py-op">!=</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L615"></a><tt class="py-lineno"> 615</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-159" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-159', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: parent: %s %s <<<<"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-160" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-160', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-161" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-161', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L616"></a><tt class="py-lineno"> 616</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-162" class="py-name"><a title="com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="py-name" href="#" onclick="return doclink('link-162', 'SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED', 'link-32');">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L617"></a><tt class="py-lineno"> 617</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-163" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-163', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt> <tt class="py-string">'com.android.internal.widget.ActionBarView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L618"></a><tt class="py-lineno"> 618</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.widget.ActionBarContextView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L619"></a><tt class="py-lineno"> 619</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.view.menu.ActionMenuView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L620"></a><tt class="py-lineno"> 620</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.policy.impl.PhoneWindow$DecorView'</tt> <tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L621"></a><tt class="py-lineno"> 621</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-164" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-164', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: skipping %s %s (%d,%d)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-165" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-165', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-166" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-166', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-167" class="py-name"><a title="com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-167', 'getX', 'link-154');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-168" class="py-name"><a title="com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-168', 'getY', 'link-155');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L622"></a><tt class="py-lineno"> 622</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L623"></a><tt class="py-lineno"> 623</tt> <tt class="py-line"> <tt class="py-keyword">continue</tt> </tt>
+<a name="L624"></a><tt class="py-lineno"> 624</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-169" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-169', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: parent=%s x=%d hx=%d y=%d hy=%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-170" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-170', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">hx</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">hy</tt><tt class="py-op">)</tt> </tt>
+<a name="L625"></a><tt class="py-lineno"> 625</tt> <tt class="py-line"> <tt class="py-name">hx</tt> <tt class="py-op">+=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-171" class="py-name"><a title="com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-171', 'getX', 'link-154');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L626"></a><tt class="py-lineno"> 626</tt> <tt class="py-line"> <tt class="py-name">hy</tt> <tt class="py-op">+=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-172" class="py-name"><a title="com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-172', 'getY', 'link-155');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L627"></a><tt class="py-lineno"> 627</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L628"></a><tt class="py-lineno"> 628</tt> <tt class="py-line"> </tt>
+<a name="L629"></a><tt class="py-lineno"> 629</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-173" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__dumpWindowsInformation()=com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation"><a title="com.dtmilano.android.viewclient.View.__dumpWindowsInformation" class="py-name" href="#" onclick="return doclink('link-173', '__dumpWindowsInformation', 'link-173');">__dumpWindowsInformation</a></tt><tt class="py-op">(</tt><tt class="py-name">debug</tt><tt class="py-op">=</tt><tt class="py-name">debug</tt><tt class="py-op">)</tt> </tt>
+<a name="L630"></a><tt class="py-lineno"> 630</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-174" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-174', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L631"></a><tt class="py-lineno"> 631</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: wv=(%d, %d) (windows information)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L632"></a><tt class="py-lineno"> 632</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L633"></a><tt class="py-lineno"> 633</tt> <tt class="py-line"> <tt class="py-name">fw</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L634"></a><tt class="py-lineno"> 634</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-175" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-175', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L635"></a><tt class="py-lineno"> 635</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: focused window="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt> </tt>
+<a name="L636"></a><tt class="py-lineno"> 636</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: deciding whether to consider statusbar offset because current focused windows is at"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-string">"parent"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+<a name="L637"></a><tt class="py-lineno"> 637</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">KeyError</tt><tt class="py-op">:</tt> </tt>
+<a name="L638"></a><tt class="py-lineno"> 638</tt> <tt class="py-line"> <tt class="py-name">fw</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L639"></a><tt class="py-lineno"> 639</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-176" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__obtainStatusBarDimensionsIfVisible()=com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible"><a title="com.dtmilano.android.viewclient.View.__obtainStatusBarDimensionsIfVisible" class="py-name" href="#" onclick="return doclink('link-176', '__obtainStatusBarDimensionsIfVisible', 'link-176');">__obtainStatusBarDimensionsIfVisible</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L640"></a><tt class="py-lineno"> 640</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-177" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-177', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L641"></a><tt class="py-lineno"> 641</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: sb=(%d, %d) (statusbar dimensions)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+<a name="L642"></a><tt class="py-lineno"> 642</tt> <tt class="py-line"> <tt class="py-name">statusBarOffset</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L643"></a><tt class="py-lineno"> 643</tt> <tt class="py-line"> <tt class="py-name">pwx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L644"></a><tt class="py-lineno"> 644</tt> <tt class="py-line"> <tt class="py-name">pwy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L645"></a><tt class="py-lineno"> 645</tt> <tt class="py-line"> </tt>
+<a name="L646"></a><tt class="py-lineno"> 646</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">:</tt> </tt>
+<a name="L647"></a><tt class="py-lineno"> 647</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-178" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-178', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L648"></a><tt class="py-lineno"> 648</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: focused window="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">,</tt> <tt class="py-string">"sb="</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+<a name="L649"></a><tt class="py-lineno"> 649</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op"><=</tt> <tt class="py-name">sbh</tt><tt class="py-op">:</tt> <tt class="py-comment"># it's very unlikely that fw.wvy < sbh, that is a window over the statusbar</tt> </tt>
+<a name="L650"></a><tt class="py-lineno"> 650</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-179" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-179', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: yes, considering offset="</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L651"></a><tt class="py-lineno"> 651</tt> <tt class="py-line"> <tt class="py-name">statusBarOffset</tt> <tt class="py-op">=</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L652"></a><tt class="py-lineno"> 652</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L653"></a><tt class="py-lineno"> 653</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-180" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-180', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: no, ignoring statusbar offset fw.wvy="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-string">">"</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L654"></a><tt class="py-lineno"> 654</tt> <tt class="py-line"> </tt>
+<a name="L655"></a><tt class="py-lineno"> 655</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> <tt class="py-op">==</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">:</tt> </tt>
+<a name="L656"></a><tt class="py-lineno"> 656</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-181" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-181', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: but wait, fw.py == fw.wvy so we are adjusting by "</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+<a name="L657"></a><tt class="py-lineno"> 657</tt> <tt class="py-line"> <tt class="py-name">pwx</tt> <tt class="py-op">=</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt> </tt>
+<a name="L658"></a><tt class="py-lineno"> 658</tt> <tt class="py-line"> <tt class="py-name">pwy</tt> <tt class="py-op">=</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> </tt>
+<a name="L659"></a><tt class="py-lineno"> 659</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L660"></a><tt class="py-lineno"> 660</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-182" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-182', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: fw.py=%d <= fw.wvy=%d, no adjustment"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L661"></a><tt class="py-lineno"> 661</tt> <tt class="py-line"> </tt>
+<a name="L662"></a><tt class="py-lineno"> 662</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-183" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-183', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt id="link-184" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-184', 'DEBUG_STATUSBAR', 'link-18');">DEBUG_STATUSBAR</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L663"></a><tt class="py-lineno"> 663</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: returning (%d, %d) ***"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">hx</tt><tt class="py-op">+</tt><tt class="py-name">wvx</tt><tt class="py-op">+</tt><tt class="py-name">pwx</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">hy</tt><tt class="py-op">+</tt><tt class="py-name">wvy</tt><tt class="py-op">-</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">+</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+<a name="L664"></a><tt class="py-lineno"> 664</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" x=%d+%d+%d+%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt><tt class="py-name">hx</tt><tt class="py-op">,</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt><tt class="py-name">pwx</tt><tt class="py-op">)</tt> </tt>
+<a name="L665"></a><tt class="py-lineno"> 665</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" y=%d+%d+%d-%d+%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt><tt class="py-op">,</tt><tt class="py-name">hy</tt><tt class="py-op">,</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">,</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+<a name="L666"></a><tt class="py-lineno"> 666</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">hx</tt><tt class="py-op">+</tt><tt class="py-name">wvx</tt><tt class="py-op">+</tt><tt class="py-name">pwx</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">hy</tt><tt class="py-op">+</tt><tt class="py-name">wvy</tt><tt class="py-op">-</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">+</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L667"></a><tt class="py-lineno"> 667</tt> <tt class="py-line"> </tt>
+<a name="View.getCoords"></a><div id="View.getCoords-def"><a name="L668"></a><tt class="py-lineno"> 668</tt> <a class="py-toggle" href="#" id="View.getCoords-toggle" onclick="return toggle('View.getCoords');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getCoords-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getCoords-expanded"><a name="L669"></a><tt class="py-lineno"> 669</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L670"></a><tt class="py-lineno"> 670</tt> <tt class="py-line"><tt class="py-docstring"> Gets the coords of the View</tt> </tt>
+<a name="L671"></a><tt class="py-lineno"> 671</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L672"></a><tt class="py-lineno"> 672</tt> <tt class="py-line"><tt class="py-docstring"> @return: A tuple containing the View's coordinates ((L, T), (R, B))</tt> </tt>
+<a name="L673"></a><tt class="py-lineno"> 673</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L674"></a><tt class="py-lineno"> 674</tt> <tt class="py-line"> </tt>
+<a name="L675"></a><tt class="py-lineno"> 675</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-185" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-185', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L676"></a><tt class="py-lineno"> 676</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getCoords(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-186" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-186', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-187" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-187', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-188" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-188', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L677"></a><tt class="py-lineno"> 677</tt> <tt class="py-line"> </tt>
+<a name="L678"></a><tt class="py-lineno"> 678</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-189" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getXY()=com.dtmilano.android.viewclient.View-class.html#getXY"><a title="com.dtmilano.android.viewclient.View.getXY" class="py-name" href="#" onclick="return doclink('link-189', 'getXY', 'link-189');">getXY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">;</tt> </tt>
+<a name="L679"></a><tt class="py-lineno"> 679</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-190" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getWidth()=com.dtmilano.android.viewclient.View-class.html#getWidth"><a title="com.dtmilano.android.viewclient.View.getWidth" class="py-name" href="#" onclick="return doclink('link-190', 'getWidth', 'link-190');">getWidth</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L680"></a><tt class="py-lineno"> 680</tt> <tt class="py-line"> <tt class="py-name">h</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-191" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getHeight()=com.dtmilano.android.viewclient.View-class.html#getHeight"><a title="com.dtmilano.android.viewclient.View.getHeight" class="py-name" href="#" onclick="return doclink('link-191', 'getHeight', 'link-191');">getHeight</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L681"></a><tt class="py-lineno"> 681</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">h</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L682"></a><tt class="py-lineno"> 682</tt> <tt class="py-line"> </tt>
+<a name="View.getPositionAndSize"></a><div id="View.getPositionAndSize-def"><a name="L683"></a><tt class="py-lineno"> 683</tt> <a class="py-toggle" href="#" id="View.getPositionAndSize-toggle" onclick="return toggle('View.getPositionAndSize');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getPositionAndSize-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getPositionAndSize-expanded"><a name="L684"></a><tt class="py-lineno"> 684</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L685"></a><tt class="py-lineno"> 685</tt> <tt class="py-line"><tt class="py-docstring"> Gets the position and size (X,Y, W, H)</tt> </tt>
+<a name="L686"></a><tt class="py-lineno"> 686</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L687"></a><tt class="py-lineno"> 687</tt> <tt class="py-line"><tt class="py-docstring"> @return: A tuple containing the View's coordinates (X, Y, W, H)</tt> </tt>
+<a name="L688"></a><tt class="py-lineno"> 688</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L689"></a><tt class="py-lineno"> 689</tt> <tt class="py-line"> </tt>
+<a name="L690"></a><tt class="py-lineno"> 690</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-192" class="py-name"><a title="com.dtmilano.android.viewclient.View.getXY" class="py-name" href="#" onclick="return doclink('link-192', 'getXY', 'link-189');">getXY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">;</tt> </tt>
+<a name="L691"></a><tt class="py-lineno"> 691</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-193" class="py-name"><a title="com.dtmilano.android.viewclient.View.getWidth" class="py-name" href="#" onclick="return doclink('link-193', 'getWidth', 'link-190');">getWidth</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L692"></a><tt class="py-lineno"> 692</tt> <tt class="py-line"> <tt class="py-name">h</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-194" class="py-name"><a title="com.dtmilano.android.viewclient.View.getHeight" class="py-name" href="#" onclick="return doclink('link-194', 'getHeight', 'link-191');">getHeight</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L693"></a><tt class="py-lineno"> 693</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">h</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L694"></a><tt class="py-lineno"> 694</tt> <tt class="py-line"> </tt>
+<a name="L695"></a><tt class="py-lineno"> 695</tt> <tt class="py-line"> </tt>
+<a name="View.getCenter"></a><div id="View.getCenter-def"><a name="L696"></a><tt class="py-lineno"> 696</tt> <a class="py-toggle" href="#" id="View.getCenter-toggle" onclick="return toggle('View.getCenter');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getCenter-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getCenter-expanded"><a name="L697"></a><tt class="py-lineno"> 697</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L698"></a><tt class="py-lineno"> 698</tt> <tt class="py-line"><tt class="py-docstring"> Gets the center coords of the View</tt> </tt>
+<a name="L699"></a><tt class="py-lineno"> 699</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L700"></a><tt class="py-lineno"> 700</tt> <tt class="py-line"><tt class="py-docstring"> @author: U{Dean Morin <https://github.com/deanmorin>}</tt> </tt>
+<a name="L701"></a><tt class="py-lineno"> 701</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L702"></a><tt class="py-lineno"> 702</tt> <tt class="py-line"> </tt>
+<a name="L703"></a><tt class="py-lineno"> 703</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">left</tt><tt class="py-op">,</tt> <tt class="py-name">top</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">right</tt><tt class="py-op">,</tt> <tt class="py-name">bottom</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-195" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getCoords()=com.dtmilano.android.viewclient.View-class.html#getCoords"><a title="com.dtmilano.android.viewclient.View.getCoords" class="py-name" href="#" onclick="return doclink('link-195', 'getCoords', 'link-195');">getCoords</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L704"></a><tt class="py-lineno"> 704</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">left</tt> <tt class="py-op">+</tt> <tt class="py-op">(</tt><tt class="py-name">right</tt> <tt class="py-op">-</tt> <tt class="py-name">left</tt><tt class="py-op">)</tt> <tt class="py-op">/</tt> <tt class="py-number">2</tt> </tt>
+<a name="L705"></a><tt class="py-lineno"> 705</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">top</tt> <tt class="py-op">+</tt> <tt class="py-op">(</tt><tt class="py-name">bottom</tt> <tt class="py-op">-</tt> <tt class="py-name">top</tt><tt class="py-op">)</tt> <tt class="py-op">/</tt> <tt class="py-number">2</tt> </tt>
+<a name="L706"></a><tt class="py-lineno"> 706</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L707"></a><tt class="py-lineno"> 707</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainStatusBarDimensionsIfVisible"></a><div id="View.__obtainStatusBarDimensionsIfVisible-def"><a name="L708"></a><tt class="py-lineno"> 708</tt> <a class="py-toggle" href="#" id="View.__obtainStatusBarDimensionsIfVisible-toggle" onclick="return toggle('View.__obtainStatusBarDimensionsIfVisible');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible">__obtainStatusBarDimensionsIfVisible</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainStatusBarDimensionsIfVisible-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainStatusBarDimensionsIfVisible-expanded"><a name="L709"></a><tt class="py-lineno"> 709</tt> <tt class="py-line"> <tt class="py-name">sbw</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L710"></a><tt class="py-lineno"> 710</tt> <tt class="py-line"> <tt class="py-name">sbh</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L711"></a><tt class="py-lineno"> 711</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">winId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">:</tt> </tt>
+<a name="L712"></a><tt class="py-lineno"> 712</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">winId</tt><tt class="py-op">]</tt> </tt>
+<a name="L713"></a><tt class="py-lineno"> 713</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-196" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-196', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __obtainStatusBarDimensionsIfVisible: w="</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-string">" w.activity="</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-string">"%%%"</tt> </tt>
+<a name="L714"></a><tt class="py-lineno"> 714</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt> <tt class="py-op">==</tt> <tt class="py-string">'StatusBar'</tt><tt class="py-op">:</tt> </tt>
+<a name="L715"></a><tt class="py-lineno"> 715</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L716"></a><tt class="py-lineno"> 716</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-197" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-197', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __obtainStatusBarDimensionsIfVisible: statusBar="</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt><tt class="py-op">)</tt> </tt>
+<a name="L717"></a><tt class="py-lineno"> 717</tt> <tt class="py-line"> <tt class="py-name">sbw</tt> <tt class="py-op">=</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt> </tt>
+<a name="L718"></a><tt class="py-lineno"> 718</tt> <tt class="py-line"> <tt class="py-name">sbh</tt> <tt class="py-op">=</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt> </tt>
+<a name="L719"></a><tt class="py-lineno"> 719</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L720"></a><tt class="py-lineno"> 720</tt> <tt class="py-line"> </tt>
+<a name="L721"></a><tt class="py-lineno"> 721</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L722"></a><tt class="py-lineno"> 722</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainVxVy"></a><div id="View.__obtainVxVy-def"><a name="L723"></a><tt class="py-lineno"> 723</tt> <a class="py-toggle" href="#" id="View.__obtainVxVy-toggle" onclick="return toggle('View.__obtainVxVy');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__obtainVxVy">__obtainVxVy</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainVxVy-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainVxVy-expanded"><a name="L724"></a><tt class="py-lineno"> 724</tt> <tt class="py-line"> <tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L725"></a><tt class="py-lineno"> 725</tt> <tt class="py-line"> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L726"></a><tt class="py-lineno"> 726</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> </tt>
+</div><a name="L727"></a><tt class="py-lineno"> 727</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainVwVh"></a><div id="View.__obtainVwVh-def"><a name="L728"></a><tt class="py-lineno"> 728</tt> <a class="py-toggle" href="#" id="View.__obtainVwVh-toggle" onclick="return toggle('View.__obtainVwVh');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__obtainVwVh">__obtainVwVh</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainVwVh-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainVwVh-expanded"><a name="L729"></a><tt class="py-lineno"> 729</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-198" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__obtainVxVy()=com.dtmilano.android.viewclient.View-class.html#__obtainVxVy"><a title="com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-198', '__obtainVxVy', 'link-198');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L730"></a><tt class="py-lineno"> 730</tt> <tt class="py-line"> <tt class="py-name">wvx1</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L731"></a><tt class="py-lineno"> 731</tt> <tt class="py-line"> <tt class="py-name">wvy1</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L732"></a><tt class="py-lineno"> 732</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">wvx1</tt><tt class="py-op">-</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy1</tt><tt class="py-op">-</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L733"></a><tt class="py-lineno"> 733</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainPxPy"></a><div id="View.__obtainPxPy-def"><a name="L734"></a><tt class="py-lineno"> 734</tt> <a class="py-toggle" href="#" id="View.__obtainPxPy-toggle" onclick="return toggle('View.__obtainPxPy');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__obtainPxPy">__obtainPxPy</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainPxPy-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainPxPy-expanded"><a name="L735"></a><tt class="py-lineno"> 735</tt> <tt class="py-line"> <tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L736"></a><tt class="py-lineno"> 736</tt> <tt class="py-line"> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L737"></a><tt class="py-lineno"> 737</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L738"></a><tt class="py-lineno"> 738</tt> <tt class="py-line"> </tt>
+<a name="View.__dumpWindowsInformation"></a><div id="View.__dumpWindowsInformation-def"><a name="L739"></a><tt class="py-lineno"> 739</tt> <a class="py-toggle" href="#" id="View.__dumpWindowsInformation-toggle" onclick="return toggle('View.__dumpWindowsInformation');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation">__dumpWindowsInformation</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">debug</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__dumpWindowsInformation-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__dumpWindowsInformation-expanded"><a name="L740"></a><tt class="py-lineno"> 740</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L741"></a><tt class="py-lineno"> 741</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L742"></a><tt class="py-lineno"> 742</tt> <tt class="py-line"> <tt class="py-name">dww</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-199" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-199', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys window windows'</tt><tt class="py-op">)</tt> </tt>
+<a name="L743"></a><tt class="py-lineno"> 743</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-200" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_WINDOWS" class="py-name" href="#" onclick="return doclink('link-200', 'DEBUG_WINDOWS', 'link-20');">DEBUG_WINDOWS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">dww</tt> </tt>
+<a name="L744"></a><tt class="py-lineno"> 744</tt> <tt class="py-line"> <tt class="py-name">lines</tt> <tt class="py-op">=</tt> <tt class="py-name">dww</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt> </tt>
+<a name="L745"></a><tt class="py-lineno"> 745</tt> <tt class="py-line"> <tt class="py-name">widRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *Window #%s Window{%s (u\d+ )?%s?.*}:'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L746"></a><tt class="py-lineno"> 746</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-201" class="py-name" targets="Function com.dtmilano.android.viewclient._nd()=com.dtmilano.android.viewclient-module.html#_nd"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-201', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'num'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-202" class="py-name" targets="Function com.dtmilano.android.viewclient._nh()=com.dtmilano.android.viewclient-module.html#_nh"><a title="com.dtmilano.android.viewclient._nh" class="py-name" href="#" onclick="return doclink('link-202', '_nh', 'link-202');">_nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-203" class="py-name" targets="Function com.dtmilano.android.viewclient._ns()=com.dtmilano.android.viewclient-module.html#_ns"><a title="com.dtmilano.android.viewclient._ns" class="py-name" href="#" onclick="return doclink('link-203', '_ns', 'link-203');">_ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'activity'</tt><tt class="py-op">,</tt> <tt class="py-name">greedy</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L747"></a><tt class="py-lineno"> 747</tt> <tt class="py-line"> <tt class="py-name">currentFocusRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ mCurrentFocus=Window{%s .*'</tt> <tt class="py-op">%</tt> <tt id="link-204" class="py-name"><a title="com.dtmilano.android.viewclient._nh" class="py-name" href="#" onclick="return doclink('link-204', '_nh', 'link-202');">_nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L748"></a><tt class="py-lineno"> 748</tt> <tt class="py-line"> <tt class="py-name">viewVisibilityRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">' mViewVisibility=0x%s '</tt> <tt class="py-op">%</tt> <tt id="link-205" class="py-name"><a title="com.dtmilano.android.viewclient._nh" class="py-name" href="#" onclick="return doclink('link-205', '_nh', 'link-202');">_nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'visibility'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L749"></a><tt class="py-lineno"> 749</tt> <tt class="py-line"> <tt class="py-comment"># This is for 4.0.4 API-15</tt> </tt>
+<a name="L750"></a><tt class="py-lineno"> 750</tt> <tt class="py-line"> <tt class="py-name">containingFrameRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *mContainingFrame=\[%s,%s\]\[%s,%s\] mParentFrame=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L751"></a><tt class="py-lineno"> 751</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-206" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-206', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-207" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-207', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-208" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-208', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-209" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-209', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ch'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-210" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-210', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-211" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-211', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-212" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-212', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'pw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-213" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-213', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ph'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L752"></a><tt class="py-lineno"> 752</tt> <tt class="py-line"> <tt class="py-name">contentFrameRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *mContentFrame=\[%s,%s\]\[%s,%s\] mVisibleFrame=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L753"></a><tt class="py-lineno"> 753</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-214" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-214', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'x'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-215" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-215', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'y'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-216" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-216', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-217" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-217', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'h'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-218" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-218', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-219" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-219', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-220" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-220', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-221" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-221', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L754"></a><tt class="py-lineno"> 754</tt> <tt class="py-line"> <tt class="py-comment"># This is for 4.1 API-16</tt> </tt>
+<a name="L755"></a><tt class="py-lineno"> 755</tt> <tt class="py-line"> <tt class="py-name">framesRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *Frames: containing=\[%s,%s\]\[%s,%s\] parent=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L756"></a><tt class="py-lineno"> 756</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-222" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-222', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-223" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-223', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-224" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-224', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-225" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-225', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ch'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-226" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-226', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-227" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-227', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-228" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-228', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'pw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-229" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-229', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ph'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L757"></a><tt class="py-lineno"> 757</tt> <tt class="py-line"> <tt class="py-name">contentRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *content=\[%s,%s\]\[%s,%s\] visible=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L758"></a><tt class="py-lineno"> 758</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-230" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-230', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'x'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-231" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-231', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'y'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-232" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-232', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-233" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-233', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'h'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-234" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-234', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-235" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-235', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-236" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-236', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-237" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-237', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L759"></a><tt class="py-lineno"> 759</tt> <tt class="py-line"> <tt class="py-name">policyVisibilityRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'mPolicyVisibility=%s '</tt> <tt class="py-op">%</tt> <tt id="link-238" class="py-name"><a title="com.dtmilano.android.viewclient._ns" class="py-name" href="#" onclick="return doclink('link-238', '_ns', 'link-203');">_ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'policyVisibility'</tt><tt class="py-op">,</tt> <tt class="py-name">greedy</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L760"></a><tt class="py-lineno"> 760</tt> <tt class="py-line"> </tt>
+<a name="L761"></a><tt class="py-lineno"> 761</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">l</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L762"></a><tt class="py-lineno"> 762</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">widRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L763"></a><tt class="py-lineno"> 763</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L764"></a><tt class="py-lineno"> 764</tt> <tt class="py-line"> <tt class="py-name">num</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'num'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L765"></a><tt class="py-lineno"> 765</tt> <tt class="py-line"> <tt class="py-name">winId</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L766"></a><tt class="py-lineno"> 766</tt> <tt class="py-line"> <tt class="py-name">activity</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'activity'</tt><tt class="py-op">)</tt> </tt>
+<a name="L767"></a><tt class="py-lineno"> 767</tt> <tt class="py-line"> <tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L768"></a><tt class="py-lineno"> 768</tt> <tt class="py-line"> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L769"></a><tt class="py-lineno"> 769</tt> <tt class="py-line"> <tt class="py-name">wvw</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L770"></a><tt class="py-lineno"> 770</tt> <tt class="py-line"> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L771"></a><tt class="py-lineno"> 771</tt> <tt class="py-line"> <tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L772"></a><tt class="py-lineno"> 772</tt> <tt class="py-line"> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L773"></a><tt class="py-lineno"> 773</tt> <tt class="py-line"> <tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L774"></a><tt class="py-lineno"> 774</tt> <tt class="py-line"> <tt class="py-name">policyVisibility</tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> </tt>
+<a name="L775"></a><tt class="py-lineno"> 775</tt> <tt class="py-line"> </tt>
+<a name="L776"></a><tt class="py-lineno"> 776</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">l2</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">l</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L777"></a><tt class="py-lineno"> 777</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">widRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L778"></a><tt class="py-lineno"> 778</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L779"></a><tt class="py-lineno"> 779</tt> <tt class="py-line"> <tt class="py-name">l</tt> <tt class="py-op">+=</tt> <tt class="py-op">(</tt><tt class="py-name">l2</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L780"></a><tt class="py-lineno"> 780</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L781"></a><tt class="py-lineno"> 781</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">viewVisibilityRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L782"></a><tt class="py-lineno"> 782</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L783"></a><tt class="py-lineno"> 783</tt> <tt class="py-line"> <tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'visibility'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L784"></a><tt class="py-lineno"> 784</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-239" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-239', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: visibility="</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt> </tt>
+<a name="L785"></a><tt class="py-lineno"> 785</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-240" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-240', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">17</tt><tt class="py-op">:</tt> </tt>
+<a name="L786"></a><tt class="py-lineno"> 786</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L787"></a><tt class="py-lineno"> 787</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L788"></a><tt class="py-lineno"> 788</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-241" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-241', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">:</tt> </tt>
+<a name="L789"></a><tt class="py-lineno"> 789</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">framesRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L790"></a><tt class="py-lineno"> 790</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L791"></a><tt class="py-lineno"> 791</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-242" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__obtainPxPy()=com.dtmilano.android.viewclient.View-class.html#__obtainPxPy"><a title="com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-242', '__obtainPxPy', 'link-242');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L792"></a><tt class="py-lineno"> 792</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L793"></a><tt class="py-lineno"> 793</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L794"></a><tt class="py-lineno"> 794</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: the information provided by 'dumpsys window windows' in 4.2.1 (API 16)</tt> </tt>
+<a name="L795"></a><tt class="py-lineno"> 795</tt> <tt class="py-line"> <tt class="py-comment"># when there's a system dialog may not be correct and causes the View coordinates</tt> </tt>
+<a name="L796"></a><tt class="py-lineno"> 796</tt> <tt class="py-line"> <tt class="py-comment"># be offset by this amount, see</tt> </tt>
+<a name="L797"></a><tt class="py-lineno"> 797</tt> <tt class="py-line"> <tt class="py-comment"># https://github.com/dtmilano/AndroidViewClient/issues/29</tt> </tt>
+<a name="L798"></a><tt class="py-lineno"> 798</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-243" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-243', '__obtainVxVy', 'link-198');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L799"></a><tt class="py-lineno"> 799</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-244" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__obtainVwVh()=com.dtmilano.android.viewclient.View-class.html#__obtainVwVh"><a title="com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-244', '__obtainVwVh', 'link-244');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L800"></a><tt class="py-lineno"> 800</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-245" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-245', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-number">15</tt><tt class="py-op">:</tt> </tt>
+<a name="L801"></a><tt class="py-lineno"> 801</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">containingFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L802"></a><tt class="py-lineno"> 802</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L803"></a><tt class="py-lineno"> 803</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-246" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-246', '__obtainPxPy', 'link-242');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L804"></a><tt class="py-lineno"> 804</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L805"></a><tt class="py-lineno"> 805</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L806"></a><tt class="py-lineno"> 806</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-247" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-247', '__obtainVxVy', 'link-198');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L807"></a><tt class="py-lineno"> 807</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-248" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-248', '__obtainVwVh', 'link-244');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L808"></a><tt class="py-lineno"> 808</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-249" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-249', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L809"></a><tt class="py-lineno"> 809</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">containingFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L810"></a><tt class="py-lineno"> 810</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L811"></a><tt class="py-lineno"> 811</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-250" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-250', '__obtainPxPy', 'link-242');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L812"></a><tt class="py-lineno"> 812</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L813"></a><tt class="py-lineno"> 813</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L814"></a><tt class="py-lineno"> 814</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-251" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-251', '__obtainVxVy', 'link-198');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L815"></a><tt class="py-lineno"> 815</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-252" class="py-name"><a title="com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-252', '__obtainVwVh', 'link-244');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L816"></a><tt class="py-lineno"> 816</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L817"></a><tt class="py-lineno"> 817</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Unsupported Android version %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-253" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-253', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L818"></a><tt class="py-lineno"> 818</tt> <tt class="py-line"> </tt>
+<a name="L819"></a><tt class="py-lineno"> 819</tt> <tt class="py-line"> <tt class="py-comment">#print >> sys.stderr, "Searching policyVisibility in", lines[l2]</tt> </tt>
+<a name="L820"></a><tt class="py-lineno"> 820</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">policyVisibilityRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L821"></a><tt class="py-lineno"> 821</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L822"></a><tt class="py-lineno"> 822</tt> <tt class="py-line"> <tt class="py-name">policyVisibility</tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'policyVisibility'</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt> <tt class="py-keyword">else</tt> <tt class="py-number">0x8</tt> </tt>
+<a name="L823"></a><tt class="py-lineno"> 823</tt> <tt class="py-line"> </tt>
+<a name="L824"></a><tt class="py-lineno"> 824</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">winId</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt id="link-254" class="py-name" targets="Class com.dtmilano.android.viewclient.Window=com.dtmilano.android.viewclient.Window-class.html"><a title="com.dtmilano.android.viewclient.Window" class="py-name" href="#" onclick="return doclink('link-254', 'Window', 'link-254');">Window</a></tt><tt class="py-op">(</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt> <tt class="py-op">+</tt> <tt class="py-name">policyVisibility</tt><tt class="py-op">)</tt> </tt>
+<a name="L825"></a><tt class="py-lineno"> 825</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L826"></a><tt class="py-lineno"> 826</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">currentFocusRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L827"></a><tt class="py-lineno"> 827</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L828"></a><tt class="py-lineno"> 828</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L829"></a><tt class="py-lineno"> 829</tt> <tt class="py-line"> </tt>
+<a name="L830"></a><tt class="py-lineno"> 830</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L831"></a><tt class="py-lineno"> 831</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-255" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-255', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L832"></a><tt class="py-lineno"> 832</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: focus="</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> </tt>
+<a name="L833"></a><tt class="py-lineno"> 833</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation:"</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L834"></a><tt class="py-lineno"> 834</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L835"></a><tt class="py-lineno"> 835</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L836"></a><tt class="py-lineno"> 836</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L837"></a><tt class="py-lineno"> 837</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-256" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-256', 'DEBUG_COORDS', 'link-14');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: (0,0)"</tt> </tt>
+<a name="L838"></a><tt class="py-lineno"> 838</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L839"></a><tt class="py-lineno"> 839</tt> <tt class="py-line"> </tt>
+<a name="View.touch"></a><div id="View.touch-def"><a name="L840"></a><tt class="py-lineno"> 840</tt> <a class="py-toggle" href="#" id="View.touch-toggle" onclick="return toggle('View.touch');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#touch">touch</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">type</tt><tt class="py-op">=</tt><tt id="link-257" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-257', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-258" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DOWN_AND_UP=com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-258', 'DOWN_AND_UP', 'link-258');">DOWN_AND_UP</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.touch-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.touch-expanded"><a name="L841"></a><tt class="py-lineno"> 841</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L842"></a><tt class="py-lineno"> 842</tt> <tt class="py-line"><tt class="py-docstring"> Touches the center of this C{View}</tt> </tt>
+<a name="L843"></a><tt class="py-lineno"> 843</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L844"></a><tt class="py-lineno"> 844</tt> <tt class="py-line"> </tt>
+<a name="L845"></a><tt class="py-lineno"> 845</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-259" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getCenter()=com.dtmilano.android.viewclient.View-class.html#getCenter"><a title="com.dtmilano.android.viewclient.View.getCenter" class="py-name" href="#" onclick="return doclink('link-259', 'getCenter', 'link-259');">getCenter</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L846"></a><tt class="py-lineno"> 846</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-260" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_TOUCH" class="py-name" href="#" onclick="return doclink('link-260', 'DEBUG_TOUCH', 'link-16');">DEBUG_TOUCH</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L847"></a><tt class="py-lineno"> 847</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"should touch @ (%d, %d)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+<a name="L848"></a><tt class="py-lineno"> 848</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-261" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED" class="py-name" href="#" onclick="return doclink('link-261', 'VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED', 'link-33');">VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a></tt> <tt class="py-keyword">and</tt> <tt id="link-262" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-262', 'type', 'link-55');">type</a></tt> <tt class="py-op">==</tt> <tt id="link-263" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-263', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-264" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-264', 'DOWN_AND_UP', 'link-258');">DOWN_AND_UP</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L849"></a><tt class="py-lineno"> 849</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-265" class="py-name"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-265', 'WARNINGS', 'link-26');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L850"></a><tt class="py-lineno"> 850</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: touch workaround enabled"</tt> </tt>
+<a name="L851"></a><tt class="py-lineno"> 851</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-266" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.touch()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#touch,Method com.dtmilano.android.viewclient.View.touch()=com.dtmilano.android.viewclient.View-class.html#touch"><a title="com.dtmilano.android.adb.adbclient.AdbClient.touch
+com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-266', 'touch', 'link-266');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt id="link-267" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-267', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-268" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.DOWN=com.dtmilano.android.adb.adbclient-module.html#DOWN"><a title="com.dtmilano.android.adb.adbclient.DOWN" class="py-name" href="#" onclick="return doclink('link-268', 'DOWN', 'link-268');">DOWN</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L852"></a><tt class="py-lineno"> 852</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-269" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.sleep()=com.dtmilano.android.viewclient.ViewClient-class.html#sleep"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-269', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">50</tt><tt class="py-op">/</tt><tt class="py-number">1000.0</tt><tt class="py-op">)</tt> </tt>
+<a name="L853"></a><tt class="py-lineno"> 853</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-270" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.touch
+com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-270', 'touch', 'link-266');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-number">10</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-number">10</tt><tt class="py-op">,</tt> <tt id="link-271" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-271', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-272" class="py-name" targets="Variable com.dtmilano.android.adb.adbclient.UP=com.dtmilano.android.adb.adbclient-module.html#UP"><a title="com.dtmilano.android.adb.adbclient.UP" class="py-name" href="#" onclick="return doclink('link-272', 'UP', 'link-272');">UP</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L854"></a><tt class="py-lineno"> 854</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L855"></a><tt class="py-lineno"> 855</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-273" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.touch
+com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-273', 'touch', 'link-266');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt id="link-274" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-274', 'type', 'link-55');">type</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L856"></a><tt class="py-lineno"> 856</tt> <tt class="py-line"> </tt>
+<a name="View.allPossibleNamesWithColon"></a><div id="View.allPossibleNamesWithColon-def"><a name="L857"></a><tt class="py-lineno"> 857</tt> <a class="py-toggle" href="#" id="View.allPossibleNamesWithColon-toggle" onclick="return toggle('View.allPossibleNamesWithColon');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.allPossibleNamesWithColon-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.allPossibleNamesWithColon-expanded"><a name="L858"></a><tt class="py-lineno"> 858</tt> <tt class="py-line"> <tt class="py-name">l</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L859"></a><tt class="py-lineno"> 859</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">count</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L860"></a><tt class="py-lineno"> 860</tt> <tt class="py-line"> <tt class="py-name">name</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">,</tt> <tt class="py-string">":"</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L861"></a><tt class="py-lineno"> 861</tt> <tt class="py-line"> <tt class="py-name">l</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+<a name="L862"></a><tt class="py-lineno"> 862</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">l</tt> </tt>
+</div><a name="L863"></a><tt class="py-lineno"> 863</tt> <tt class="py-line"> </tt>
+<a name="View.intersection"></a><div id="View.intersection-def"><a name="L864"></a><tt class="py-lineno"> 864</tt> <a class="py-toggle" href="#" id="View.intersection-toggle" onclick="return toggle('View.intersection');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">l1</tt><tt class="py-op">,</tt> <tt class="py-param">l2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.intersection-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.intersection-expanded"><a name="L865"></a><tt class="py-lineno"> 865</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-275" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.list()=com.dtmilano.android.viewclient.ViewClient-class.html#list"><a title="com.dtmilano.android.viewclient.ViewClient.list" class="py-name" href="#" onclick="return doclink('link-275', 'list', 'link-275');">list</a></tt><tt class="py-op">(</tt><tt class="py-name">set</tt><tt class="py-op">(</tt><tt class="py-name">l1</tt><tt class="py-op">)</tt> <tt class="py-op">&</tt> <tt class="py-name">set</tt><tt class="py-op">(</tt><tt class="py-name">l2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L866"></a><tt class="py-lineno"> 866</tt> <tt class="py-line"> </tt>
+<a name="View.containsPoint"></a><div id="View.containsPoint-def"><a name="L867"></a><tt class="py-lineno"> 867</tt> <a class="py-toggle" href="#" id="View.containsPoint-toggle" onclick="return toggle('View.containsPoint');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x</tt><tt class="py-op">,</tt> <tt class="py-param">y</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.containsPoint-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.containsPoint-expanded"><a name="L868"></a><tt class="py-lineno"> 868</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">X</tt><tt class="py-op">,</tt> <tt class="py-name">Y</tt><tt class="py-op">,</tt> <tt class="py-name">W</tt><tt class="py-op">,</tt> <tt class="py-name">H</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-276" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getPositionAndSize()=com.dtmilano.android.viewclient.View-class.html#getPositionAndSize"><a title="com.dtmilano.android.viewclient.View.getPositionAndSize" class="py-name" href="#" onclick="return doclink('link-276', 'getPositionAndSize', 'link-276');">getPositionAndSize</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L869"></a><tt class="py-lineno"> 869</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt> <tt class="py-op">>=</tt> <tt class="py-name">X</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt> <tt class="py-op"><=</tt> <tt class="py-op">(</tt><tt class="py-name">X</tt><tt class="py-op">+</tt><tt class="py-name">W</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">y</tt> <tt class="py-op">>=</tt> <tt class="py-name">Y</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt> <tt class="py-op"><=</tt> <tt class="py-op">(</tt><tt class="py-name">Y</tt><tt class="py-op">+</tt><tt class="py-name">H</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L870"></a><tt class="py-lineno"> 870</tt> <tt class="py-line"> </tt>
+<a name="View.add"></a><div id="View.add-def"><a name="L871"></a><tt class="py-lineno"> 871</tt> <a class="py-toggle" href="#" id="View.add-toggle" onclick="return toggle('View.add');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#add">add</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">child</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.add-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.add-expanded"><a name="L872"></a><tt class="py-lineno"> 872</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L873"></a><tt class="py-lineno"> 873</tt> <tt class="py-line"><tt class="py-docstring"> Adds a child</tt> </tt>
+<a name="L874"></a><tt class="py-lineno"> 874</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L875"></a><tt class="py-lineno"> 875</tt> <tt class="py-line"><tt class="py-docstring"> @type child: View</tt> </tt>
+<a name="L876"></a><tt class="py-lineno"> 876</tt> <tt class="py-line"><tt class="py-docstring"> @param child: The child to add</tt> </tt>
+<a name="L877"></a><tt class="py-lineno"> 877</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L878"></a><tt class="py-lineno"> 878</tt> <tt class="py-line"> <tt class="py-name">child</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt> </tt>
+<a name="L879"></a><tt class="py-lineno"> 879</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L880"></a><tt class="py-lineno"> 880</tt> <tt class="py-line"> </tt>
+<a name="View.isClickable"></a><div id="View.isClickable-def"><a name="L881"></a><tt class="py-lineno"> 881</tt> <a class="py-toggle" href="#" id="View.isClickable-toggle" onclick="return toggle('View.isClickable');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.isClickable-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.isClickable-expanded"><a name="L882"></a><tt class="py-lineno"> 882</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-277" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__getattr__()=com.dtmilano.android.viewclient.View-class.html#__getattr__"><a title="com.dtmilano.android.viewclient.View.__getattr__" class="py-name" href="#" onclick="return doclink('link-277', '__getattr__', 'link-277');">__getattr__</a></tt><tt class="py-op">(</tt><tt class="py-string">'isClickable'</tt><tt class="py-op">)</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L883"></a><tt class="py-lineno"> 883</tt> <tt class="py-line"> </tt>
+<a name="View.variableNameFromId"></a><div id="View.variableNameFromId-def"><a name="L884"></a><tt class="py-lineno"> 884</tt> <a class="py-toggle" href="#" id="View.variableNameFromId-toggle" onclick="return toggle('View.variableNameFromId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.variableNameFromId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.variableNameFromId-expanded"><a name="L885"></a><tt class="py-lineno"> 885</tt> <tt class="py-line"> <tt class="py-name">_id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-278" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-278', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L886"></a><tt class="py-lineno"> 886</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">_id</tt><tt class="py-op">:</tt> </tt>
+<a name="L887"></a><tt class="py-lineno"> 887</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">=</tt> <tt class="py-name">_id</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">':'</tt><tt class="py-op">,</tt> <tt class="py-string">'___'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'/'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">)</tt> </tt>
+<a name="L888"></a><tt class="py-lineno"> 888</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L889"></a><tt class="py-lineno"> 889</tt> <tt class="py-line"> <tt class="py-name">_id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-279" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-279', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L890"></a><tt class="py-lineno"> 890</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt id="link-280" class="py-name"><a title="com.dtmilano.android.viewclient.ID_RE" class="py-name" href="#" onclick="return doclink('link-280', 'ID_RE', 'link-57');">ID_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">_id</tt><tt class="py-op">)</tt> </tt>
+<a name="L891"></a><tt class="py-lineno"> 891</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L892"></a><tt class="py-lineno"> 892</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L893"></a><tt class="py-lineno"> 893</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L894"></a><tt class="py-lineno"> 894</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">+=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt> </tt>
+<a name="L895"></a><tt class="py-lineno"> 895</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^\d'</tt><tt class="py-op">,</tt> <tt class="py-name">var</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L896"></a><tt class="py-lineno"> 896</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">=</tt> <tt class="py-string">'id_'</tt> <tt class="py-op">+</tt> <tt class="py-name">var</tt> </tt>
+<a name="L897"></a><tt class="py-lineno"> 897</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">var</tt> </tt>
+</div><a name="L898"></a><tt class="py-lineno"> 898</tt> <tt class="py-line"> </tt>
+<a name="View.writeImageToFile"></a><div id="View.writeImageToFile-def"><a name="L899"></a><tt class="py-lineno"> 899</tt> <a class="py-toggle" href="#" id="View.writeImageToFile-toggle" onclick="return toggle('View.writeImageToFile');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">format</tt><tt class="py-op">=</tt><tt class="py-string">"PNG"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.writeImageToFile-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.writeImageToFile-expanded"><a name="L900"></a><tt class="py-lineno"> 900</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L901"></a><tt class="py-lineno"> 901</tt> <tt class="py-line"><tt class="py-docstring"> Write the View image to the specified filename in the specified format.</tt> </tt>
+<a name="L902"></a><tt class="py-lineno"> 902</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L903"></a><tt class="py-lineno"> 903</tt> <tt class="py-line"><tt class="py-docstring"> @type filename: str</tt> </tt>
+<a name="L904"></a><tt class="py-lineno"> 904</tt> <tt class="py-line"><tt class="py-docstring"> @param filename: Absolute path and optional filename receiving the image. If this points to</tt> </tt>
+<a name="L905"></a><tt class="py-lineno"> 905</tt> <tt class="py-line"><tt class="py-docstring"> a directory, then the filename is determined by this View unique ID and</tt> </tt>
+<a name="L906"></a><tt class="py-lineno"> 906</tt> <tt class="py-line"><tt class="py-docstring"> format extension.</tt> </tt>
+<a name="L907"></a><tt class="py-lineno"> 907</tt> <tt class="py-line"><tt class="py-docstring"> @type format: str</tt> </tt>
+<a name="L908"></a><tt class="py-lineno"> 908</tt> <tt class="py-line"><tt class="py-docstring"> @param format: Image format (default format is PNG)</tt> </tt>
+<a name="L909"></a><tt class="py-lineno"> 909</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L910"></a><tt class="py-lineno"> 910</tt> <tt class="py-line"> </tt>
+<a name="L911"></a><tt class="py-lineno"> 911</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L912"></a><tt class="py-lineno"> 912</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"writeImageToFile expects an absolute path"</tt><tt class="py-op">)</tt> </tt>
+<a name="L913"></a><tt class="py-lineno"> 913</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L914"></a><tt class="py-lineno"> 914</tt> <tt class="py-line"> <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-281" class="py-name" targets="Method com.dtmilano.android.viewclient.View.variableNameFromId()=com.dtmilano.android.viewclient.View-class.html#variableNameFromId"><a title="com.dtmilano.android.viewclient.View.variableNameFromId" class="py-name" href="#" onclick="return doclink('link-281', 'variableNameFromId', 'link-281');">variableNameFromId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> <tt class="py-op">+</tt> <tt class="py-name">format</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L915"></a><tt class="py-lineno"> 915</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-282" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-282', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L916"></a><tt class="py-lineno"> 916</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"writeImageToFile: saving image to '%s' in %s format"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+<a name="L917"></a><tt class="py-lineno"> 917</tt> <tt class="py-line"> <tt class="py-comment">#self.device.takeSnapshot().getSubImage(self.getPositionAndSize()).writeToFile(filename, format)</tt> </tt>
+<a name="L918"></a><tt class="py-lineno"> 918</tt> <tt class="py-line"> <tt class="py-comment"># crop:</tt> </tt>
+<a name="L919"></a><tt class="py-lineno"> 919</tt> <tt class="py-line"> <tt class="py-comment"># im.crop(box) ⇒ image</tt> </tt>
+<a name="L920"></a><tt class="py-lineno"> 920</tt> <tt class="py-line"> <tt class="py-comment"># Returns a copy of a rectangular region from the current image.</tt> </tt>
+<a name="L921"></a><tt class="py-lineno"> 921</tt> <tt class="py-line"> <tt class="py-comment"># The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate.</tt> </tt>
+<a name="L922"></a><tt class="py-lineno"> 922</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">l</tt><tt class="py-op">,</tt> <tt class="py-name">t</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">r</tt><tt class="py-op">,</tt> <tt class="py-name">b</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-283" class="py-name"><a title="com.dtmilano.android.viewclient.View.getCoords" class="py-name" href="#" onclick="return doclink('link-283', 'getCoords', 'link-195');">getCoords</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L923"></a><tt class="py-lineno"> 923</tt> <tt class="py-line"> <tt class="py-name">box</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">l</tt><tt class="py-op">,</tt> <tt class="py-name">t</tt><tt class="py-op">,</tt> <tt class="py-name">r</tt><tt class="py-op">,</tt> <tt class="py-name">b</tt><tt class="py-op">)</tt> </tt>
+<a name="L924"></a><tt class="py-lineno"> 924</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-284" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-284', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L925"></a><tt class="py-lineno"> 925</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"writeImageToFile: cropping"</tt><tt class="py-op">,</tt> <tt class="py-name">box</tt><tt class="py-op">,</tt> <tt class="py-string">" reconnect="</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">reconnect</tt> </tt>
+<a name="L926"></a><tt class="py-lineno"> 926</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-285" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.takeSnapshot()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#takeSnapshot"><a title="com.dtmilano.android.adb.adbclient.AdbClient.takeSnapshot" class="py-name" href="#" onclick="return doclink('link-285', 'takeSnapshot', 'link-285');">takeSnapshot</a></tt><tt class="py-op">(</tt><tt class="py-name">reconnect</tt><tt class="py-op">=</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">reconnect</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">crop</tt><tt class="py-op">(</tt><tt class="py-name">box</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">save</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L927"></a><tt class="py-lineno"> 927</tt> <tt class="py-line"> </tt>
+<a name="View.__smallStr__"></a><div id="View.__smallStr__-def"><a name="L928"></a><tt class="py-lineno"> 928</tt> <a class="py-toggle" href="#" id="View.__smallStr__-toggle" onclick="return toggle('View.__smallStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__smallStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__smallStr__-expanded"><a name="L929"></a><tt class="py-lineno"> 929</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L930"></a><tt class="py-lineno"> 930</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L931"></a><tt class="py-lineno"> 931</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L932"></a><tt class="py-lineno"> 932</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-286" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-286', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L933"></a><tt class="py-lineno"> 933</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" ] parent="</tt> </tt>
+<a name="L934"></a><tt class="py-lineno"> 934</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-keyword">and</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L935"></a><tt class="py-lineno"> 935</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt> </tt>
+<a name="L936"></a><tt class="py-lineno"> 936</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L937"></a><tt class="py-lineno"> 937</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"None"</tt> </tt>
+<a name="L938"></a><tt class="py-lineno"> 938</tt> <tt class="py-line"> </tt>
+<a name="L939"></a><tt class="py-lineno"> 939</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L940"></a><tt class="py-lineno"> 940</tt> <tt class="py-line"> </tt>
+<a name="View.__tinyStr__"></a><div id="View.__tinyStr__-def"><a name="L941"></a><tt class="py-lineno"> 941</tt> <a class="py-toggle" href="#" id="View.__tinyStr__-toggle" onclick="return toggle('View.__tinyStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__tinyStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__tinyStr__-expanded"><a name="L942"></a><tt class="py-lineno"> 942</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L943"></a><tt class="py-lineno"> 943</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L944"></a><tt class="py-lineno"> 944</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'.*\.'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L945"></a><tt class="py-lineno"> 945</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-287" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-287', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L946"></a><tt class="py-lineno"> 946</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" ]"</tt> </tt>
+<a name="L947"></a><tt class="py-lineno"> 947</tt> <tt class="py-line"> </tt>
+<a name="L948"></a><tt class="py-lineno"> 948</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L949"></a><tt class="py-lineno"> 949</tt> <tt class="py-line"> </tt>
+<a name="View.__microStr__"></a><div id="View.__microStr__-def"><a name="L950"></a><tt class="py-lineno"> 950</tt> <a class="py-toggle" href="#" id="View.__microStr__-toggle" onclick="return toggle('View.__microStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__microStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__microStr__-expanded"><a name="L951"></a><tt class="py-lineno"> 951</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L952"></a><tt class="py-lineno"> 952</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L953"></a><tt class="py-lineno"> 953</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'.*\.'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L954"></a><tt class="py-lineno"> 954</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-288" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-288', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'id/no_id/'</tt><tt class="py-op">,</tt> <tt class="py-string">'-'</tt><tt class="py-op">)</tt> </tt>
+<a name="L955"></a><tt class="py-lineno"> 955</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">id</tt> </tt>
+<a name="L956"></a><tt class="py-lineno"> 956</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">L</tt><tt class="py-op">,</tt> <tt class="py-name">T</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">R</tt><tt class="py-op">,</tt> <tt class="py-name">B</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-289" class="py-name"><a title="com.dtmilano.android.viewclient.View.getCoords" class="py-name" href="#" onclick="return doclink('link-289', 'getCoords', 'link-195');">getCoords</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L957"></a><tt class="py-lineno"> 957</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">'@%04d%04d%04d%04d'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">L</tt><tt class="py-op">,</tt> <tt class="py-name">T</tt><tt class="py-op">,</tt> <tt class="py-name">R</tt><tt class="py-op">,</tt> <tt class="py-name">B</tt><tt class="py-op">)</tt> </tt>
+<a name="L958"></a><tt class="py-lineno"> 958</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">''</tt> </tt>
+<a name="L959"></a><tt class="py-lineno"> 959</tt> <tt class="py-line"> </tt>
+<a name="L960"></a><tt class="py-lineno"> 960</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L961"></a><tt class="py-lineno"> 961</tt> <tt class="py-line"> </tt>
+<a name="L962"></a><tt class="py-lineno"> 962</tt> <tt class="py-line"> </tt>
+<a name="View.__str__"></a><div id="View.__str__-def"><a name="L963"></a><tt class="py-lineno"> 963</tt> <a class="py-toggle" href="#" id="View.__str__-toggle" onclick="return toggle('View.__str__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__str__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__str__-expanded"><a name="L964"></a><tt class="py-lineno"> 964</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L965"></a><tt class="py-lineno"> 965</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L966"></a><tt class="py-lineno"> 966</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt id="link-290" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.Device.__str__()=com.dtmilano.android.adb.adbclient.Device-class.html#__str__,Method com.dtmilano.android.viewclient.View.__str__()=com.dtmilano.android.viewclient.View-class.html#__str__,Method com.dtmilano.android.viewclient.Window.__str__()=com.dtmilano.android.viewclient.Window-class.html#__str__"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-290', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">" "</tt> </tt>
+<a name="L967"></a><tt class="py-lineno"> 967</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">a</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L968"></a><tt class="py-lineno"> 968</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">a</tt> <tt class="py-op">+</tt> <tt class="py-string">"="</tt> </tt>
+<a name="L969"></a><tt class="py-lineno"> 969</tt> <tt class="py-line"> <tt class="py-comment"># decode() works only on python's 8-bit strings</tt> </tt>
+<a name="L970"></a><tt class="py-lineno"> 970</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">a</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">unicode</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L971"></a><tt class="py-lineno"> 971</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">a</tt><tt class="py-op">]</tt> </tt>
+<a name="L972"></a><tt class="py-lineno"> 972</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L973"></a><tt class="py-lineno"> 973</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-name">str</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">a</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-name">errors</tt><tt class="py-op">=</tt><tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L974"></a><tt class="py-lineno"> 974</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" "</tt> </tt>
+<a name="L975"></a><tt class="py-lineno"> 975</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"] parent="</tt> </tt>
+<a name="L976"></a><tt class="py-lineno"> 976</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">:</tt> </tt>
+<a name="L977"></a><tt class="py-lineno"> 977</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L978"></a><tt class="py-lineno"> 978</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt> </tt>
+<a name="L979"></a><tt class="py-lineno"> 979</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L980"></a><tt class="py-lineno"> 980</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-291" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-291', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-292" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-292', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L981"></a><tt class="py-lineno"> 981</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L982"></a><tt class="py-lineno"> 982</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"None"</tt> </tt>
+<a name="L983"></a><tt class="py-lineno"> 983</tt> <tt class="py-line"> </tt>
+<a name="L984"></a><tt class="py-lineno"> 984</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div></div><a name="L985"></a><tt class="py-lineno"> 985</tt> <tt class="py-line"> </tt>
+<a name="TextView"></a><div id="TextView-def"><a name="L986"></a><tt class="py-lineno"> 986</tt> <a class="py-toggle" href="#" id="TextView-toggle" onclick="return toggle('TextView');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.TextView-class.html">TextView</a><tt class="py-op">(</tt><tt class="py-base-class">View</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="TextView-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="TextView-expanded"><a name="L987"></a><tt class="py-lineno"> 987</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L988"></a><tt class="py-lineno"> 988</tt> <tt class="py-line"><tt class="py-docstring"> TextView class.</tt> </tt>
+<a name="L989"></a><tt class="py-lineno"> 989</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L990"></a><tt class="py-lineno"> 990</tt> <tt class="py-line"> </tt>
+<a name="L991"></a><tt class="py-lineno"> 991</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L992"></a><tt class="py-lineno"> 992</tt> <tt class="py-line"> </tt>
+<a name="EditText"></a><div id="EditText-def"><a name="L993"></a><tt class="py-lineno"> 993</tt> <a class="py-toggle" href="#" id="EditText-toggle" onclick="return toggle('EditText');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.EditText-class.html">EditText</a><tt class="py-op">(</tt><tt class="py-base-class">TextView</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="EditText-expanded"><a name="L994"></a><tt class="py-lineno"> 994</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L995"></a><tt class="py-lineno"> 995</tt> <tt class="py-line"><tt class="py-docstring"> EditText class.</tt> </tt>
+<a name="L996"></a><tt class="py-lineno"> 996</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L997"></a><tt class="py-lineno"> 997</tt> <tt class="py-line"> </tt>
+<a name="EditText.type"></a><div id="EditText.type-def"><a name="L998"></a><tt class="py-lineno"> 998</tt> <a class="py-toggle" href="#" id="EditText.type-toggle" onclick="return toggle('EditText.type');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.EditText-class.html#type">type</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText.type-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="EditText.type-expanded"><a name="L999"></a><tt class="py-lineno"> 999</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-293" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.touch
+com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-293', 'touch', 'link-266');">touch</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1000"></a><tt class="py-lineno">1000</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-294" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-294', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">0.5</tt><tt class="py-op">)</tt> </tt>
+<a name="L1001"></a><tt class="py-lineno">1001</tt> <tt class="py-line"> <tt class="py-name">escaped</tt> <tt class="py-op">=</tt> <tt class="py-name">text</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'%s'</tt><tt class="py-op">,</tt> <tt class="py-string">'\\%s'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1002"></a><tt class="py-lineno">1002</tt> <tt class="py-line"> <tt class="py-name">encoded</tt> <tt class="py-op">=</tt> <tt class="py-name">escaped</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt class="py-string">'%s'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1003"></a><tt class="py-lineno">1003</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-295" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-295', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">encoded</tt><tt class="py-op">)</tt> </tt>
+<a name="L1004"></a><tt class="py-lineno">1004</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-296" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-296', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">0.5</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1005"></a><tt class="py-lineno">1005</tt> <tt class="py-line"> </tt>
+<a name="EditText.backspace"></a><div id="EditText.backspace-def"><a name="L1006"></a><tt class="py-lineno">1006</tt> <a class="py-toggle" href="#" id="EditText.backspace-toggle" onclick="return toggle('EditText.backspace');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.EditText-class.html#backspace">backspace</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText.backspace-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="EditText.backspace-expanded"><a name="L1007"></a><tt class="py-lineno">1007</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-297" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.touch
+com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-297', 'touch', 'link-266');">touch</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1008"></a><tt class="py-lineno">1008</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-298" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-298', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1009"></a><tt class="py-lineno">1009</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-299" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.press()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#press"><a title="com.dtmilano.android.adb.adbclient.AdbClient.press" class="py-name" href="#" onclick="return doclink('link-299', 'press', 'link-299');">press</a></tt><tt class="py-op">(</tt><tt class="py-string">'KEYCODE_DEL'</tt><tt class="py-op">,</tt> <tt id="link-300" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-300', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-301" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DOWN_AND_UP" class="py-name" href="#" onclick="return doclink('link-301', 'DOWN_AND_UP', 'link-258');">DOWN_AND_UP</a></tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L1010"></a><tt class="py-lineno">1010</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient"></a><div id="UiAutomator2AndroidViewClient-def"><a name="L1011"></a><tt class="py-lineno">1011</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient-toggle" onclick="return toggle('UiAutomator2AndroidViewClient');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="UiAutomator2AndroidViewClient-expanded"><a name="L1012"></a><tt class="py-lineno">1012</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1013"></a><tt class="py-lineno">1013</tt> <tt class="py-line"><tt class="py-docstring"> UiAutomator XML to AndroidViewClient</tt> </tt>
+<a name="L1014"></a><tt class="py-lineno">1014</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1015"></a><tt class="py-lineno">1015</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.__init__"></a><div id="UiAutomator2AndroidViewClient.__init__-def"><a name="L1016"></a><tt class="py-lineno">1016</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.__init__-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.__init__-expanded"><a name="L1017"></a><tt class="py-lineno">1017</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L1018"></a><tt class="py-lineno">1018</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">version</tt> </tt>
+<a name="L1019"></a><tt class="py-lineno">1019</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1020"></a><tt class="py-lineno">1020</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1021"></a><tt class="py-lineno">1021</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1022"></a><tt class="py-lineno">1022</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1023"></a><tt class="py-lineno">1023</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+</div><a name="L1024"></a><tt class="py-lineno">1024</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.StartElement"></a><div id="UiAutomator2AndroidViewClient.StartElement-def"><a name="L1025"></a><tt class="py-lineno">1025</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.StartElement-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.StartElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement">StartElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">attributes</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.StartElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.StartElement-expanded"><a name="L1026"></a><tt class="py-lineno">1026</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1027"></a><tt class="py-lineno">1027</tt> <tt class="py-line"><tt class="py-docstring"> Expat start element event handler</tt> </tt>
+<a name="L1028"></a><tt class="py-lineno">1028</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1029"></a><tt class="py-lineno">1029</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'hierarchy'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1030"></a><tt class="py-lineno">1030</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1031"></a><tt class="py-lineno">1031</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'node'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1032"></a><tt class="py-lineno">1032</tt> <tt class="py-line"> <tt class="py-comment"># Instantiate an Element object</tt> </tt>
+<a name="L1033"></a><tt class="py-lineno">1033</tt> <tt class="py-line"> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-string">'id/no_id/%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> </tt>
+<a name="L1034"></a><tt class="py-lineno">1034</tt> <tt class="py-line"> <tt class="py-name">bounds</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'[\][,]'</tt><tt class="py-op">,</tt> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1035"></a><tt class="py-lineno">1035</tt> <tt class="py-line"> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1036"></a><tt class="py-lineno">1036</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-302" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_BOUNDS" class="py-name" href="#" onclick="return doclink('link-302', 'DEBUG_BOUNDS', 'link-22');">DEBUG_BOUNDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1037"></a><tt class="py-lineno">1037</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"bounds="</tt><tt class="py-op">,</tt> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt> </tt>
+<a name="L1038"></a><tt class="py-lineno">1038</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L1039"></a><tt class="py-lineno">1039</tt> <tt class="py-line"> <tt class="py-name">child</tt> <tt class="py-op">=</tt> <tt id="link-303" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-303', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-304" class="py-name" targets="Static Method com.dtmilano.android.adb.adbclient.Device.factory()=com.dtmilano.android.adb.adbclient.Device-class.html#factory,Static Method com.dtmilano.android.viewclient.View.factory()=com.dtmilano.android.viewclient.View-class.html#factory"><a title="com.dtmilano.android.adb.adbclient.Device.factory
+com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-304', 'factory', 'link-304');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attributes</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">version</tt><tt class="py-op">)</tt> </tt>
+<a name="L1040"></a><tt class="py-lineno">1040</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1041"></a><tt class="py-lineno">1041</tt> <tt class="py-line"> <tt class="py-comment"># Push element onto the stack and make it a child of parent</tt> </tt>
+<a name="L1042"></a><tt class="py-lineno">1042</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">:</tt> </tt>
+<a name="L1043"></a><tt class="py-lineno">1043</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1044"></a><tt class="py-lineno">1044</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1045"></a><tt class="py-lineno">1045</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L1046"></a><tt class="py-lineno">1046</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-305" class="py-name" targets="Method com.dtmilano.android.viewclient.View.add()=com.dtmilano.android.viewclient.View-class.html#add"><a title="com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-305', 'add', 'link-305');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1047"></a><tt class="py-lineno">1047</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1048"></a><tt class="py-lineno">1048</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.EndElement"></a><div id="UiAutomator2AndroidViewClient.EndElement-def"><a name="L1049"></a><tt class="py-lineno">1049</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.EndElement-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.EndElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement">EndElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.EndElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.EndElement-expanded"><a name="L1050"></a><tt class="py-lineno">1050</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1051"></a><tt class="py-lineno">1051</tt> <tt class="py-line"><tt class="py-docstring"> Expat end element event handler</tt> </tt>
+<a name="L1052"></a><tt class="py-lineno">1052</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1053"></a><tt class="py-lineno">1053</tt> <tt class="py-line"> </tt>
+<a name="L1054"></a><tt class="py-lineno">1054</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'hierarchy'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1055"></a><tt class="py-lineno">1055</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1056"></a><tt class="py-lineno">1056</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'node'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1057"></a><tt class="py-lineno">1057</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1058"></a><tt class="py-lineno">1058</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.CharacterData"></a><div id="UiAutomator2AndroidViewClient.CharacterData-def"><a name="L1059"></a><tt class="py-lineno">1059</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.CharacterData-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.CharacterData');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData">CharacterData</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">data</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.CharacterData-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.CharacterData-expanded"><a name="L1060"></a><tt class="py-lineno">1060</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1061"></a><tt class="py-lineno">1061</tt> <tt class="py-line"><tt class="py-docstring"> Expat character data event handler</tt> </tt>
+<a name="L1062"></a><tt class="py-lineno">1062</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1063"></a><tt class="py-lineno">1063</tt> <tt class="py-line"> </tt>
+<a name="L1064"></a><tt class="py-lineno">1064</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1065"></a><tt class="py-lineno">1065</tt> <tt class="py-line"> <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1066"></a><tt class="py-lineno">1066</tt> <tt class="py-line"> <tt class="py-name">element</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L1067"></a><tt class="py-lineno">1067</tt> <tt class="py-line"> <tt class="py-name">element</tt><tt class="py-op">.</tt><tt class="py-name">cdata</tt> <tt class="py-op">+=</tt> <tt class="py-name">data</tt> </tt>
+</div><a name="L1068"></a><tt class="py-lineno">1068</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.Parse"></a><div id="UiAutomator2AndroidViewClient.Parse-def"><a name="L1069"></a><tt class="py-lineno">1069</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.Parse-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.Parse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse">Parse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">uiautomatorxml</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.Parse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.Parse-expanded"><a name="L1070"></a><tt class="py-lineno">1070</tt> <tt class="py-line"> <tt class="py-comment"># Create an Expat parser</tt> </tt>
+<a name="L1071"></a><tt class="py-lineno">1071</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ParserCreate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1072"></a><tt class="py-lineno">1072</tt> <tt class="py-line"> <tt class="py-comment"># Set the Expat event handlers to our methods</tt> </tt>
+<a name="L1073"></a><tt class="py-lineno">1073</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">StartElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-306" class="py-name" targets="Method com.dtmilano.android.viewclient.Excerpt2Code.StartElement()=com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement,Method com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement()=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement"><a title="com.dtmilano.android.viewclient.Excerpt2Code.StartElement
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement" class="py-name" href="#" onclick="return doclink('link-306', 'StartElement', 'link-306');">StartElement</a></tt> </tt>
+<a name="L1074"></a><tt class="py-lineno">1074</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">EndElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-307" class="py-name" targets="Method com.dtmilano.android.viewclient.Excerpt2Code.EndElement()=com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement,Method com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement()=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement"><a title="com.dtmilano.android.viewclient.Excerpt2Code.EndElement
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement" class="py-name" href="#" onclick="return doclink('link-307', 'EndElement', 'link-307');">EndElement</a></tt> </tt>
+<a name="L1075"></a><tt class="py-lineno">1075</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">CharacterDataHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-308" class="py-name" targets="Method com.dtmilano.android.viewclient.Excerpt2Code.CharacterData()=com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData,Method com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData()=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData"><a title="com.dtmilano.android.viewclient.Excerpt2Code.CharacterData
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData" class="py-name" href="#" onclick="return doclink('link-308', 'CharacterData', 'link-308');">CharacterData</a></tt> </tt>
+<a name="L1076"></a><tt class="py-lineno">1076</tt> <tt class="py-line"> <tt class="py-comment"># Parse the XML File</tt> </tt>
+<a name="L1077"></a><tt class="py-lineno">1077</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1078"></a><tt class="py-lineno">1078</tt> <tt class="py-line"> <tt class="py-name">parserStatus</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-309" class="py-name" targets="Method com.dtmilano.android.viewclient.Excerpt2Code.Parse()=com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse,Method com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse()=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse"><a title="com.dtmilano.android.viewclient.Excerpt2Code.Parse
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-309', 'Parse', 'link-309');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">uiautomatorxml</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-name">encoding</tt><tt class="py-op">=</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-name">errors</tt><tt class="py-op">=</tt><tt class="py-string">'replace'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">True</tt><tt class="py-op">)</tt> </tt>
+<a name="L1079"></a><tt class="py-lineno">1079</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ExpatError</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1080"></a><tt class="py-lineno">1080</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: Offending XML:\n"</tt><tt class="py-op">,</tt> <tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">uiautomatorxml</tt><tt class="py-op">)</tt> </tt>
+<a name="L1081"></a><tt class="py-lineno">1081</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-name">ex</tt><tt class="py-op">)</tt> </tt>
+<a name="L1082"></a><tt class="py-lineno">1082</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+</div></div><a name="L1083"></a><tt class="py-lineno">1083</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code"></a><div id="Excerpt2Code-def"><a name="L1084"></a><tt class="py-lineno">1084</tt> <a class="py-toggle" href="#" id="Excerpt2Code-toggle" onclick="return toggle('Excerpt2Code');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="Excerpt2Code-expanded"><a name="L1085"></a><tt class="py-lineno">1085</tt> <tt class="py-line"> <tt class="py-docstring">''' Excerpt XML to code '''</tt> </tt>
+<a name="L1086"></a><tt class="py-lineno">1086</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.__init__"></a><div id="Excerpt2Code.__init__-def"><a name="L1087"></a><tt class="py-lineno">1087</tt> <a class="py-toggle" href="#" id="Excerpt2Code.__init__-toggle" onclick="return toggle('Excerpt2Code.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.__init__-expanded"><a name="L1088"></a><tt class="py-lineno">1088</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L1089"></a><tt class="py-lineno">1089</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.StartElement"></a><div id="Excerpt2Code.StartElement-def"><a name="L1090"></a><tt class="py-lineno">1090</tt> <a class="py-toggle" href="#" id="Excerpt2Code.StartElement-toggle" onclick="return toggle('Excerpt2Code.StartElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement">StartElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">attributes</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.StartElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.StartElement-expanded"><a name="L1091"></a><tt class="py-lineno">1091</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1092"></a><tt class="py-lineno">1092</tt> <tt class="py-line"><tt class="py-docstring"> Expat start element event handler</tt> </tt>
+<a name="L1093"></a><tt class="py-lineno">1093</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1094"></a><tt class="py-lineno">1094</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'excerpt'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1095"></a><tt class="py-lineno">1095</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1096"></a><tt class="py-lineno">1096</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1097"></a><tt class="py-lineno">1097</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Unexpected element: '%s'"</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1098"></a><tt class="py-lineno">1098</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.EndElement"></a><div id="Excerpt2Code.EndElement-def"><a name="L1099"></a><tt class="py-lineno">1099</tt> <a class="py-toggle" href="#" id="Excerpt2Code.EndElement-toggle" onclick="return toggle('Excerpt2Code.EndElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement">EndElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.EndElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.EndElement-expanded"><a name="L1100"></a><tt class="py-lineno">1100</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1101"></a><tt class="py-lineno">1101</tt> <tt class="py-line"><tt class="py-docstring"> Expat end element event handler</tt> </tt>
+<a name="L1102"></a><tt class="py-lineno">1102</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1103"></a><tt class="py-lineno">1103</tt> <tt class="py-line"> </tt>
+<a name="L1104"></a><tt class="py-lineno">1104</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'excerpt'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1105"></a><tt class="py-lineno">1105</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L1106"></a><tt class="py-lineno">1106</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.CharacterData"></a><div id="Excerpt2Code.CharacterData-def"><a name="L1107"></a><tt class="py-lineno">1107</tt> <a class="py-toggle" href="#" id="Excerpt2Code.CharacterData-toggle" onclick="return toggle('Excerpt2Code.CharacterData');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData">CharacterData</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">data</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.CharacterData-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.CharacterData-expanded"><a name="L1108"></a><tt class="py-lineno">1108</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1109"></a><tt class="py-lineno">1109</tt> <tt class="py-line"><tt class="py-docstring"> Expat character data event handler</tt> </tt>
+<a name="L1110"></a><tt class="py-lineno">1110</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1111"></a><tt class="py-lineno">1111</tt> <tt class="py-line"> </tt>
+<a name="L1112"></a><tt class="py-lineno">1112</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1113"></a><tt class="py-lineno">1113</tt> <tt class="py-line"> <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1114"></a><tt class="py-lineno">1114</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt><tt class="py-op">:</tt> </tt>
+<a name="L1115"></a><tt class="py-lineno">1115</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt> </tt>
+<a name="L1116"></a><tt class="py-lineno">1116</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1117"></a><tt class="py-lineno">1117</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">+=</tt> <tt class="py-name">data</tt> </tt>
+</div><a name="L1118"></a><tt class="py-lineno">1118</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.Parse"></a><div id="Excerpt2Code.Parse-def"><a name="L1119"></a><tt class="py-lineno">1119</tt> <a class="py-toggle" href="#" id="Excerpt2Code.Parse-toggle" onclick="return toggle('Excerpt2Code.Parse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse">Parse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">excerpt</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.Parse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.Parse-expanded"><a name="L1120"></a><tt class="py-lineno">1120</tt> <tt class="py-line"> <tt class="py-comment"># Create an Expat parser</tt> </tt>
+<a name="L1121"></a><tt class="py-lineno">1121</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ParserCreate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1122"></a><tt class="py-lineno">1122</tt> <tt class="py-line"> <tt class="py-comment"># Set the Expat event handlers to our methods</tt> </tt>
+<a name="L1123"></a><tt class="py-lineno">1123</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">StartElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-310" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.StartElement
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement" class="py-name" href="#" onclick="return doclink('link-310', 'StartElement', 'link-306');">StartElement</a></tt> </tt>
+<a name="L1124"></a><tt class="py-lineno">1124</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">EndElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-311" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.EndElement
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement" class="py-name" href="#" onclick="return doclink('link-311', 'EndElement', 'link-307');">EndElement</a></tt> </tt>
+<a name="L1125"></a><tt class="py-lineno">1125</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">CharacterDataHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-312" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.CharacterData
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData" class="py-name" href="#" onclick="return doclink('link-312', 'CharacterData', 'link-308');">CharacterData</a></tt> </tt>
+<a name="L1126"></a><tt class="py-lineno">1126</tt> <tt class="py-line"> <tt class="py-comment"># Parse the XML</tt> </tt>
+<a name="L1127"></a><tt class="py-lineno">1127</tt> <tt class="py-line"> <tt class="py-name">parserStatus</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-313" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.Parse
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-313', 'Parse', 'link-309');">Parse</a></tt><tt class="py-op">(</tt><tt id="link-314" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.excerpt()=com.dtmilano.android.viewclient.ViewClient-class.html#excerpt"><a title="com.dtmilano.android.viewclient.ViewClient.excerpt" class="py-name" href="#" onclick="return doclink('link-314', 'excerpt', 'link-314');">excerpt</a></tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1128"></a><tt class="py-lineno">1128</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> </tt>
+</div></div><a name="L1129"></a><tt class="py-lineno">1129</tt> <tt class="py-line"> </tt>
+<a name="ViewClient"></a><div id="ViewClient-def"><a name="L1130"></a><tt class="py-lineno">1130</tt> <a class="py-toggle" href="#" id="ViewClient-toggle" onclick="return toggle('ViewClient');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="ViewClient-expanded"><a name="L1131"></a><tt class="py-lineno">1131</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1132"></a><tt class="py-lineno">1132</tt> <tt class="py-line"><tt class="py-docstring"> ViewClient is a I{ViewServer} client.</tt> </tt>
+<a name="L1133"></a><tt class="py-lineno">1133</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1134"></a><tt class="py-lineno">1134</tt> <tt class="py-line"><tt class="py-docstring"> ViewServer backend</tt> </tt>
+<a name="L1135"></a><tt class="py-lineno">1135</tt> <tt class="py-line"><tt class="py-docstring"> ==================</tt> </tt>
+<a name="L1136"></a><tt class="py-lineno">1136</tt> <tt class="py-line"><tt class="py-docstring"> If not running the ViewServer is started on the target device or emulator and then the port</tt> </tt>
+<a name="L1137"></a><tt class="py-lineno">1137</tt> <tt class="py-line"><tt class="py-docstring"> mapping is created.</tt> </tt>
+<a name="L1138"></a><tt class="py-lineno">1138</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1139"></a><tt class="py-lineno">1139</tt> <tt class="py-line"><tt class="py-docstring"> UiAutomator backend</tt> </tt>
+<a name="L1140"></a><tt class="py-lineno">1140</tt> <tt class="py-line"><tt class="py-docstring"> ===================</tt> </tt>
+<a name="L1141"></a><tt class="py-lineno">1141</tt> <tt class="py-line"><tt class="py-docstring"> No service is started.</tt> </tt>
+<a name="L1142"></a><tt class="py-lineno">1142</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1143"></a><tt class="py-lineno">1143</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__init__"></a><div id="ViewClient.__init__-def"><a name="L1144"></a><tt class="py-lineno">1144</tt> <a class="py-toggle" href="#" id="ViewClient.__init__-toggle" onclick="return toggle('ViewClient.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">,</tt> <tt class="py-param">adb</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">autodump</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">localport</tt><tt class="py-op">=</tt><tt id="link-315" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-315', 'VIEW_SERVER_PORT', 'link-28');">VIEW_SERVER_PORT</a></tt><tt class="py-op">,</tt> <tt class="py-param">remoteport</tt><tt class="py-op">=</tt><tt id="link-316" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-316', 'VIEW_SERVER_PORT', 'link-28');">VIEW_SERVER_PORT</a></tt><tt class="py-op">,</tt> <tt class="py-param">startviewserver</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">ignoreuiautomatorkilled</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__init__-expanded"><a name="L1145"></a><tt class="py-lineno">1145</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1146"></a><tt class="py-lineno">1146</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L1147"></a><tt class="py-lineno">1147</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1148"></a><tt class="py-lineno">1148</tt> <tt class="py-line"><tt class="py-docstring"> @type device: MonkeyDevice</tt> </tt>
+<a name="L1149"></a><tt class="py-lineno">1149</tt> <tt class="py-line"><tt class="py-docstring"> @param device: The device running the C{View server} to which this client will connect</tt> </tt>
+<a name="L1150"></a><tt class="py-lineno">1150</tt> <tt class="py-line"><tt class="py-docstring"> @type serialno: str</tt> </tt>
+<a name="L1151"></a><tt class="py-lineno">1151</tt> <tt class="py-line"><tt class="py-docstring"> @param serialno: the serial number of the device or emulator to connect to</tt> </tt>
+<a name="L1152"></a><tt class="py-lineno">1152</tt> <tt class="py-line"><tt class="py-docstring"> @type adb: str</tt> </tt>
+<a name="L1153"></a><tt class="py-lineno">1153</tt> <tt class="py-line"><tt class="py-docstring"> @param adb: the path of the C{adb} executable or None and C{ViewClient} will try to find it</tt> </tt>
+<a name="L1154"></a><tt class="py-lineno">1154</tt> <tt class="py-line"><tt class="py-docstring"> @type autodump: boolean</tt> </tt>
+<a name="L1155"></a><tt class="py-lineno">1155</tt> <tt class="py-line"><tt class="py-docstring"> @param autodump: whether an automatic dump is performed at the end of this constructor</tt> </tt>
+<a name="L1156"></a><tt class="py-lineno">1156</tt> <tt class="py-line"><tt class="py-docstring"> @type forceviewserveruse: boolean</tt> </tt>
+<a name="L1157"></a><tt class="py-lineno">1157</tt> <tt class="py-line"><tt class="py-docstring"> @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions to use</tt> </tt>
+<a name="L1158"></a><tt class="py-lineno">1158</tt> <tt class="py-line"><tt class="py-docstring"> C{UiAutomator} are satisfied</tt> </tt>
+<a name="L1159"></a><tt class="py-lineno">1159</tt> <tt class="py-line"><tt class="py-docstring"> @type localport: int</tt> </tt>
+<a name="L1160"></a><tt class="py-lineno">1160</tt> <tt class="py-line"><tt class="py-docstring"> @param localport: the local port used in the redirection</tt> </tt>
+<a name="L1161"></a><tt class="py-lineno">1161</tt> <tt class="py-line"><tt class="py-docstring"> @type remoteport: int</tt> </tt>
+<a name="L1162"></a><tt class="py-lineno">1162</tt> <tt class="py-line"><tt class="py-docstring"> @param remoteport: the remote port used to start the C{ViewServer} in the device or</tt> </tt>
+<a name="L1163"></a><tt class="py-lineno">1163</tt> <tt class="py-line"><tt class="py-docstring"> emulator</tt> </tt>
+<a name="L1164"></a><tt class="py-lineno">1164</tt> <tt class="py-line"><tt class="py-docstring"> @type startviewserver: boolean</tt> </tt>
+<a name="L1165"></a><tt class="py-lineno">1165</tt> <tt class="py-line"><tt class="py-docstring"> @param startviewserver: Whether to start the B{global} ViewServer</tt> </tt>
+<a name="L1166"></a><tt class="py-lineno">1166</tt> <tt class="py-line"><tt class="py-docstring"> @type ignoreuiautomatorkilled: boolean</tt> </tt>
+<a name="L1167"></a><tt class="py-lineno">1167</tt> <tt class="py-line"><tt class="py-docstring"> @param ignoreuiautomatorkilled: Ignores received B{Killed} message from C{uiautomator}</tt> </tt>
+<a name="L1168"></a><tt class="py-lineno">1168</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1169"></a><tt class="py-lineno">1169</tt> <tt class="py-line"> </tt>
+<a name="L1170"></a><tt class="py-lineno">1170</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">device</tt><tt class="py-op">:</tt> </tt>
+<a name="L1171"></a><tt class="py-lineno">1171</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'Device is not connected'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1172"></a><tt class="py-lineno">1172</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L1173"></a><tt class="py-lineno">1173</tt> <tt class="py-line"> <tt class="py-string">''' The C{MonkeyDevice} device instance '''</tt> </tt>
+<a name="L1174"></a><tt class="py-lineno">1174</tt> <tt class="py-line"> </tt>
+<a name="L1175"></a><tt class="py-lineno">1175</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1176"></a><tt class="py-lineno">1176</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Serialno cannot be None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1177"></a><tt class="py-lineno">1177</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-317" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__mapSerialNo()=com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo"><a title="com.dtmilano.android.viewclient.ViewClient.__mapSerialNo" class="py-name" href="#" onclick="return doclink('link-317', '__mapSerialNo', 'link-317');">__mapSerialNo</a></tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L1178"></a><tt class="py-lineno">1178</tt> <tt class="py-line"> <tt class="py-string">''' The serial number of the device '''</tt> </tt>
+<a name="L1179"></a><tt class="py-lineno">1179</tt> <tt class="py-line"> </tt>
+<a name="L1180"></a><tt class="py-lineno">1180</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-318" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-318', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: using device with serialno"</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> </tt>
+<a name="L1181"></a><tt class="py-lineno">1181</tt> <tt class="py-line"> </tt>
+<a name="L1182"></a><tt class="py-lineno">1182</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-319" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-319', 'adb', 'link-1');">adb</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1183"></a><tt class="py-lineno">1183</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt id="link-320" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-320', 'adb', 'link-1');">adb</a></tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1184"></a><tt class="py-lineno">1184</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'adb="%s" is not executable'</tt> <tt class="py-op">%</tt> <tt id="link-321" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-321', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1185"></a><tt class="py-lineno">1185</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1186"></a><tt class="py-lineno">1186</tt> <tt class="py-line"> <tt class="py-comment"># Using adbclient we don't need adb executable yet (maybe it's needed if we want to</tt> </tt>
+<a name="L1187"></a><tt class="py-lineno">1187</tt> <tt class="py-line"> <tt class="py-comment"># start adb if not running)</tt> </tt>
+<a name="L1188"></a><tt class="py-lineno">1188</tt> <tt class="py-line"> <tt id="link-322" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-322', 'adb', 'link-1');">adb</a></tt> <tt class="py-op">=</tt> <tt id="link-323" class="py-name" targets="Class com.dtmilano.android.viewclient.ViewClient=com.dtmilano.android.viewclient.ViewClient-class.html"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-323', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-324" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath()=com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath"><a title="com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath" class="py-name" href="#" onclick="return doclink('link-324', '__obtainAdbPath', 'link-324');">__obtainAdbPath</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1189"></a><tt class="py-lineno">1189</tt> <tt class="py-line"> </tt>
+<a name="L1190"></a><tt class="py-lineno">1190</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-325" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-325', 'adb', 'link-1');">adb</a></tt> <tt class="py-op">=</tt> <tt id="link-326" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-326', 'adb', 'link-1');">adb</a></tt> </tt>
+<a name="L1191"></a><tt class="py-lineno">1191</tt> <tt class="py-line"> <tt class="py-string">''' The adb command '''</tt> </tt>
+<a name="L1192"></a><tt class="py-lineno">1192</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1193"></a><tt class="py-lineno">1193</tt> <tt class="py-line"> <tt class="py-string">''' The root node '''</tt> </tt>
+<a name="L1194"></a><tt class="py-lineno">1194</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1195"></a><tt class="py-lineno">1195</tt> <tt class="py-line"> <tt class="py-string">''' The map containing all the L{View}s indexed by their L{View.getUniqueId()} '''</tt> </tt>
+<a name="L1196"></a><tt class="py-lineno">1196</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1197"></a><tt class="py-lineno">1197</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's display properties: width, height and density '''</tt> </tt>
+<a name="L1198"></a><tt class="py-lineno">1198</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt> <tt class="py-string">'width'</tt><tt class="py-op">,</tt> <tt class="py-string">'height'</tt><tt class="py-op">,</tt> <tt class="py-string">'density'</tt> <tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1199"></a><tt class="py-lineno">1199</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1200"></a><tt class="py-lineno">1200</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-327" class="py-name"><a title="com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-327', 'USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES', 'link-31');">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1201"></a><tt class="py-lineno">1201</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1202"></a><tt class="py-lineno">1202</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-328" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-328', 'getProperty', 'link-70');">getProperty</a></tt><tt class="py-op">(</tt><tt class="py-string">'display.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1203"></a><tt class="py-lineno">1203</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1204"></a><tt class="py-lineno">1204</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-329" class="py-name"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-329', 'WARNINGS', 'link-26');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1205"></a><tt class="py-lineno">1205</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine display %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1206"></a><tt class="py-lineno">1206</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1207"></a><tt class="py-lineno">1207</tt> <tt class="py-line"> <tt class="py-comment"># these values are usually not defined as properties, so we stick to the -1 set</tt> </tt>
+<a name="L1208"></a><tt class="py-lineno">1208</tt> <tt class="py-line"> <tt class="py-comment"># before</tt> </tt>
+<a name="L1209"></a><tt class="py-lineno">1209</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1210"></a><tt class="py-lineno">1210</tt> <tt class="py-line"> </tt>
+<a name="L1211"></a><tt class="py-lineno">1211</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1212"></a><tt class="py-lineno">1212</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's build properties: version.sdk, version.release '''</tt> </tt>
+<a name="L1213"></a><tt class="py-lineno">1213</tt> <tt class="py-line"> </tt>
+<a name="L1214"></a><tt class="py-lineno">1214</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt><tt id="link-330" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-330', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">,</tt> <tt id="link-331" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY
+com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY" class="py-name" href="#" onclick="return doclink('link-331', 'VERSION_RELEASE_PROPERTY', 'link-35');">VERSION_RELEASE_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1215"></a><tt class="py-lineno">1215</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1216"></a><tt class="py-lineno">1216</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1217"></a><tt class="py-lineno">1217</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-332" class="py-name"><a title="com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-332', 'USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES', 'link-31');">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1218"></a><tt class="py-lineno">1218</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-333" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-333', 'getProperty', 'link-70');">getProperty</a></tt><tt class="py-op">(</tt><tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1219"></a><tt class="py-lineno">1219</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1220"></a><tt class="py-lineno">1220</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-334" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-334', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.build.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1221"></a><tt class="py-lineno">1221</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1222"></a><tt class="py-lineno">1222</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-335" class="py-name"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-335', 'WARNINGS', 'link-26');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1223"></a><tt class="py-lineno">1223</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine build %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1224"></a><tt class="py-lineno">1224</tt> <tt class="py-line"> </tt>
+<a name="L1225"></a><tt class="py-lineno">1225</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">prop</tt> <tt class="py-op">==</tt> <tt id="link-336" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-336', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1226"></a><tt class="py-lineno">1226</tt> <tt class="py-line"> <tt class="py-comment"># we expect it to be an int</tt> </tt>
+<a name="L1227"></a><tt class="py-lineno">1227</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-keyword">else</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1228"></a><tt class="py-lineno">1228</tt> <tt class="py-line"> </tt>
+<a name="L1229"></a><tt class="py-lineno">1229</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1230"></a><tt class="py-lineno">1230</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's ro properties: secure, debuggable '''</tt> </tt>
+<a name="L1231"></a><tt class="py-lineno">1231</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt><tt class="py-string">'secure'</tt><tt class="py-op">,</tt> <tt class="py-string">'debuggable'</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1232"></a><tt class="py-lineno">1232</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1233"></a><tt class="py-lineno">1233</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-337" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-337', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1234"></a><tt class="py-lineno">1234</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1235"></a><tt class="py-lineno">1235</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-338" class="py-name"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-338', 'WARNINGS', 'link-26');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1236"></a><tt class="py-lineno">1236</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine ro %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1237"></a><tt class="py-lineno">1237</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-string">'UNKNOWN'</tt> </tt>
+<a name="L1238"></a><tt class="py-lineno">1238</tt> <tt class="py-line"> </tt>
+<a name="L1239"></a><tt class="py-lineno">1239</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt> <tt class="py-op">=</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L1240"></a><tt class="py-lineno">1240</tt> <tt class="py-line"> <tt class="py-string">''' Force the use of ViewServer even if the conditions to use UiAutomator are satisfied '''</tt> </tt>
+<a name="L1241"></a><tt class="py-lineno">1241</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-339" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-339', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">forceviewserveruse</tt> <tt class="py-comment"># jelly bean 4.1 & 4.2</tt> </tt>
+<a name="L1242"></a><tt class="py-lineno">1242</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-340" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-340', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1243"></a><tt class="py-lineno">1243</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" ViewClient.__init__: useUiAutomator="</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">,</tt> <tt class="py-string">"sdk="</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-341" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-341', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-string">"forceviewserveruse="</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L1244"></a><tt class="py-lineno">1244</tt> <tt class="py-line"> <tt class="py-string">''' If UIAutomator is supported by the device it will be used '''</tt> </tt>
+<a name="L1245"></a><tt class="py-lineno">1245</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ignoreUiAutomatorKilled</tt> <tt class="py-op">=</tt> <tt class="py-name">ignoreuiautomatorkilled</tt> </tt>
+<a name="L1246"></a><tt class="py-lineno">1246</tt> <tt class="py-line"> <tt class="py-string">''' On some devices (i.e. Nexus 7 running 4.2.2) uiautomator is killed just after generating</tt> </tt>
+<a name="L1247"></a><tt class="py-lineno">1247</tt> <tt class="py-line"><tt class="py-string"> the dump file. In many cases the file is already complete so we can ask to ignore the 'Killed'</tt> </tt>
+<a name="L1248"></a><tt class="py-lineno">1248</tt> <tt class="py-line"><tt class="py-string"> message by setting L{ignoreuiautomatorkilled} to C{True}.</tt> </tt>
+<a name="L1249"></a><tt class="py-lineno">1249</tt> <tt class="py-line"><tt class="py-string"></tt> </tt>
+<a name="L1250"></a><tt class="py-lineno">1250</tt> <tt class="py-line"><tt class="py-string"> Changes in v2.3.21 that uses C{/dev/tty} instead of a file may have turned this variable</tt> </tt>
+<a name="L1251"></a><tt class="py-lineno">1251</tt> <tt class="py-line"><tt class="py-string"> unnecessary, however it has been kept for backward compatibility.</tt> </tt>
+<a name="L1252"></a><tt class="py-lineno">1252</tt> <tt class="py-line"><tt class="py-string"> '''</tt> </tt>
+<a name="L1253"></a><tt class="py-lineno">1253</tt> <tt class="py-line"> </tt>
+<a name="L1254"></a><tt class="py-lineno">1254</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1255"></a><tt class="py-lineno">1255</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-342" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-342', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-40');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L1256"></a><tt class="py-lineno">1256</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1257"></a><tt class="py-lineno">1257</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-343" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-343', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op"><=</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L1258"></a><tt class="py-lineno">1258</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-344" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-344', 'TEXT_PROPERTY_API_10', 'link-39');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L1259"></a><tt class="py-lineno">1259</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1260"></a><tt class="py-lineno">1260</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-345" class="py-name"><a title="com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-345', 'TEXT_PROPERTY', 'link-38');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L1261"></a><tt class="py-lineno">1261</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">startviewserver</tt><tt class="py-op">:</tt> </tt>
+<a name="L1262"></a><tt class="py-lineno">1262</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-346" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.serviceResponse()=com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse"><a title="com.dtmilano.android.viewclient.ViewClient.serviceResponse" class="py-name" href="#" onclick="return doclink('link-346', 'serviceResponse', 'link-346');">serviceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-347" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-347', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'service call window 3'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1263"></a><tt class="py-lineno">1263</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1264"></a><tt class="py-lineno">1264</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-348" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.assertServiceResponse()=com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse"><a title="com.dtmilano.android.viewclient.ViewClient.assertServiceResponse" class="py-name" href="#" onclick="return doclink('link-348', 'assertServiceResponse', 'link-348');">assertServiceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-349" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-349', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'service call window 1 i32 %d'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L1265"></a><tt class="py-lineno">1265</tt> <tt class="py-line"> <tt class="py-name">remoteport</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1266"></a><tt class="py-lineno">1266</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1267"></a><tt class="py-lineno">1267</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">'Cannot start View server.\n'</tt> \ </tt>
+<a name="L1268"></a><tt class="py-lineno">1268</tt> <tt class="py-line"> <tt class="py-string">'This only works on emulator and devices running developer versions.\n'</tt> \ </tt>
+<a name="L1269"></a><tt class="py-lineno">1269</tt> <tt class="py-line"> <tt class="py-string">'Does hierarchyviewer work on your device?\n'</tt> \ </tt>
+<a name="L1270"></a><tt class="py-lineno">1270</tt> <tt class="py-line"> <tt class="py-string">'See https://github.com/dtmilano/AndroidViewClient/wiki/Secure-mode\n\n'</tt> \ </tt>
+<a name="L1271"></a><tt class="py-lineno">1271</tt> <tt class="py-line"> <tt class="py-string">'Device properties:\n'</tt> \ </tt>
+<a name="L1272"></a><tt class="py-lineno">1272</tt> <tt class="py-line"> <tt class="py-string">' ro.secure=%s\n'</tt> \ </tt>
+<a name="L1273"></a><tt class="py-lineno">1273</tt> <tt class="py-line"> <tt class="py-string">' ro.debuggable=%s\n'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-string">'secure'</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-string">'debuggable'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1274"></a><tt class="py-lineno">1274</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">)</tt> </tt>
+<a name="L1275"></a><tt class="py-lineno">1275</tt> <tt class="py-line"> </tt>
+<a name="L1276"></a><tt class="py-lineno">1276</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt> <tt class="py-op">=</tt> <tt class="py-name">localport</tt> </tt>
+<a name="L1277"></a><tt class="py-lineno">1277</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">remotePort</tt> <tt class="py-op">=</tt> <tt class="py-name">remoteport</tt> </tt>
+<a name="L1278"></a><tt class="py-lineno">1278</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: it seems there's no way of obtaining the serialno from the MonkeyDevice</tt> </tt>
+<a name="L1279"></a><tt class="py-lineno">1279</tt> <tt class="py-line"> <tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">check_call</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-350" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-350', 'adb', 'link-1');">adb</a></tt><tt class="py-op">,</tt> <tt class="py-string">'-s'</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt class="py-string">'forward'</tt><tt class="py-op">,</tt> <tt class="py-string">'tcp:%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> </tt>
+<a name="L1280"></a><tt class="py-lineno">1280</tt> <tt class="py-line"> <tt class="py-string">'tcp:%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">remotePort</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1281"></a><tt class="py-lineno">1281</tt> <tt class="py-line"> </tt>
+<a name="L1282"></a><tt class="py-lineno">1282</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1283"></a><tt class="py-lineno">1283</tt> <tt class="py-line"> <tt class="py-string">''' The list of windows as obtained by L{ViewClient.list()} '''</tt> </tt>
+<a name="L1284"></a><tt class="py-lineno">1284</tt> <tt class="py-line"> </tt>
+<a name="L1285"></a><tt class="py-lineno">1285</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">autodump</tt><tt class="py-op">:</tt> </tt>
+<a name="L1286"></a><tt class="py-lineno">1286</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-351" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.dump()=com.dtmilano.android.viewclient.ViewClient-class.html#dump"><a title="com.dtmilano.android.viewclient.ViewClient.dump" class="py-name" href="#" onclick="return doclink('link-351', 'dump', 'link-351');">dump</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1287"></a><tt class="py-lineno">1287</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__del__"></a><div id="ViewClient.__del__-def"><a name="L1288"></a><tt class="py-lineno">1288</tt> <a class="py-toggle" href="#" id="ViewClient.__del__-toggle" onclick="return toggle('ViewClient.__del__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__del__">__del__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__del__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__del__-expanded"><a name="L1289"></a><tt class="py-lineno">1289</tt> <tt class="py-line"> <tt class="py-comment"># should clean up some things</tt> </tt>
+<a name="L1290"></a><tt class="py-lineno">1290</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L1291"></a><tt class="py-lineno">1291</tt> <tt class="py-line"> </tt>
+<a name="L1292"></a><tt class="py-lineno">1292</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__obtainAdbPath"></a><div id="ViewClient.__obtainAdbPath-def"><a name="L1293"></a><tt class="py-lineno">1293</tt> <a class="py-toggle" href="#" id="ViewClient.__obtainAdbPath-toggle" onclick="return toggle('ViewClient.__obtainAdbPath');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath">__obtainAdbPath</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__obtainAdbPath-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__obtainAdbPath-expanded"><a name="L1294"></a><tt class="py-lineno">1294</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1295"></a><tt class="py-lineno">1295</tt> <tt class="py-line"><tt class="py-docstring"> Obtains the ADB path attempting know locations for different OSs</tt> </tt>
+<a name="L1296"></a><tt class="py-lineno">1296</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1297"></a><tt class="py-lineno">1297</tt> <tt class="py-line"> </tt>
+<a name="L1298"></a><tt class="py-lineno">1298</tt> <tt class="py-line"> <tt class="py-name">osName</tt> <tt class="py-op">=</tt> <tt class="py-name">platform</tt><tt class="py-op">.</tt><tt class="py-name">system</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1299"></a><tt class="py-lineno">1299</tt> <tt class="py-line"> <tt class="py-name">isWindows</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L1300"></a><tt class="py-lineno">1300</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1301"></a><tt class="py-lineno">1301</tt> <tt class="py-line"> <tt id="link-352" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-352', 'adb', 'link-1');">adb</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'adb.exe'</tt> </tt>
+<a name="L1302"></a><tt class="py-lineno">1302</tt> <tt class="py-line"> <tt class="py-name">isWindows</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1303"></a><tt class="py-lineno">1303</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1304"></a><tt class="py-lineno">1304</tt> <tt class="py-line"> <tt id="link-353" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-353', 'adb', 'link-1');">adb</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'adb'</tt> </tt>
+<a name="L1305"></a><tt class="py-lineno">1305</tt> <tt class="py-line"> </tt>
+<a name="L1306"></a><tt class="py-lineno">1306</tt> <tt class="py-line"> <tt class="py-name">ANDROID_HOME</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_HOME'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'ANDROID_HOME'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">'/opt/android-sdk'</tt> </tt>
+<a name="L1307"></a><tt class="py-lineno">1307</tt> <tt class="py-line"> <tt class="py-name">HOME</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'HOME'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'HOME'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1308"></a><tt class="py-lineno">1308</tt> <tt class="py-line"> </tt>
+<a name="L1309"></a><tt class="py-lineno">1309</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">ANDROID_HOME</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-354" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-354', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1310"></a><tt class="py-lineno">1310</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-355" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-355', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1311"></a><tt class="py-lineno">1311</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-356" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-356', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1312"></a><tt class="py-lineno">1312</tt> <tt class="py-line"> <tt id="link-357" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-357', 'adb', 'link-1');">adb</a></tt><tt class="py-op">,</tt> </tt>
+<a name="L1313"></a><tt class="py-lineno">1313</tt> <tt class="py-line"> <tt class="py-op">]</tt> </tt>
+<a name="L1314"></a><tt class="py-lineno">1314</tt> <tt class="py-line"> </tt>
+<a name="L1315"></a><tt class="py-lineno">1315</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1316"></a><tt class="py-lineno">1316</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"""C:\Program Files\Android\android-sdk\platform-tools"""</tt><tt class="py-op">,</tt> <tt id="link-358" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-358', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1317"></a><tt class="py-lineno">1317</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"""C:\Program Files (x86)\Android\android-sdk\platform-tools"""</tt><tt class="py-op">,</tt> <tt id="link-359" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-359', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1318"></a><tt class="py-lineno">1318</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Linux'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1319"></a><tt class="py-lineno">1319</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-360" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-360', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1320"></a><tt class="py-lineno">1320</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-361" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-361', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1321"></a><tt class="py-lineno">1321</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-362" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-362', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1322"></a><tt class="py-lineno">1322</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Mac'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1323"></a><tt class="py-lineno">1323</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-363" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-363', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1324"></a><tt class="py-lineno">1324</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-364" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-364', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1325"></a><tt class="py-lineno">1325</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-365" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-365', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1326"></a><tt class="py-lineno">1326</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-366" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-366', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1327"></a><tt class="py-lineno">1327</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt id="link-367" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-367', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1328"></a><tt class="py-lineno">1328</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1329"></a><tt class="py-lineno">1329</tt> <tt class="py-line"> <tt class="py-comment"># Unsupported OS</tt> </tt>
+<a name="L1330"></a><tt class="py-lineno">1330</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1331"></a><tt class="py-lineno">1331</tt> <tt class="py-line"> </tt>
+<a name="L1332"></a><tt class="py-lineno">1332</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">exeFile</tt> <tt class="py-keyword">in</tt> <tt class="py-name">possibleChoices</tt><tt class="py-op">:</tt> </tt>
+<a name="L1333"></a><tt class="py-lineno">1333</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt class="py-name">exeFile</tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1334"></a><tt class="py-lineno">1334</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">exeFile</tt> </tt>
+<a name="L1335"></a><tt class="py-lineno">1335</tt> <tt class="py-line"> </tt>
+<a name="L1336"></a><tt class="py-lineno">1336</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">path</tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">"PATH"</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">pathsep</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1337"></a><tt class="py-lineno">1337</tt> <tt class="py-line"> <tt class="py-name">exeFile</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt id="link-368" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-368', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1338"></a><tt class="py-lineno">1338</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">exeFile</tt> <tt class="py-op">!=</tt> <tt class="py-name">None</tt> <tt class="py-keyword">and</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt class="py-name">exeFile</tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">isWindows</tt> <tt class="py-keyword">else</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">F_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1339"></a><tt class="py-lineno">1339</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">exeFile</tt> </tt>
+<a name="L1340"></a><tt class="py-lineno">1340</tt> <tt class="py-line"> </tt>
+<a name="L1341"></a><tt class="py-lineno">1341</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'adb="%s" is not executable. Did you forget to set ANDROID_HOME in the environment?'</tt> <tt class="py-op">%</tt> <tt id="link-369" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-369', 'adb', 'link-1');">adb</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1342"></a><tt class="py-lineno">1342</tt> <tt class="py-line"> </tt>
+<a name="L1343"></a><tt class="py-lineno">1343</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__mapSerialNo"></a><div id="ViewClient.__mapSerialNo-def"><a name="L1344"></a><tt class="py-lineno">1344</tt> <a class="py-toggle" href="#" id="ViewClient.__mapSerialNo-toggle" onclick="return toggle('ViewClient.__mapSerialNo');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo">__mapSerialNo</a><tt class="py-op">(</tt><tt class="py-param">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__mapSerialNo-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__mapSerialNo-expanded"><a name="L1345"></a><tt class="py-lineno">1345</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1346"></a><tt class="py-lineno">1346</tt> <tt class="py-line"> <tt class="py-comment">#ipRE = re.compile('^\d+\.\d+.\d+.\d+$')</tt> </tt>
+<a name="L1347"></a><tt class="py-lineno">1347</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-370" class="py-name"><a title="com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-370', 'IP_RE', 'link-56');">IP_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1348"></a><tt class="py-lineno">1348</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-371" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-371', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: adding default port to serialno"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt id="link-372" class="py-name"><a title="com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-372', 'ADB_DEFAULT_PORT', 'link-29');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1349"></a><tt class="py-lineno">1349</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> <tt class="py-op">+</tt> <tt class="py-string">':%d'</tt> <tt class="py-op">%</tt> <tt id="link-373" class="py-name"><a title="com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-373', 'ADB_DEFAULT_PORT', 'link-29');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1350"></a><tt class="py-lineno">1350</tt> <tt class="py-line"> </tt>
+<a name="L1351"></a><tt class="py-lineno">1351</tt> <tt class="py-line"> <tt class="py-name">ipPortRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^\d+\.\d+.\d+.\d+:\d+$'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1352"></a><tt class="py-lineno">1352</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">ipPortRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1353"></a><tt class="py-lineno">1353</tt> <tt class="py-line"> <tt class="py-comment"># nothing to map</tt> </tt>
+<a name="L1354"></a><tt class="py-lineno">1354</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1355"></a><tt class="py-lineno">1355</tt> <tt class="py-line"> </tt>
+<a name="L1356"></a><tt class="py-lineno">1356</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"[.*()+]"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1357"></a><tt class="py-lineno">1357</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Regular expression not supported as serialno in ViewClient"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1358"></a><tt class="py-lineno">1358</tt> <tt class="py-line"> </tt>
+<a name="L1359"></a><tt class="py-lineno">1359</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1360"></a><tt class="py-lineno">1360</tt> <tt class="py-line"> </tt>
+<a name="L1361"></a><tt class="py-lineno">1361</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__obtainDeviceSerialNumber"></a><div id="ViewClient.__obtainDeviceSerialNumber-def"><a name="L1362"></a><tt class="py-lineno">1362</tt> <a class="py-toggle" href="#" id="ViewClient.__obtainDeviceSerialNumber-toggle" onclick="return toggle('ViewClient.__obtainDeviceSerialNumber');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber">__obtainDeviceSerialNumber</a><tt class="py-op">(</tt><tt class="py-param">device</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__obtainDeviceSerialNumber-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__obtainDeviceSerialNumber-expanded"><a name="L1363"></a><tt class="py-lineno">1363</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-374" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-374', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: obtaining serial number for connected device"</tt> </tt>
+<a name="L1364"></a><tt class="py-lineno">1364</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-375" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-375', 'getProperty', 'link-70');">getProperty</a></tt><tt class="py-op">(</tt><tt class="py-string">'ro.serialno'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1365"></a><tt class="py-lineno">1365</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1366"></a><tt class="py-lineno">1366</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-376" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-376', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.serialno'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1367"></a><tt class="py-lineno">1367</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1368"></a><tt class="py-lineno">1368</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1369"></a><tt class="py-lineno">1369</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1370"></a><tt class="py-lineno">1370</tt> <tt class="py-line"> <tt class="py-name">qemu</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-377" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-377', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.kernel.qemu'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1371"></a><tt class="py-lineno">1371</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">qemu</tt><tt class="py-op">:</tt> </tt>
+<a name="L1372"></a><tt class="py-lineno">1372</tt> <tt class="py-line"> <tt class="py-name">qemu</tt> <tt class="py-op">=</tt> <tt class="py-name">qemu</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1373"></a><tt class="py-lineno">1373</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">qemu</tt> <tt class="py-keyword">and</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">qemu</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L1374"></a><tt class="py-lineno">1374</tt> <tt class="py-line"> <tt class="py-comment"># FIXME !!!!!</tt> </tt>
+<a name="L1375"></a><tt class="py-lineno">1375</tt> <tt class="py-line"> <tt class="py-comment"># this must be calculated from somewhere, though using a fixed serialno for now</tt> </tt>
+<a name="L1376"></a><tt class="py-lineno">1376</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Running on emulator but no serial number was specified then 'emulator-5554' is used"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1377"></a><tt class="py-lineno">1377</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-string">'emulator-5554'</tt> </tt>
+<a name="L1378"></a><tt class="py-lineno">1378</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1379"></a><tt class="py-lineno">1379</tt> <tt class="py-line"> <tt class="py-comment"># If there's only one device connected get its serialno</tt> </tt>
+<a name="L1380"></a><tt class="py-lineno">1380</tt> <tt class="py-line"> <tt id="link-378" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-378', 'adb', 'link-1');">adb</a></tt> <tt class="py-op">=</tt> <tt id="link-379" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-379', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-380" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath" class="py-name" href="#" onclick="return doclink('link-380', '__obtainAdbPath', 'link-324');">__obtainAdbPath</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1381"></a><tt class="py-lineno">1381</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-381" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-381', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" using adb=%s"</tt> <tt class="py-op">%</tt> <tt id="link-382" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-382', 'adb', 'link-1');">adb</a></tt> </tt>
+<a name="L1382"></a><tt class="py-lineno">1382</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">Popen</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt id="link-383" class="py-name"><a title="com.dtmilano.android.adb" class="py-name" href="#" onclick="return doclink('link-383', 'adb', 'link-1');">adb</a></tt><tt class="py-op">,</tt> <tt class="py-string">'get-serialno'</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">stdout</tt><tt class="py-op">=</tt><tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">PIPE</tt><tt class="py-op">,</tt> <tt class="py-name">stderr</tt><tt class="py-op">=</tt><tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">PIPE</tt><tt class="py-op">,</tt> <tt class="py-name">env</tt><tt class="py-op">=</tt><tt class="py-op">{</tt><tt class="py-op">}</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">communicate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L1383"></a><tt class="py-lineno">1383</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt> <tt class="py-op">!=</tt> <tt class="py-string">'unknown'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1384"></a><tt class="py-lineno">1384</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">s</tt> </tt>
+<a name="L1385"></a><tt class="py-lineno">1385</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-384" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-384', 'DEBUG_DEVICE', 'link-4');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" serialno=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1386"></a><tt class="py-lineno">1386</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1387"></a><tt class="py-lineno">1387</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't obtain the serialno of the connected device"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1388"></a><tt class="py-lineno">1388</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1389"></a><tt class="py-lineno">1389</tt> <tt class="py-line"> </tt>
+<a name="L1390"></a><tt class="py-lineno">1390</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.setAlarm"></a><div id="ViewClient.setAlarm-def"><a name="L1391"></a><tt class="py-lineno">1391</tt> <a class="py-toggle" href="#" id="ViewClient.setAlarm-toggle" onclick="return toggle('ViewClient.setAlarm');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm">setAlarm</a><tt class="py-op">(</tt><tt class="py-param">timeout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setAlarm-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setAlarm-expanded"><a name="L1392"></a><tt class="py-lineno">1392</tt> <tt class="py-line"> <tt class="py-name">osName</tt> <tt class="py-op">=</tt> <tt class="py-name">platform</tt><tt class="py-op">.</tt><tt class="py-name">system</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1393"></a><tt class="py-lineno">1393</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> <tt class="py-comment"># alarm is not implemented in Windows</tt> </tt>
+<a name="L1394"></a><tt class="py-lineno">1394</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L1395"></a><tt class="py-lineno">1395</tt> <tt class="py-line"> <tt class="py-name">signal</tt><tt class="py-op">.</tt><tt class="py-name">alarm</tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1396"></a><tt class="py-lineno">1396</tt> <tt class="py-line"> </tt>
+<a name="L1397"></a><tt class="py-lineno">1397</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.connectToDeviceOrExit"></a><div id="ViewClient.connectToDeviceOrExit-def"><a name="L1398"></a><tt class="py-lineno">1398</tt> <a class="py-toggle" href="#" id="ViewClient.connectToDeviceOrExit-toggle" onclick="return toggle('ViewClient.connectToDeviceOrExit');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit">connectToDeviceOrExit</a><tt class="py-op">(</tt><tt class="py-param">timeout</tt><tt class="py-op">=</tt><tt class="py-number">60</tt><tt class="py-op">,</tt> <tt class="py-param">verbose</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">ignoresecuredevice</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.connectToDeviceOrExit-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.connectToDeviceOrExit-expanded"><a name="L1399"></a><tt class="py-lineno">1399</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1400"></a><tt class="py-lineno">1400</tt> <tt class="py-line"><tt class="py-docstring"> Connects to a device which serial number is obtained from the script arguments if available</tt> </tt>
+<a name="L1401"></a><tt class="py-lineno">1401</tt> <tt class="py-line"><tt class="py-docstring"> or using the default regex C{.*}.</tt> </tt>
+<a name="L1402"></a><tt class="py-lineno">1402</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1403"></a><tt class="py-lineno">1403</tt> <tt class="py-line"><tt class="py-docstring"> If the connection is not successful the script exits.</tt> </tt>
+<a name="L1404"></a><tt class="py-lineno">1404</tt> <tt class="py-line"><tt class="py-docstring"> L{MonkeyRunner.waitForConnection()} returns a L{MonkeyDevice} even if the connection failed.</tt> </tt>
+<a name="L1405"></a><tt class="py-lineno">1405</tt> <tt class="py-line"><tt class="py-docstring"> Then, to detect this situation, C{device.wake()} is attempted and if it fails then it is</tt> </tt>
+<a name="L1406"></a><tt class="py-lineno">1406</tt> <tt class="py-line"><tt class="py-docstring"> assumed the previous connection failed.</tt> </tt>
+<a name="L1407"></a><tt class="py-lineno">1407</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1408"></a><tt class="py-lineno">1408</tt> <tt class="py-line"><tt class="py-docstring"> @type timeout: int</tt> </tt>
+<a name="L1409"></a><tt class="py-lineno">1409</tt> <tt class="py-line"><tt class="py-docstring"> @param timeout: timeout for the connection</tt> </tt>
+<a name="L1410"></a><tt class="py-lineno">1410</tt> <tt class="py-line"><tt class="py-docstring"> @type verbose: bool</tt> </tt>
+<a name="L1411"></a><tt class="py-lineno">1411</tt> <tt class="py-line"><tt class="py-docstring"> @param verbose: Verbose output</tt> </tt>
+<a name="L1412"></a><tt class="py-lineno">1412</tt> <tt class="py-line"><tt class="py-docstring"> @type ignoresecuredevice: bool</tt> </tt>
+<a name="L1413"></a><tt class="py-lineno">1413</tt> <tt class="py-line"><tt class="py-docstring"> @param ignoresecuredevice: Ignores the check for a secure device</tt> </tt>
+<a name="L1414"></a><tt class="py-lineno">1414</tt> <tt class="py-line"><tt class="py-docstring"> @type serialno: str</tt> </tt>
+<a name="L1415"></a><tt class="py-lineno">1415</tt> <tt class="py-line"><tt class="py-docstring"> @param serialno: The device or emulator serial number</tt> </tt>
+<a name="L1416"></a><tt class="py-lineno">1416</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1417"></a><tt class="py-lineno">1417</tt> <tt class="py-line"><tt class="py-docstring"> @return: the device and serialno used for the connection</tt> </tt>
+<a name="L1418"></a><tt class="py-lineno">1418</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1419"></a><tt class="py-lineno">1419</tt> <tt class="py-line"> </tt>
+<a name="L1420"></a><tt class="py-lineno">1420</tt> <tt class="py-line"> <tt class="py-name">progname</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">basename</tt><tt class="py-op">(</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1421"></a><tt class="py-lineno">1421</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">serialno</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L1422"></a><tt class="py-lineno">1422</tt> <tt class="py-line"> <tt class="py-comment"># eat all the extra options the invoking script may have added</tt> </tt>
+<a name="L1423"></a><tt class="py-lineno">1423</tt> <tt class="py-line"> <tt class="py-name">args</tt> <tt class="py-op">=</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt> </tt>
+<a name="L1424"></a><tt class="py-lineno">1424</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">args</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">1</tt> <tt class="py-keyword">and</tt> <tt class="py-name">args</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'-'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1425"></a><tt class="py-lineno">1425</tt> <tt class="py-line"> <tt class="py-name">args</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1426"></a><tt class="py-lineno">1426</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">args</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">args</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">1</tt> <tt class="py-keyword">else</tt> \ </tt>
+<a name="L1427"></a><tt class="py-lineno">1427</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_SERIAL'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'ANDROID_SERIAL'</tt><tt class="py-op">)</tt> \ </tt>
+<a name="L1428"></a><tt class="py-lineno">1428</tt> <tt class="py-line"> <tt class="py-keyword">else</tt> <tt class="py-string">'.*'</tt> </tt>
+<a name="L1429"></a><tt class="py-lineno">1429</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-385" class="py-name"><a title="com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-385', 'IP_RE', 'link-56');">IP_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1430"></a><tt class="py-lineno">1430</tt> <tt class="py-line"> <tt class="py-comment"># If matches an IP address format and port was not specified add the default</tt> </tt>
+<a name="L1431"></a><tt class="py-lineno">1431</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">+=</tt> <tt class="py-string">':%d'</tt> <tt class="py-op">%</tt> <tt id="link-386" class="py-name"><a title="com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-386', 'ADB_DEFAULT_PORT', 'link-29');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1432"></a><tt class="py-lineno">1432</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1433"></a><tt class="py-lineno">1433</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Connecting to a device with serialno=%s with a timeout of %d secs...'</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L1434"></a><tt class="py-lineno">1434</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt class="py-name">timeout</tt><tt class="py-op">)</tt> </tt>
+<a name="L1435"></a><tt class="py-lineno">1435</tt> <tt class="py-line"> <tt id="link-387" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-387', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-388" class="py-name" targets="Static Method com.dtmilano.android.adb.adbclient.AdbClient.setAlarm()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#setAlarm,Static Method com.dtmilano.android.viewclient.ViewClient.setAlarm()=com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-388', 'setAlarm', 'link-388');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">+</tt><tt class="py-number">5</tt><tt class="py-op">)</tt> </tt>
+<a name="L1436"></a><tt class="py-lineno">1436</tt> <tt class="py-line"> <tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt id="link-389" class="py-name"><a title="com.dtmilano.android.adb.adbclient" class="py-name" href="#" onclick="return doclink('link-389', 'adbclient', 'link-2');">adbclient</a></tt><tt class="py-op">.</tt><tt id="link-390" class="py-name" targets="Class com.dtmilano.android.adb.adbclient.AdbClient=com.dtmilano.android.adb.adbclient.AdbClient-class.html"><a title="com.dtmilano.android.adb.adbclient.AdbClient" class="py-name" href="#" onclick="return doclink('link-390', 'AdbClient', 'link-390');">AdbClient</a></tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L1437"></a><tt class="py-lineno">1437</tt> <tt class="py-line"> <tt id="link-391" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-391', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-392" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-392', 'setAlarm', 'link-388');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1438"></a><tt class="py-lineno">1438</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1439"></a><tt class="py-lineno">1439</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Connected to device with serialno=%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1440"></a><tt class="py-lineno">1440</tt> <tt class="py-line"> <tt class="py-name">secure</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-393" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.getSystemProperty()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSystemProperty"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getSystemProperty" class="py-name" href="#" onclick="return doclink('link-393', 'getSystemProperty', 'link-393');">getSystemProperty</a></tt><tt class="py-op">(</tt><tt class="py-string">'ro.secure'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1441"></a><tt class="py-lineno">1441</tt> <tt class="py-line"> <tt class="py-name">debuggable</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-394" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getSystemProperty" class="py-name" href="#" onclick="return doclink('link-394', 'getSystemProperty', 'link-393');">getSystemProperty</a></tt><tt class="py-op">(</tt><tt class="py-string">'ro.debuggable'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1442"></a><tt class="py-lineno">1442</tt> <tt class="py-line"> <tt class="py-name">versionProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-395" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.getProperty" class="py-name" href="#" onclick="return doclink('link-395', 'getProperty', 'link-70');">getProperty</a></tt><tt class="py-op">(</tt><tt id="link-396" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-396', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1443"></a><tt class="py-lineno">1443</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">versionProperty</tt><tt class="py-op">:</tt> </tt>
+<a name="L1444"></a><tt class="py-lineno">1444</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">versionProperty</tt><tt class="py-op">)</tt> </tt>
+<a name="L1445"></a><tt class="py-lineno">1445</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1446"></a><tt class="py-lineno">1446</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1447"></a><tt class="py-lineno">1447</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"Couldn't obtain device SDK version"</tt> </tt>
+<a name="L1448"></a><tt class="py-lineno">1448</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1449"></a><tt class="py-lineno">1449</tt> <tt class="py-line"> </tt>
+<a name="L1450"></a><tt class="py-lineno">1450</tt> <tt class="py-line"> <tt class="py-comment"># we are going to use UiAutomator for versions >= 16 that's why we ignore if the device</tt> </tt>
+<a name="L1451"></a><tt class="py-lineno">1451</tt> <tt class="py-line"> <tt class="py-comment"># is secure if this is true</tt> </tt>
+<a name="L1452"></a><tt class="py-lineno">1452</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">secure</tt> <tt class="py-op">==</tt> <tt class="py-string">'1'</tt> <tt class="py-keyword">and</tt> <tt class="py-name">debuggable</tt> <tt class="py-op">==</tt> <tt class="py-string">'0'</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">ignoresecuredevice</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">16</tt><tt class="py-op">:</tt> </tt>
+<a name="L1453"></a><tt class="py-lineno">1453</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"%s: ERROR: Device is secure, AndroidViewClient won't work."</tt> <tt class="py-op">%</tt> <tt class="py-name">progname</tt> </tt>
+<a name="L1454"></a><tt class="py-lineno">1454</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1455"></a><tt class="py-lineno">1455</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" secure=%s debuggable=%s version=%d ignoresecuredevice=%s"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L1456"></a><tt class="py-lineno">1456</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">secure</tt><tt class="py-op">,</tt> <tt class="py-name">debuggable</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">ignoresecuredevice</tt><tt class="py-op">)</tt> </tt>
+<a name="L1457"></a><tt class="py-lineno">1457</tt> <tt class="py-line"> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">exit</tt><tt class="py-op">(</tt><tt class="py-number">2</tt><tt class="py-op">)</tt> </tt>
+<a name="L1458"></a><tt class="py-lineno">1458</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"[.*()+]"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"(\d{1,3}\.){3}\d{1,3}"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1459"></a><tt class="py-lineno">1459</tt> <tt class="py-line"> <tt class="py-comment"># if a regex was used we have to determine the serialno used</tt> </tt>
+<a name="L1460"></a><tt class="py-lineno">1460</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt id="link-397" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-397', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-398" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__obtainDeviceSerialNumber()=com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber"><a title="com.dtmilano.android.viewclient.ViewClient.__obtainDeviceSerialNumber" class="py-name" href="#" onclick="return doclink('link-398', '__obtainDeviceSerialNumber', 'link-398');">__obtainDeviceSerialNumber</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">)</tt> </tt>
+<a name="L1461"></a><tt class="py-lineno">1461</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1462"></a><tt class="py-lineno">1462</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Actual device serialno=%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1463"></a><tt class="py-lineno">1463</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1464"></a><tt class="py-lineno">1464</tt> <tt class="py-line"> </tt>
+<a name="L1465"></a><tt class="py-lineno">1465</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdAndText"></a><div id="ViewClient.traverseShowClassIdAndText-def"><a name="L1466"></a><tt class="py-lineno">1466</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdAndText-toggle" onclick="return toggle('ViewClient.traverseShowClassIdAndText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText">traverseShowClassIdAndText</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">,</tt> <tt class="py-param">extraInfo</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">noextrainfo</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdAndText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdAndText-expanded"><a name="L1467"></a><tt class="py-lineno">1467</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1468"></a><tt class="py-lineno">1468</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1469"></a><tt class="py-lineno">1469</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1470"></a><tt class="py-lineno">1470</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1471"></a><tt class="py-lineno">1471</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1472"></a><tt class="py-lineno">1472</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1473"></a><tt class="py-lineno">1473</tt> <tt class="py-line"><tt class="py-docstring"> @type extraInfo: method</tt> </tt>
+<a name="L1474"></a><tt class="py-lineno">1474</tt> <tt class="py-line"><tt class="py-docstring"> @param extraInfo: the View method to add extra info</tt> </tt>
+<a name="L1475"></a><tt class="py-lineno">1475</tt> <tt class="py-line"><tt class="py-docstring"> @type noextrainfo: bool</tt> </tt>
+<a name="L1476"></a><tt class="py-lineno">1476</tt> <tt class="py-line"><tt class="py-docstring"> @param noextrainfo: Don't add extra info</tt> </tt>
+<a name="L1477"></a><tt class="py-lineno">1477</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1478"></a><tt class="py-lineno">1478</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available</tt> </tt>
+<a name="L1479"></a><tt class="py-lineno">1479</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1480"></a><tt class="py-lineno">1480</tt> <tt class="py-line"> </tt>
+<a name="L1481"></a><tt class="py-lineno">1481</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1482"></a><tt class="py-lineno">1482</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1483"></a><tt class="py-lineno">1483</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">extraInfo</tt><tt class="py-op">:</tt> </tt>
+<a name="L1484"></a><tt class="py-lineno">1484</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-name">extraInfo</tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-399" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-399', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1485"></a><tt class="py-lineno">1485</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">eis</tt> <tt class="py-keyword">and</tt> <tt class="py-name">noextrainfo</tt><tt class="py-op">:</tt> </tt>
+<a name="L1486"></a><tt class="py-lineno">1486</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-name">noextrainfo</tt> </tt>
+<a name="L1487"></a><tt class="py-lineno">1487</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">eis</tt><tt class="py-op">:</tt> </tt>
+<a name="L1488"></a><tt class="py-lineno">1488</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">eis</tt> </tt>
+<a name="L1489"></a><tt class="py-lineno">1489</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"%s %s %s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-400" class="py-name"><a title="com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-400', 'getClass', 'link-133');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-401" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-401', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-402" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getText()=com.dtmilano.android.viewclient.View-class.html#getText"><a title="com.dtmilano.android.viewclient.View.getText" class="py-name" href="#" onclick="return doclink('link-402', 'getText', 'link-402');">getText</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">eis</tt><tt class="py-op">)</tt> </tt>
+<a name="L1490"></a><tt class="py-lineno">1490</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">Exception</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">:</tt> </tt>
+<a name="L1491"></a><tt class="py-lineno">1491</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"Exception in view=%s: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-403" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__smallStr__()=com.dtmilano.android.viewclient.View-class.html#__smallStr__"><a title="com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-403', '__smallStr__', 'link-403');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1492"></a><tt class="py-lineno">1492</tt> <tt class="py-line"> </tt>
+<a name="L1493"></a><tt class="py-lineno">1493</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndUniqueId"></a><div id="ViewClient.traverseShowClassIdTextAndUniqueId-def"><a name="L1494"></a><tt class="py-lineno">1494</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndUniqueId-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndUniqueId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId">traverseShowClassIdTextAndUniqueId</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndUniqueId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndUniqueId-expanded"><a name="L1495"></a><tt class="py-lineno">1495</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1496"></a><tt class="py-lineno">1496</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id, text if available and unique id.</tt> </tt>
+<a name="L1497"></a><tt class="py-lineno">1497</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1498"></a><tt class="py-lineno">1498</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1499"></a><tt class="py-lineno">1499</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1500"></a><tt class="py-lineno">1500</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1501"></a><tt class="py-lineno">1501</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available and unique Id</tt> </tt>
+<a name="L1502"></a><tt class="py-lineno">1502</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1503"></a><tt class="py-lineno">1503</tt> <tt class="py-line"> </tt>
+<a name="L1504"></a><tt class="py-lineno">1504</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-404" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-404', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-405" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText()=com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-405', 'traverseShowClassIdAndText', 'link-405');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-406" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-406', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-407" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-407', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1505"></a><tt class="py-lineno">1505</tt> <tt class="py-line"> </tt>
+<a name="L1506"></a><tt class="py-lineno">1506</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndContentDescription"></a><div id="ViewClient.traverseShowClassIdTextAndContentDescription-def"><a name="L1507"></a><tt class="py-lineno">1507</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndContentDescription-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription">traverseShowClassIdTextAndContentDescription</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndContentDescription-expanded"><a name="L1508"></a><tt class="py-lineno">1508</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1509"></a><tt class="py-lineno">1509</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id, text if available and unique id.</tt> </tt>
+<a name="L1510"></a><tt class="py-lineno">1510</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1511"></a><tt class="py-lineno">1511</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1512"></a><tt class="py-lineno">1512</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1513"></a><tt class="py-lineno">1513</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1514"></a><tt class="py-lineno">1514</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available and the content description</tt> </tt>
+<a name="L1515"></a><tt class="py-lineno">1515</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1516"></a><tt class="py-lineno">1516</tt> <tt class="py-line"> </tt>
+<a name="L1517"></a><tt class="py-lineno">1517</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-408" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-408', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-409" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-409', 'traverseShowClassIdAndText', 'link-405');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-410" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-410', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-411" class="py-name" targets="Method com.dtmilano.android.viewclient.View.getContentDescription()=com.dtmilano.android.viewclient.View-class.html#getContentDescription"><a title="com.dtmilano.android.viewclient.View.getContentDescription" class="py-name" href="#" onclick="return doclink('link-411', 'getContentDescription', 'link-411');">getContentDescription</a></tt><tt class="py-op">,</tt> <tt class="py-string">'NAF'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1518"></a><tt class="py-lineno">1518</tt> <tt class="py-line"> </tt>
+<a name="L1519"></a><tt class="py-lineno">1519</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndCenter"></a><div id="ViewClient.traverseShowClassIdTextAndCenter-def"><a name="L1520"></a><tt class="py-lineno">1520</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndCenter-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndCenter');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter">traverseShowClassIdTextAndCenter</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndCenter-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndCenter-expanded"><a name="L1521"></a><tt class="py-lineno">1521</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1522"></a><tt class="py-lineno">1522</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1523"></a><tt class="py-lineno">1523</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1524"></a><tt class="py-lineno">1524</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1525"></a><tt class="py-lineno">1525</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1526"></a><tt class="py-lineno">1526</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1527"></a><tt class="py-lineno">1527</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available</tt> </tt>
+<a name="L1528"></a><tt class="py-lineno">1528</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1529"></a><tt class="py-lineno">1529</tt> <tt class="py-line"> </tt>
+<a name="L1530"></a><tt class="py-lineno">1530</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-412" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-412', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-413" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-413', 'traverseShowClassIdAndText', 'link-405');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-414" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-414', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-415" class="py-name"><a title="com.dtmilano.android.viewclient.View.getCenter" class="py-name" href="#" onclick="return doclink('link-415', 'getCenter', 'link-259');">getCenter</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1531"></a><tt class="py-lineno">1531</tt> <tt class="py-line"> </tt>
+<a name="L1532"></a><tt class="py-lineno">1532</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextPositionAndSize"></a><div id="ViewClient.traverseShowClassIdTextPositionAndSize-def"><a name="L1533"></a><tt class="py-lineno">1533</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextPositionAndSize-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextPositionAndSize');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize">traverseShowClassIdTextPositionAndSize</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextPositionAndSize-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextPositionAndSize-expanded"><a name="L1534"></a><tt class="py-lineno">1534</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1535"></a><tt class="py-lineno">1535</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1536"></a><tt class="py-lineno">1536</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1537"></a><tt class="py-lineno">1537</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1538"></a><tt class="py-lineno">1538</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1539"></a><tt class="py-lineno">1539</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1540"></a><tt class="py-lineno">1540</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available</tt> </tt>
+<a name="L1541"></a><tt class="py-lineno">1541</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1542"></a><tt class="py-lineno">1542</tt> <tt class="py-line"> </tt>
+<a name="L1543"></a><tt class="py-lineno">1543</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-416" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-416', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-417" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-417', 'traverseShowClassIdAndText', 'link-405');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-418" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-418', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-419" class="py-name"><a title="com.dtmilano.android.viewclient.View.getPositionAndSize" class="py-name" href="#" onclick="return doclink('link-419', 'getPositionAndSize', 'link-276');">getPositionAndSize</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1544"></a><tt class="py-lineno">1544</tt> <tt class="py-line"> </tt>
+<a name="L1545"></a><tt class="py-lineno">1545</tt> <tt class="py-line"> <tt class="py-comment"># methods that can be used to transform ViewClient.traverse output</tt> </tt>
+<a name="L1546"></a><tt class="py-lineno">1546</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CIT</tt> <tt class="py-op">=</tt> <tt id="link-420" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-420', 'traverseShowClassIdAndText', 'link-405');">traverseShowClassIdAndText</a></tt> </tt>
+<a name="L1547"></a><tt class="py-lineno">1547</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdAndText(view)} '''</tt> </tt>
+<a name="L1548"></a><tt class="py-lineno">1548</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITUI</tt> <tt class="py-op">=</tt> <tt id="link-421" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndUniqueId()=com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndUniqueId" class="py-name" href="#" onclick="return doclink('link-421', 'traverseShowClassIdTextAndUniqueId', 'link-421');">traverseShowClassIdTextAndUniqueId</a></tt> </tt>
+<a name="L1549"></a><tt class="py-lineno">1549</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndUniqueId(view)} '''</tt> </tt>
+<a name="L1550"></a><tt class="py-lineno">1550</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITCD</tt> <tt class="py-op">=</tt> <tt id="link-422" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndContentDescription()=com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndContentDescription" class="py-name" href="#" onclick="return doclink('link-422', 'traverseShowClassIdTextAndContentDescription', 'link-422');">traverseShowClassIdTextAndContentDescription</a></tt> </tt>
+<a name="L1551"></a><tt class="py-lineno">1551</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndContentDescription(view)} '''</tt> </tt>
+<a name="L1552"></a><tt class="py-lineno">1552</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITC</tt> <tt class="py-op">=</tt> <tt id="link-423" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndCenter()=com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndCenter" class="py-name" href="#" onclick="return doclink('link-423', 'traverseShowClassIdTextAndCenter', 'link-423');">traverseShowClassIdTextAndCenter</a></tt> </tt>
+<a name="L1553"></a><tt class="py-lineno">1553</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndCenter(view)} '''</tt> </tt>
+<a name="L1554"></a><tt class="py-lineno">1554</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITPS</tt> <tt class="py-op">=</tt> <tt id="link-424" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextPositionAndSize()=com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"><a title="com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextPositionAndSize" class="py-name" href="#" onclick="return doclink('link-424', 'traverseShowClassIdTextPositionAndSize', 'link-424');">traverseShowClassIdTextPositionAndSize</a></tt> </tt>
+<a name="L1555"></a><tt class="py-lineno">1555</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextPositionAndSize(view)} '''</tt> </tt>
+<a name="L1556"></a><tt class="py-lineno">1556</tt> <tt class="py-line"> </tt>
+<a name="L1557"></a><tt class="py-lineno">1557</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.sleep"></a><div id="ViewClient.sleep-def"><a name="L1558"></a><tt class="py-lineno">1558</tt> <a class="py-toggle" href="#" id="ViewClient.sleep-toggle" onclick="return toggle('ViewClient.sleep');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#sleep">sleep</a><tt class="py-op">(</tt><tt class="py-param">secs</tt><tt class="py-op">=</tt><tt class="py-number">1.0</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.sleep-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.sleep-expanded"><a name="L1559"></a><tt class="py-lineno">1559</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1560"></a><tt class="py-lineno">1560</tt> <tt class="py-line"><tt class="py-docstring"> Sleeps for the specified number of seconds.</tt> </tt>
+<a name="L1561"></a><tt class="py-lineno">1561</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1562"></a><tt class="py-lineno">1562</tt> <tt class="py-line"><tt class="py-docstring"> @type secs: float</tt> </tt>
+<a name="L1563"></a><tt class="py-lineno">1563</tt> <tt class="py-line"><tt class="py-docstring"> @param secs: number of seconds</tt> </tt>
+<a name="L1564"></a><tt class="py-lineno">1564</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1565"></a><tt class="py-lineno">1565</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-425" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-425', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-name">secs</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1566"></a><tt class="py-lineno">1566</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.assertServiceResponse"></a><div id="ViewClient.assertServiceResponse-def"><a name="L1567"></a><tt class="py-lineno">1567</tt> <a class="py-toggle" href="#" id="ViewClient.assertServiceResponse-toggle" onclick="return toggle('ViewClient.assertServiceResponse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse">assertServiceResponse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.assertServiceResponse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.assertServiceResponse-expanded"><a name="L1568"></a><tt class="py-lineno">1568</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1569"></a><tt class="py-lineno">1569</tt> <tt class="py-line"><tt class="py-docstring"> Checks whether the response received from the server is correct or raises and Exception.</tt> </tt>
+<a name="L1570"></a><tt class="py-lineno">1570</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1571"></a><tt class="py-lineno">1571</tt> <tt class="py-line"><tt class="py-docstring"> @type response: str</tt> </tt>
+<a name="L1572"></a><tt class="py-lineno">1572</tt> <tt class="py-line"><tt class="py-docstring"> @param response: Response received from the server</tt> </tt>
+<a name="L1573"></a><tt class="py-lineno">1573</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1574"></a><tt class="py-lineno">1574</tt> <tt class="py-line"><tt class="py-docstring"> @raise Exception: If the response received from the server is invalid</tt> </tt>
+<a name="L1575"></a><tt class="py-lineno">1575</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1576"></a><tt class="py-lineno">1576</tt> <tt class="py-line"> </tt>
+<a name="L1577"></a><tt class="py-lineno">1577</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-426" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.serviceResponse" class="py-name" href="#" onclick="return doclink('link-426', 'serviceResponse', 'link-346');">serviceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1578"></a><tt class="py-lineno">1578</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'Invalid response received from service.'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1579"></a><tt class="py-lineno">1579</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.serviceResponse"></a><div id="ViewClient.serviceResponse-def"><a name="L1580"></a><tt class="py-lineno">1580</tt> <a class="py-toggle" href="#" id="ViewClient.serviceResponse-toggle" onclick="return toggle('ViewClient.serviceResponse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse">serviceResponse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.serviceResponse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.serviceResponse-expanded"><a name="L1581"></a><tt class="py-lineno">1581</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1582"></a><tt class="py-lineno">1582</tt> <tt class="py-line"><tt class="py-docstring"> Checks the response received from the I{ViewServer}.</tt> </tt>
+<a name="L1583"></a><tt class="py-lineno">1583</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1584"></a><tt class="py-lineno">1584</tt> <tt class="py-line"><tt class="py-docstring"> @return: C{True} if the response received matches L{PARCEL_TRUE}, C{False} otherwise</tt> </tt>
+<a name="L1585"></a><tt class="py-lineno">1585</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1586"></a><tt class="py-lineno">1586</tt> <tt class="py-line"> </tt>
+<a name="L1587"></a><tt class="py-lineno">1587</tt> <tt class="py-line"> <tt class="py-name">PARCEL_TRUE</tt> <tt class="py-op">=</tt> <tt class="py-string">"Result: Parcel(00000000 00000001 '........')\r\n"</tt> </tt>
+<a name="L1588"></a><tt class="py-lineno">1588</tt> <tt class="py-line"> <tt class="py-string">''' The TRUE response parcel '''</tt> </tt>
+<a name="L1589"></a><tt class="py-lineno">1589</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-427" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-427', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1590"></a><tt class="py-lineno">1590</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"serviceResponse: comparing '%s' vs Parcel(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">response</tt><tt class="py-op">,</tt> <tt class="py-name">PARCEL_TRUE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1591"></a><tt class="py-lineno">1591</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">response</tt> <tt class="py-op">==</tt> <tt class="py-name">PARCEL_TRUE</tt> </tt>
+</div><a name="L1592"></a><tt class="py-lineno">1592</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.setViews"></a><div id="ViewClient.setViews-def"><a name="L1593"></a><tt class="py-lineno">1593</tt> <a class="py-toggle" href="#" id="ViewClient.setViews-toggle" onclick="return toggle('ViewClient.setViews');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#setViews">setViews</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setViews-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setViews-expanded"><a name="L1594"></a><tt class="py-lineno">1594</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1595"></a><tt class="py-lineno">1595</tt> <tt class="py-line"><tt class="py-docstring"> Sets L{self.views} to the received value splitting it into lines.</tt> </tt>
+<a name="L1596"></a><tt class="py-lineno">1596</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1597"></a><tt class="py-lineno">1597</tt> <tt class="py-line"><tt class="py-docstring"> @type received: str</tt> </tt>
+<a name="L1598"></a><tt class="py-lineno">1598</tt> <tt class="py-line"><tt class="py-docstring"> @param received: the string received from the I{View Server}</tt> </tt>
+<a name="L1599"></a><tt class="py-lineno">1599</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1600"></a><tt class="py-lineno">1600</tt> <tt class="py-line"> </tt>
+<a name="L1601"></a><tt class="py-lineno">1601</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt> <tt class="py-keyword">or</tt> <tt class="py-name">received</tt> <tt class="py-op">==</tt> <tt class="py-string">""</tt><tt class="py-op">:</tt> </tt>
+<a name="L1602"></a><tt class="py-lineno">1602</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"received is empty"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1603"></a><tt class="py-lineno">1603</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1604"></a><tt class="py-lineno">1604</tt> <tt class="py-line"> <tt class="py-string">''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''</tt> </tt>
+<a name="L1605"></a><tt class="py-lineno">1605</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-428" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__parseTree()=com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree"><a title="com.dtmilano.android.viewclient.ViewClient.__parseTree" class="py-name" href="#" onclick="return doclink('link-428', '__parseTree', 'link-428');">__parseTree</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">"\n"</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1606"></a><tt class="py-lineno">1606</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-429" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-429', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1607"></a><tt class="py-lineno">1607</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"there are %d views in this dump"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1608"></a><tt class="py-lineno">1608</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.setViewsFromUiAutomatorDump"></a><div id="ViewClient.setViewsFromUiAutomatorDump-def"><a name="L1609"></a><tt class="py-lineno">1609</tt> <a class="py-toggle" href="#" id="ViewClient.setViewsFromUiAutomatorDump-toggle" onclick="return toggle('ViewClient.setViewsFromUiAutomatorDump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump">setViewsFromUiAutomatorDump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setViewsFromUiAutomatorDump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setViewsFromUiAutomatorDump-expanded"><a name="L1610"></a><tt class="py-lineno">1610</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1611"></a><tt class="py-lineno">1611</tt> <tt class="py-line"><tt class="py-docstring"> Sets L{self.views} to the received value parsing the received XML.</tt> </tt>
+<a name="L1612"></a><tt class="py-lineno">1612</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1613"></a><tt class="py-lineno">1613</tt> <tt class="py-line"><tt class="py-docstring"> @type received: str</tt> </tt>
+<a name="L1614"></a><tt class="py-lineno">1614</tt> <tt class="py-line"><tt class="py-docstring"> @param received: the string received from the I{UI Automator}</tt> </tt>
+<a name="L1615"></a><tt class="py-lineno">1615</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1616"></a><tt class="py-lineno">1616</tt> <tt class="py-line"> </tt>
+<a name="L1617"></a><tt class="py-lineno">1617</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt> <tt class="py-keyword">or</tt> <tt class="py-name">received</tt> <tt class="py-op">==</tt> <tt class="py-string">""</tt><tt class="py-op">:</tt> </tt>
+<a name="L1618"></a><tt class="py-lineno">1618</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"received is empty"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1619"></a><tt class="py-lineno">1619</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1620"></a><tt class="py-lineno">1620</tt> <tt class="py-line"> <tt class="py-string">''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''</tt> </tt>
+<a name="L1621"></a><tt class="py-lineno">1621</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-430" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__parseTreeFromUiAutomatorDump()=com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump"><a title="com.dtmilano.android.viewclient.ViewClient.__parseTreeFromUiAutomatorDump" class="py-name" href="#" onclick="return doclink('link-430', '__parseTreeFromUiAutomatorDump', 'link-430');">__parseTreeFromUiAutomatorDump</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1622"></a><tt class="py-lineno">1622</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-431" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-431', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1623"></a><tt class="py-lineno">1623</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"there are %d views in this dump"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1624"></a><tt class="py-lineno">1624</tt> <tt class="py-line"> </tt>
+<a name="L1625"></a><tt class="py-lineno">1625</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__splitAttrs"></a><div id="ViewClient.__splitAttrs-def"><a name="L1626"></a><tt class="py-lineno">1626</tt> <a class="py-toggle" href="#" id="ViewClient.__splitAttrs-toggle" onclick="return toggle('ViewClient.__splitAttrs');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs">__splitAttrs</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">strArgs</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__splitAttrs-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__splitAttrs-expanded"><a name="L1627"></a><tt class="py-lineno">1627</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1628"></a><tt class="py-lineno">1628</tt> <tt class="py-line"><tt class="py-docstring"> Splits the C{View} attributes in C{strArgs} and optionally adds the view id to the C{viewsById} list.</tt> </tt>
+<a name="L1629"></a><tt class="py-lineno">1629</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1630"></a><tt class="py-lineno">1630</tt> <tt class="py-line"><tt class="py-docstring"> Unique Ids</tt> </tt>
+<a name="L1631"></a><tt class="py-lineno">1631</tt> <tt class="py-line"><tt class="py-docstring"> ==========</tt> </tt>
+<a name="L1632"></a><tt class="py-lineno">1632</tt> <tt class="py-line"><tt class="py-docstring"> It is very common to find C{View}s having B{NO_ID} as the Id. This turns very difficult to</tt> </tt>
+<a name="L1633"></a><tt class="py-lineno">1633</tt> <tt class="py-line"><tt class="py-docstring"> use L{self.findViewById()}. To help in this situation this method assigns B{unique Ids}.</tt> </tt>
+<a name="L1634"></a><tt class="py-lineno">1634</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1635"></a><tt class="py-lineno">1635</tt> <tt class="py-line"><tt class="py-docstring"> The B{unique Ids} are generated using the pattern C{id/no_id/<number>} with C{<number>} starting</tt> </tt>
+<a name="L1636"></a><tt class="py-lineno">1636</tt> <tt class="py-line"><tt class="py-docstring"> at 1.</tt> </tt>
+<a name="L1637"></a><tt class="py-lineno">1637</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1638"></a><tt class="py-lineno">1638</tt> <tt class="py-line"><tt class="py-docstring"> @type strArgs: str</tt> </tt>
+<a name="L1639"></a><tt class="py-lineno">1639</tt> <tt class="py-line"><tt class="py-docstring"> @param strArgs: the string containing the raw list of attributes and values</tt> </tt>
+<a name="L1640"></a><tt class="py-lineno">1640</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1641"></a><tt class="py-lineno">1641</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns the attributes map.</tt> </tt>
+<a name="L1642"></a><tt class="py-lineno">1642</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1643"></a><tt class="py-lineno">1643</tt> <tt class="py-line"> </tt>
+<a name="L1644"></a><tt class="py-lineno">1644</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1645"></a><tt class="py-lineno">1645</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"This method is not compatible with UIAutomator"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1646"></a><tt class="py-lineno">1646</tt> <tt class="py-line"> <tt class="py-comment"># replace the spaces in text:mText to preserve them in later split</tt> </tt>
+<a name="L1647"></a><tt class="py-lineno">1647</tt> <tt class="py-line"> <tt class="py-comment"># they are translated back after the attribute matches</tt> </tt>
+<a name="L1648"></a><tt class="py-lineno">1648</tt> <tt class="py-line"> <tt class="py-name">textRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s=%s,'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt id="link-432" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-432', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1649"></a><tt class="py-lineno">1649</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">textRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">strArgs</tt><tt class="py-op">)</tt> </tt>
+<a name="L1650"></a><tt class="py-lineno">1650</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1651"></a><tt class="py-lineno">1651</tt> <tt class="py-line"> <tt class="py-name">__textStart</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">end</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1652"></a><tt class="py-lineno">1652</tt> <tt class="py-line"> <tt class="py-name">__textLen</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1653"></a><tt class="py-lineno">1653</tt> <tt class="py-line"> <tt class="py-name">__textEnd</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">end</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-name">__textLen</tt> </tt>
+<a name="L1654"></a><tt class="py-lineno">1654</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-name">strArgs</tt><tt class="py-op">[</tt><tt class="py-name">__textStart</tt><tt class="py-op">:</tt><tt class="py-name">__textEnd</tt><tt class="py-op">]</tt> </tt>
+<a name="L1655"></a><tt class="py-lineno">1655</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-name">s1</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt id="link-433" class="py-name"><a title="com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-433', 'WS', 'link-41');">WS</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1656"></a><tt class="py-lineno">1656</tt> <tt class="py-line"> <tt class="py-name">strArgs</tt> <tt class="py-op">=</tt> <tt class="py-name">strArgs</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1657"></a><tt class="py-lineno">1657</tt> <tt class="py-line"> </tt>
+<a name="L1658"></a><tt class="py-lineno">1658</tt> <tt class="py-line"> <tt class="py-name">idRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"(?P<viewId>id/\S+)"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1659"></a><tt class="py-lineno">1659</tt> <tt class="py-line"> <tt class="py-name">attrRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s(?P<parens>\(\))?=%s,(?P<val>[^ ]*)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-434" class="py-name"><a title="com.dtmilano.android.viewclient._ns" class="py-name" href="#" onclick="return doclink('link-434', '_ns', 'link-203');">_ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'attr'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-435" class="py-name"><a title="com.dtmilano.android.viewclient._nd" class="py-name" href="#" onclick="return doclink('link-435', '_nd', 'link-201');">_nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">flags</tt><tt class="py-op">=</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">DOTALL</tt><tt class="py-op">)</tt> </tt>
+<a name="L1660"></a><tt class="py-lineno">1660</tt> <tt class="py-line"> <tt class="py-name">hashRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s@%s'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-436" class="py-name"><a title="com.dtmilano.android.viewclient._ns" class="py-name" href="#" onclick="return doclink('link-436', '_ns', 'link-203');">_ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-437" class="py-name"><a title="com.dtmilano.android.viewclient._nh" class="py-name" href="#" onclick="return doclink('link-437', '_nh', 'link-202');">_nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'oid'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1661"></a><tt class="py-lineno">1661</tt> <tt class="py-line"> </tt>
+<a name="L1662"></a><tt class="py-lineno">1662</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1663"></a><tt class="py-lineno">1663</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1664"></a><tt class="py-lineno">1664</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">idRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">strArgs</tt><tt class="py-op">)</tt> </tt>
+<a name="L1665"></a><tt class="py-lineno">1665</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1666"></a><tt class="py-lineno">1666</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'viewId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1667"></a><tt class="py-lineno">1667</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-438" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-438', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1668"></a><tt class="py-lineno">1668</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"found view with id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1669"></a><tt class="py-lineno">1669</tt> <tt class="py-line"> </tt>
+<a name="L1670"></a><tt class="py-lineno">1670</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">strArgs</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1671"></a><tt class="py-lineno">1671</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">attrRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">)</tt> </tt>
+<a name="L1672"></a><tt class="py-lineno">1672</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1673"></a><tt class="py-lineno">1673</tt> <tt class="py-line"> <tt class="py-name">__attr</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'attr'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1674"></a><tt class="py-lineno">1674</tt> <tt class="py-line"> <tt class="py-name">__parens</tt> <tt class="py-op">=</tt> <tt class="py-string">'()'</tt> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'parens'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1675"></a><tt class="py-lineno">1675</tt> <tt class="py-line"> <tt class="py-name">__len</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1676"></a><tt class="py-lineno">1676</tt> <tt class="py-line"> <tt class="py-name">__val</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'val'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1677"></a><tt class="py-lineno">1677</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-439" class="py-name"><a title="com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-439', 'WARNINGS', 'link-26');">WARNINGS</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">__len</tt> <tt class="py-op">!=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">__val</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1678"></a><tt class="py-lineno">1678</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Invalid len: expected: %d found: %d s=%s e=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">__len</tt><tt class="py-op">,</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">__val</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">__val</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">50</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">__val</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">50</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1679"></a><tt class="py-lineno">1679</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">__attr</tt> <tt class="py-op">==</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">:</tt> </tt>
+<a name="L1680"></a><tt class="py-lineno">1680</tt> <tt class="py-line"> <tt class="py-comment"># restore spaces that have been replaced</tt> </tt>
+<a name="L1681"></a><tt class="py-lineno">1681</tt> <tt class="py-line"> <tt class="py-name">__val</tt> <tt class="py-op">=</tt> <tt class="py-name">__val</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt id="link-440" class="py-name"><a title="com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-440', 'WS', 'link-41');">WS</a></tt><tt class="py-op">,</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> </tt>
+<a name="L1682"></a><tt class="py-lineno">1682</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-name">__attr</tt> <tt class="py-op">+</tt> <tt class="py-name">__parens</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">__val</tt> </tt>
+<a name="L1683"></a><tt class="py-lineno">1683</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1684"></a><tt class="py-lineno">1684</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">hashRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">)</tt> </tt>
+<a name="L1685"></a><tt class="py-lineno">1685</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1686"></a><tt class="py-lineno">1686</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1687"></a><tt class="py-lineno">1687</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'oid'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'oid'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1688"></a><tt class="py-lineno">1688</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1689"></a><tt class="py-lineno">1689</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-441" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-441', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1690"></a><tt class="py-lineno">1690</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-string">"doesn't match"</tt> </tt>
+<a name="L1691"></a><tt class="py-lineno">1691</tt> <tt class="py-line"> </tt>
+<a name="L1692"></a><tt class="py-lineno">1692</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> <tt class="py-comment"># was assignViewById</tt> </tt>
+<a name="L1693"></a><tt class="py-lineno">1693</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1694"></a><tt class="py-lineno">1694</tt> <tt class="py-line"> <tt class="py-comment"># If the view has NO_ID we are assigning a default id here (id/no_id) which is</tt> </tt>
+<a name="L1695"></a><tt class="py-lineno">1695</tt> <tt class="py-line"> <tt class="py-comment"># immediately incremented if another view with no id was found before to generate</tt> </tt>
+<a name="L1696"></a><tt class="py-lineno">1696</tt> <tt class="py-line"> <tt class="py-comment"># a unique id</tt> </tt>
+<a name="L1697"></a><tt class="py-lineno">1697</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-string">"id/no_id/1"</tt> </tt>
+<a name="L1698"></a><tt class="py-lineno">1698</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">:</tt> </tt>
+<a name="L1699"></a><tt class="py-lineno">1699</tt> <tt class="py-line"> <tt class="py-comment"># sometimes the view ids are not unique, so let's generate a unique id here</tt> </tt>
+<a name="L1700"></a><tt class="py-lineno">1700</tt> <tt class="py-line"> <tt class="py-name">i</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L1701"></a><tt class="py-lineno">1701</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1702"></a><tt class="py-lineno">1702</tt> <tt class="py-line"> <tt class="py-name">newId</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'/\d+$'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'/%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">i</tt> </tt>
+<a name="L1703"></a><tt class="py-lineno">1703</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">newId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">:</tt> </tt>
+<a name="L1704"></a><tt class="py-lineno">1704</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1705"></a><tt class="py-lineno">1705</tt> <tt class="py-line"> <tt class="py-name">i</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L1706"></a><tt class="py-lineno">1706</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">newId</tt> </tt>
+<a name="L1707"></a><tt class="py-lineno">1707</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-442" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-442', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1708"></a><tt class="py-lineno">1708</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"adding viewById %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1709"></a><tt class="py-lineno">1709</tt> <tt class="py-line"> <tt class="py-comment"># We are assigning a new attribute to keep the original id preserved, which could have</tt> </tt>
+<a name="L1710"></a><tt class="py-lineno">1710</tt> <tt class="py-line"> <tt class="py-comment"># been NO_ID repeated multiple times</tt> </tt>
+<a name="L1711"></a><tt class="py-lineno">1711</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1712"></a><tt class="py-lineno">1712</tt> <tt class="py-line"> </tt>
+<a name="L1713"></a><tt class="py-lineno">1713</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">attrs</tt> </tt>
+</div><a name="L1714"></a><tt class="py-lineno">1714</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__parseTree"></a><div id="ViewClient.__parseTree-def"><a name="L1715"></a><tt class="py-lineno">1715</tt> <a class="py-toggle" href="#" id="ViewClient.__parseTree-toggle" onclick="return toggle('ViewClient.__parseTree');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree">__parseTree</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">receivedLines</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__parseTree-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__parseTree-expanded"><a name="L1716"></a><tt class="py-lineno">1716</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1717"></a><tt class="py-lineno">1717</tt> <tt class="py-line"><tt class="py-docstring"> Parses the View tree contained in L{receivedLines}. The tree is created and the root node assigned to L{self.root}.</tt> </tt>
+<a name="L1718"></a><tt class="py-lineno">1718</tt> <tt class="py-line"><tt class="py-docstring"> This method also assigns L{self.viewsById} values using L{View.getUniqueId} as the key.</tt> </tt>
+<a name="L1719"></a><tt class="py-lineno">1719</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1720"></a><tt class="py-lineno">1720</tt> <tt class="py-line"><tt class="py-docstring"> @type receivedLines: str</tt> </tt>
+<a name="L1721"></a><tt class="py-lineno">1721</tt> <tt class="py-line"><tt class="py-docstring"> @param receivedLines: the string received from B{View Server}</tt> </tt>
+<a name="L1722"></a><tt class="py-lineno">1722</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1723"></a><tt class="py-lineno">1723</tt> <tt class="py-line"> </tt>
+<a name="L1724"></a><tt class="py-lineno">1724</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1725"></a><tt class="py-lineno">1725</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1726"></a><tt class="py-lineno">1726</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1727"></a><tt class="py-lineno">1727</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1728"></a><tt class="py-lineno">1728</tt> <tt class="py-line"> <tt class="py-name">parents</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1729"></a><tt class="py-lineno">1729</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1730"></a><tt class="py-lineno">1730</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1731"></a><tt class="py-lineno">1731</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1732"></a><tt class="py-lineno">1732</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">receivedLines</tt><tt class="py-op">:</tt> </tt>
+<a name="L1733"></a><tt class="py-lineno">1733</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">''</tt> <tt class="py-keyword">or</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">'DONE'</tt> <tt class="py-keyword">or</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">'DONE.'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1734"></a><tt class="py-lineno">1734</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1735"></a><tt class="py-lineno">1735</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-443" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__splitAttrs()=com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs"><a title="com.dtmilano.android.viewclient.ViewClient.__splitAttrs" class="py-name" href="#" onclick="return doclink('link-443', '__splitAttrs', 'link-443');">__splitAttrs</a></tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt> </tt>
+<a name="L1736"></a><tt class="py-lineno">1736</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L1737"></a><tt class="py-lineno">1737</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">' '</tt><tt class="py-op">:</tt> </tt>
+<a name="L1738"></a><tt class="py-lineno">1738</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"Unexpected root element starting with ' '."</tt><tt class="py-op">)</tt> </tt>
+<a name="L1739"></a><tt class="py-lineno">1739</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt id="link-444" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-444', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-445" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.factory
+com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-445', 'factory', 'link-304');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-446" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-446', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt><tt class="py-op">)</tt> </tt>
+<a name="L1740"></a><tt class="py-lineno">1740</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-447" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-447', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">raw</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+<a name="L1741"></a><tt class="py-lineno">1741</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L1742"></a><tt class="py-lineno">1742</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L1743"></a><tt class="py-lineno">1743</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1744"></a><tt class="py-lineno">1744</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1745"></a><tt class="py-lineno">1745</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1746"></a><tt class="py-lineno">1746</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1747"></a><tt class="py-lineno">1747</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt> <tt class="py-op">-</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt class="py-name">lstrip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1748"></a><tt class="py-lineno">1748</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1749"></a><tt class="py-lineno">1749</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"newLevel==0 treeLevel=%d but tree can have only one root, v=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">treeLevel</tt><tt class="py-op">,</tt> <tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1750"></a><tt class="py-lineno">1750</tt> <tt class="py-line"> <tt class="py-name">child</tt> <tt class="py-op">=</tt> <tt id="link-448" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-448', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-449" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.factory
+com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-449', 'factory', 'link-304');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-450" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-450', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt><tt class="py-op">)</tt> </tt>
+<a name="L1751"></a><tt class="py-lineno">1751</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-451" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-451', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-name">child</tt><tt class="py-op">.</tt><tt class="py-name">raw</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+<a name="L1752"></a><tt class="py-lineno">1752</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">==</tt> <tt class="py-name">treeLevel</tt><tt class="py-op">:</tt> </tt>
+<a name="L1753"></a><tt class="py-lineno">1753</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-452" class="py-name"><a title="com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-452', 'add', 'link-305');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1754"></a><tt class="py-lineno">1754</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1755"></a><tt class="py-lineno">1755</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">></tt> <tt class="py-name">treeLevel</tt><tt class="py-op">:</tt> </tt>
+<a name="L1756"></a><tt class="py-lineno">1756</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">newLevel</tt> <tt class="py-op">-</tt> <tt class="py-name">treeLevel</tt><tt class="py-op">)</tt> <tt class="py-op">!=</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L1757"></a><tt class="py-lineno">1757</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"newLevel jumps %d levels, v=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">newLevel</tt><tt class="py-op">-</tt><tt class="py-name">treeLevel</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1758"></a><tt class="py-lineno">1758</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">lastView</tt> </tt>
+<a name="L1759"></a><tt class="py-lineno">1759</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1760"></a><tt class="py-lineno">1760</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-453" class="py-name"><a title="com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-453', 'add', 'link-305');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1761"></a><tt class="py-lineno">1761</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1762"></a><tt class="py-lineno">1762</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-name">newLevel</tt> </tt>
+<a name="L1763"></a><tt class="py-lineno">1763</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> <tt class="py-comment"># newLevel < treeLevel</tt> </tt>
+<a name="L1764"></a><tt class="py-lineno">1764</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">treeLevel</tt> <tt class="py-op">-</tt> <tt class="py-name">newLevel</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1765"></a><tt class="py-lineno">1765</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1766"></a><tt class="py-lineno">1766</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1767"></a><tt class="py-lineno">1767</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1768"></a><tt class="py-lineno">1768</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-454" class="py-name"><a title="com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-454', 'add', 'link-305');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1769"></a><tt class="py-lineno">1769</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-name">newLevel</tt> </tt>
+<a name="L1770"></a><tt class="py-lineno">1770</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1771"></a><tt class="py-lineno">1771</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">lastView</tt><tt class="py-op">)</tt> </tt>
+<a name="L1772"></a><tt class="py-lineno">1772</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">[</tt><tt class="py-name">lastView</tt><tt class="py-op">.</tt><tt id="link-455" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-455', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">lastView</tt> </tt>
+</div><a name="L1773"></a><tt class="py-lineno">1773</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__parseTreeFromUiAutomatorDump"></a><div id="ViewClient.__parseTreeFromUiAutomatorDump-def"><a name="L1774"></a><tt class="py-lineno">1774</tt> <a class="py-toggle" href="#" id="ViewClient.__parseTreeFromUiAutomatorDump-toggle" onclick="return toggle('ViewClient.__parseTreeFromUiAutomatorDump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump">__parseTreeFromUiAutomatorDump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">receivedXml</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__parseTreeFromUiAutomatorDump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__parseTreeFromUiAutomatorDump-expanded"><a name="L1775"></a><tt class="py-lineno">1775</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt id="link-456" class="py-name" targets="Class com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient=com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"><a title="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient" class="py-name" href="#" onclick="return doclink('link-456', 'UiAutomator2AndroidViewClient', 'link-456');">UiAutomator2AndroidViewClient</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-457" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-457', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1776"></a><tt class="py-lineno">1776</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-458" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.Parse
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-458', 'Parse', 'link-309');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">receivedXml</tt><tt class="py-op">)</tt> </tt>
+<a name="L1777"></a><tt class="py-lineno">1777</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> </tt>
+<a name="L1778"></a><tt class="py-lineno">1778</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1779"></a><tt class="py-lineno">1779</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">:</tt> </tt>
+<a name="L1780"></a><tt class="py-lineno">1780</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">[</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt id="link-459" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-459', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+</div><a name="L1781"></a><tt class="py-lineno">1781</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getRoot"></a><div id="ViewClient.getRoot-def"><a name="L1782"></a><tt class="py-lineno">1782</tt> <a class="py-toggle" href="#" id="ViewClient.getRoot-toggle" onclick="return toggle('ViewClient.getRoot');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#getRoot">getRoot</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getRoot-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getRoot-expanded"><a name="L1783"></a><tt class="py-lineno">1783</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1784"></a><tt class="py-lineno">1784</tt> <tt class="py-line"><tt class="py-docstring"> Gets the root node of the C{View} tree</tt> </tt>
+<a name="L1785"></a><tt class="py-lineno">1785</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1786"></a><tt class="py-lineno">1786</tt> <tt class="py-line"><tt class="py-docstring"> @return: the root node of the C{View} tree</tt> </tt>
+<a name="L1787"></a><tt class="py-lineno">1787</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1788"></a><tt class="py-lineno">1788</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+</div><a name="L1789"></a><tt class="py-lineno">1789</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.traverse"></a><div id="ViewClient.traverse-def"><a name="L1790"></a><tt class="py-lineno">1790</tt> <a class="py-toggle" href="#" id="ViewClient.traverse-toggle" onclick="return toggle('ViewClient.traverse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse">traverse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">indent</tt><tt class="py-op">=</tt><tt class="py-string">""</tt><tt class="py-op">,</tt> <tt class="py-param">transform</tt><tt class="py-op">=</tt><tt id="link-460" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-460', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-461" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-461', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-param">stream</tt><tt class="py-op">=</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverse-expanded"><a name="L1791"></a><tt class="py-lineno">1791</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1792"></a><tt class="py-lineno">1792</tt> <tt class="py-line"><tt class="py-docstring"> Traverses the C{View} tree and prints its nodes.</tt> </tt>
+<a name="L1793"></a><tt class="py-lineno">1793</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1794"></a><tt class="py-lineno">1794</tt> <tt class="py-line"><tt class="py-docstring"> The nodes are printed converting them to string but other transformations can be specified</tt> </tt>
+<a name="L1795"></a><tt class="py-lineno">1795</tt> <tt class="py-line"><tt class="py-docstring"> by providing a method name as the C{transform} parameter.</tt> </tt>
+<a name="L1796"></a><tt class="py-lineno">1796</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1797"></a><tt class="py-lineno">1797</tt> <tt class="py-line"><tt class="py-docstring"> @type root: L{View}</tt> </tt>
+<a name="L1798"></a><tt class="py-lineno">1798</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node from where the traverse starts</tt> </tt>
+<a name="L1799"></a><tt class="py-lineno">1799</tt> <tt class="py-line"><tt class="py-docstring"> @type indent: str</tt> </tt>
+<a name="L1800"></a><tt class="py-lineno">1800</tt> <tt class="py-line"><tt class="py-docstring"> @param indent: the indentation string to use to print the nodes</tt> </tt>
+<a name="L1801"></a><tt class="py-lineno">1801</tt> <tt class="py-line"><tt class="py-docstring"> @type transform: method</tt> </tt>
+<a name="L1802"></a><tt class="py-lineno">1802</tt> <tt class="py-line"><tt class="py-docstring"> @param transform: a method to use to transform the node before is printed</tt> </tt>
+<a name="L1803"></a><tt class="py-lineno">1803</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1804"></a><tt class="py-lineno">1804</tt> <tt class="py-line"> </tt>
+<a name="L1805"></a><tt class="py-lineno">1805</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-462" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-462', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L1806"></a><tt class="py-lineno">1806</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1807"></a><tt class="py-lineno">1807</tt> <tt class="py-line"> </tt>
+<a name="L1808"></a><tt class="py-lineno">1808</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-463" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-463', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-464" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__traverse()=com.dtmilano.android.viewclient.ViewClient-class.html#__traverse"><a title="com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-464', '__traverse', 'link-464');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">indent</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">,</tt> <tt class="py-name">stream</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1809"></a><tt class="py-lineno">1809</tt> <tt class="py-line"><tt class="py-comment"># if not root:</tt> </tt>
+<a name="L1810"></a><tt class="py-lineno">1810</tt> <tt class="py-line"><tt class="py-comment"># return</tt> </tt>
+<a name="L1811"></a><tt class="py-lineno">1811</tt> <tt class="py-line"><tt class="py-comment">#</tt> </tt>
+<a name="L1812"></a><tt class="py-lineno">1812</tt> <tt class="py-line"><tt class="py-comment"># s = transform(root)</tt> </tt>
+<a name="L1813"></a><tt class="py-lineno">1813</tt> <tt class="py-line"><tt class="py-comment"># if s:</tt> </tt>
+<a name="L1814"></a><tt class="py-lineno">1814</tt> <tt class="py-line"><tt class="py-comment"># print >>stream, "%s%s" % (indent, s)</tt> </tt>
+<a name="L1815"></a><tt class="py-lineno">1815</tt> <tt class="py-line"><tt class="py-comment">#</tt> </tt>
+<a name="L1816"></a><tt class="py-lineno">1816</tt> <tt class="py-line"><tt class="py-comment"># for ch in root.children:</tt> </tt>
+<a name="L1817"></a><tt class="py-lineno">1817</tt> <tt class="py-line"><tt class="py-comment"># self.traverse(ch, indent=indent+" ", transform=transform, stream=stream)</tt> </tt>
+<a name="L1818"></a><tt class="py-lineno">1818</tt> <tt class="py-line"> </tt>
+<a name="L1819"></a><tt class="py-lineno">1819</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__traverse"></a><div id="ViewClient.__traverse-def"><a name="L1820"></a><tt class="py-lineno">1820</tt> <a class="py-toggle" href="#" id="ViewClient.__traverse-toggle" onclick="return toggle('ViewClient.__traverse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__traverse">__traverse</a><tt class="py-op">(</tt><tt class="py-param">root</tt><tt class="py-op">,</tt> <tt class="py-param">indent</tt><tt class="py-op">=</tt><tt class="py-string">""</tt><tt class="py-op">,</tt> <tt class="py-param">transform</tt><tt class="py-op">=</tt><tt id="link-465" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-465', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-466" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-466', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-param">stream</tt><tt class="py-op">=</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__traverse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__traverse-expanded"><a name="L1821"></a><tt class="py-lineno">1821</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L1822"></a><tt class="py-lineno">1822</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L1823"></a><tt class="py-lineno">1823</tt> <tt class="py-line"> </tt>
+<a name="L1824"></a><tt class="py-lineno">1824</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">transform</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L1825"></a><tt class="py-lineno">1825</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt><tt class="py-op">:</tt> </tt>
+<a name="L1826"></a><tt class="py-lineno">1826</tt> <tt class="py-line"> <tt class="py-name">ius</tt> <tt class="py-op">=</tt> <tt class="py-string">"%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">indent</tt><tt class="py-op">,</tt> <tt class="py-name">s</tt> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">s</tt><tt class="py-op">,</tt> <tt class="py-name">unicode</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-name">s</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1827"></a><tt class="py-lineno">1827</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">stream</tt><tt class="py-op">,</tt> <tt class="py-name">ius</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1828"></a><tt class="py-lineno">1828</tt> <tt class="py-line"> </tt>
+<a name="L1829"></a><tt class="py-lineno">1829</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L1830"></a><tt class="py-lineno">1830</tt> <tt class="py-line"> <tt id="link-467" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-467', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-468" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-468', '__traverse', 'link-464');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">indent</tt><tt class="py-op">=</tt><tt class="py-name">indent</tt><tt class="py-op">+</tt><tt class="py-string">" "</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">=</tt><tt class="py-name">transform</tt><tt class="py-op">,</tt> <tt class="py-name">stream</tt><tt class="py-op">=</tt><tt class="py-name">stream</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1831"></a><tt class="py-lineno">1831</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.dump"></a><div id="ViewClient.dump-def"><a name="L1832"></a><tt class="py-lineno">1832</tt> <a class="py-toggle" href="#" id="ViewClient.dump-toggle" onclick="return toggle('ViewClient.dump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#dump">dump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">window</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">sleep</tt><tt class="py-op">=</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.dump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.dump-expanded"><a name="L1833"></a><tt class="py-lineno">1833</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1834"></a><tt class="py-lineno">1834</tt> <tt class="py-line"><tt class="py-docstring"> Dumps the window content.</tt> </tt>
+<a name="L1835"></a><tt class="py-lineno">1835</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1836"></a><tt class="py-lineno">1836</tt> <tt class="py-line"><tt class="py-docstring"> Sleep is useful to wait some time before obtaining the new content when something in the</tt> </tt>
+<a name="L1837"></a><tt class="py-lineno">1837</tt> <tt class="py-line"><tt class="py-docstring"> window has changed.</tt> </tt>
+<a name="L1838"></a><tt class="py-lineno">1838</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1839"></a><tt class="py-lineno">1839</tt> <tt class="py-line"><tt class="py-docstring"> @type window: int or str</tt> </tt>
+<a name="L1840"></a><tt class="py-lineno">1840</tt> <tt class="py-line"><tt class="py-docstring"> @param window: the window id or name of the window to dump.</tt> </tt>
+<a name="L1841"></a><tt class="py-lineno">1841</tt> <tt class="py-line"><tt class="py-docstring"> The B{name} is the package name or the window name (i.e. StatusBar) for</tt> </tt>
+<a name="L1842"></a><tt class="py-lineno">1842</tt> <tt class="py-line"><tt class="py-docstring"> system windows.</tt> </tt>
+<a name="L1843"></a><tt class="py-lineno">1843</tt> <tt class="py-line"><tt class="py-docstring"> The window id can be provided as C{int} or C{str}. The C{str} should represent</tt> </tt>
+<a name="L1844"></a><tt class="py-lineno">1844</tt> <tt class="py-line"><tt class="py-docstring"> and C{int} in either base 10 or 16.</tt> </tt>
+<a name="L1845"></a><tt class="py-lineno">1845</tt> <tt class="py-line"><tt class="py-docstring"> Use -1 to dump all windows.</tt> </tt>
+<a name="L1846"></a><tt class="py-lineno">1846</tt> <tt class="py-line"><tt class="py-docstring"> This parameter only is used when the backend is B{ViewServer} and it's</tt> </tt>
+<a name="L1847"></a><tt class="py-lineno">1847</tt> <tt class="py-line"><tt class="py-docstring"> ignored for B{UiAutomator}.</tt> </tt>
+<a name="L1848"></a><tt class="py-lineno">1848</tt> <tt class="py-line"><tt class="py-docstring"> @type sleep: int</tt> </tt>
+<a name="L1849"></a><tt class="py-lineno">1849</tt> <tt class="py-line"><tt class="py-docstring"> @param sleep: sleep in seconds before proceeding to dump the content</tt> </tt>
+<a name="L1850"></a><tt class="py-lineno">1850</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1851"></a><tt class="py-lineno">1851</tt> <tt class="py-line"><tt class="py-docstring"> @return: the list of Views as C{str} received from the server after being split into lines</tt> </tt>
+<a name="L1852"></a><tt class="py-lineno">1852</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1853"></a><tt class="py-lineno">1853</tt> <tt class="py-line"> </tt>
+<a name="L1854"></a><tt class="py-lineno">1854</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-469" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-469', 'sleep', 'link-269');">sleep</a></tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1855"></a><tt class="py-lineno">1855</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-470" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-470', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt id="link-471" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-471', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1856"></a><tt class="py-lineno">1856</tt> <tt class="py-line"> </tt>
+<a name="L1857"></a><tt class="py-lineno">1857</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1858"></a><tt class="py-lineno">1858</tt> <tt class="py-line"> <tt class="py-comment"># NOTICE:</tt> </tt>
+<a name="L1859"></a><tt class="py-lineno">1859</tt> <tt class="py-line"> <tt class="py-comment"># Using /dev/tty this works even on devices with no sdcard</tt> </tt>
+<a name="L1860"></a><tt class="py-lineno">1860</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-472" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-472', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'uiautomator dump /dev/tty >/dev/null'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">encoding</tt><tt class="py-op">=</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-name">errors</tt><tt class="py-op">=</tt><tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1861"></a><tt class="py-lineno">1861</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt><tt class="py-op">:</tt> </tt>
+<a name="L1862"></a><tt class="py-lineno">1862</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'ERROR: Empty UiAutomator dump was received'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1863"></a><tt class="py-lineno">1863</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-473" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-473', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1864"></a><tt class="py-lineno">1864</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1865"></a><tt class="py-lineno">1865</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-474" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-474', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1866"></a><tt class="py-lineno">1866</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1867"></a><tt class="py-lineno">1867</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1868"></a><tt class="py-lineno">1868</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1869"></a><tt class="py-lineno">1869</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1870"></a><tt class="py-lineno">1870</tt> <tt class="py-line"> <tt class="py-name">onlyKilledRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'[\n\S]*Killed[\n\r\S]*'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1871"></a><tt class="py-lineno">1871</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">onlyKilledRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1872"></a><tt class="py-lineno">1872</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'''ERROR: UiAutomator output contains no valid information. UiAutomator was killed, no reason given.'''</tt><tt class="py-op">)</tt> </tt>
+<a name="L1873"></a><tt class="py-lineno">1873</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ignoreUiAutomatorKilled</tt><tt class="py-op">:</tt> </tt>
+<a name="L1874"></a><tt class="py-lineno">1874</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-475" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-475', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1875"></a><tt class="py-lineno">1875</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ignoring UiAutomator Killed"</tt> </tt>
+<a name="L1876"></a><tt class="py-lineno">1876</tt> <tt class="py-line"> <tt class="py-name">killedRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'</hierarchy>[\n\S]*Killed'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1877"></a><tt class="py-lineno">1877</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">killedRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1878"></a><tt class="py-lineno">1878</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-name">killedRE</tt><tt class="py-op">,</tt> <tt class="py-string">'</hierarchy>'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1879"></a><tt class="py-lineno">1879</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt id="link-476" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-476', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1880"></a><tt class="py-lineno">1880</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"UiAutomator Killed: NOT FOUND!"</tt> </tt>
+<a name="L1881"></a><tt class="py-lineno">1881</tt> <tt class="py-line"> <tt class="py-comment"># It seems that API18 uiautomator spits this message to stdout</tt> </tt>
+<a name="L1882"></a><tt class="py-lineno">1882</tt> <tt class="py-line"> <tt class="py-name">dumpedToDevTtyRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'</hierarchy>[\n\S]*UI hierchary dumped to: /dev/tty.*'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1883"></a><tt class="py-lineno">1883</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">dumpedToDevTtyRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1884"></a><tt class="py-lineno">1884</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-name">dumpedToDevTtyRE</tt><tt class="py-op">,</tt> <tt class="py-string">'</hierarchy>'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1885"></a><tt class="py-lineno">1885</tt> <tt class="py-line"> <tt class="py-comment"># API19 seems to send this warning as part of the XML.</tt> </tt>
+<a name="L1886"></a><tt class="py-lineno">1886</tt> <tt class="py-line"> <tt class="py-comment"># Let's remove it if present</tt> </tt>
+<a name="L1887"></a><tt class="py-lineno">1887</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix.\r\n'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">)</tt> </tt>
+<a name="L1888"></a><tt class="py-lineno">1888</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-477" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-477', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1889"></a><tt class="py-lineno">1889</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received="</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1890"></a><tt class="py-lineno">1890</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">'\[: not found'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1891"></a><tt class="py-lineno">1891</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'''ERROR: Some emulator images (i.e. android 4.1.2 API 16 generic_x86) does not include the '[' command.</tt> </tt>
+<a name="L1892"></a><tt class="py-lineno">1892</tt> <tt class="py-line"><tt class="py-string">While UiAutomator back-end might be supported 'uiautomator' command fails.</tt> </tt>
+<a name="L1893"></a><tt class="py-lineno">1893</tt> <tt class="py-line"><tt class="py-string">You should force ViewServer back-end.'''</tt><tt class="py-op">)</tt> </tt>
+<a name="L1894"></a><tt class="py-lineno">1894</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-478" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.setViewsFromUiAutomatorDump()=com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump"><a title="com.dtmilano.android.viewclient.ViewClient.setViewsFromUiAutomatorDump" class="py-name" href="#" onclick="return doclink('link-478', 'setViewsFromUiAutomatorDump', 'link-478');">setViewsFromUiAutomatorDump</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1895"></a><tt class="py-lineno">1895</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1896"></a><tt class="py-lineno">1896</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-name">str</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1897"></a><tt class="py-lineno">1897</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">window</tt> <tt class="py-op">!=</tt> <tt class="py-string">'-1'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1898"></a><tt class="py-lineno">1898</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-479" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.list" class="py-name" href="#" onclick="return doclink('link-479', 'list', 'link-275');">list</a></tt><tt class="py-op">(</tt><tt id="link-480" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-480', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">=</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1899"></a><tt class="py-lineno">1899</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L1900"></a><tt class="py-lineno">1900</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">wId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">:</tt> </tt>
+<a name="L1901"></a><tt class="py-lineno">1901</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1902"></a><tt class="py-lineno">1902</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">window</tt> <tt class="py-op">==</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">wId</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1903"></a><tt class="py-lineno">1903</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1904"></a><tt class="py-lineno">1904</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1905"></a><tt class="py-lineno">1905</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1906"></a><tt class="py-lineno">1906</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1907"></a><tt class="py-lineno">1907</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1908"></a><tt class="py-lineno">1908</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1909"></a><tt class="py-lineno">1909</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">wId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1910"></a><tt class="py-lineno">1910</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1911"></a><tt class="py-lineno">1911</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1912"></a><tt class="py-lineno">1912</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1913"></a><tt class="py-lineno">1913</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1914"></a><tt class="py-lineno">1914</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1915"></a><tt class="py-lineno">1915</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1916"></a><tt class="py-lineno">1916</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">wId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1917"></a><tt class="py-lineno">1917</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1918"></a><tt class="py-lineno">1918</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1919"></a><tt class="py-lineno">1919</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1920"></a><tt class="py-lineno">1920</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1921"></a><tt class="py-lineno">1921</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1922"></a><tt class="py-lineno">1922</tt> <tt class="py-line"> </tt>
+<a name="L1923"></a><tt class="py-lineno">1923</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">found</tt><tt class="py-op">:</tt> </tt>
+<a name="L1924"></a><tt class="py-lineno">1924</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Cannot find window '%s' in %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1925"></a><tt class="py-lineno">1925</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1926"></a><tt class="py-lineno">1926</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1927"></a><tt class="py-lineno">1927</tt> <tt class="py-line"> </tt>
+<a name="L1928"></a><tt class="py-lineno">1928</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">(</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">AF_INET</tt><tt class="py-op">,</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">SOCK_STREAM</tt><tt class="py-op">)</tt> </tt>
+<a name="L1929"></a><tt class="py-lineno">1929</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1930"></a><tt class="py-lineno">1930</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">connect</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt id="link-481" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-481', 'VIEW_SERVER_HOST', 'link-27');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1931"></a><tt class="py-lineno">1931</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">error</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1932"></a><tt class="py-lineno">1932</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Connecting to %s:%d: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-482" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-482', 'VIEW_SERVER_HOST', 'link-27');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1933"></a><tt class="py-lineno">1933</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-string">'dump %x\r\n'</tt> <tt class="py-op">%</tt> <tt class="py-name">window</tt> </tt>
+<a name="L1934"></a><tt class="py-lineno">1934</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-483" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-483', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1935"></a><tt class="py-lineno">1935</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"executing: '%s'"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L1936"></a><tt class="py-lineno">1936</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">send</tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt><tt class="py-op">)</tt> </tt>
+<a name="L1937"></a><tt class="py-lineno">1937</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-string">""</tt> </tt>
+<a name="L1938"></a><tt class="py-lineno">1938</tt> <tt class="py-line"> <tt class="py-name">doneRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"DONE"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1939"></a><tt class="py-lineno">1939</tt> <tt class="py-line"> <tt id="link-484" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-484', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-485" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-485', 'setAlarm', 'link-388');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">120</tt><tt class="py-op">)</tt> </tt>
+<a name="L1940"></a><tt class="py-lineno">1940</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1941"></a><tt class="py-lineno">1941</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-486" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-486', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1942"></a><tt class="py-lineno">1942</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" reading from socket..."</tt> </tt>
+<a name="L1943"></a><tt class="py-lineno">1943</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">+=</tt> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">1024</tt><tt class="py-op">)</tt> </tt>
+<a name="L1944"></a><tt class="py-lineno">1944</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">7</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1945"></a><tt class="py-lineno">1945</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1946"></a><tt class="py-lineno">1946</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt id="link-487" class="py-name" targets="Method com.dtmilano.android.adb.adbclient.AdbClient.close()=com.dtmilano.android.adb.adbclient.AdbClient-class.html#close"><a title="com.dtmilano.android.adb.adbclient.AdbClient.close" class="py-name" href="#" onclick="return doclink('link-487', 'close', 'link-487');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1947"></a><tt class="py-lineno">1947</tt> <tt class="py-line"> <tt id="link-488" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-488', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-489" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.setAlarm
+com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-489', 'setAlarm', 'link-388');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1948"></a><tt class="py-lineno">1948</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-490" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-490', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1949"></a><tt class="py-lineno">1949</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1950"></a><tt class="py-lineno">1950</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-491" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-491', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1951"></a><tt class="py-lineno">1951</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1952"></a><tt class="py-lineno">1952</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1953"></a><tt class="py-lineno">1953</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1954"></a><tt class="py-lineno">1954</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1955"></a><tt class="py-lineno">1955</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-492" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.setViews()=com.dtmilano.android.viewclient.ViewClient-class.html#setViews"><a title="com.dtmilano.android.viewclient.ViewClient.setViews" class="py-name" href="#" onclick="return doclink('link-492', 'setViews', 'link-492');">setViews</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1956"></a><tt class="py-lineno">1956</tt> <tt class="py-line"> </tt>
+<a name="L1957"></a><tt class="py-lineno">1957</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-493" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_TREE" class="py-name" href="#" onclick="return doclink('link-493', 'DEBUG_TREE', 'link-8');">DEBUG_TREE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1958"></a><tt class="py-lineno">1958</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-494" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.traverse()=com.dtmilano.android.viewclient.ViewClient-class.html#traverse"><a title="com.dtmilano.android.viewclient.ViewClient.traverse" class="py-name" href="#" onclick="return doclink('link-494', 'traverse', 'link-494');">traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L1959"></a><tt class="py-lineno">1959</tt> <tt class="py-line"> </tt>
+<a name="L1960"></a><tt class="py-lineno">1960</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> </tt>
+</div><a name="L1961"></a><tt class="py-lineno">1961</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.list"></a><div id="ViewClient.list-def"><a name="L1962"></a><tt class="py-lineno">1962</tt> <a class="py-toggle" href="#" id="ViewClient.list-toggle" onclick="return toggle('ViewClient.list');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#list">list</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">sleep</tt><tt class="py-op">=</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.list-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.list-expanded"><a name="L1963"></a><tt class="py-lineno">1963</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1964"></a><tt class="py-lineno">1964</tt> <tt class="py-line"><tt class="py-docstring"> List the windows.</tt> </tt>
+<a name="L1965"></a><tt class="py-lineno">1965</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1966"></a><tt class="py-lineno">1966</tt> <tt class="py-line"><tt class="py-docstring"> Sleep is useful to wait some time before obtaining the new content when something in the</tt> </tt>
+<a name="L1967"></a><tt class="py-lineno">1967</tt> <tt class="py-line"><tt class="py-docstring"> window has changed.</tt> </tt>
+<a name="L1968"></a><tt class="py-lineno">1968</tt> <tt class="py-line"><tt class="py-docstring"> This also sets L{self.windows} as the list of windows.</tt> </tt>
+<a name="L1969"></a><tt class="py-lineno">1969</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1970"></a><tt class="py-lineno">1970</tt> <tt class="py-line"><tt class="py-docstring"> @type sleep: int</tt> </tt>
+<a name="L1971"></a><tt class="py-lineno">1971</tt> <tt class="py-line"><tt class="py-docstring"> @param sleep: sleep in seconds before proceeding to dump the content</tt> </tt>
+<a name="L1972"></a><tt class="py-lineno">1972</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L1973"></a><tt class="py-lineno">1973</tt> <tt class="py-line"><tt class="py-docstring"> @return: the list of windows</tt> </tt>
+<a name="L1974"></a><tt class="py-lineno">1974</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1975"></a><tt class="py-lineno">1975</tt> <tt class="py-line"> </tt>
+<a name="L1976"></a><tt class="py-lineno">1976</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-495" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-495', 'sleep', 'link-269');">sleep</a></tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1977"></a><tt class="py-lineno">1977</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-496" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-496', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">(</tt><tt id="link-497" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-497', 'sleep', 'link-269');">sleep</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1978"></a><tt class="py-lineno">1978</tt> <tt class="py-line"> </tt>
+<a name="L1979"></a><tt class="py-lineno">1979</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1980"></a><tt class="py-lineno">1980</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"Not implemented yet: listing windows with UiAutomator"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1981"></a><tt class="py-lineno">1981</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1982"></a><tt class="py-lineno">1982</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">(</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">AF_INET</tt><tt class="py-op">,</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">SOCK_STREAM</tt><tt class="py-op">)</tt> </tt>
+<a name="L1983"></a><tt class="py-lineno">1983</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1984"></a><tt class="py-lineno">1984</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">connect</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt id="link-498" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-498', 'VIEW_SERVER_HOST', 'link-27');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1985"></a><tt class="py-lineno">1985</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">error</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1986"></a><tt class="py-lineno">1986</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Connecting to %s:%d: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-499" class="py-name"><a title="com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-499', 'VIEW_SERVER_HOST', 'link-27');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1987"></a><tt class="py-lineno">1987</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">send</tt><tt class="py-op">(</tt><tt class="py-string">'list\r\n'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1988"></a><tt class="py-lineno">1988</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-string">""</tt> </tt>
+<a name="L1989"></a><tt class="py-lineno">1989</tt> <tt class="py-line"> <tt class="py-name">doneRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"DONE"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1990"></a><tt class="py-lineno">1990</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1991"></a><tt class="py-lineno">1991</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">+=</tt> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">1024</tt><tt class="py-op">)</tt> </tt>
+<a name="L1992"></a><tt class="py-lineno">1992</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">7</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1993"></a><tt class="py-lineno">1993</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1994"></a><tt class="py-lineno">1994</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt id="link-500" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.close" class="py-name" href="#" onclick="return doclink('link-500', 'close', 'link-487');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1995"></a><tt class="py-lineno">1995</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-501" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-501', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1996"></a><tt class="py-lineno">1996</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1997"></a><tt class="py-lineno">1997</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-502" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-502', 'DEBUG_RECEIVED', 'link-6');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1998"></a><tt class="py-lineno">1998</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1999"></a><tt class="py-lineno">1999</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L2000"></a><tt class="py-lineno">2000</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L2001"></a><tt class="py-lineno">2001</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L2002"></a><tt class="py-lineno">2002</tt> <tt class="py-line"> </tt>
+<a name="L2003"></a><tt class="py-lineno">2003</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L2004"></a><tt class="py-lineno">2004</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">line</tt> <tt class="py-keyword">in</tt> <tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2005"></a><tt class="py-lineno">2005</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">line</tt><tt class="py-op">:</tt> </tt>
+<a name="L2006"></a><tt class="py-lineno">2006</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L2007"></a><tt class="py-lineno">2007</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">line</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2008"></a><tt class="py-lineno">2008</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L2009"></a><tt class="py-lineno">2009</tt> <tt class="py-line"> <tt class="py-name">values</tt> <tt class="py-op">=</tt> <tt class="py-name">line</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L2010"></a><tt class="py-lineno">2010</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">values</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L2011"></a><tt class="py-lineno">2011</tt> <tt class="py-line"> <tt class="py-name">package</tt> <tt class="py-op">=</tt> <tt class="py-name">values</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L2012"></a><tt class="py-lineno">2012</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2013"></a><tt class="py-lineno">2013</tt> <tt class="py-line"> <tt class="py-name">package</tt> <tt class="py-op">=</tt> <tt class="py-string">"UNKNOWN"</tt> </tt>
+<a name="L2014"></a><tt class="py-lineno">2014</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">values</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2015"></a><tt class="py-lineno">2015</tt> <tt class="py-line"> <tt class="py-name">wid</tt> <tt class="py-op">=</tt> <tt class="py-name">values</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L2016"></a><tt class="py-lineno">2016</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2017"></a><tt class="py-lineno">2017</tt> <tt class="py-line"> <tt class="py-name">wid</tt> <tt class="py-op">=</tt> <tt class="py-string">'00000000'</tt> </tt>
+<a name="L2018"></a><tt class="py-lineno">2018</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-string">'0x'</tt> <tt class="py-op">+</tt> <tt class="py-name">wid</tt><tt class="py-op">,</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">package</tt> </tt>
+<a name="L2019"></a><tt class="py-lineno">2019</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> </tt>
+</div><a name="L2020"></a><tt class="py-lineno">2020</tt> <tt class="py-line"> </tt>
+<a name="L2021"></a><tt class="py-lineno">2021</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewById"></a><div id="ViewClient.findViewById-def"><a name="L2022"></a><tt class="py-lineno">2022</tt> <a class="py-toggle" href="#" id="ViewClient.findViewById-toggle" onclick="return toggle('ViewClient.findViewById');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewById">findViewById</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">viewId</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">viewFilter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewById-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewById-expanded"><a name="L2023"></a><tt class="py-lineno">2023</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2024"></a><tt class="py-lineno">2024</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified viewId.</tt> </tt>
+<a name="L2025"></a><tt class="py-lineno">2025</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2026"></a><tt class="py-lineno">2026</tt> <tt class="py-line"><tt class="py-docstring"> @type viewId: str</tt> </tt>
+<a name="L2027"></a><tt class="py-lineno">2027</tt> <tt class="py-line"><tt class="py-docstring"> @param viewId: the ID of the view to find</tt> </tt>
+<a name="L2028"></a><tt class="py-lineno">2028</tt> <tt class="py-line"><tt class="py-docstring"> @type root: str</tt> </tt>
+<a name="L2029"></a><tt class="py-lineno">2029</tt> <tt class="py-line"><tt class="py-docstring"> @type root: View</tt> </tt>
+<a name="L2030"></a><tt class="py-lineno">2030</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node of the tree where the View will be searched</tt> </tt>
+<a name="L2031"></a><tt class="py-lineno">2031</tt> <tt class="py-line"><tt class="py-docstring"> @type: viewFilter: function</tt> </tt>
+<a name="L2032"></a><tt class="py-lineno">2032</tt> <tt class="py-line"><tt class="py-docstring"> @param viewFilter: a function that will be invoked providing the candidate View as a parameter</tt> </tt>
+<a name="L2033"></a><tt class="py-lineno">2033</tt> <tt class="py-line"><tt class="py-docstring"> and depending on the return value (C{True} or C{False}) the View will be</tt> </tt>
+<a name="L2034"></a><tt class="py-lineno">2034</tt> <tt class="py-line"><tt class="py-docstring"> selected and returned as the result of C{findViewById()} or ignored.</tt> </tt>
+<a name="L2035"></a><tt class="py-lineno">2035</tt> <tt class="py-line"><tt class="py-docstring"> This can be C{None} and no extra filtering is applied.</tt> </tt>
+<a name="L2036"></a><tt class="py-lineno">2036</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2037"></a><tt class="py-lineno">2037</tt> <tt class="py-line"><tt class="py-docstring"> @return: the C{View} found or C{None}</tt> </tt>
+<a name="L2038"></a><tt class="py-lineno">2038</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2039"></a><tt class="py-lineno">2039</tt> <tt class="py-line"> </tt>
+<a name="L2040"></a><tt class="py-lineno">2040</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L2041"></a><tt class="py-lineno">2041</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L2042"></a><tt class="py-lineno">2042</tt> <tt class="py-line"> </tt>
+<a name="L2043"></a><tt class="py-lineno">2043</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-503" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-503', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2044"></a><tt class="py-lineno">2044</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-504" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.findViewById()=com.dtmilano.android.viewclient.ViewClient-class.html#findViewById"><a title="com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-504', 'findViewById', 'link-504');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L2045"></a><tt class="py-lineno">2045</tt> <tt class="py-line"> </tt>
+<a name="L2046"></a><tt class="py-lineno">2046</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-505" class="py-name"><a title="com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-505', 'getId', 'link-134');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L2047"></a><tt class="py-lineno">2047</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L2048"></a><tt class="py-lineno">2048</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2049"></a><tt class="py-lineno">2049</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2050"></a><tt class="py-lineno">2050</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2051"></a><tt class="py-lineno">2051</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2052"></a><tt class="py-lineno">2052</tt> <tt class="py-line"> </tt>
+<a name="L2053"></a><tt class="py-lineno">2053</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^id/no_id'</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^id/.+/.+'</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2054"></a><tt class="py-lineno">2054</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-506" class="py-name"><a title="com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-506', 'getUniqueId', 'link-135');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L2055"></a><tt class="py-lineno">2055</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L2056"></a><tt class="py-lineno">2056</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2057"></a><tt class="py-lineno">2057</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt><tt class="py-op">;</tt> </tt>
+<a name="L2058"></a><tt class="py-lineno">2058</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2059"></a><tt class="py-lineno">2059</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2060"></a><tt class="py-lineno">2060</tt> <tt class="py-line"> </tt>
+<a name="L2061"></a><tt class="py-lineno">2061</tt> <tt class="py-line"> </tt>
+<a name="L2062"></a><tt class="py-lineno">2062</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L2063"></a><tt class="py-lineno">2063</tt> <tt class="py-line"> <tt class="py-name">foundView</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-507" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-507', 'findViewById', 'link-504');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L2064"></a><tt class="py-lineno">2064</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">foundView</tt><tt class="py-op">:</tt> </tt>
+<a name="L2065"></a><tt class="py-lineno">2065</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L2066"></a><tt class="py-lineno">2066</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">foundView</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2067"></a><tt class="py-lineno">2067</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">foundView</tt> </tt>
+<a name="L2068"></a><tt class="py-lineno">2068</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2069"></a><tt class="py-lineno">2069</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">foundView</tt> </tt>
+</div><a name="L2070"></a><tt class="py-lineno">2070</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByIdOrRaise"></a><div id="ViewClient.findViewByIdOrRaise-def"><a name="L2071"></a><tt class="py-lineno">2071</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByIdOrRaise-toggle" onclick="return toggle('ViewClient.findViewByIdOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise">findViewByIdOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">viewId</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">viewFilter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByIdOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByIdOrRaise-expanded"><a name="L2072"></a><tt class="py-lineno">2072</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2073"></a><tt class="py-lineno">2073</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L2074"></a><tt class="py-lineno">2074</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2075"></a><tt class="py-lineno">2075</tt> <tt class="py-line"><tt class="py-docstring"> @type viewId: str</tt> </tt>
+<a name="L2076"></a><tt class="py-lineno">2076</tt> <tt class="py-line"><tt class="py-docstring"> @param viewId: the ID of the view to find</tt> </tt>
+<a name="L2077"></a><tt class="py-lineno">2077</tt> <tt class="py-line"><tt class="py-docstring"> @type root: str</tt> </tt>
+<a name="L2078"></a><tt class="py-lineno">2078</tt> <tt class="py-line"><tt class="py-docstring"> @type root: View</tt> </tt>
+<a name="L2079"></a><tt class="py-lineno">2079</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node of the tree where the View will be searched</tt> </tt>
+<a name="L2080"></a><tt class="py-lineno">2080</tt> <tt class="py-line"><tt class="py-docstring"> @type: viewFilter: function</tt> </tt>
+<a name="L2081"></a><tt class="py-lineno">2081</tt> <tt class="py-line"><tt class="py-docstring"> @param viewFilter: a function that will be invoked providing the candidate View as a parameter</tt> </tt>
+<a name="L2082"></a><tt class="py-lineno">2082</tt> <tt class="py-line"><tt class="py-docstring"> and depending on the return value (C{True} or C{False}) the View will be</tt> </tt>
+<a name="L2083"></a><tt class="py-lineno">2083</tt> <tt class="py-line"><tt class="py-docstring"> selected and returned as the result of C{findViewById()} or ignored.</tt> </tt>
+<a name="L2084"></a><tt class="py-lineno">2084</tt> <tt class="py-line"><tt class="py-docstring"> This can be C{None} and no extra filtering is applied.</tt> </tt>
+<a name="L2085"></a><tt class="py-lineno">2085</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2086"></a><tt class="py-lineno">2086</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2087"></a><tt class="py-lineno">2087</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2088"></a><tt class="py-lineno">2088</tt> <tt class="py-line"> </tt>
+<a name="L2089"></a><tt class="py-lineno">2089</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-508" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-508', 'findViewById', 'link-504');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L2090"></a><tt class="py-lineno">2090</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2091"></a><tt class="py-lineno">2091</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2092"></a><tt class="py-lineno">2092</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2093"></a><tt class="py-lineno">2093</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-509" class="py-name" targets="Class com.dtmilano.android.viewclient.ViewNotFoundException=com.dtmilano.android.viewclient.ViewNotFoundException-class.html"><a title="com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-509', 'ViewNotFoundException', 'link-509');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"ID"</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2094"></a><tt class="py-lineno">2094</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByTag"></a><div id="ViewClient.findViewByTag-def"><a name="L2095"></a><tt class="py-lineno">2095</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByTag-toggle" onclick="return toggle('ViewClient.findViewByTag');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTag">findViewByTag</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tag</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByTag-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByTag-expanded"><a name="L2096"></a><tt class="py-lineno">2096</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2097"></a><tt class="py-lineno">2097</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified tag</tt> </tt>
+<a name="L2098"></a><tt class="py-lineno">2098</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2099"></a><tt class="py-lineno">2099</tt> <tt class="py-line"> </tt>
+<a name="L2100"></a><tt class="py-lineno">2100</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-510" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute()=com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-510', 'findViewWithAttribute', 'link-510');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-string">'getTag()'</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2101"></a><tt class="py-lineno">2101</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByTagOrRaise"></a><div id="ViewClient.findViewByTagOrRaise-def"><a name="L2102"></a><tt class="py-lineno">2102</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByTagOrRaise-toggle" onclick="return toggle('ViewClient.findViewByTagOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTagOrRaise">findViewByTagOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tag</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByTagOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByTagOrRaise-expanded"><a name="L2103"></a><tt class="py-lineno">2103</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2104"></a><tt class="py-lineno">2104</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified tag or raise a ViewNotFoundException</tt> </tt>
+<a name="L2105"></a><tt class="py-lineno">2105</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2106"></a><tt class="py-lineno">2106</tt> <tt class="py-line"> </tt>
+<a name="L2107"></a><tt class="py-lineno">2107</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-511" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-511', 'findViewWithAttribute', 'link-510');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-string">'getTag()'</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2108"></a><tt class="py-lineno">2108</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2109"></a><tt class="py-lineno">2109</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2110"></a><tt class="py-lineno">2110</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2111"></a><tt class="py-lineno">2111</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-512" class="py-name"><a title="com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-512', 'ViewNotFoundException', 'link-509');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"tag"</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2112"></a><tt class="py-lineno">2112</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTree"></a><div id="ViewClient.__findViewWithAttributeInTree-def"><a name="L2113"></a><tt class="py-lineno">2113</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTree-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTree');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree">__findViewWithAttributeInTree</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTree-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTree-expanded"><a name="L2114"></a><tt class="py-lineno">2114</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L2115"></a><tt class="py-lineno">2115</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: no root, did you forget to call dump()?"</tt> </tt>
+<a name="L2116"></a><tt class="py-lineno">2116</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L2117"></a><tt class="py-lineno">2117</tt> <tt class="py-line"> </tt>
+<a name="L2118"></a><tt class="py-lineno">2118</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-513" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-513', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2119"></a><tt class="py-lineno">2119</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L2120"></a><tt class="py-lineno">2120</tt> <tt class="py-line"> </tt>
+<a name="L2121"></a><tt class="py-lineno">2121</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-514" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-514', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: type val="</tt><tt class="py-op">,</tt> <tt id="link-515" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-515', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">val</tt><tt class="py-op">)</tt> </tt>
+<a name="L2122"></a><tt class="py-lineno">2122</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-516" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-516', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: checking if root=%s has attr=%s == %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-517" class="py-name"><a title="com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-517', '__smallStr__', 'link-403');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">)</tt> </tt>
+<a name="L2123"></a><tt class="py-lineno">2123</tt> <tt class="py-line"> </tt>
+<a name="L2124"></a><tt class="py-lineno">2124</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">RegexType</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2125"></a><tt class="py-lineno">2125</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-518" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches()=com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-518', '__findViewWithAttributeInTreeThatMatches', 'link-518');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2126"></a><tt class="py-lineno">2126</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2127"></a><tt class="py-lineno">2127</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt> <tt class="py-keyword">and</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">attr</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-name">val</tt><tt class="py-op">:</tt> </tt>
+<a name="L2128"></a><tt class="py-lineno">2128</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-519" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-519', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: FOUND: %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-520" class="py-name"><a title="com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-520', '__smallStr__', 'link-403');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L2129"></a><tt class="py-lineno">2129</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2130"></a><tt class="py-lineno">2130</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2131"></a><tt class="py-lineno">2131</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L2132"></a><tt class="py-lineno">2132</tt> <tt class="py-line"> <tt class="py-name">v</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-521" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree()=com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-521', '__findViewWithAttributeInTree', 'link-521');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">)</tt> </tt>
+<a name="L2133"></a><tt class="py-lineno">2133</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> </tt>
+<a name="L2134"></a><tt class="py-lineno">2134</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">v</tt> </tt>
+<a name="L2135"></a><tt class="py-lineno">2135</tt> <tt class="py-line"> </tt>
+<a name="L2136"></a><tt class="py-lineno">2136</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2137"></a><tt class="py-lineno">2137</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTreeOrRaise"></a><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-def"><a name="L2138"></a><tt class="py-lineno">2138</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTreeOrRaise-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTreeOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise">__findViewWithAttributeInTreeOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-expanded"><a name="L2139"></a><tt class="py-lineno">2139</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-522" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-522', '__findViewWithAttributeInTree', 'link-521');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2140"></a><tt class="py-lineno">2140</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2141"></a><tt class="py-lineno">2141</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2142"></a><tt class="py-lineno">2142</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2143"></a><tt class="py-lineno">2143</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-523" class="py-name"><a title="com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-523', 'ViewNotFoundException', 'link-509');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2144"></a><tt class="py-lineno">2144</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTreeThatMatches"></a><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-def"><a name="L2145"></a><tt class="py-lineno">2145</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTreeThatMatches-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTreeThatMatches');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches">__findViewWithAttributeInTreeThatMatches</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">regex</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">,</tt> <tt class="py-param">rlist</tt><tt class="py-op">=</tt><tt class="py-op">[</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-expanded"><a name="L2146"></a><tt class="py-lineno">2146</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L2147"></a><tt class="py-lineno">2147</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: no root, did you forget to call dump()?"</tt> </tt>
+<a name="L2148"></a><tt class="py-lineno">2148</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L2149"></a><tt class="py-lineno">2149</tt> <tt class="py-line"> </tt>
+<a name="L2150"></a><tt class="py-lineno">2150</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-524" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.type
+com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-524', 'type', 'link-55');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2151"></a><tt class="py-lineno">2151</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L2152"></a><tt class="py-lineno">2152</tt> <tt class="py-line"> </tt>
+<a name="L2153"></a><tt class="py-lineno">2153</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-525" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-525', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTreeThatMatches: checking if root=%s attr=%s matches %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-526" class="py-name"><a title="com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-526', '__smallStr__', 'link-403');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">)</tt> </tt>
+<a name="L2154"></a><tt class="py-lineno">2154</tt> <tt class="py-line"> </tt>
+<a name="L2155"></a><tt class="py-lineno">2155</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt> <tt class="py-keyword">and</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">regex</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">attr</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2156"></a><tt class="py-lineno">2156</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-527" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-527', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTreeThatMatches: FOUND: %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-528" class="py-name"><a title="com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-528', '__smallStr__', 'link-403');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L2157"></a><tt class="py-lineno">2157</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2158"></a><tt class="py-lineno">2158</tt> <tt class="py-line"> <tt class="py-comment">#print >>sys.stderr, "appending root=%s to rlist=%s" % (root.__smallStr__(), rlist)</tt> </tt>
+<a name="L2159"></a><tt class="py-lineno">2159</tt> <tt class="py-line"> <tt class="py-comment">#return rlist.append(root)</tt> </tt>
+<a name="L2160"></a><tt class="py-lineno">2160</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2161"></a><tt class="py-lineno">2161</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L2162"></a><tt class="py-lineno">2162</tt> <tt class="py-line"> <tt class="py-name">v</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-529" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-529', '__findViewWithAttributeInTreeThatMatches', 'link-518');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">rlist</tt><tt class="py-op">)</tt> </tt>
+<a name="L2163"></a><tt class="py-lineno">2163</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> </tt>
+<a name="L2164"></a><tt class="py-lineno">2164</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">v</tt> </tt>
+<a name="L2165"></a><tt class="py-lineno">2165</tt> <tt class="py-line"> <tt class="py-comment">#print >>sys.stderr, "appending v=%s to rlist=%s" % (v.__smallStr__(), rlist)</tt> </tt>
+<a name="L2166"></a><tt class="py-lineno">2166</tt> <tt class="py-line"> <tt class="py-comment">#return rlist.append(v)</tt> </tt>
+<a name="L2167"></a><tt class="py-lineno">2167</tt> <tt class="py-line"> </tt>
+<a name="L2168"></a><tt class="py-lineno">2168</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2169"></a><tt class="py-lineno">2169</tt> <tt class="py-line"> <tt class="py-comment">#return rlist</tt> </tt>
+<a name="L2170"></a><tt class="py-lineno">2170</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttribute"></a><div id="ViewClient.findViewWithAttribute-def"><a name="L2171"></a><tt class="py-lineno">2171</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttribute-toggle" onclick="return toggle('ViewClient.findViewWithAttribute');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute">findViewWithAttribute</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttribute-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttribute-expanded"><a name="L2172"></a><tt class="py-lineno">2172</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2173"></a><tt class="py-lineno">2173</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified attribute and value</tt> </tt>
+<a name="L2174"></a><tt class="py-lineno">2174</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2175"></a><tt class="py-lineno">2175</tt> <tt class="py-line"> </tt>
+<a name="L2176"></a><tt class="py-lineno">2176</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-530" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-530', '__findViewWithAttributeInTree', 'link-521');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2177"></a><tt class="py-lineno">2177</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttributeOrRaise"></a><div id="ViewClient.findViewWithAttributeOrRaise-def"><a name="L2178"></a><tt class="py-lineno">2178</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttributeOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithAttributeOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise">findViewWithAttributeOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttributeOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttributeOrRaise-expanded"><a name="L2179"></a><tt class="py-lineno">2179</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2180"></a><tt class="py-lineno">2180</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L2181"></a><tt class="py-lineno">2181</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2182"></a><tt class="py-lineno">2182</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2183"></a><tt class="py-lineno">2183</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2184"></a><tt class="py-lineno">2184</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2185"></a><tt class="py-lineno">2185</tt> <tt class="py-line"> </tt>
+<a name="L2186"></a><tt class="py-lineno">2186</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-531" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-531', 'findViewWithAttribute', 'link-510');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2187"></a><tt class="py-lineno">2187</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2188"></a><tt class="py-lineno">2188</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2189"></a><tt class="py-lineno">2189</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2190"></a><tt class="py-lineno">2190</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-532" class="py-name"><a title="com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-532', 'ViewNotFoundException', 'link-509');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2191"></a><tt class="py-lineno">2191</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttributeThatMatches"></a><div id="ViewClient.findViewWithAttributeThatMatches-def"><a name="L2192"></a><tt class="py-lineno">2192</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttributeThatMatches-toggle" onclick="return toggle('ViewClient.findViewWithAttributeThatMatches');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches">findViewWithAttributeThatMatches</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">regex</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttributeThatMatches-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttributeThatMatches-expanded"><a name="L2193"></a><tt class="py-lineno">2193</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2194"></a><tt class="py-lineno">2194</tt> <tt class="py-line"><tt class="py-docstring"> Finds the list of Views with the specified attribute matching</tt> </tt>
+<a name="L2195"></a><tt class="py-lineno">2195</tt> <tt class="py-line"><tt class="py-docstring"> regex</tt> </tt>
+<a name="L2196"></a><tt class="py-lineno">2196</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2197"></a><tt class="py-lineno">2197</tt> <tt class="py-line"> </tt>
+<a name="L2198"></a><tt class="py-lineno">2198</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-533" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-533', '__findViewWithAttributeInTreeThatMatches', 'link-518');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2199"></a><tt class="py-lineno">2199</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithText"></a><div id="ViewClient.findViewWithText-def"><a name="L2200"></a><tt class="py-lineno">2200</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithText-toggle" onclick="return toggle('ViewClient.findViewWithText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText">findViewWithText</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithText-expanded"><a name="L2201"></a><tt class="py-lineno">2201</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-534" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-534', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2202"></a><tt class="py-lineno">2202</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"findViewWithText(%s, %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2203"></a><tt class="py-lineno">2203</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">RegexType</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2204"></a><tt class="py-lineno">2204</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-535" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeThatMatches()=com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeThatMatches" class="py-name" href="#" onclick="return doclink('link-535', 'findViewWithAttributeThatMatches', 'link-535');">findViewWithAttributeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2205"></a><tt class="py-lineno">2205</tt> <tt class="py-line"> <tt class="py-comment">#l = self.findViewWithAttributeThatMatches(TEXT_PROPERTY, text)</tt> </tt>
+<a name="L2206"></a><tt class="py-lineno">2206</tt> <tt class="py-line"> <tt class="py-comment">#ll = len(l)</tt> </tt>
+<a name="L2207"></a><tt class="py-lineno">2207</tt> <tt class="py-line"> <tt class="py-comment">#if ll == 0:</tt> </tt>
+<a name="L2208"></a><tt class="py-lineno">2208</tt> <tt class="py-line"> <tt class="py-comment"># return None</tt> </tt>
+<a name="L2209"></a><tt class="py-lineno">2209</tt> <tt class="py-line"> <tt class="py-comment">#elif ll == 1:</tt> </tt>
+<a name="L2210"></a><tt class="py-lineno">2210</tt> <tt class="py-line"> <tt class="py-comment"># return l[0]</tt> </tt>
+<a name="L2211"></a><tt class="py-lineno">2211</tt> <tt class="py-line"> <tt class="py-comment">#else:</tt> </tt>
+<a name="L2212"></a><tt class="py-lineno">2212</tt> <tt class="py-line"> <tt class="py-comment"># print >>sys.stderr, "WARNING: findViewWithAttributeThatMatches invoked by findViewWithText returns %d items." % ll</tt> </tt>
+<a name="L2213"></a><tt class="py-lineno">2213</tt> <tt class="py-line"> <tt class="py-comment"># return l</tt> </tt>
+<a name="L2214"></a><tt class="py-lineno">2214</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2215"></a><tt class="py-lineno">2215</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-536" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-536', 'findViewWithAttribute', 'link-510');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2216"></a><tt class="py-lineno">2216</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithTextOrRaise"></a><div id="ViewClient.findViewWithTextOrRaise-def"><a name="L2217"></a><tt class="py-lineno">2217</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithTextOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithTextOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise">findViewWithTextOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithTextOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithTextOrRaise-expanded"><a name="L2218"></a><tt class="py-lineno">2218</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2219"></a><tt class="py-lineno">2219</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L2220"></a><tt class="py-lineno">2220</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2221"></a><tt class="py-lineno">2221</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2222"></a><tt class="py-lineno">2222</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2223"></a><tt class="py-lineno">2223</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2224"></a><tt class="py-lineno">2224</tt> <tt class="py-line"> </tt>
+<a name="L2225"></a><tt class="py-lineno">2225</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-537" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-537', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2226"></a><tt class="py-lineno">2226</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"findViewWithTextOrRaise(%s, %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2227"></a><tt class="py-lineno">2227</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-538" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.findViewWithText()=com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText"><a title="com.dtmilano.android.viewclient.ViewClient.findViewWithText" class="py-name" href="#" onclick="return doclink('link-538', 'findViewWithText', 'link-538');">findViewWithText</a></tt><tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2228"></a><tt class="py-lineno">2228</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2229"></a><tt class="py-lineno">2229</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2230"></a><tt class="py-lineno">2230</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2231"></a><tt class="py-lineno">2231</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-539" class="py-name"><a title="com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-539', 'ViewNotFoundException', 'link-509');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"text"</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2232"></a><tt class="py-lineno">2232</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithContentDescription"></a><div id="ViewClient.findViewWithContentDescription-def"><a name="L2233"></a><tt class="py-lineno">2233</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithContentDescription-toggle" onclick="return toggle('ViewClient.findViewWithContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescription">findViewWithContentDescription</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithContentDescription-expanded"><a name="L2234"></a><tt class="py-lineno">2234</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2235"></a><tt class="py-lineno">2235</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified content description</tt> </tt>
+<a name="L2236"></a><tt class="py-lineno">2236</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2237"></a><tt class="py-lineno">2237</tt> <tt class="py-line"> </tt>
+<a name="L2238"></a><tt class="py-lineno">2238</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-540" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-540', '__findViewWithAttributeInTree', 'link-521');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">,</tt> <tt class="py-name">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2239"></a><tt class="py-lineno">2239</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithContentDescriptionOrRaise"></a><div id="ViewClient.findViewWithContentDescriptionOrRaise-def"><a name="L2240"></a><tt class="py-lineno">2240</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithContentDescriptionOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithContentDescriptionOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescriptionOrRaise">findViewWithContentDescriptionOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithContentDescriptionOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithContentDescriptionOrRaise-expanded"><a name="L2241"></a><tt class="py-lineno">2241</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2242"></a><tt class="py-lineno">2242</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified content description</tt> </tt>
+<a name="L2243"></a><tt class="py-lineno">2243</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2244"></a><tt class="py-lineno">2244</tt> <tt class="py-line"> </tt>
+<a name="L2245"></a><tt class="py-lineno">2245</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-541" class="py-name" targets="Method com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeOrRaise()=com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise"><a title="com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeOrRaise" class="py-name" href="#" onclick="return doclink('link-541', '__findViewWithAttributeInTreeOrRaise', 'link-541');">__findViewWithAttributeInTreeOrRaise</a></tt><tt class="py-op">(</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">,</tt> <tt class="py-name">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2246"></a><tt class="py-lineno">2246</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewsContainingPoint"></a><div id="ViewClient.findViewsContainingPoint-def"><a name="L2247"></a><tt class="py-lineno">2247</tt> <a class="py-toggle" href="#" id="ViewClient.findViewsContainingPoint-toggle" onclick="return toggle('ViewClient.findViewsContainingPoint');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewsContainingPoint">findViewsContainingPoint</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x</tt><tt class="py-op">,</tt> <tt class="py-param">y</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-param">filter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewsContainingPoint-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewsContainingPoint-expanded"><a name="L2248"></a><tt class="py-lineno">2248</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2249"></a><tt class="py-lineno">2249</tt> <tt class="py-line"><tt class="py-docstring"> Finds the list of Views that contain the point (x, y).</tt> </tt>
+<a name="L2250"></a><tt class="py-lineno">2250</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2251"></a><tt class="py-lineno">2251</tt> <tt class="py-line"> </tt>
+<a name="L2252"></a><tt class="py-lineno">2252</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">filter</tt><tt class="py-op">:</tt> </tt>
+<a name="L2253"></a><tt class="py-lineno">2253</tt> <tt class="py-line"> <tt class="py-name">filter</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> <tt class="py-name">True</tt> </tt>
+<a name="L2254"></a><tt class="py-lineno">2254</tt> <tt class="py-line"> </tt>
+<a name="L2255"></a><tt class="py-lineno">2255</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">[</tt><tt class="py-name">v</tt> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt id="link-542" class="py-name" targets="Method com.dtmilano.android.viewclient.View.containsPoint()=com.dtmilano.android.viewclient.View-class.html#containsPoint"><a title="com.dtmilano.android.viewclient.View.containsPoint" class="py-name" href="#" onclick="return doclink('link-542', 'containsPoint', 'link-542');">containsPoint</a></tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt><tt class="py-name">y</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-name">filter</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2256"></a><tt class="py-lineno">2256</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getViewIds"></a><div id="ViewClient.getViewIds-def"><a name="L2257"></a><tt class="py-lineno">2257</tt> <a class="py-toggle" href="#" id="ViewClient.getViewIds-toggle" onclick="return toggle('ViewClient.getViewIds');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds">getViewIds</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getViewIds-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getViewIds-expanded"><a name="L2258"></a><tt class="py-lineno">2258</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2259"></a><tt class="py-lineno">2259</tt> <tt class="py-line"><tt class="py-docstring"> @deprecated: Use L{getViewsById} instead.</tt> </tt>
+<a name="L2260"></a><tt class="py-lineno">2260</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2261"></a><tt class="py-lineno">2261</tt> <tt class="py-line"><tt class="py-docstring"> Returns the Views map.</tt> </tt>
+<a name="L2262"></a><tt class="py-lineno">2262</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2263"></a><tt class="py-lineno">2263</tt> <tt class="py-line"> </tt>
+<a name="L2264"></a><tt class="py-lineno">2264</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> </tt>
+</div><a name="L2265"></a><tt class="py-lineno">2265</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getViewsById"></a><div id="ViewClient.getViewsById-def"><a name="L2266"></a><tt class="py-lineno">2266</tt> <a class="py-toggle" href="#" id="ViewClient.getViewsById-toggle" onclick="return toggle('ViewClient.getViewsById');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById">getViewsById</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getViewsById-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getViewsById-expanded"><a name="L2267"></a><tt class="py-lineno">2267</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2268"></a><tt class="py-lineno">2268</tt> <tt class="py-line"><tt class="py-docstring"> Returns the Views map. The keys are C{uniqueIds} and the values are C{View}s.</tt> </tt>
+<a name="L2269"></a><tt class="py-lineno">2269</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2270"></a><tt class="py-lineno">2270</tt> <tt class="py-line"> </tt>
+<a name="L2271"></a><tt class="py-lineno">2271</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> </tt>
+</div><a name="L2272"></a><tt class="py-lineno">2272</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__getFocusedWindowPosition"></a><div id="ViewClient.__getFocusedWindowPosition-def"><a name="L2273"></a><tt class="py-lineno">2273</tt> <a class="py-toggle" href="#" id="ViewClient.__getFocusedWindowPosition-toggle" onclick="return toggle('ViewClient.__getFocusedWindowPosition');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__getFocusedWindowPosition">__getFocusedWindowPosition</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__getFocusedWindowPosition-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__getFocusedWindowPosition-expanded"><a name="L2274"></a><tt class="py-lineno">2274</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">__getFocusedWindowId</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2275"></a><tt class="py-lineno">2275</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getSdkVersion"></a><div id="ViewClient.getSdkVersion-def"><a name="L2276"></a><tt class="py-lineno">2276</tt> <a class="py-toggle" href="#" id="ViewClient.getSdkVersion-toggle" onclick="return toggle('ViewClient.getSdkVersion');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#getSdkVersion">getSdkVersion</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getSdkVersion-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getSdkVersion-expanded"><a name="L2277"></a><tt class="py-lineno">2277</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2278"></a><tt class="py-lineno">2278</tt> <tt class="py-line"><tt class="py-docstring"> Gets the SDK version.</tt> </tt>
+<a name="L2279"></a><tt class="py-lineno">2279</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2280"></a><tt class="py-lineno">2280</tt> <tt class="py-line"> </tt>
+<a name="L2281"></a><tt class="py-lineno">2281</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-543" class="py-name"><a title="com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY
+com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-543', 'VERSION_SDK_PROPERTY', 'link-34');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2282"></a><tt class="py-lineno">2282</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.isKeyboardShown"></a><div id="ViewClient.isKeyboardShown-def"><a name="L2283"></a><tt class="py-lineno">2283</tt> <a class="py-toggle" href="#" id="ViewClient.isKeyboardShown-toggle" onclick="return toggle('ViewClient.isKeyboardShown');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#isKeyboardShown">isKeyboardShown</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.isKeyboardShown-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.isKeyboardShown-expanded"><a name="L2284"></a><tt class="py-lineno">2284</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2285"></a><tt class="py-lineno">2285</tt> <tt class="py-line"><tt class="py-docstring"> Whether the keyboard is displayed.</tt> </tt>
+<a name="L2286"></a><tt class="py-lineno">2286</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2287"></a><tt class="py-lineno">2287</tt> <tt class="py-line"> </tt>
+<a name="L2288"></a><tt class="py-lineno">2288</tt> <tt class="py-line"> <tt class="py-name">dim</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-544" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.shell" class="py-name" href="#" onclick="return doclink('link-544', 'shell', 'link-73');">shell</a></tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys input_method'</tt><tt class="py-op">)</tt> </tt>
+<a name="L2289"></a><tt class="py-lineno">2289</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">dim</tt><tt class="py-op">:</tt> </tt>
+<a name="L2290"></a><tt class="py-lineno">2290</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: API >= 15 ?</tt> </tt>
+<a name="L2291"></a><tt class="py-lineno">2291</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"mInputShown=true"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">dim</tt> </tt>
+<a name="L2292"></a><tt class="py-lineno">2292</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">False</tt> </tt>
+</div><a name="L2293"></a><tt class="py-lineno">2293</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.writeImageToFile"></a><div id="ViewClient.writeImageToFile-def"><a name="L2294"></a><tt class="py-lineno">2294</tt> <a class="py-toggle" href="#" id="ViewClient.writeImageToFile-toggle" onclick="return toggle('ViewClient.writeImageToFile');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile">writeImageToFile</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">format</tt><tt class="py-op">=</tt><tt class="py-string">"PNG"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.writeImageToFile-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.writeImageToFile-expanded"><a name="L2295"></a><tt class="py-lineno">2295</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2296"></a><tt class="py-lineno">2296</tt> <tt class="py-line"><tt class="py-docstring"> Write the View image to the specified filename in the specified format.</tt> </tt>
+<a name="L2297"></a><tt class="py-lineno">2297</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2298"></a><tt class="py-lineno">2298</tt> <tt class="py-line"><tt class="py-docstring"> @type filename: str</tt> </tt>
+<a name="L2299"></a><tt class="py-lineno">2299</tt> <tt class="py-line"><tt class="py-docstring"> @param filename: Absolute path and optional filename receiving the image. If this points to</tt> </tt>
+<a name="L2300"></a><tt class="py-lineno">2300</tt> <tt class="py-line"><tt class="py-docstring"> a directory, then the filename is determined by the serialno of the device and</tt> </tt>
+<a name="L2301"></a><tt class="py-lineno">2301</tt> <tt class="py-line"><tt class="py-docstring"> format extension.</tt> </tt>
+<a name="L2302"></a><tt class="py-lineno">2302</tt> <tt class="py-line"><tt class="py-docstring"> @type format: str</tt> </tt>
+<a name="L2303"></a><tt class="py-lineno">2303</tt> <tt class="py-line"><tt class="py-docstring"> @param format: Image format (default format is PNG)</tt> </tt>
+<a name="L2304"></a><tt class="py-lineno">2304</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2305"></a><tt class="py-lineno">2305</tt> <tt class="py-line"> </tt>
+<a name="L2306"></a><tt class="py-lineno">2306</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2307"></a><tt class="py-lineno">2307</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"writeImageToFile expects an absolute path"</tt><tt class="py-op">)</tt> </tt>
+<a name="L2308"></a><tt class="py-lineno">2308</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2309"></a><tt class="py-lineno">2309</tt> <tt class="py-line"> <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> <tt class="py-op">+</tt> <tt class="py-name">format</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2310"></a><tt class="py-lineno">2310</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-545" class="py-name"><a title="com.dtmilano.android.adb.adbclient.DEBUG
+com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-545', 'DEBUG', 'link-3');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2311"></a><tt class="py-lineno">2311</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"writeImageToFile: saving image to '%s' in %s format"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+<a name="L2312"></a><tt class="py-lineno">2312</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-546" class="py-name"><a title="com.dtmilano.android.adb.adbclient.AdbClient.takeSnapshot" class="py-name" href="#" onclick="return doclink('link-546', 'takeSnapshot', 'link-285');">takeSnapshot</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">save</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2313"></a><tt class="py-lineno">2313</tt> <tt class="py-line"> </tt>
+<a name="L2314"></a><tt class="py-lineno">2314</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__pickleable"></a><div id="ViewClient.__pickleable-def"><a name="L2315"></a><tt class="py-lineno">2315</tt> <a class="py-toggle" href="#" id="ViewClient.__pickleable-toggle" onclick="return toggle('ViewClient.__pickleable');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable">__pickleable</a><tt class="py-op">(</tt><tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__pickleable-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__pickleable-expanded"><a name="L2316"></a><tt class="py-lineno">2316</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2317"></a><tt class="py-lineno">2317</tt> <tt class="py-line"><tt class="py-docstring"> Makes the tree pickleable.</tt> </tt>
+<a name="L2318"></a><tt class="py-lineno">2318</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2319"></a><tt class="py-lineno">2319</tt> <tt class="py-line"> </tt>
+<a name="L2320"></a><tt class="py-lineno">2320</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">removeDeviceReference</tt><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2321"></a><tt class="py-lineno">2321</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2322"></a><tt class="py-lineno">2322</tt> <tt class="py-line"><tt class="py-docstring"> Removes the reference to a L{MonkeyDevice}.</tt> </tt>
+<a name="L2323"></a><tt class="py-lineno">2323</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2324"></a><tt class="py-lineno">2324</tt> <tt class="py-line"> </tt>
+<a name="L2325"></a><tt class="py-lineno">2325</tt> <tt class="py-line"> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2326"></a><tt class="py-lineno">2326</tt> <tt class="py-line"> </tt>
+<a name="L2327"></a><tt class="py-lineno">2327</tt> <tt class="py-line"> <tt class="py-comment">###########################################################################################</tt> </tt>
+<a name="L2328"></a><tt class="py-lineno">2328</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: Unfortunatelly deepcopy does not work with MonkeyDevice objects, which is</tt> </tt>
+<a name="L2329"></a><tt class="py-lineno">2329</tt> <tt class="py-line"> <tt class="py-comment"># sadly the reason why we cannot pickle the tree and we need to remove the MonkeyDevice</tt> </tt>
+<a name="L2330"></a><tt class="py-lineno">2330</tt> <tt class="py-line"> <tt class="py-comment"># references.</tt> </tt>
+<a name="L2331"></a><tt class="py-lineno">2331</tt> <tt class="py-line"> <tt class="py-comment"># We wanted to copy the tree to preserve the original and make piclkleable the copy.</tt> </tt>
+<a name="L2332"></a><tt class="py-lineno">2332</tt> <tt class="py-line"> <tt class="py-comment">#treeCopy = copy.deepcopy(tree)</tt> </tt>
+<a name="L2333"></a><tt class="py-lineno">2333</tt> <tt class="py-line"> <tt class="py-name">treeCopy</tt> <tt class="py-op">=</tt> <tt class="py-name">tree</tt> </tt>
+<a name="L2334"></a><tt class="py-lineno">2334</tt> <tt class="py-line"> <tt class="py-comment"># IMPORTANT:</tt> </tt>
+<a name="L2335"></a><tt class="py-lineno">2335</tt> <tt class="py-line"> <tt class="py-comment"># This assumes that the first element in the list is the tree root</tt> </tt>
+<a name="L2336"></a><tt class="py-lineno">2336</tt> <tt class="py-line"> <tt id="link-547" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-547', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-548" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-548', '__traverse', 'link-464');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">treeCopy</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">=</tt><tt class="py-name">removeDeviceReference</tt><tt class="py-op">)</tt> </tt>
+<a name="L2337"></a><tt class="py-lineno">2337</tt> <tt class="py-line"> <tt class="py-comment">###########################################################################################</tt> </tt>
+<a name="L2338"></a><tt class="py-lineno">2338</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">treeCopy</tt> </tt>
+</div><a name="L2339"></a><tt class="py-lineno">2339</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.distance"></a><div id="ViewClient.distance-def"><a name="L2340"></a><tt class="py-lineno">2340</tt> <a class="py-toggle" href="#" id="ViewClient.distance-toggle" onclick="return toggle('ViewClient.distance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#distance">distance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.distance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.distance-expanded"><a name="L2341"></a><tt class="py-lineno">2341</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2342"></a><tt class="py-lineno">2342</tt> <tt class="py-line"><tt class="py-docstring"> Calculates the distance between this tree and the tree passed as argument.</tt> </tt>
+<a name="L2343"></a><tt class="py-lineno">2343</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2344"></a><tt class="py-lineno">2344</tt> <tt class="py-line"><tt class="py-docstring"> @type tree: list of Views</tt> </tt>
+<a name="L2345"></a><tt class="py-lineno">2345</tt> <tt class="py-line"><tt class="py-docstring"> @param tree: Tree of Views</tt> </tt>
+<a name="L2346"></a><tt class="py-lineno">2346</tt> <tt class="py-line"><tt class="py-docstring"> @return: the distance</tt> </tt>
+<a name="L2347"></a><tt class="py-lineno">2347</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2348"></a><tt class="py-lineno">2348</tt> <tt class="py-line"> <tt class="py-comment">################################################################</tt> </tt>
+<a name="L2349"></a><tt class="py-lineno">2349</tt> <tt class="py-line"> <tt class="py-comment">#FIXME: this should copy the entire tree and then transform it #</tt> </tt>
+<a name="L2350"></a><tt class="py-lineno">2350</tt> <tt class="py-line"> <tt class="py-comment">################################################################</tt> </tt>
+<a name="L2351"></a><tt class="py-lineno">2351</tt> <tt class="py-line"> <tt class="py-name">pickleableViews</tt> <tt class="py-op">=</tt> <tt id="link-549" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-549', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-550" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__pickleable()=com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable"><a title="com.dtmilano.android.viewclient.ViewClient.__pickleable" class="py-name" href="#" onclick="return doclink('link-550', '__pickleable', 'link-550');">__pickleable</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+<a name="L2352"></a><tt class="py-lineno">2352</tt> <tt class="py-line"> <tt class="py-name">pickleableTree</tt> <tt class="py-op">=</tt> <tt id="link-551" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-551', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-552" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__pickleable" class="py-name" href="#" onclick="return doclink('link-552', '__pickleable', 'link-550');">__pickleable</a></tt><tt class="py-op">(</tt><tt class="py-name">tree</tt><tt class="py-op">)</tt> </tt>
+<a name="L2353"></a><tt class="py-lineno">2353</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-name">pickle</tt><tt class="py-op">.</tt><tt class="py-name">dumps</tt><tt class="py-op">(</tt><tt class="py-name">pickleableViews</tt><tt class="py-op">)</tt> </tt>
+<a name="L2354"></a><tt class="py-lineno">2354</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-name">pickle</tt><tt class="py-op">.</tt><tt class="py-name">dumps</tt><tt class="py-op">(</tt><tt class="py-name">pickleableTree</tt><tt class="py-op">)</tt> </tt>
+<a name="L2355"></a><tt class="py-lineno">2355</tt> <tt class="py-line"> </tt>
+<a name="L2356"></a><tt class="py-lineno">2356</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-553" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-553', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2357"></a><tt class="py-lineno">2357</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: calculating distance between"</tt><tt class="py-op">,</tt> <tt class="py-name">s1</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">20</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-string">"and"</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">20</tt><tt class="py-op">]</tt> </tt>
+<a name="L2358"></a><tt class="py-lineno">2358</tt> <tt class="py-line"> </tt>
+<a name="L2359"></a><tt class="py-lineno">2359</tt> <tt class="py-line"> <tt class="py-name">l1</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2360"></a><tt class="py-lineno">2360</tt> <tt class="py-line"> <tt class="py-name">l2</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+<a name="L2361"></a><tt class="py-lineno">2361</tt> <tt class="py-line"> <tt class="py-name">t</tt> <tt class="py-op">=</tt> <tt class="py-name">float</tt><tt class="py-op">(</tt><tt class="py-name">max</tt><tt class="py-op">(</tt><tt class="py-name">l1</tt><tt class="py-op">,</tt> <tt class="py-name">l2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2362"></a><tt class="py-lineno">2362</tt> <tt class="py-line"> </tt>
+<a name="L2363"></a><tt class="py-lineno">2363</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">l1</tt> <tt class="py-op">==</tt> <tt class="py-name">l2</tt><tt class="py-op">:</tt> </tt>
+<a name="L2364"></a><tt class="py-lineno">2364</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-554" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-554', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2365"></a><tt class="py-lineno">2365</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: trees have same length, using Hamming distance"</tt> </tt>
+<a name="L2366"></a><tt class="py-lineno">2366</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-555" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-555', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-556" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__hammingDistance()=com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance"><a title="com.dtmilano.android.viewclient.ViewClient.__hammingDistance" class="py-name" href="#" onclick="return doclink('link-556', '__hammingDistance', 'link-556');">__hammingDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">/</tt><tt class="py-name">t</tt> </tt>
+<a name="L2367"></a><tt class="py-lineno">2367</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2368"></a><tt class="py-lineno">2368</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-557" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-557', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2369"></a><tt class="py-lineno">2369</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: trees have different length, using Levenshtein distance"</tt> </tt>
+<a name="L2370"></a><tt class="py-lineno">2370</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-558" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-558', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-559" class="py-name" targets="Static Method com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance()=com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance"><a title="com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance" class="py-name" href="#" onclick="return doclink('link-559', '__levenshteinDistance', 'link-559');">__levenshteinDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">/</tt><tt class="py-name">t</tt> </tt>
+</div><a name="L2371"></a><tt class="py-lineno">2371</tt> <tt class="py-line"> </tt>
+<a name="L2372"></a><tt class="py-lineno">2372</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__hammingDistance"></a><div id="ViewClient.__hammingDistance-def"><a name="L2373"></a><tt class="py-lineno">2373</tt> <a class="py-toggle" href="#" id="ViewClient.__hammingDistance-toggle" onclick="return toggle('ViewClient.__hammingDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance">__hammingDistance</a><tt class="py-op">(</tt><tt class="py-param">s1</tt><tt class="py-op">,</tt> <tt class="py-param">s2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__hammingDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__hammingDistance-expanded"><a name="L2374"></a><tt class="py-lineno">2374</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2375"></a><tt class="py-lineno">2375</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Hamming distance between two strings.</tt> </tt>
+<a name="L2376"></a><tt class="py-lineno">2376</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2377"></a><tt class="py-lineno">2377</tt> <tt class="py-line"><tt class="py-docstring"> @param s1: string</tt> </tt>
+<a name="L2378"></a><tt class="py-lineno">2378</tt> <tt class="py-line"><tt class="py-docstring"> @param s2: string</tt> </tt>
+<a name="L2379"></a><tt class="py-lineno">2379</tt> <tt class="py-line"><tt class="py-docstring"> @return: the distance</tt> </tt>
+<a name="L2380"></a><tt class="py-lineno">2380</tt> <tt class="py-line"><tt class="py-docstring"> @raise ValueError: if the lenght of the strings differ</tt> </tt>
+<a name="L2381"></a><tt class="py-lineno">2381</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2382"></a><tt class="py-lineno">2382</tt> <tt class="py-line"> </tt>
+<a name="L2383"></a><tt class="py-lineno">2383</tt> <tt class="py-line"> <tt class="py-name">l1</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2384"></a><tt class="py-lineno">2384</tt> <tt class="py-line"> <tt class="py-name">l2</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+<a name="L2385"></a><tt class="py-lineno">2385</tt> <tt class="py-line"> </tt>
+<a name="L2386"></a><tt class="py-lineno">2386</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">l1</tt> <tt class="py-op">!=</tt> <tt class="py-name">l2</tt><tt class="py-op">:</tt> </tt>
+<a name="L2387"></a><tt class="py-lineno">2387</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Hamming distance requires strings of same size."</tt><tt class="py-op">)</tt> </tt>
+<a name="L2388"></a><tt class="py-lineno">2388</tt> <tt class="py-line"> </tt>
+<a name="L2389"></a><tt class="py-lineno">2389</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">sum</tt><tt class="py-op">(</tt><tt class="py-name">ch1</tt> <tt class="py-op">!=</tt> <tt class="py-name">ch2</tt> <tt class="py-keyword">for</tt> <tt class="py-name">ch1</tt><tt class="py-op">,</tt> <tt class="py-name">ch2</tt> <tt class="py-keyword">in</tt> <tt class="py-name">zip</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2390"></a><tt class="py-lineno">2390</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.hammingDistance"></a><div id="ViewClient.hammingDistance-def"><a name="L2391"></a><tt class="py-lineno">2391</tt> <a class="py-toggle" href="#" id="ViewClient.hammingDistance-toggle" onclick="return toggle('ViewClient.hammingDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#hammingDistance">hammingDistance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.hammingDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.hammingDistance-expanded"><a name="L2392"></a><tt class="py-lineno">2392</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2393"></a><tt class="py-lineno">2393</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Hamming distance between this tree and the one passed as argument.</tt> </tt>
+<a name="L2394"></a><tt class="py-lineno">2394</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2395"></a><tt class="py-lineno">2395</tt> <tt class="py-line"> </tt>
+<a name="L2396"></a><tt class="py-lineno">2396</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-560" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-560', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-561" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-561', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2397"></a><tt class="py-lineno">2397</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-562" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-562', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-563" class="py-name"><a title="com.dtmilano.android.adb.adbclient.Device.__str__
+com.dtmilano.android.viewclient.View.__str__
+com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-563', '__str__', 'link-290');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-name">tree</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2398"></a><tt class="py-lineno">2398</tt> <tt class="py-line"> </tt>
+<a name="L2399"></a><tt class="py-lineno">2399</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-564" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-564', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-565" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__hammingDistance" class="py-name" href="#" onclick="return doclink('link-565', '__hammingDistance', 'link-556');">__hammingDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2400"></a><tt class="py-lineno">2400</tt> <tt class="py-line"> </tt>
+<a name="L2401"></a><tt class="py-lineno">2401</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__levenshteinDistance"></a><div id="ViewClient.__levenshteinDistance-def"><a name="L2402"></a><tt class="py-lineno">2402</tt> <a class="py-toggle" href="#" id="ViewClient.__levenshteinDistance-toggle" onclick="return toggle('ViewClient.__levenshteinDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance">__levenshteinDistance</a><tt class="py-op">(</tt><tt class="py-param">s</tt><tt class="py-op">,</tt> <tt class="py-param">t</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__levenshteinDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__levenshteinDistance-expanded"><a name="L2403"></a><tt class="py-lineno">2403</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2404"></a><tt class="py-lineno">2404</tt> <tt class="py-line"><tt class="py-docstring"> Find the Levenshtein distance between two Strings.</tt> </tt>
+<a name="L2405"></a><tt class="py-lineno">2405</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2406"></a><tt class="py-lineno">2406</tt> <tt class="py-line"><tt class="py-docstring"> Python version of Levenshtein distance method implemented in Java at</tt> </tt>
+<a name="L2407"></a><tt class="py-lineno">2407</tt> <tt class="py-line"><tt class="py-docstring"> U{http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm}.</tt> </tt>
+<a name="L2408"></a><tt class="py-lineno">2408</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2409"></a><tt class="py-lineno">2409</tt> <tt class="py-line"><tt class="py-docstring"> This is the number of changes needed to change one String into</tt> </tt>
+<a name="L2410"></a><tt class="py-lineno">2410</tt> <tt class="py-line"><tt class="py-docstring"> another, where each change is a single character modification (deletion,</tt> </tt>
+<a name="L2411"></a><tt class="py-lineno">2411</tt> <tt class="py-line"><tt class="py-docstring"> insertion or substitution).</tt> </tt>
+<a name="L2412"></a><tt class="py-lineno">2412</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2413"></a><tt class="py-lineno">2413</tt> <tt class="py-line"><tt class="py-docstring"> The previous implementation of the Levenshtein distance algorithm</tt> </tt>
+<a name="L2414"></a><tt class="py-lineno">2414</tt> <tt class="py-line"><tt class="py-docstring"> was from U{http://www.merriampark.com/ld.htm}</tt> </tt>
+<a name="L2415"></a><tt class="py-lineno">2415</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2416"></a><tt class="py-lineno">2416</tt> <tt class="py-line"><tt class="py-docstring"> Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError</tt> </tt>
+<a name="L2417"></a><tt class="py-lineno">2417</tt> <tt class="py-line"><tt class="py-docstring"> which can occur when my Java implementation is used with very large strings.</tt> </tt>
+<a name="L2418"></a><tt class="py-lineno">2418</tt> <tt class="py-line"><tt class="py-docstring"> This implementation of the Levenshtein distance algorithm</tt> </tt>
+<a name="L2419"></a><tt class="py-lineno">2419</tt> <tt class="py-line"><tt class="py-docstring"> is from U{http://www.merriampark.com/ldjava.htm}::</tt> </tt>
+<a name="L2420"></a><tt class="py-lineno">2420</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2421"></a><tt class="py-lineno">2421</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException</tt> </tt>
+<a name="L2422"></a><tt class="py-lineno">2422</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance(*, null) = IllegalArgumentException</tt> </tt>
+<a name="L2423"></a><tt class="py-lineno">2423</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("","") = 0</tt> </tt>
+<a name="L2424"></a><tt class="py-lineno">2424</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("","a") = 1</tt> </tt>
+<a name="L2425"></a><tt class="py-lineno">2425</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("aaapppp", "") = 7</tt> </tt>
+<a name="L2426"></a><tt class="py-lineno">2426</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("frog", "fog") = 1</tt> </tt>
+<a name="L2427"></a><tt class="py-lineno">2427</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("fly", "ant") = 3</tt> </tt>
+<a name="L2428"></a><tt class="py-lineno">2428</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("elephant", "hippo") = 7</tt> </tt>
+<a name="L2429"></a><tt class="py-lineno">2429</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hippo", "elephant") = 7</tt> </tt>
+<a name="L2430"></a><tt class="py-lineno">2430</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8</tt> </tt>
+<a name="L2431"></a><tt class="py-lineno">2431</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hello", "hallo") = 1</tt> </tt>
+<a name="L2432"></a><tt class="py-lineno">2432</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L2433"></a><tt class="py-lineno">2433</tt> <tt class="py-line"><tt class="py-docstring"> @param s: the first String, must not be null</tt> </tt>
+<a name="L2434"></a><tt class="py-lineno">2434</tt> <tt class="py-line"><tt class="py-docstring"> @param t: the second String, must not be null</tt> </tt>
+<a name="L2435"></a><tt class="py-lineno">2435</tt> <tt class="py-line"><tt class="py-docstring"> @return: result distance</tt> </tt>
+<a name="L2436"></a><tt class="py-lineno">2436</tt> <tt class="py-line"><tt class="py-docstring"> @raise ValueError: if either String input C{null}</tt> </tt>
+<a name="L2437"></a><tt class="py-lineno">2437</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2438"></a><tt class="py-lineno">2438</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt> <tt class="py-keyword">or</tt> <tt class="py-name">t</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L2439"></a><tt class="py-lineno">2439</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Strings must not be null"</tt><tt class="py-op">)</tt> </tt>
+<a name="L2440"></a><tt class="py-lineno">2440</tt> <tt class="py-line"> </tt>
+<a name="L2441"></a><tt class="py-lineno">2441</tt> <tt class="py-line"> <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s</tt><tt class="py-op">)</tt> </tt>
+<a name="L2442"></a><tt class="py-lineno">2442</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">t</tt><tt class="py-op">)</tt> </tt>
+<a name="L2443"></a><tt class="py-lineno">2443</tt> <tt class="py-line"> </tt>
+<a name="L2444"></a><tt class="py-lineno">2444</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">n</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2445"></a><tt class="py-lineno">2445</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">m</tt> </tt>
+<a name="L2446"></a><tt class="py-lineno">2446</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">m</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2447"></a><tt class="py-lineno">2447</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">n</tt> </tt>
+<a name="L2448"></a><tt class="py-lineno">2448</tt> <tt class="py-line"> </tt>
+<a name="L2449"></a><tt class="py-lineno">2449</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">n</tt> <tt class="py-op">></tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L2450"></a><tt class="py-lineno">2450</tt> <tt class="py-line"> <tt class="py-name">tmp</tt> <tt class="py-op">=</tt> <tt class="py-name">s</tt> </tt>
+<a name="L2451"></a><tt class="py-lineno">2451</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">t</tt> </tt>
+<a name="L2452"></a><tt class="py-lineno">2452</tt> <tt class="py-line"> <tt class="py-name">t</tt> <tt class="py-op">=</tt> <tt class="py-name">tmp</tt> </tt>
+<a name="L2453"></a><tt class="py-lineno">2453</tt> <tt class="py-line"> <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">;</tt> </tt>
+<a name="L2454"></a><tt class="py-lineno">2454</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">t</tt><tt class="py-op">)</tt> </tt>
+<a name="L2455"></a><tt class="py-lineno">2455</tt> <tt class="py-line"> </tt>
+<a name="L2456"></a><tt class="py-lineno">2456</tt> <tt class="py-line"> <tt class="py-name">p</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-name">None</tt><tt class="py-op">]</tt><tt class="py-op">*</tt><tt class="py-op">(</tt><tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2457"></a><tt class="py-lineno">2457</tt> <tt class="py-line"> <tt class="py-name">d</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-name">None</tt><tt class="py-op">]</tt><tt class="py-op">*</tt><tt class="py-op">(</tt><tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2458"></a><tt class="py-lineno">2458</tt> <tt class="py-line"> </tt>
+<a name="L2459"></a><tt class="py-lineno">2459</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2460"></a><tt class="py-lineno">2460</tt> <tt class="py-line"> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">i</tt> </tt>
+<a name="L2461"></a><tt class="py-lineno">2461</tt> <tt class="py-line"> </tt>
+<a name="L2462"></a><tt class="py-lineno">2462</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">j</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">m</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2463"></a><tt class="py-lineno">2463</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-566" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-566', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2464"></a><tt class="py-lineno">2464</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">j</tt> <tt class="py-op">%</tt> <tt class="py-number">100</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2465"></a><tt class="py-lineno">2465</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"DEBUG:"</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">j</tt><tt class="py-op">/</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">+</tt><tt class="py-number">1.0</tt><tt class="py-op">)</tt><tt class="py-op">*</tt><tt class="py-number">100</tt><tt class="py-op">)</tt><tt class="py-op">,</tt><tt class="py-string">"%\r"</tt><tt class="py-op">,</tt> </tt>
+<a name="L2466"></a><tt class="py-lineno">2466</tt> <tt class="py-line"> <tt class="py-name">t_j</tt> <tt class="py-op">=</tt> <tt class="py-name">t</tt><tt class="py-op">[</tt><tt class="py-name">j</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L2467"></a><tt class="py-lineno">2467</tt> <tt class="py-line"> <tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">j</tt> </tt>
+<a name="L2468"></a><tt class="py-lineno">2468</tt> <tt class="py-line"> </tt>
+<a name="L2469"></a><tt class="py-lineno">2469</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2470"></a><tt class="py-lineno">2470</tt> <tt class="py-line"> <tt class="py-name">cost</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-name">t_j</tt> <tt class="py-keyword">else</tt> <tt class="py-number">1</tt> </tt>
+<a name="L2471"></a><tt class="py-lineno">2471</tt> <tt class="py-line"> <tt class="py-comment"># minimum of cell to the left+1, to the top+1, diagonally left and up +cost</tt> </tt>
+<a name="L2472"></a><tt class="py-lineno">2472</tt> <tt class="py-line"> <tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">min</tt><tt class="py-op">(</tt><tt class="py-name">min</tt><tt class="py-op">(</tt><tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-name">cost</tt><tt class="py-op">)</tt> </tt>
+<a name="L2473"></a><tt class="py-lineno">2473</tt> <tt class="py-line"> </tt>
+<a name="L2474"></a><tt class="py-lineno">2474</tt> <tt class="py-line"> <tt class="py-name">_d</tt> <tt class="py-op">=</tt> <tt class="py-name">p</tt> </tt>
+<a name="L2475"></a><tt class="py-lineno">2475</tt> <tt class="py-line"> <tt class="py-name">p</tt> <tt class="py-op">=</tt> <tt class="py-name">d</tt> </tt>
+<a name="L2476"></a><tt class="py-lineno">2476</tt> <tt class="py-line"> <tt class="py-name">d</tt> <tt class="py-op">=</tt> <tt class="py-name">_d</tt> </tt>
+<a name="L2477"></a><tt class="py-lineno">2477</tt> <tt class="py-line"> </tt>
+<a name="L2478"></a><tt class="py-lineno">2478</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-567" class="py-name"><a title="com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-567', 'DEBUG_DISTANCE', 'link-24');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2479"></a><tt class="py-lineno">2479</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"\n"</tt> </tt>
+<a name="L2480"></a><tt class="py-lineno">2480</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2481"></a><tt class="py-lineno">2481</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.levenshteinDistance"></a><div id="ViewClient.levenshteinDistance-def"><a name="L2482"></a><tt class="py-lineno">2482</tt> <a class="py-toggle" href="#" id="ViewClient.levenshteinDistance-toggle" onclick="return toggle('ViewClient.levenshteinDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#levenshteinDistance">levenshteinDistance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.levenshteinDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.levenshteinDistance-expanded"><a name="L2483"></a><tt class="py-lineno">2483</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2484"></a><tt class="py-lineno">2484</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Levenshtein distance between this tree and the one passed as argument.</tt> </tt>
+<a name="L2485"></a><tt class="py-lineno">2485</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2486"></a><tt class="py-lineno">2486</tt> <tt class="py-line"> </tt>
+<a name="L2487"></a><tt class="py-lineno">2487</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-568" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-568', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-569" class="py-name" targets="Method com.dtmilano.android.viewclient.View.__microStr__()=com.dtmilano.android.viewclient.View-class.html#__microStr__"><a title="com.dtmilano.android.viewclient.View.__microStr__" class="py-name" href="#" onclick="return doclink('link-569', '__microStr__', 'link-569');">__microStr__</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2488"></a><tt class="py-lineno">2488</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-570" class="py-name"><a title="com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-570', 'View', 'link-61');">View</a></tt><tt class="py-op">.</tt><tt id="link-571" class="py-name"><a title="com.dtmilano.android.viewclient.View.__microStr__" class="py-name" href="#" onclick="return doclink('link-571', '__microStr__', 'link-569');">__microStr__</a></tt><tt class="py-op">,</tt> <tt class="py-name">tree</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2489"></a><tt class="py-lineno">2489</tt> <tt class="py-line"> </tt>
+<a name="L2490"></a><tt class="py-lineno">2490</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-572" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-572', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-573" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance" class="py-name" href="#" onclick="return doclink('link-573', '__levenshteinDistance', 'link-559');">__levenshteinDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2491"></a><tt class="py-lineno">2491</tt> <tt class="py-line"> </tt>
+<a name="L2492"></a><tt class="py-lineno">2492</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.excerpt"></a><div id="ViewClient.excerpt-def"><a name="L2493"></a><tt class="py-lineno">2493</tt> <a class="py-toggle" href="#" id="ViewClient.excerpt-toggle" onclick="return toggle('ViewClient.excerpt');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="com.dtmilano.android.viewclient.ViewClient-class.html#excerpt">excerpt</a><tt class="py-op">(</tt><tt class="py-param">str</tt><tt class="py-op">,</tt> <tt class="py-param">execute</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.excerpt-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.excerpt-expanded"><a name="L2494"></a><tt class="py-lineno">2494</tt> <tt class="py-line"> <tt class="py-name">code</tt> <tt class="py-op">=</tt> <tt id="link-574" class="py-name" targets="Class com.dtmilano.android.viewclient.Excerpt2Code=com.dtmilano.android.viewclient.Excerpt2Code-class.html"><a title="com.dtmilano.android.viewclient.Excerpt2Code" class="py-name" href="#" onclick="return doclink('link-574', 'Excerpt2Code', 'link-574');">Excerpt2Code</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-575" class="py-name"><a title="com.dtmilano.android.viewclient.Excerpt2Code.Parse
+com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-575', 'Parse', 'link-309');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">str</tt><tt class="py-op">)</tt> </tt>
+<a name="L2495"></a><tt class="py-lineno">2495</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">execute</tt><tt class="py-op">:</tt> </tt>
+<a name="L2496"></a><tt class="py-lineno">2496</tt> <tt class="py-line"> <tt class="py-keyword">exec</tt> <tt class="py-name">code</tt> </tt>
+<a name="L2497"></a><tt class="py-lineno">2497</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2498"></a><tt class="py-lineno">2498</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">code</tt> </tt>
+</div></div><a name="L2499"></a><tt class="py-lineno">2499</tt> <tt class="py-line"> </tt>
+<a name="L2500"></a><tt class="py-lineno">2500</tt> <tt class="py-line"> </tt>
+<a name="L2501"></a><tt class="py-lineno">2501</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">"__main__"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2502"></a><tt class="py-lineno">2502</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L2503"></a><tt class="py-lineno">2503</tt> <tt class="py-line"> <tt class="py-name">vc</tt> <tt class="py-op">=</tt> <tt id="link-576" class="py-name"><a title="com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-576', 'ViewClient', 'link-323');">ViewClient</a></tt><tt class="py-op">(</tt><tt class="py-name">None</tt><tt class="py-op">)</tt> </tt>
+<a name="L2504"></a><tt class="py-lineno">2504</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L2505"></a><tt class="py-lineno">2505</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"%s: Don't expect this to do anything"</tt> <tt class="py-op">%</tt> <tt class="py-name">__file__</tt> </tt>
+<a name="L2506"></a><tt class="py-lineno">2506</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:05 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.EditText-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.EditText-class.html
new file mode 100755
index 0000000..45b8bee
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.EditText-class.html
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.EditText</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class EditText
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.EditText-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class EditText</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#EditText">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_com_dtmi" name="uml_class_diagram_for_com_dtmi">
+<area shape="rect" id="node1_31" href="com.dtmilano.android.viewclient.EditText-class.html#type" title="com.dtmilano.android.viewclient.EditText.type" alt="" coords="164,716,264,735"/>
+<area shape="rect" id="node1_32" href="com.dtmilano.android.viewclient.EditText-class.html#backspace" title="com.dtmilano.android.viewclient.EditText.backspace" alt="" coords="164,735,264,753"/>
+<area shape="rect" id="node1" href="com.dtmilano.android.viewclient.EditText-class.html" title="EditText class." alt="" coords="151,683,275,759"/>
+<area shape="rect" id="node2" href="com.dtmilano.android.viewclient.TextView-class.html" title="TextView class." alt="" coords="176,619,253,663"/>
+<area shape="rect" id="node3_33" href="com.dtmilano.android.viewclient.View-class.html#map" title="The map that contains the attr,value pairs" alt="" coords="17,31,412,49"/>
+<area shape="rect" id="node3_34" href="com.dtmilano.android.viewclient.View-class.html#device" title="The MonkeyDevice" alt="" coords="17,49,412,68"/>
+<area shape="rect" id="node3_35" href="com.dtmilano.android.viewclient.View-class.html#children" title="The children of this View" alt="" coords="17,68,412,87"/>
+<area shape="rect" id="node3_36" href="com.dtmilano.android.viewclient.View-class.html#parent" title="The parent of this View" alt="" coords="17,87,412,105"/>
+<area shape="rect" id="node3_37" href="com.dtmilano.android.viewclient.View-class.html#currentFocus" title="The current focus" alt="" coords="17,105,412,124"/>
+<area shape="rect" id="node3_38" href="com.dtmilano.android.viewclient.View-class.html#build" title="Build properties" alt="" coords="17,124,412,143"/>
+<area shape="rect" id="node3_39" href="com.dtmilano.android.viewclient.View-class.html#version" title="API version number" alt="" coords="17,143,412,161"/>
+<area shape="rect" id="node3_40" href="com.dtmilano.android.viewclient.View-class.html#forceviewserveruse" title="Force ViewServer use" alt="" coords="17,161,412,180"/>
+<area shape="rect" id="node3_41" href="com.dtmilano.android.viewclient.View-class.html#useUiAutomator" title="Whether to use UIAutomator or ViewServer" alt="" coords="17,180,412,199"/>
+<area shape="rect" id="node3_42" href="com.dtmilano.android.viewclient.View-class.html#idProperty" title="The id property depending on the View attribute format" alt="" coords="17,199,412,217"/>
+<area shape="rect" id="node3_43" href="com.dtmilano.android.viewclient.View-class.html#textProperty" title="The text property depending on the View attribute format" alt="" coords="17,217,412,236"/>
+<area shape="rect" id="node3_44" href="com.dtmilano.android.viewclient.View-class.html#leftProperty" title="The left property depending on the View attribute format" alt="" coords="17,236,412,255"/>
+<area shape="rect" id="node3_45" href="com.dtmilano.android.viewclient.View-class.html#topProperty" title="The top property depending on the View attribute format" alt="" coords="17,255,412,273"/>
+<area shape="rect" id="node3_46" href="com.dtmilano.android.viewclient.View-class.html#widthProperty" title="The width property depending on the View attribute format" alt="" coords="17,273,412,292"/>
+<area shape="rect" id="node3_47" href="com.dtmilano.android.viewclient.View-class.html#heightProperty" title="The height property depending on the View attribute format" alt="" coords="17,292,412,311"/>
+<area shape="rect" id="node3_48" href="com.dtmilano.android.viewclient.View-class.html#factory" title="View factory" alt="" coords="17,313,412,332"/>
+<area shape="rect" id="node3_49" href="com.dtmilano.android.viewclient.View-class.html#__init__" title="Constructor" alt="" coords="17,332,412,351"/>
+<area shape="rect" id="node3_50" href="com.dtmilano.android.viewclient.View-class.html#__getitem__" title="com.dtmilano.android.viewclient.View.__getitem__" alt="" coords="17,351,412,369"/>
+<area shape="rect" id="node3_51" href="com.dtmilano.android.viewclient.View-class.html#__getattr__" title="com.dtmilano.android.viewclient.View.__getattr__" alt="" coords="17,369,412,388"/>
+<area shape="rect" id="node3_52" href="com.dtmilano.android.viewclient.View-class.html#__call__" title="com.dtmilano.android.viewclient.View.__call__" alt="" coords="17,388,412,407"/>
+<area shape="rect" id="node3_53" href="com.dtmilano.android.viewclient.View-class.html#getClass" title="Gets the View class" alt="" coords="17,407,412,425"/>
+<area shape="rect" id="node3_54" href="com.dtmilano.android.viewclient.View-class.html#getId" title="Gets the View Id" alt="" coords="17,425,412,444"/>
+<area shape="rect" id="node3_55" href="com.dtmilano.android.viewclient.View-class.html#getContentDescription" title="Gets the content description." alt="" coords="17,444,412,463"/>
+<area shape="rect" id="node3_56" href="com.dtmilano.android.viewclient.View-class.html#getParent" title="Gets the parent." alt="" coords="17,463,412,481"/>
+<area shape="rect" id="node3_57" href="com.dtmilano.android.viewclient.View-class.html#getText" title="Gets the text attribute." alt="" coords="17,481,412,500"/>
+<area shape="rect" id="node3_58" href="com.dtmilano.android.viewclient.View-class.html#getHeight" title="Gets the height." alt="" coords="17,500,412,519"/>
+<area shape="rect" id="node3_59" href="com.dtmilano.android.viewclient.View-class.html#getWidth" title="Gets the width." alt="" coords="17,519,412,537"/>
+<area shape="rect" id="node3_60" href="com.dtmilano.android.viewclient.View-class.html#getUniqueId" title="Gets the unique Id of this View." alt="" coords="17,537,412,556"/>
+<area shape="rect" id="node3_61" href="com.dtmilano.android.viewclient.View-class.html#__str__" title="com.dtmilano.android.viewclient.View.__str__" alt="" coords="17,575,412,593"/>
+<area shape="rect" id="node3" href="com.dtmilano.android.viewclient.View-class.html" title="View class" alt="" coords="5,6,424,599"/>
+</map>
+ <img src="uml_class_diagram_for_com_dtmi.gif" alt='' usemap="#uml_class_diagram_for_com_dtmi" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>EditText class.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="type"></a><span class="summary-sig-name">type</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#EditText.type">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="backspace"></a><span class="summary-sig-name">backspace</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#EditText.backspace">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#add">add</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getId">getId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getText">getText</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getX">getX</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getY">getY</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#touch">touch</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#factory">factory</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#build">build</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#children">children</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#currentFocus">currentFocus</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#device">device</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#forceviewserveruse">forceviewserveruse</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#heightProperty">heightProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#idProperty">idProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#leftProperty">leftProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#map">map</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#parent">parent</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#textProperty">textProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#topProperty">topProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#useUiAutomator">useUiAutomator</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#version">version</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#widthProperty">widthProperty</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:00 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.Excerpt2Code-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.Excerpt2Code-class.html
new file mode 100755
index 0000000..0e75cc6
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.Excerpt2Code-class.html
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.Excerpt2Code</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class Excerpt2Code
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class Excerpt2Code</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code">source code</a></span></p>
+<p>Excerpt XML to code</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="StartElement"></a><span class="summary-sig-name">StartElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">attributes</span>)</span><br />
+ Expat start element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.StartElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="EndElement"></a><span class="summary-sig-name">EndElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span><br />
+ Expat end element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.EndElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="CharacterData"></a><span class="summary-sig-name">CharacterData</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">data</span>)</span><br />
+ Expat character data event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.CharacterData">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="Parse"></a><span class="summary-sig-name">Parse</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">excerpt</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.Parse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:00 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.TextView-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.TextView-class.html
new file mode 100755
index 0000000..402a503
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.TextView-class.html
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.TextView</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class TextView
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.TextView-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class TextView</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#TextView">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_com_dtmi_2" name="uml_class_diagram_for_com_dtmi_2">
+<area shape="rect" id="node1" href="com.dtmilano.android.viewclient.TextView-class.html" title="TextView class." alt="" coords="176,619,253,663"/>
+<area shape="rect" id="node3" href="com.dtmilano.android.viewclient.EditText-class.html" title="EditText class." alt="" coords="173,683,256,722"/>
+<area shape="rect" id="node2_29" href="com.dtmilano.android.viewclient.View-class.html#map" title="The map that contains the attr,value pairs" alt="" coords="17,31,412,49"/>
+<area shape="rect" id="node2_30" href="com.dtmilano.android.viewclient.View-class.html#device" title="The MonkeyDevice" alt="" coords="17,49,412,68"/>
+<area shape="rect" id="node2_31" href="com.dtmilano.android.viewclient.View-class.html#children" title="The children of this View" alt="" coords="17,68,412,87"/>
+<area shape="rect" id="node2_32" href="com.dtmilano.android.viewclient.View-class.html#parent" title="The parent of this View" alt="" coords="17,87,412,105"/>
+<area shape="rect" id="node2_33" href="com.dtmilano.android.viewclient.View-class.html#currentFocus" title="The current focus" alt="" coords="17,105,412,124"/>
+<area shape="rect" id="node2_34" href="com.dtmilano.android.viewclient.View-class.html#build" title="Build properties" alt="" coords="17,124,412,143"/>
+<area shape="rect" id="node2_35" href="com.dtmilano.android.viewclient.View-class.html#version" title="API version number" alt="" coords="17,143,412,161"/>
+<area shape="rect" id="node2_36" href="com.dtmilano.android.viewclient.View-class.html#forceviewserveruse" title="Force ViewServer use" alt="" coords="17,161,412,180"/>
+<area shape="rect" id="node2_37" href="com.dtmilano.android.viewclient.View-class.html#useUiAutomator" title="Whether to use UIAutomator or ViewServer" alt="" coords="17,180,412,199"/>
+<area shape="rect" id="node2_38" href="com.dtmilano.android.viewclient.View-class.html#idProperty" title="The id property depending on the View attribute format" alt="" coords="17,199,412,217"/>
+<area shape="rect" id="node2_39" href="com.dtmilano.android.viewclient.View-class.html#textProperty" title="The text property depending on the View attribute format" alt="" coords="17,217,412,236"/>
+<area shape="rect" id="node2_40" href="com.dtmilano.android.viewclient.View-class.html#leftProperty" title="The left property depending on the View attribute format" alt="" coords="17,236,412,255"/>
+<area shape="rect" id="node2_41" href="com.dtmilano.android.viewclient.View-class.html#topProperty" title="The top property depending on the View attribute format" alt="" coords="17,255,412,273"/>
+<area shape="rect" id="node2_42" href="com.dtmilano.android.viewclient.View-class.html#widthProperty" title="The width property depending on the View attribute format" alt="" coords="17,273,412,292"/>
+<area shape="rect" id="node2_43" href="com.dtmilano.android.viewclient.View-class.html#heightProperty" title="The height property depending on the View attribute format" alt="" coords="17,292,412,311"/>
+<area shape="rect" id="node2_44" href="com.dtmilano.android.viewclient.View-class.html#factory" title="View factory" alt="" coords="17,313,412,332"/>
+<area shape="rect" id="node2_45" href="com.dtmilano.android.viewclient.View-class.html#__init__" title="Constructor" alt="" coords="17,332,412,351"/>
+<area shape="rect" id="node2_46" href="com.dtmilano.android.viewclient.View-class.html#__getitem__" title="com.dtmilano.android.viewclient.View.__getitem__" alt="" coords="17,351,412,369"/>
+<area shape="rect" id="node2_47" href="com.dtmilano.android.viewclient.View-class.html#__getattr__" title="com.dtmilano.android.viewclient.View.__getattr__" alt="" coords="17,369,412,388"/>
+<area shape="rect" id="node2_48" href="com.dtmilano.android.viewclient.View-class.html#__call__" title="com.dtmilano.android.viewclient.View.__call__" alt="" coords="17,388,412,407"/>
+<area shape="rect" id="node2_49" href="com.dtmilano.android.viewclient.View-class.html#getClass" title="Gets the View class" alt="" coords="17,407,412,425"/>
+<area shape="rect" id="node2_50" href="com.dtmilano.android.viewclient.View-class.html#getId" title="Gets the View Id" alt="" coords="17,425,412,444"/>
+<area shape="rect" id="node2_51" href="com.dtmilano.android.viewclient.View-class.html#getContentDescription" title="Gets the content description." alt="" coords="17,444,412,463"/>
+<area shape="rect" id="node2_52" href="com.dtmilano.android.viewclient.View-class.html#getParent" title="Gets the parent." alt="" coords="17,463,412,481"/>
+<area shape="rect" id="node2_53" href="com.dtmilano.android.viewclient.View-class.html#getText" title="Gets the text attribute." alt="" coords="17,481,412,500"/>
+<area shape="rect" id="node2_54" href="com.dtmilano.android.viewclient.View-class.html#getHeight" title="Gets the height." alt="" coords="17,500,412,519"/>
+<area shape="rect" id="node2_55" href="com.dtmilano.android.viewclient.View-class.html#getWidth" title="Gets the width." alt="" coords="17,519,412,537"/>
+<area shape="rect" id="node2_56" href="com.dtmilano.android.viewclient.View-class.html#getUniqueId" title="Gets the unique Id of this View." alt="" coords="17,537,412,556"/>
+<area shape="rect" id="node2_57" href="com.dtmilano.android.viewclient.View-class.html#__str__" title="com.dtmilano.android.viewclient.View.__str__" alt="" coords="17,575,412,593"/>
+<area shape="rect" id="node2" href="com.dtmilano.android.viewclient.View-class.html" title="View class" alt="" coords="5,6,424,599"/>
+</map>
+ <img src="uml_class_diagram_for_com_dtmi_2.gif" alt='' usemap="#uml_class_diagram_for_com_dtmi_2" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>TextView class.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#add">add</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getId">getId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getText">getText</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getX">getX</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#getY">getY</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#touch">touch</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#factory">factory</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#build">build</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#children">children</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#currentFocus">currentFocus</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#device">device</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#forceviewserveruse">forceviewserveruse</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#heightProperty">heightProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#idProperty">idProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#leftProperty">leftProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#map">map</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#parent">parent</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#textProperty">textProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#topProperty">topProperty</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#useUiAutomator">useUiAutomator</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#version">version</a></code>,
+ <code><a href="com.dtmilano.android.viewclient.View-class.html#widthProperty">widthProperty</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:00 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html
new file mode 100755
index 0000000..b78e307
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class UiAutomator2AndroidViewClient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class UiAutomator2AndroidViewClient</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient">source code</a></span></p>
+<p>UiAutomator XML to AndroidViewClient</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">version</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="StartElement"></a><span class="summary-sig-name">StartElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">attributes</span>)</span><br />
+ Expat start element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.StartElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="EndElement"></a><span class="summary-sig-name">EndElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span><br />
+ Expat end element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.EndElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="CharacterData"></a><span class="summary-sig-name">CharacterData</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">data</span>)</span><br />
+ Expat character data event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.CharacterData">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="Parse"></a><span class="summary-sig-name">Parse</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">uiautomatorxml</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.Parse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:00 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.View-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.View-class.html
new file mode 100755
index 0000000..77644ef
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.View-class.html
@@ -0,0 +1,1326 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.View</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class View
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.View-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class View</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_com_dtmi_3" name="uml_class_diagram_for_com_dtmi_3">
+<area shape="rect" id="node1_29" href="com.dtmilano.android.viewclient.View-class.html#map" title="The map that contains the attr,value pairs" alt="" coords="17,31,412,49"/>
+<area shape="rect" id="node1_30" href="com.dtmilano.android.viewclient.View-class.html#device" title="The MonkeyDevice" alt="" coords="17,49,412,68"/>
+<area shape="rect" id="node1_31" href="com.dtmilano.android.viewclient.View-class.html#children" title="The children of this View" alt="" coords="17,68,412,87"/>
+<area shape="rect" id="node1_32" href="com.dtmilano.android.viewclient.View-class.html#parent" title="The parent of this View" alt="" coords="17,87,412,105"/>
+<area shape="rect" id="node1_33" href="com.dtmilano.android.viewclient.View-class.html#currentFocus" title="The current focus" alt="" coords="17,105,412,124"/>
+<area shape="rect" id="node1_34" href="com.dtmilano.android.viewclient.View-class.html#build" title="Build properties" alt="" coords="17,124,412,143"/>
+<area shape="rect" id="node1_35" href="com.dtmilano.android.viewclient.View-class.html#version" title="API version number" alt="" coords="17,143,412,161"/>
+<area shape="rect" id="node1_36" href="com.dtmilano.android.viewclient.View-class.html#forceviewserveruse" title="Force ViewServer use" alt="" coords="17,161,412,180"/>
+<area shape="rect" id="node1_37" href="com.dtmilano.android.viewclient.View-class.html#useUiAutomator" title="Whether to use UIAutomator or ViewServer" alt="" coords="17,180,412,199"/>
+<area shape="rect" id="node1_38" href="com.dtmilano.android.viewclient.View-class.html#idProperty" title="The id property depending on the View attribute format" alt="" coords="17,199,412,217"/>
+<area shape="rect" id="node1_39" href="com.dtmilano.android.viewclient.View-class.html#textProperty" title="The text property depending on the View attribute format" alt="" coords="17,217,412,236"/>
+<area shape="rect" id="node1_40" href="com.dtmilano.android.viewclient.View-class.html#leftProperty" title="The left property depending on the View attribute format" alt="" coords="17,236,412,255"/>
+<area shape="rect" id="node1_41" href="com.dtmilano.android.viewclient.View-class.html#topProperty" title="The top property depending on the View attribute format" alt="" coords="17,255,412,273"/>
+<area shape="rect" id="node1_42" href="com.dtmilano.android.viewclient.View-class.html#widthProperty" title="The width property depending on the View attribute format" alt="" coords="17,273,412,292"/>
+<area shape="rect" id="node1_43" href="com.dtmilano.android.viewclient.View-class.html#heightProperty" title="The height property depending on the View attribute format" alt="" coords="17,292,412,311"/>
+<area shape="rect" id="node1_44" href="com.dtmilano.android.viewclient.View-class.html#factory" title="View factory" alt="" coords="17,313,412,332"/>
+<area shape="rect" id="node1_45" href="com.dtmilano.android.viewclient.View-class.html#__init__" title="Constructor" alt="" coords="17,332,412,351"/>
+<area shape="rect" id="node1_46" href="com.dtmilano.android.viewclient.View-class.html#__getitem__" title="com.dtmilano.android.viewclient.View.__getitem__" alt="" coords="17,351,412,369"/>
+<area shape="rect" id="node1_47" href="com.dtmilano.android.viewclient.View-class.html#__getattr__" title="com.dtmilano.android.viewclient.View.__getattr__" alt="" coords="17,369,412,388"/>
+<area shape="rect" id="node1_48" href="com.dtmilano.android.viewclient.View-class.html#__call__" title="com.dtmilano.android.viewclient.View.__call__" alt="" coords="17,388,412,407"/>
+<area shape="rect" id="node1_49" href="com.dtmilano.android.viewclient.View-class.html#getClass" title="Gets the View class" alt="" coords="17,407,412,425"/>
+<area shape="rect" id="node1_50" href="com.dtmilano.android.viewclient.View-class.html#getId" title="Gets the View Id" alt="" coords="17,425,412,444"/>
+<area shape="rect" id="node1_51" href="com.dtmilano.android.viewclient.View-class.html#getContentDescription" title="Gets the content description." alt="" coords="17,444,412,463"/>
+<area shape="rect" id="node1_52" href="com.dtmilano.android.viewclient.View-class.html#getParent" title="Gets the parent." alt="" coords="17,463,412,481"/>
+<area shape="rect" id="node1_53" href="com.dtmilano.android.viewclient.View-class.html#getText" title="Gets the text attribute." alt="" coords="17,481,412,500"/>
+<area shape="rect" id="node1_54" href="com.dtmilano.android.viewclient.View-class.html#getHeight" title="Gets the height." alt="" coords="17,500,412,519"/>
+<area shape="rect" id="node1_55" href="com.dtmilano.android.viewclient.View-class.html#getWidth" title="Gets the width." alt="" coords="17,519,412,537"/>
+<area shape="rect" id="node1_56" href="com.dtmilano.android.viewclient.View-class.html#getUniqueId" title="Gets the unique Id of this View." alt="" coords="17,537,412,556"/>
+<area shape="rect" id="node1_57" href="com.dtmilano.android.viewclient.View-class.html#__str__" title="com.dtmilano.android.viewclient.View.__str__" alt="" coords="17,575,412,593"/>
+<area shape="rect" id="node1" href="com.dtmilano.android.viewclient.View-class.html" title="View class" alt="" coords="5,6,424,599"/>
+<area shape="rect" id="node2" href="com.dtmilano.android.viewclient.TextView-class.html" title="TextView class." alt="" coords="171,619,259,658"/>
+<area shape="rect" id="node3" href="com.dtmilano.android.viewclient.EditText-class.html" title="EditText class." alt="" coords="173,678,256,717"/>
+</map>
+ <img src="uml_class_diagram_for_com_dtmi_3.gif" alt='' usemap="#uml_class_diagram_for_com_dtmi_3" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>View class</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">map</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">version</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getitem__"></a><span class="summary-sig-name">__getitem__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__getitem__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getattr__"></a><span class="summary-sig-name">__getattr__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__getattr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__call__"></a><span class="summary-sig-name">__call__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">*args</span>,
+ <span class="summary-sig-arg">**kwargs</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__call__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getClass" class="summary-sig-name">getClass</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getClass">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getId" class="summary-sig-name">getId</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> Id</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getContentDescription"></a><span class="summary-sig-name">getContentDescription</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the content description.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getParent"></a><span class="summary-sig-name">getParent</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the parent.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getParent">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getText" class="summary-sig-name">getText</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the text attribute.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getHeight"></a><span class="summary-sig-name">getHeight</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the height.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getHeight">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getWidth"></a><span class="summary-sig-name">getWidth</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the width.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getWidth">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getUniqueId" class="summary-sig-name">getUniqueId</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the unique Id of this View.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getVisibility"></a><span class="summary-sig-name">getVisibility</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View visibility</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getVisibility">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getX"></a><span class="summary-sig-name">getX</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View X coordinate</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getX">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getY"></a><span class="summary-sig-name">getY</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View Y coordinate</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getY">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getXY" class="summary-sig-name">getXY</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">debug</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Returns the <i>screen</i> coordinates of this <code>View</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getXY">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getCoords" class="summary-sig-name">getCoords</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the coords of the View</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getCoords">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getPositionAndSize" class="summary-sig-name">getPositionAndSize</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the position and size (X,Y, W, H)</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#getCenter" class="summary-sig-name">getCenter</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the center coords of the View</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainStatusBarDimensionsIfVisible"></a><span class="summary-sig-name">__obtainStatusBarDimensionsIfVisible</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__obtainStatusBarDimensionsIfVisible">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainVxVy"></a><span class="summary-sig-name">__obtainVxVy</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__obtainVxVy">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainVwVh"></a><span class="summary-sig-name">__obtainVwVh</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__obtainVwVh">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainPxPy"></a><span class="summary-sig-name">__obtainPxPy</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__obtainPxPy">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__dumpWindowsInformation"></a><span class="summary-sig-name">__dumpWindowsInformation</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">debug</span>=<span class="summary-sig-default">False</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__dumpWindowsInformation">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="touch"></a><span class="summary-sig-name">touch</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">type</span>=<span class="summary-sig-default">2</span>)</span><br />
+ Touches the center of this <code>View</code></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.touch">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="allPossibleNamesWithColon"></a><span class="summary-sig-name">allPossibleNamesWithColon</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.allPossibleNamesWithColon">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="intersection"></a><span class="summary-sig-name">intersection</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">l1</span>,
+ <span class="summary-sig-arg">l2</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.intersection">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="containsPoint"></a><span class="summary-sig-name">containsPoint</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">(x, y)</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.containsPoint">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#add" class="summary-sig-name">add</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">child</span>)</span><br />
+ Adds a child</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.add">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="isClickable"></a><span class="summary-sig-name">isClickable</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.isClickable">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="variableNameFromId"></a><span class="summary-sig-name">variableNameFromId</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.variableNameFromId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#writeImageToFile" class="summary-sig-name">writeImageToFile</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">filename</span>,
+ <span class="summary-sig-arg">format</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">PNG</code><code class="variable-quote">'</code></span>)</span><br />
+ Write the View image to the specified filename in the specified
+ format.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.writeImageToFile">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__smallStr__"></a><span class="summary-sig-name">__smallStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__smallStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__tinyStr__"></a><span class="summary-sig-name">__tinyStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__tinyStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__microStr__"></a><span class="summary-sig-name">__microStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__microStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__str__"></a><span class="summary-sig-name">__str__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__str__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS METHODS ==================== -->
+<a name="section-ClassMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Class Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-ClassMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__copy"></a><span class="summary-sig-name">__copy</span>(<span class="summary-sig-arg">cls</span>,
+ <span class="summary-sig-arg">view</span>)</span><br />
+ Copy constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__copy">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.View-class.html#factory" class="summary-sig-name">factory</a>(<span class="summary-sig-arg">arg1</span>,
+ <span class="summary-sig-arg">arg2</span>,
+ <span class="summary-sig-arg">version</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>)</span><br />
+ View factory</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.factory">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="map"></a><span class="summary-name">map</span><br />
+ The map that contains the <code>attr</code>,<code>value</code> pairs
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="device"></a><span class="summary-name">device</span><br />
+ The MonkeyDevice
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="children"></a><span class="summary-name">children</span><br />
+ The children of this View
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="parent"></a><span class="summary-name">parent</span><br />
+ The parent of this View
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="currentFocus"></a><span class="summary-name">currentFocus</span><br />
+ The current focus
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="build"></a><span class="summary-name">build</span><br />
+ Build properties
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="version"></a><span class="summary-name">version</span><br />
+ API version number
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="forceviewserveruse"></a><span class="summary-name">forceviewserveruse</span><br />
+ Force ViewServer use
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="useUiAutomator"></a><span class="summary-name">useUiAutomator</span><br />
+ Whether to use UIAutomator or ViewServer
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="idProperty"></a><span class="summary-name">idProperty</span><br />
+ The id property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="textProperty"></a><span class="summary-name">textProperty</span><br />
+ The text property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="leftProperty"></a><span class="summary-name">leftProperty</span><br />
+ The left property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="topProperty"></a><span class="summary-name">topProperty</span><br />
+ The top property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="widthProperty"></a><span class="summary-name">widthProperty</span><br />
+ The width property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="heightProperty"></a><span class="summary-name">heightProperty</span><br />
+ The height property depending on the View attribute format
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="factory"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">factory</span>(<span class="sig-arg">arg1</span>,
+ <span class="sig-arg">arg2</span>,
+ <span class="sig-arg">version</span>=<span class="sig-default">-1</span>,
+ <span class="sig-arg">forceviewserveruse</span>=<span class="sig-default">False</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.factory">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>View factory</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>arg1</code></strong> (ClassType or dict)</li>
+ <li><strong class="pname"><code>arg2</code></strong> (View instance or AdbClient)</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">map</span>,
+ <span class="sig-arg">device</span>,
+ <span class="sig-arg">version</span>=<span class="sig-default">-1</span>,
+ <span class="sig-arg">forceviewserveruse</span>=<span class="sig-default">False</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>map</code></strong> (map) - the map containing the (attribute, value) pairs</li>
+ <li><strong class="pname"><code>device</code></strong> (MonkeyDevice) - the device containing this View</li>
+ <li><strong class="pname"><code>version</code></strong> (int) - the Android SDK version number of the platform where this View
+ belongs. If this is <code>-1</code> then the Android SDK version
+ will be obtained in this constructor.</li>
+ <li><strong class="pname"><code>forceviewserveruse</code></strong> (boolean) - Force the use of <code>ViewServer</code> even if the conditions
+ were given to use <code>UiAutomator</code>.</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getClass"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getClass</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getClass">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class or <code>None</code> if not defined</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getId</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> Id</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the <a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> <code>Id</code> or <code>None</code> if not
+ defined</dd>
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a
+ href="com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">getUniqueId()</a>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getText"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getText</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the text attribute.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the text attribute or <code>None</code> if not defined</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getUniqueId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getUniqueId</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the unique Id of this View.</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs"
+ class="link"
+ onclick="show_private();">ViewClient.__splitAttrs()</a> for a
+ discussion on <b>Unique Ids</b>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getXY"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getXY</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">debug</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getXY">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Returns the <i>screen</i> coordinates of this <code>View</code>.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>The <i>screen</i> coordinates of this <code>View</code></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getCoords"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getCoords</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getCoords">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the coords of the View</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>A tuple containing the View's coordinates ((L, T), (R, B))</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getPositionAndSize"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getPositionAndSize</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the position and size (X,Y, W, H)</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>A tuple containing the View's coordinates (X, Y, W, H)</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getCenter"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getCenter</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.getCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the center coords of the View</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Author:</strong>
+ <a href="https://github.com/deanmorin" target="_top">Dean Morin</a>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="add"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">add</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">child</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.add">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Adds a child</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>child</code></strong> (View) - The child to add</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="writeImageToFile"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">writeImageToFile</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">filename</span>,
+ <span class="sig-arg">format</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">PNG</code><code class="variable-quote">'</code></span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#View.writeImageToFile">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Write the View image to the specified filename in the specified
+ format.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>filename</code></strong> (str) - Absolute path and optional filename receiving the image. If this
+ points to a directory, then the filename is determined by this
+ View unique ID and format extension.</li>
+ <li><strong class="pname"><code>format</code></strong> (str) - Image format (default format is PNG)</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:01 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewClient-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewClient-class.html
new file mode 100755
index 0000000..d94ae33
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewClient-class.html
@@ -0,0 +1,2453 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.ViewClient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class ViewClient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.ViewClient-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class ViewClient</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient">source code</a></span></p>
+<p>ViewClient is a <i>ViewServer</i> client.</p>
+ <h1 class="heading">ViewServer backend</h1>
+ <p>If not running the ViewServer is started on the target device or
+ emulator and then the port mapping is created.</p>
+ <h1 class="heading">UiAutomator backend</h1>
+ <p>No service is started.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">serialno</span>,
+ <span class="summary-sig-arg">adb</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">autodump</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">localport</span>=<span class="summary-sig-default">4939</span>,
+ <span class="summary-sig-arg">remoteport</span>=<span class="summary-sig-default">4939</span>,
+ <span class="summary-sig-arg">startviewserver</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">ignoreuiautomatorkilled</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__del__"></a><span class="summary-sig-name">__del__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__del__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse" class="summary-sig-name">assertServiceResponse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">response</span>)</span><br />
+ Checks whether the response received from the server is correct or
+ raises and Exception.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.assertServiceResponse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse" class="summary-sig-name">serviceResponse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">response</span>)</span><br />
+ Checks the response received from the <i>ViewServer</i>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.serviceResponse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#setViews" class="summary-sig-name">setViews</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">received</span>)</span><br />
+ Sets <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value splitting it into
+ lines.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViews">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump" class="summary-sig-name">setViewsFromUiAutomatorDump</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">received</span>)</span><br />
+ Sets <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value parsing the
+ received XML.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViewsFromUiAutomatorDump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs" class="summary-sig-name" onclick="show_private();">__splitAttrs</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">strArgs</span>)</span><br />
+ Splits the <code>View</code> attributes in <code>strArgs</code> and
+ optionally adds the view id to the <code>viewsById</code> list.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__splitAttrs">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree" class="summary-sig-name" onclick="show_private();">__parseTree</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">receivedLines</span>)</span><br />
+ Parses the View tree contained in <code
+ class="link">receivedLines</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTree">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__parseTreeFromUiAutomatorDump"></a><span class="summary-sig-name">__parseTreeFromUiAutomatorDump</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">receivedXml</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTreeFromUiAutomatorDump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getRoot" class="summary-sig-name">getRoot</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the root node of the <code>View</code> tree</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getRoot">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse" class="summary-sig-name">traverse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">indent</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string"></code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">transform</span>=<span class="summary-sig-default"><unbound method View.__str__></span>,
+ <span class="summary-sig-arg">stream</span>=<span class="summary-sig-default">sys.stdout</span>)</span><br />
+ Traverses the <code>View</code> tree and prints its nodes.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#dump" class="summary-sig-name">dump</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">window</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">sleep</span>=<span class="summary-sig-default">1</span>)</span><br />
+ Dumps the window content.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.dump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#list" class="summary-sig-name">list</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">sleep</span>=<span class="summary-sig-default">1</span>)</span><br />
+ List the windows.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.list">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewById" class="summary-sig-name">findViewById</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">viewId</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">viewFilter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the View with the specified viewId.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewById">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise" class="summary-sig-name">findViewByIdOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">viewId</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">viewFilter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByIdOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewByTag"></a><span class="summary-sig-name">findViewByTag</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tag</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View with the specified tag</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByTag">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewByTagOrRaise"></a><span class="summary-sig-name">findViewByTagOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tag</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View with the specified tag or raise a
+ ViewNotFoundException</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByTagOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTree"></a><span class="summary-sig-name">__findViewWithAttributeInTree</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTree">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTreeOrRaise"></a><span class="summary-sig-name">__findViewWithAttributeInTreeOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTreeOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTreeThatMatches"></a><span class="summary-sig-name">__findViewWithAttributeInTreeThatMatches</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">regex</span>,
+ <span class="summary-sig-arg">root</span>,
+ <span class="summary-sig-arg">rlist</span>=<span class="summary-sig-default"><code class="variable-group">[</code><code class="variable-group">]</code></span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTreeThatMatches">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithAttribute"></a><span class="summary-sig-name">findViewWithAttribute</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View with the specified attribute and value</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttribute">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise" class="summary-sig-name">findViewWithAttributeOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithAttributeThatMatches"></a><span class="summary-sig-name">findViewWithAttributeThatMatches</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">regex</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the list of Views with the specified attribute matching regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeThatMatches">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithText"></a><span class="summary-sig-name">findViewWithText</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise" class="summary-sig-name">findViewWithTextOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithTextOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithContentDescription"></a><span class="summary-sig-name">findViewWithContentDescription</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">contentdescription</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View with the specified content description</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithContentDescriptionOrRaise"></a><span class="summary-sig-name">findViewWithContentDescriptionOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">contentdescription</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span><br />
+ Finds the View with the specified content description</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithContentDescriptionOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewsContainingPoint"></a><span class="summary-sig-name">findViewsContainingPoint</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">(x, y)</span>,
+ <span class="summary-sig-arg">filter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the list of Views that contain the point (x, y).</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewsContainingPoint">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds" class="summary-sig-name">getViewIds</a>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewIds">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById" class="summary-sig-name">getViewsById</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Returns the Views map.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewsById">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getFocusedWindowPosition"></a><span class="summary-sig-name">__getFocusedWindowPosition</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__getFocusedWindowPosition">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getSdkVersion"></a><span class="summary-sig-name">getSdkVersion</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the SDK version.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getSdkVersion">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="isKeyboardShown"></a><span class="summary-sig-name">isKeyboardShown</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Whether the keyboard is displayed.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.isKeyboardShown">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile" class="summary-sig-name">writeImageToFile</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">filename</span>,
+ <span class="summary-sig-arg">format</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string">PNG</code><code class="variable-quote">'</code></span>)</span><br />
+ Write the View image to the specified filename in the specified
+ format.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.writeImageToFile">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#distance" class="summary-sig-name">distance</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Calculates the distance between this tree and the tree passed as
+ argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.distance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="hammingDistance"></a><span class="summary-sig-name">hammingDistance</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Finds the Hamming distance between this tree and the one passed as
+ argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.hammingDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="levenshteinDistance"></a><span class="summary-sig-name">levenshteinDistance</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Finds the Levenshtein distance between this tree and the one passed
+ as argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.levenshteinDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainAdbPath"></a><span class="summary-sig-name">__obtainAdbPath</span>()</span><br />
+ Obtains the ADB path attempting know locations for different OSs</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__obtainAdbPath">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__mapSerialNo"></a><span class="summary-sig-name">__mapSerialNo</span>(<span class="summary-sig-arg">serialno</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__mapSerialNo">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainDeviceSerialNumber"></a><span class="summary-sig-name">__obtainDeviceSerialNumber</span>(<span class="summary-sig-arg">device</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__obtainDeviceSerialNumber">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="setAlarm"></a><span class="summary-sig-name">setAlarm</span>(<span class="summary-sig-arg">timeout</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.setAlarm">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit" class="summary-sig-name">connectToDeviceOrExit</a>(<span class="summary-sig-arg">timeout</span>=<span class="summary-sig-default">60</span>,
+ <span class="summary-sig-arg">verbose</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">ignoresecuredevice</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">serialno</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Connects to a device which serial number is obtained from the script
+ arguments if available or using the default regex <code>.*</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.connectToDeviceOrExit">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText" class="summary-sig-name">traverseShowClassIdAndText</a>(<span class="summary-sig-arg">view</span>,
+ <span class="summary-sig-arg">extraInfo</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">noextrainfo</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId" class="summary-sig-name">traverseShowClassIdTextAndUniqueId</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id, text if available and unique id.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription" class="summary-sig-name">traverseShowClassIdTextAndContentDescription</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id, text if available and unique id.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter" class="summary-sig-name">traverseShowClassIdTextAndCenter</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize" class="summary-sig-name">traverseShowClassIdTextPositionAndSize</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CIT" class="summary-sig-name">TRAVERSE_CIT</a>(<span class="summary-sig-arg">view</span>,
+ <span class="summary-sig-arg">extraInfo</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">noextrainfo</span>=<span class="summary-sig-default">None</span>)</span><br />
+ An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"
+ class="link">traverseShowClassIdAndText(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITUI" class="summary-sig-name">TRAVERSE_CITUI</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"
+ class="link">traverseShowClassIdTextAndUniqueId(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITCD" class="summary-sig-name">TRAVERSE_CITCD</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"
+ class="link">traverseShowClassIdTextAndContentDescription(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITC" class="summary-sig-name">TRAVERSE_CITC</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"
+ class="link">traverseShowClassIdTextAndCenter(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITPS" class="summary-sig-name">TRAVERSE_CITPS</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"
+ class="link">traverseShowClassIdTextPositionAndSize(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#sleep" class="summary-sig-name">sleep</a>(<span class="summary-sig-arg">secs</span>=<span class="summary-sig-default">1.0</span>)</span><br />
+ Sleeps for the specified number of seconds.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.sleep">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__traverse"></a><span class="summary-sig-name">__traverse</span>(<span class="summary-sig-arg">root</span>,
+ <span class="summary-sig-arg">indent</span>=<span class="summary-sig-default"><code class="variable-quote">'</code><code class="variable-string"></code><code class="variable-quote">'</code></span>,
+ <span class="summary-sig-arg">transform</span>=<span class="summary-sig-default"><unbound method View.__str__></span>,
+ <span class="summary-sig-arg">stream</span>=<span class="summary-sig-default">sys.stdout</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__traverse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__pickleable"></a><span class="summary-sig-name">__pickleable</span>(<span class="summary-sig-arg">tree</span>)</span><br />
+ Makes the tree pickleable.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__pickleable">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance" class="summary-sig-name" onclick="show_private();">__hammingDistance</a>(<span class="summary-sig-arg">s1</span>,
+ <span class="summary-sig-arg">s2</span>)</span><br />
+ Finds the Hamming distance between two strings.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__hammingDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance" class="summary-sig-name" onclick="show_private();">__levenshteinDistance</a>(<span class="summary-sig-arg">s</span>,
+ <span class="summary-sig-arg">t</span>)</span><br />
+ Find the Levenshtein distance between two Strings.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__levenshteinDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="excerpt"></a><span class="summary-sig-name">excerpt</span>(<span class="summary-sig-arg">str</span>,
+ <span class="summary-sig-arg">execute</span>=<span class="summary-sig-default">False</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.excerpt">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="device"></a><span class="summary-name">device</span><br />
+ The <code>MonkeyDevice</code> device instance
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="serialno"></a><span class="summary-name">serialno</span><br />
+ The serial number of the device
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="adb"></a><span class="summary-name">adb</span><br />
+ The adb command
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="root"></a><span class="summary-name">root</span><br />
+ The root node
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="viewsById"></a><span class="summary-name">viewsById</span><br />
+ The map containing all the <a
+ href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a>s indexed by their <a
+ href="com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">View.getUniqueId()</a>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="display"></a><span class="summary-name">display</span><br />
+ The map containing the device's display properties: width, height and
+ density
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="build"></a><span class="summary-name">build</span><br />
+ The map containing the device's build properties: version.sdk,
+ version.release
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ro"></a><span class="summary-name">ro</span><br />
+ The map containing the device's ro properties: secure, debuggable
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="forceViewServerUse"></a><span class="summary-name">forceViewServerUse</span><br />
+ Force the use of ViewServer even if the conditions to use UiAutomator
+ are satisfied
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.ViewClient-class.html#ignoreUiAutomatorKilled" class="summary-name">ignoreUiAutomatorKilled</a><br />
+ On some devices (i.e.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="windows"></a><span class="summary-name">windows</span><br />
+ The list of windows as obtained by <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#list"
+ class="link">ViewClient.list()</a>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="com.dtmilano.android.viewclient.ViewClient-class.html#views" class="summary-name">views</a><br />
+ The list of Views represented as <code>str</code> obtained after
+ splitting it into lines after being received from the server.
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">device</span>,
+ <span class="sig-arg">serialno</span>,
+ <span class="sig-arg">adb</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">autodump</span>=<span class="sig-default">True</span>,
+ <span class="sig-arg">forceviewserveruse</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">localport</span>=<span class="sig-default">4939</span>,
+ <span class="sig-arg">remoteport</span>=<span class="sig-default">4939</span>,
+ <span class="sig-arg">startviewserver</span>=<span class="sig-default">True</span>,
+ <span class="sig-arg">ignoreuiautomatorkilled</span>=<span class="sig-default">False</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>device</code></strong> (MonkeyDevice) - The device running the <code>View server</code> to which this
+ client will connect</li>
+ <li><strong class="pname"><code>serialno</code></strong> (str) - the serial number of the device or emulator to connect to</li>
+ <li><strong class="pname"><code>adb</code></strong> (str) - the path of the <code>adb</code> executable or None and
+ <code>ViewClient</code> will try to find it</li>
+ <li><strong class="pname"><code>autodump</code></strong> (boolean) - whether an automatic dump is performed at the end of this
+ constructor</li>
+ <li><strong class="pname"><code>forceviewserveruse</code></strong> (boolean) - Force the use of <code>ViewServer</code> even if the conditions
+ to use <code>UiAutomator</code> are satisfied</li>
+ <li><strong class="pname"><code>localport</code></strong> (int) - the local port used in the redirection</li>
+ <li><strong class="pname"><code>remoteport</code></strong> (int) - the remote port used to start the <code>ViewServer</code> in the
+ device or emulator</li>
+ <li><strong class="pname"><code>startviewserver</code></strong> (boolean) - Whether to start the <b>global</b> ViewServer</li>
+ <li><strong class="pname"><code>ignoreuiautomatorkilled</code></strong> (boolean) - Ignores received <b>Killed</b> message from
+ <code>uiautomator</code></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="connectToDeviceOrExit"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">connectToDeviceOrExit</span>(<span class="sig-arg">timeout</span>=<span class="sig-default">60</span>,
+ <span class="sig-arg">verbose</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">ignoresecuredevice</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">serialno</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.connectToDeviceOrExit">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Connects to a device which serial number is obtained from the script
+ arguments if available or using the default regex <code>.*</code>.</p>
+ <p>If the connection is not successful the script exits. <code
+ class="link">MonkeyRunner.waitForConnection()</code> returns a <code
+ class="link">MonkeyDevice</code> even if the connection failed. Then, to
+ detect this situation, <code>device.wake()</code> is attempted and if it
+ fails then it is assumed the previous connection failed.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>timeout</code></strong> (int) - timeout for the connection</li>
+ <li><strong class="pname"><code>verbose</code></strong> (bool) - Verbose output</li>
+ <li><strong class="pname"><code>ignoresecuredevice</code></strong> (bool) - Ignores the check for a secure device</li>
+ <li><strong class="pname"><code>serialno</code></strong> (str) - The device or emulator serial number</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the device and serialno used for the connection</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdAndText"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdAndText</span>(<span class="sig-arg">view</span>,
+ <span class="sig-arg">extraInfo</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">noextrainfo</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ <li><strong class="pname"><code>extraInfo</code></strong> (method) - the View method to add extra info</li>
+ <li><strong class="pname"><code>noextrainfo</code></strong> (bool) - Don't add extra info</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndUniqueId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndUniqueId</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id, text if available and unique id. This
+ function can be used as a transform function to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and unique
+ Id</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndContentDescription"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndContentDescription</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id, text if available and unique id. This
+ function can be used as a transform function to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and the
+ content description</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndCenter"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndCenter</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextPositionAndSize"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextPositionAndSize</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CIT"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CIT</span>(<span class="sig-arg">view</span>,
+ <span class="sig-arg">extraInfo</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">noextrainfo</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"
+ class="link">traverseShowClassIdAndText(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ <li><strong class="pname"><code>extraInfo</code></strong> (method) - the View method to add extra info</li>
+ <li><strong class="pname"><code>noextrainfo</code></strong> (bool) - Don't add extra info</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITUI"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITUI</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"
+ class="link">traverseShowClassIdTextAndUniqueId(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and unique
+ Id</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITCD"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITCD</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"
+ class="link">traverseShowClassIdTextAndContentDescription(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and the
+ content description</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITC"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITC</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"
+ class="link">traverseShowClassIdTextAndCenter(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITPS"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITPS</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"
+ class="link">traverseShowClassIdTextPositionAndSize(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="sleep"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">sleep</span>(<span class="sig-arg">secs</span>=<span class="sig-default">1.0</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.sleep">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sleeps for the specified number of seconds.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>secs</code></strong> (float) - number of seconds</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="assertServiceResponse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">assertServiceResponse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">response</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.assertServiceResponse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks whether the response received from the server is correct or
+ raises and Exception.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>response</code></strong> (str) - Response received from the server</li>
+ </ul></dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>Exception</strong></code> - If the response received from the server is invalid</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="serviceResponse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">serviceResponse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">response</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.serviceResponse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks the response received from the <i>ViewServer</i>.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd><code>True</code> if the response received matches <code
+ class="link">PARCEL_TRUE</code>, <code>False</code> otherwise</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="setViews"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">setViews</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">received</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViews">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sets <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value splitting it into
+ lines.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>received</code></strong> (str) - the string received from the <i>View Server</i></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="setViewsFromUiAutomatorDump"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">setViewsFromUiAutomatorDump</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">received</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViewsFromUiAutomatorDump">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sets <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value parsing the received
+ XML.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>received</code></strong> (str) - the string received from the <i>UI Automator</i></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__splitAttrs"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__splitAttrs</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">strArgs</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__splitAttrs">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Splits the <code>View</code> attributes in <code>strArgs</code> and
+ optionally adds the view id to the <code>viewsById</code> list.</p>
+ <h1 class="heading">Unique Ids</h1>
+ <p>It is very common to find <code>View</code>s having <b>NO_ID</b> as
+ the Id. This turns very difficult to use <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewById"
+ class="link">self.findViewById()</a>. To help in this situation this
+ method assigns <b>unique Ids</b>.</p>
+ <p>The <b>unique Ids</b> are generated using the pattern
+ <code>id/no_id/<number></code> with <code><number></code>
+ starting at 1.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>strArgs</code></strong> (str) - the string containing the raw list of attributes and values</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>Returns the attributes map.</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__parseTree"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__parseTree</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">receivedLines</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTree">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Parses the View tree contained in <code
+ class="link">receivedLines</code>. The tree is created and the root node
+ assigned to <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#root"
+ class="link">self.root</a>. This method also assigns <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#viewsById"
+ class="link">self.viewsById</a> values using <a
+ href="com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">View.getUniqueId</a> as the key.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>receivedLines</code></strong> (str) - the string received from <b>View Server</b></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getRoot"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getRoot</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getRoot">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the root node of the <code>View</code> tree</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the root node of the <code>View</code> tree</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="sig-arg">indent</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string"></code><code class="variable-quote">'</code></span>,
+ <span class="sig-arg">transform</span>=<span class="sig-default"><unbound method View.__str__></span>,
+ <span class="sig-arg">stream</span>=<span class="sig-default">sys.stdout</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Traverses the <code>View</code> tree and prints its nodes.</p>
+ <p>The nodes are printed converting them to string but other
+ transformations can be specified by providing a method name as the
+ <code>transform</code> parameter.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>root</code></strong> (<a href="com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a>) - the root node from where the traverse starts</li>
+ <li><strong class="pname"><code>indent</code></strong> (str) - the indentation string to use to print the nodes</li>
+ <li><strong class="pname"><code>transform</code></strong> (method) - a method to use to transform the node before is printed</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="dump"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">dump</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">window</span>=<span class="sig-default">-1</span>,
+ <span class="sig-arg">sleep</span>=<span class="sig-default">1</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.dump">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Dumps the window content.</p>
+ <p>Sleep is useful to wait some time before obtaining the new content
+ when something in the window has changed.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>window</code></strong> (int or str) - the window id or name of the window to dump. The <b>name</b> is
+ the package name or the window name (i.e. StatusBar) for system
+ windows. The window id can be provided as <code>int</code> or
+ <code>str</code>. The <code>str</code> should represent and
+ <code>int</code> in either base 10 or 16. Use -1 to dump all
+ windows. This parameter only is used when the backend is
+ <b>ViewServer</b> and it's ignored for <b>UiAutomator</b>.</li>
+ <li><strong class="pname"><code>sleep</code></strong> (int) - sleep in seconds before proceeding to dump the content</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the list of Views as <code>str</code> received from the server
+ after being split into lines</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="list"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">list</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">sleep</span>=<span class="sig-default">1</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.list">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>List the windows.</p>
+ <p>Sleep is useful to wait some time before obtaining the new content
+ when something in the window has changed. This also sets <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#windows"
+ class="link">self.windows</a> as the list of windows.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>sleep</code></strong> (int) - sleep in seconds before proceeding to dump the content</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the list of windows</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewById"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewById</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">viewId</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="sig-arg">viewFilter</span>=<span class="sig-default">None</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewById">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View with the specified viewId.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>viewId</code></strong> (str) - the ID of the view to find</li>
+ <li><strong class="pname"><code>root</code></strong> (str) - the root node of the tree where the View will be searched</li>
+ <li><strong class="pname"><code>viewFilter</code></strong> - a function that will be invoked providing the candidate View as a
+ parameter and depending on the return value (<code>True</code> or
+ <code>False</code>) the View will be selected and returned as the
+ result of <code>findViewById()</code> or ignored. This can be
+ <code>None</code> and no extra filtering is applied.</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the <code>View</code> found or <code>None</code></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewByIdOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewByIdOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">viewId</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>,
+ <span class="sig-arg">viewFilter</span>=<span class="sig-default">None</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByIdOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>viewId</code></strong> (str) - the ID of the view to find</li>
+ <li><strong class="pname"><code>root</code></strong> (str) - the root node of the tree where the View will be searched</li>
+ <li><strong class="pname"><code>viewFilter</code></strong> - a function that will be invoked providing the candidate View as a
+ parameter and depending on the return value (<code>True</code> or
+ <code>False</code>) the View will be selected and returned as the
+ result of <code>findViewById()</code> or ignored. This can be
+ <code>None</code> and no extra filtering is applied.</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewWithAttributeOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewWithAttributeOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">attr</span>,
+ <span class="sig-arg">val</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewWithTextOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewWithTextOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">text</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">ROOT</code><code class="variable-quote">'</code></span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithTextOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getViewIds"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getViewIds</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewIds">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Deprecated:</strong>
+ Use <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById"
+ class="link">getViewsById</a> instead.
+ <p>Returns the Views map.</p>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getViewsById"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getViewsById</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewsById">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Returns the Views map. The keys are <code>uniqueIds</code> and the
+ values are <code>View</code>s.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="writeImageToFile"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">writeImageToFile</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">filename</span>,
+ <span class="sig-arg">format</span>=<span class="sig-default"><code class="variable-quote">'</code><code class="variable-string">PNG</code><code class="variable-quote">'</code></span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.writeImageToFile">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Write the View image to the specified filename in the specified
+ format.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>filename</code></strong> (str) - Absolute path and optional filename receiving the image. If this
+ points to a directory, then the filename is determined by the
+ serialno of the device and format extension.</li>
+ <li><strong class="pname"><code>format</code></strong> (str) - Image format (default format is PNG)</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="distance"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">distance</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">tree</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.distance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Calculates the distance between this tree and the tree passed as
+ argument.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>tree</code></strong> (list of Views) - Tree of Views</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the distance</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__hammingDistance"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__hammingDistance</span>(<span class="sig-arg">s1</span>,
+ <span class="sig-arg">s2</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__hammingDistance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the Hamming distance between two strings.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>s1</code></strong> - string</li>
+ <li><strong class="pname"><code>s2</code></strong> - string</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the distance</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>ValueError</strong></code> - if the lenght of the strings differ</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__levenshteinDistance"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__levenshteinDistance</span>(<span class="sig-arg">s</span>,
+ <span class="sig-arg">t</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewClient.__levenshteinDistance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Find the Levenshtein distance between two Strings.</p>
+ <p>Python version of Levenshtein distance method implemented in Java at
+ <a
+ href="http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm"
+
+ target="_top">http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm</a>.</p>
+ <p>This is the number of changes needed to change one String into
+ another, where each change is a single character modification (deletion,
+ insertion or substitution).</p>
+ <p>The previous implementation of the Levenshtein distance algorithm was
+ from <a href="http://www.merriampark.com/ld.htm"
+ target="_top">http://www.merriampark.com/ld.htm</a></p>
+ <p>Chas Emerick has written an implementation in Java, which avoids an
+ OutOfMemoryError which can occur when my Java implementation is used with
+ very large strings. This implementation of the Levenshtein distance
+ algorithm is from <a href="http://www.merriampark.com/ldjava.htm"
+ target="_top">http://www.merriampark.com/ldjava.htm</a>:</p>
+<pre class="literalblock">
+ StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance(*, null) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance("","") = 0
+ StringUtils.getLevenshteinDistance("","a") = 1
+ StringUtils.getLevenshteinDistance("aaapppp", "") = 7
+ StringUtils.getLevenshteinDistance("frog", "fog") = 1
+ StringUtils.getLevenshteinDistance("fly", "ant") = 3
+ StringUtils.getLevenshteinDistance("elephant", "hippo") = 7
+ StringUtils.getLevenshteinDistance("hippo", "elephant") = 7
+ StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8
+ StringUtils.getLevenshteinDistance("hello", "hallo") = 1
+</pre>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>s</code></strong> - the first String, must not be null</li>
+ <li><strong class="pname"><code>t</code></strong> - the second String, must not be null</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>result distance</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>ValueError</strong></code> - if either String input <code>null</code></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== INSTANCE VARIABLE DETAILS ==================== -->
+<a name="section-InstanceVariableDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variable Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariableDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="ignoreUiAutomatorKilled"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">ignoreUiAutomatorKilled</h3>
+ <p>On some devices (i.e. Nexus 7 running 4.2.2) uiautomator is killed
+ just after generating the dump file. In many cases the file is already
+ complete so we can ask to ignore the 'Killed' message by setting <code
+ class="link">ignoreuiautomatorkilled</code> to <code>True</code>.</p>
+ <p>Changes in v2.3.21 that uses <code>/dev/tty</code> instead of a file
+ may have turned this variable unnecessary, however it has been kept for
+ backward compatibility.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="views"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">views</h3>
+ <p>The list of Views represented as <code>str</code> obtained after
+ splitting it into lines after being received from the server. Done by <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#setViews"
+ class="link">self.setViews()</a>.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:01 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewNotFoundException-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewNotFoundException-class.html
new file mode 100755
index 0000000..612043c
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.ViewNotFoundException-class.html
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.ViewNotFoundException</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class ViewNotFoundException
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class ViewNotFoundException</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_com_dtmi_4" name="uml_class_diagram_for_com_dtmi_4">
+<area shape="rect" id="node1_14" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__" title="x.__init__(...) initializes x; see help(type(x)) for signature" alt="" coords="17,393,195,412"/>
+<area shape="rect" id="node1" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html" title="ViewNotFoundException is raised when a View is not found." alt="" coords="5,361,206,418"/>
+<area shape="rect" id="node2_15" href="javascript:void(0);" title="exceptions.Exception.__new__" alt="" coords="43,316,169,335"/>
+<area shape="rect" id="node2" href="javascript:void(0);" title="Common base class for all non-exit exceptions." alt="" coords="30,283,181,341"/>
+<area shape="rect" id="node3_16" href="javascript:void(0);" title="exceptions.BaseException.args" alt="" coords="28,31,185,49"/>
+<area shape="rect" id="node3_17" href="javascript:void(0);" title="exceptions.BaseException.message" alt="" coords="28,49,185,68"/>
+<area shape="rect" id="node3_18" href="javascript:void(0);" title="x.__delattr__('name') <==> del x.name" alt="" coords="28,71,185,89"/>
+<area shape="rect" id="node3_19" href="javascript:void(0);" title="x.__getattribute__('name') <==> x.name" alt="" coords="28,89,185,108"/>
+<area shape="rect" id="node3_20" href="javascript:void(0);" title="x[y]" alt="" coords="28,108,185,127"/>
+<area shape="rect" id="node3_21" href="javascript:void(0);" title="x[i:j]" alt="" coords="28,127,185,145"/>
+<area shape="rect" id="node3_22" href="javascript:void(0);" title="helper for pickle" alt="" coords="28,145,185,164"/>
+<area shape="rect" id="node3_23" href="javascript:void(0);" title="repr(x)" alt="" coords="28,164,185,183"/>
+<area shape="rect" id="node3_24" href="javascript:void(0);" title="x.__setattr__('name', value) <==> x.name = value" alt="" coords="28,183,185,201"/>
+<area shape="rect" id="node3_25" href="javascript:void(0);" title="exceptions.BaseException.__setstate__" alt="" coords="28,201,185,220"/>
+<area shape="rect" id="node3_26" href="javascript:void(0);" title="str(x)" alt="" coords="28,220,185,239"/>
+<area shape="rect" id="node3_27" href="javascript:void(0);" title="exceptions.BaseException.__unicode__" alt="" coords="28,239,185,257"/>
+<area shape="rect" id="node3" href="javascript:void(0);" title="Common base class for all exceptions" alt="" coords="16,6,197,263"/>
+</map>
+ <img src="uml_class_diagram_for_com_dtmi_4.gif" alt='' usemap="#uml_class_diagram_for_com_dtmi_4" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>ViewNotFoundException is raised when a View is not found.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">value</span>,
+ <span class="summary-sig-arg">root</span>)</span><br />
+ x.__init__(...) initializes x; see help(type(x)) for signature</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.Exception</code></b>:
+ <code>__new__</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.BaseException</code></b>:
+ <code>__delattr__</code>,
+ <code>__getattribute__</code>,
+ <code>__getitem__</code>,
+ <code>__getslice__</code>,
+ <code>__reduce__</code>,
+ <code>__repr__</code>,
+ <code>__setattr__</code>,
+ <code>__setstate__</code>,
+ <code>__str__</code>,
+ <code>__unicode__</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+ <code>__format__</code>,
+ <code>__hash__</code>,
+ <code>__reduce_ex__</code>,
+ <code>__sizeof__</code>,
+ <code>__subclasshook__</code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== PROPERTIES ==================== -->
+<a name="section-Properties"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Properties</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Properties"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.BaseException</code></b>:
+ <code>args</code>,
+ <code>message</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+ <code>__class__</code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">attr</span>,
+ <span class="sig-arg">value</span>,
+ <span class="sig-arg">root</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>x.__init__(...) initializes x; see help(type(x)) for signature</p>
+ <dl class="fields">
+ <dt>Overrides:
+ object.__init__
+ <dd><em class="note">(inherited documentation)</em></dd>
+ </dt>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:02 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/com.dtmilano.android.viewclient.Window-class.html b/AndroidViewClient/doc/com.dtmilano.android.viewclient.Window-class.html
new file mode 100755
index 0000000..d43feb5
--- /dev/null
+++ b/AndroidViewClient/doc/com.dtmilano.android.viewclient.Window-class.html
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>com.dtmilano.android.viewclient.Window</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package com ::
+ Package dtmilano ::
+ <a href="com.dtmilano.android-module.html">Package android</a> ::
+ <a href="com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class Window
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="com.dtmilano.android.viewclient.Window-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class Window</h1><p class="nomargin-top"><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Window">source code</a></span></p>
+<p>Window class</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="com.dtmilano.android.viewclient.Window-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">num</span>,
+ <span class="summary-sig-arg">winId</span>,
+ <span class="summary-sig-arg">activity</span>,
+ <span class="summary-sig-arg">wvx</span>,
+ <span class="summary-sig-arg">wvy</span>,
+ <span class="summary-sig-arg">wvw</span>,
+ <span class="summary-sig-arg">wvh</span>,
+ <span class="summary-sig-arg">px</span>,
+ <span class="summary-sig-arg">py</span>,
+ <span class="summary-sig-arg">visibility</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Window.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__str__"></a><span class="summary-sig-name">__str__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Window.__str__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">num</span>,
+ <span class="sig-arg">winId</span>,
+ <span class="sig-arg">activity</span>,
+ <span class="sig-arg">wvx</span>,
+ <span class="sig-arg">wvy</span>,
+ <span class="sig-arg">wvw</span>,
+ <span class="sig-arg">wvh</span>,
+ <span class="sig-arg">px</span>,
+ <span class="sig-arg">py</span>,
+ <span class="sig-arg">visibility</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="com.dtmilano.android.viewclient-pysrc.html#Window.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>num</code></strong> (int) - Ordering number in Window Manager</li>
+ <li><strong class="pname"><code>winId</code></strong> (str) - the window ID</li>
+ <li><strong class="pname"><code>activity</code></strong> (str) - the activity (or sometimes other component) owning the window</li>
+ <li><strong class="pname"><code>wvx</code></strong> (int) - window's virtual X</li>
+ <li><strong class="pname"><code>wvy</code></strong> (int) - window's virtual Y</li>
+ <li><strong class="pname"><code>wvw</code></strong> (int) - window's virtual width</li>
+ <li><strong class="pname"><code>wvh</code></strong> (int) - window's virtual height</li>
+ <li><strong class="pname"><code>px</code></strong> (int) - parent's X</li>
+ <li><strong class="pname"><code>py</code></strong> (int) - parent's Y</li>
+ <li><strong class="pname"><code>visibility</code></strong> (int) - visibility of the window</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:36:02 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/crarr.png b/AndroidViewClient/doc/crarr.png
new file mode 100755
index 0000000..26b43c5
--- /dev/null
+++ b/AndroidViewClient/doc/crarr.png
Binary files differ
diff --git a/AndroidViewClient/doc/deprecated-index.html b/AndroidViewClient/doc/deprecated-index.html
new file mode 100755
index 0000000..8233135
--- /dev/null
+++ b/AndroidViewClient/doc/deprecated-index.html
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Deprecation List</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Indices </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%"> </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="deprecated-index.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<center><b>[
+ <a href="identifier-index.html">Identifiers</a>
+| <a href="deprecated-index.html">Deprecations</a>
+]</b></center><br />
+<h1 class="epydoc"><a name="deprecated">Deprecation List</a></h1>
+<br />
+<div>
+<table width="100%" class="metadata-index" bgcolor="#e0e0e0"><tr><td class="metadata-index"><b>Deprecations in <a href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds">com.dtmilano.android.viewclient.ViewClient.getViewIds</a></b> <ul class="nomargin">
+ <li>Use <a
+ href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById"
+ class="link">getViewsById</a> instead.
+ <p>Returns the Views map.</p></li>
+ </ul>
+</table></div>
+<br /><!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Indices </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:57 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/epydoc.css b/AndroidViewClient/doc/epydoc.css
new file mode 100755
index 0000000..86d4170
--- /dev/null
+++ b/AndroidViewClient/doc/epydoc.css
@@ -0,0 +1,322 @@
+
+
+/* Epydoc CSS Stylesheet
+ *
+ * This stylesheet can be used to customize the appearance of epydoc's
+ * HTML output.
+ *
+ */
+
+/* Default Colors & Styles
+ * - Set the default foreground & background color with 'body'; and
+ * link colors with 'a:link' and 'a:visited'.
+ * - Use bold for decision list terms.
+ * - The heading styles defined here are used for headings *within*
+ * docstring descriptions. All headings used by epydoc itself use
+ * either class='epydoc' or class='toc' (CSS styles for both
+ * defined below).
+ */
+body { background: #ffffff; color: #000000; }
+p { margin-top: 0.5em; margin-bottom: 0.5em; }
+a:link { color: #0000ff; }
+a:visited { color: #204080; }
+dt { font-weight: bold; }
+h1 { font-size: +140%; font-style: italic;
+ font-weight: bold; }
+h2 { font-size: +125%; font-style: italic;
+ font-weight: bold; }
+h3 { font-size: +110%; font-style: italic;
+ font-weight: normal; }
+code { font-size: 100%; }
+/* N.B.: class, not pseudoclass */
+a.link { font-family: monospace; }
+
+/* Page Header & Footer
+ * - The standard page header consists of a navigation bar (with
+ * pointers to standard pages such as 'home' and 'trees'); a
+ * breadcrumbs list, which can be used to navigate to containing
+ * classes or modules; options links, to show/hide private
+ * variables and to show/hide frames; and a page title (using
+ * <h1>). The page title may be followed by a link to the
+ * corresponding source code (using 'span.codelink').
+ * - The footer consists of a navigation bar, a timestamp, and a
+ * pointer to epydoc's homepage.
+ */
+h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; }
+h2.epydoc { font-size: +130%; font-weight: bold; }
+h3.epydoc { font-size: +115%; font-weight: bold;
+ margin-top: 0.2em; }
+td h3.epydoc { font-size: +115%; font-weight: bold;
+ margin-bottom: 0; }
+table.navbar { background: #a0c0ff; color: #000000;
+ border: 2px groove #c0d0d0; }
+table.navbar table { color: #000000; }
+th.navbar-select { background: #70b0ff;
+ color: #000000; }
+table.navbar a { text-decoration: none; }
+table.navbar a:link { color: #0000ff; }
+table.navbar a:visited { color: #204080; }
+span.breadcrumbs { font-size: 85%; font-weight: bold; }
+span.options { font-size: 70%; }
+span.codelink { font-size: 85%; }
+td.footer { font-size: 85%; }
+
+/* Table Headers
+ * - Each summary table and details section begins with a 'header'
+ * row. This row contains a section title (marked by
+ * 'span.table-header') as well as a show/hide private link
+ * (marked by 'span.options', defined above).
+ * - Summary tables that contain user-defined groups mark those
+ * groups using 'group header' rows.
+ */
+td.table-header { background: #70b0ff; color: #000000;
+ border: 1px solid #608090; }
+td.table-header table { color: #000000; }
+td.table-header table a:link { color: #0000ff; }
+td.table-header table a:visited { color: #204080; }
+span.table-header { font-size: 120%; font-weight: bold; }
+th.group-header { background: #c0e0f8; color: #000000;
+ text-align: left; font-style: italic;
+ font-size: 115%;
+ border: 1px solid #608090; }
+
+/* Summary Tables (functions, variables, etc)
+ * - Each object is described by a single row of the table with
+ * two cells. The left cell gives the object's type, and is
+ * marked with 'code.summary-type'. The right cell gives the
+ * object's name and a summary description.
+ * - CSS styles for the table's header and group headers are
+ * defined above, under 'Table Headers'
+ */
+table.summary { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin-bottom: 0.5em; }
+td.summary { border: 1px solid #608090; }
+code.summary-type { font-size: 85%; }
+table.summary a:link { color: #0000ff; }
+table.summary a:visited { color: #204080; }
+
+
+/* Details Tables (functions, variables, etc)
+ * - Each object is described in its own div.
+ * - A single-row summary table w/ table-header is used as
+ * a header for each details section (CSS style for table-header
+ * is defined above, under 'Table Headers').
+ */
+table.details { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin: .2em 0 0 0; }
+table.details table { color: #000000; }
+table.details a:link { color: #0000ff; }
+table.details a:visited { color: #204080; }
+
+/* Fields */
+dl.fields { margin-left: 2em; margin-top: 1em;
+ margin-bottom: 1em; }
+dl.fields dd ul { margin-left: 0em; padding-left: 0em; }
+dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; }
+div.fields { margin-left: 2em; }
+div.fields p { margin-bottom: 0.5em; }
+
+/* Index tables (identifier index, term index, etc)
+ * - link-index is used for indices containing lists of links
+ * (namely, the identifier index & term index).
+ * - index-where is used in link indices for the text indicating
+ * the container/source for each link.
+ * - metadata-index is used for indices containing metadata
+ * extracted from fields (namely, the bug index & todo index).
+ */
+table.link-index { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090; }
+td.link-index { border-width: 0px; }
+table.link-index a:link { color: #0000ff; }
+table.link-index a:visited { color: #204080; }
+span.index-where { font-size: 70%; }
+table.metadata-index { border-collapse: collapse;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #608090;
+ margin: .2em 0 0 0; }
+td.metadata-index { border-width: 1px; border-style: solid; }
+table.metadata-index a:link { color: #0000ff; }
+table.metadata-index a:visited { color: #204080; }
+
+/* Function signatures
+ * - sig* is used for the signature in the details section.
+ * - .summary-sig* is used for the signature in the summary
+ * table, and when listing property accessor functions.
+ * */
+.sig-name { color: #006080; }
+.sig-arg { color: #008060; }
+.sig-default { color: #602000; }
+.summary-sig { font-family: monospace; }
+.summary-sig-name { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:link
+ { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:visited
+ { color: #006080; font-weight: bold; }
+.summary-sig-arg { color: #006040; }
+.summary-sig-default { color: #501800; }
+
+/* Subclass list
+ */
+ul.subclass-list { display: inline; }
+ul.subclass-list li { display: inline; }
+
+/* To render variables, classes etc. like functions */
+table.summary .summary-name { color: #006080; font-weight: bold;
+ font-family: monospace; }
+table.summary
+ a.summary-name:link { color: #006080; font-weight: bold;
+ font-family: monospace; }
+table.summary
+ a.summary-name:visited { color: #006080; font-weight: bold;
+ font-family: monospace; }
+
+/* Variable values
+ * - In the 'variable details' sections, each varaible's value is
+ * listed in a 'pre.variable' box. The width of this box is
+ * restricted to 80 chars; if the value's repr is longer than
+ * this it will be wrapped, using a backslash marked with
+ * class 'variable-linewrap'. If the value's repr is longer
+ * than 3 lines, the rest will be ellided; and an ellipsis
+ * marker ('...' marked with 'variable-ellipsis') will be used.
+ * - If the value is a string, its quote marks will be marked
+ * with 'variable-quote'.
+ * - If the variable is a regexp, it is syntax-highlighted using
+ * the re* CSS classes.
+ */
+pre.variable { padding: .5em; margin: 0;
+ background: #dce4ec; color: #000000;
+ border: 1px solid #708890; }
+.variable-linewrap { color: #604000; font-weight: bold; }
+.variable-ellipsis { color: #604000; font-weight: bold; }
+.variable-quote { color: #604000; font-weight: bold; }
+.variable-group { color: #008000; font-weight: bold; }
+.variable-op { color: #604000; font-weight: bold; }
+.variable-string { color: #006030; }
+.variable-unknown { color: #a00000; font-weight: bold; }
+.re { color: #000000; }
+.re-char { color: #006030; }
+.re-op { color: #600000; }
+.re-group { color: #003060; }
+.re-ref { color: #404040; }
+
+/* Base tree
+ * - Used by class pages to display the base class hierarchy.
+ */
+pre.base-tree { font-size: 80%; margin: 0; }
+
+/* Frames-based table of contents headers
+ * - Consists of two frames: one for selecting modules; and
+ * the other listing the contents of the selected module.
+ * - h1.toc is used for each frame's heading
+ * - h2.toc is used for subheadings within each frame.
+ */
+h1.toc { text-align: center; font-size: 105%;
+ margin: 0; font-weight: bold;
+ padding: 0; }
+h2.toc { font-size: 100%; font-weight: bold;
+ margin: 0.5em 0 0 -0.3em; }
+
+/* Syntax Highlighting for Source Code
+ * - doctest examples are displayed in a 'pre.py-doctest' block.
+ * If the example is in a details table entry, then it will use
+ * the colors specified by the 'table pre.py-doctest' line.
+ * - Source code listings are displayed in a 'pre.py-src' block.
+ * Each line is marked with 'span.py-line' (used to draw a line
+ * down the left margin, separating the code from the line
+ * numbers). Line numbers are displayed with 'span.py-lineno'.
+ * The expand/collapse block toggle button is displayed with
+ * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
+ * modify the font size of the text.)
+ * - If a source code page is opened with an anchor, then the
+ * corresponding code block will be highlighted. The code
+ * block's header is highlighted with 'py-highlight-hdr'; and
+ * the code block's body is highlighted with 'py-highlight'.
+ * - The remaining py-* classes are used to perform syntax
+ * highlighting (py-string for string literals, py-name for names,
+ * etc.)
+ */
+pre.py-doctest { padding: .5em; margin: 1em;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #708890; }
+table pre.py-doctest { background: #dce4ec;
+ color: #000000; }
+pre.py-src { border: 2px solid #000000;
+ background: #f0f0f0; color: #000000; }
+.py-line { border-left: 2px solid #000000;
+ margin-left: .2em; padding-left: .4em; }
+.py-lineno { font-style: italic; font-size: 90%;
+ padding-left: .5em; }
+a.py-toggle { text-decoration: none; }
+div.py-highlight-hdr { border-top: 2px solid #000000;
+ border-bottom: 2px solid #000000;
+ background: #d8e8e8; }
+div.py-highlight { border-bottom: 2px solid #000000;
+ background: #d0e0e0; }
+.py-prompt { color: #005050; font-weight: bold;}
+.py-more { color: #005050; font-weight: bold;}
+.py-string { color: #006030; }
+.py-comment { color: #003060; }
+.py-keyword { color: #600000; }
+.py-output { color: #404040; }
+.py-name { color: #000050; }
+.py-name:link { color: #000050 !important; }
+.py-name:visited { color: #000050 !important; }
+.py-number { color: #005000; }
+.py-defname { color: #000060; font-weight: bold; }
+.py-def-name { color: #000060; font-weight: bold; }
+.py-base-class { color: #000060; }
+.py-param { color: #000060; }
+.py-docstring { color: #006030; }
+.py-decorator { color: #804020; }
+/* Use this if you don't want links to names underlined: */
+/*a.py-name { text-decoration: none; }*/
+
+/* Graphs & Diagrams
+ * - These CSS styles are used for graphs & diagrams generated using
+ * Graphviz dot. 'img.graph-without-title' is used for bare
+ * diagrams (to remove the border created by making the image
+ * clickable).
+ */
+img.graph-without-title { border: none; }
+img.graph-with-title { border: 1px solid #000000; }
+span.graph-title { font-weight: bold; }
+span.graph-caption { }
+
+/* General-purpose classes
+ * - 'p.indent-wrapped-lines' defines a paragraph whose first line
+ * is not indented, but whose subsequent lines are.
+ * - The 'nomargin-top' class is used to remove the top margin (e.g.
+ * from lists). The 'nomargin' class is used to remove both the
+ * top and bottom margin (but not the left or right margin --
+ * for lists, that would cause the bullets to disappear.)
+ */
+p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em;
+ margin: 0; }
+.nomargin-top { margin-top: 0; }
+.nomargin { margin-top: 0; margin-bottom: 0; }
+
+/* HTML Log */
+div.log-block { padding: 0; margin: .5em 0 .5em 0;
+ background: #e8f0f8; color: #000000;
+ border: 1px solid #000000; }
+div.log-error { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #ffb0b0; color: #000000;
+ border: 1px solid #000000; }
+div.log-warning { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #ffffb0; color: #000000;
+ border: 1px solid #000000; }
+div.log-info { padding: .1em .3em .1em .3em; margin: 4px;
+ background: #b0ffb0; color: #000000;
+ border: 1px solid #000000; }
+h2.log-hdr { background: #70b0ff; color: #000000;
+ margin: 0; padding: 0em 0.5em 0em 0.5em;
+ border-bottom: 1px solid #000000; font-size: 110%; }
+p.log { font-weight: bold; margin: .5em 0 .5em 0; }
+tr.opt-changed { color: #000000; font-weight: bold; }
+tr.opt-default { color: #606060; }
+pre.log { margin: 0; padding: 0; padding-left: 1em; }
diff --git a/AndroidViewClient/doc/epydoc.js b/AndroidViewClient/doc/epydoc.js
new file mode 100755
index 0000000..e787dbc
--- /dev/null
+++ b/AndroidViewClient/doc/epydoc.js
@@ -0,0 +1,293 @@
+function toggle_private() {
+ // Search for any private/public links on this page. Store
+ // their old text in "cmd," so we will know what action to
+ // take; and change their text to the opposite action.
+ var cmd = "?";
+ var elts = document.getElementsByTagName("a");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "privatelink") {
+ cmd = elts[i].innerHTML;
+ elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")?
+ "hide private":"show private");
+ }
+ }
+ // Update all DIVs containing private objects.
+ var elts = document.getElementsByTagName("div");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+ }
+ else if (elts[i].className == "public") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none");
+ }
+ }
+ // Update all table rows containing private objects. Note, we
+ // use "" instead of "block" becaue IE & firefox disagree on what
+ // this should be (block vs table-row), and "" just gives the
+ // default for both browsers.
+ var elts = document.getElementsByTagName("tr");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"");
+ }
+ }
+ // Update all list items containing private objects.
+ var elts = document.getElementsByTagName("li");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?
+ "none":"");
+ }
+ }
+ // Update all list items containing private objects.
+ var elts = document.getElementsByTagName("ul");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "private") {
+ elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+ }
+ }
+ // Set a cookie to remember the current option.
+ document.cookie = "EpydocPrivate="+cmd;
+ }
+function show_private() {
+ var elts = document.getElementsByTagName("a");
+ for(var i=0; i<elts.length; i++) {
+ if (elts[i].className == "privatelink") {
+ cmd = elts[i].innerHTML;
+ if (cmd && cmd.substr(0,4)=="show")
+ toggle_private();
+ }
+ }
+ }
+function getCookie(name) {
+ var dc = document.cookie;
+ var prefix = name + "=";
+ var begin = dc.indexOf("; " + prefix);
+ if (begin == -1) {
+ begin = dc.indexOf(prefix);
+ if (begin != 0) return null;
+ } else
+ { begin += 2; }
+ var end = document.cookie.indexOf(";", begin);
+ if (end == -1)
+ { end = dc.length; }
+ return unescape(dc.substring(begin + prefix.length, end));
+ }
+function setFrame(url1, url2) {
+ parent.frames[1].location.href = url1;
+ parent.frames[2].location.href = url2;
+ }
+function checkCookie() {
+ var cmd=getCookie("EpydocPrivate");
+ if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0)
+ toggle_private();
+ }
+function toggleCallGraph(id) {
+ var elt = document.getElementById(id);
+ if (elt.style.display == "none")
+ elt.style.display = "block";
+ else
+ elt.style.display = "none";
+ }
+function expand(id) {
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.style.display = "block";
+ var elt = document.getElementById(id+"-expanded-linenums");
+ if (elt) elt.style.display = "block";
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+ var elt = document.getElementById(id+"-collapsed-linenums");
+ if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+ var elt = document.getElementById(id+"-toggle");
+ if (elt) { elt.innerHTML = "-"; }
+}
+
+function collapse(id) {
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.style.display = "none";
+ var elt = document.getElementById(id+"-expanded-linenums");
+ if (elt) elt.style.display = "none";
+ var elt = document.getElementById(id+"-collapsed-linenums");
+ if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; }
+ var elt = document.getElementById(id+"-toggle");
+ if (elt) { elt.innerHTML = "+"; }
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) {
+ elt.style.display = "block";
+
+ var indent = elt.getAttribute("indent");
+ var pad = elt.getAttribute("pad");
+ var s = "<tt class='py-lineno'>";
+ for (var i=0; i<pad.length; i++) { s += " " }
+ s += "</tt>";
+ s += " <tt class='py-line'>";
+ for (var i=0; i<indent.length; i++) { s += " " }
+ s += "<a href='#' onclick='expand(\"" + id;
+ s += "\");return false'>...</a></tt><br />";
+ elt.innerHTML = s;
+ }
+}
+
+function toggle(id) {
+ elt = document.getElementById(id+"-toggle");
+ if (elt.innerHTML == "-")
+ collapse(id);
+ else
+ expand(id);
+ return false;
+}
+
+function highlight(id) {
+ var elt = document.getElementById(id+"-def");
+ if (elt) elt.className = "py-highlight-hdr";
+ var elt = document.getElementById(id+"-expanded");
+ if (elt) elt.className = "py-highlight";
+ var elt = document.getElementById(id+"-collapsed");
+ if (elt) elt.className = "py-highlight";
+}
+
+function num_lines(s) {
+ var n = 1;
+ var pos = s.indexOf("\n");
+ while ( pos > 0) {
+ n += 1;
+ pos = s.indexOf("\n", pos+1);
+ }
+ return n;
+}
+
+// Collapse all blocks that mave more than `min_lines` lines.
+function collapse_all(min_lines) {
+ var elts = document.getElementsByTagName("div");
+ for (var i=0; i<elts.length; i++) {
+ var elt = elts[i];
+ var split = elt.id.indexOf("-");
+ if (split > 0)
+ if (elt.id.substring(split, elt.id.length) == "-expanded")
+ if (num_lines(elt.innerHTML) > min_lines)
+ collapse(elt.id.substring(0, split));
+ }
+}
+
+function expandto(href) {
+ var start = href.indexOf("#")+1;
+ if (start != 0 && start != href.length) {
+ if (href.substring(start, href.length) != "-") {
+ collapse_all(4);
+ pos = href.indexOf(".", start);
+ while (pos != -1) {
+ var id = href.substring(start, pos);
+ expand(id);
+ pos = href.indexOf(".", pos+1);
+ }
+ var id = href.substring(start, href.length);
+ expand(id);
+ highlight(id);
+ }
+ }
+}
+
+function kill_doclink(id) {
+ var parent = document.getElementById(id);
+ parent.removeChild(parent.childNodes.item(0));
+}
+function auto_kill_doclink(ev) {
+ if (!ev) var ev = window.event;
+ if (!this.contains(ev.toElement)) {
+ var parent = document.getElementById(this.parentID);
+ parent.removeChild(parent.childNodes.item(0));
+ }
+}
+
+function doclink(id, name, targets_id) {
+ var elt = document.getElementById(id);
+
+ // If we already opened the box, then destroy it.
+ // (This case should never occur, but leave it in just in case.)
+ if (elt.childNodes.length > 1) {
+ elt.removeChild(elt.childNodes.item(0));
+ }
+ else {
+ // The outer box: relative + inline positioning.
+ var box1 = document.createElement("div");
+ box1.style.position = "relative";
+ box1.style.display = "inline";
+ box1.style.top = 0;
+ box1.style.left = 0;
+
+ // A shadow for fun
+ var shadow = document.createElement("div");
+ shadow.style.position = "absolute";
+ shadow.style.left = "-1.3em";
+ shadow.style.top = "-1.3em";
+ shadow.style.background = "#404040";
+
+ // The inner box: absolute positioning.
+ var box2 = document.createElement("div");
+ box2.style.position = "relative";
+ box2.style.border = "1px solid #a0a0a0";
+ box2.style.left = "-.2em";
+ box2.style.top = "-.2em";
+ box2.style.background = "white";
+ box2.style.padding = ".3em .4em .3em .4em";
+ box2.style.fontStyle = "normal";
+ box2.onmouseout=auto_kill_doclink;
+ box2.parentID = id;
+
+ // Get the targets
+ var targets_elt = document.getElementById(targets_id);
+ var targets = targets_elt.getAttribute("targets");
+ var links = "";
+ target_list = targets.split(",");
+ for (var i=0; i<target_list.length; i++) {
+ var target = target_list[i].split("=");
+ links += "<li><a href='" + target[1] +
+ "' style='text-decoration:none'>" +
+ target[0] + "</a></li>";
+ }
+
+ // Put it all together.
+ elt.insertBefore(box1, elt.childNodes.item(0));
+ //box1.appendChild(box2);
+ box1.appendChild(shadow);
+ shadow.appendChild(box2);
+ box2.innerHTML =
+ "Which <b>"+name+"</b> do you want to see documentation for?" +
+ "<ul style='margin-bottom: 0;'>" +
+ links +
+ "<li><a href='#' style='text-decoration:none' " +
+ "onclick='kill_doclink(\""+id+"\");return false;'>"+
+ "<i>None of the above</i></a></li></ul>";
+ }
+ return false;
+}
+
+function get_anchor() {
+ var href = location.href;
+ var start = href.indexOf("#")+1;
+ if ((start != 0) && (start != href.length))
+ return href.substring(start, href.length);
+ }
+function redirect_url(dottedName) {
+ // Scan through each element of the "pages" list, and check
+ // if "name" matches with any of them.
+ for (var i=0; i<pages.length; i++) {
+
+ // Each page has the form "<pagename>-m" or "<pagename>-c";
+ // extract the <pagename> portion & compare it to dottedName.
+ var pagename = pages[i].substring(0, pages[i].length-2);
+ if (pagename == dottedName.substring(0,pagename.length)) {
+
+ // We've found a page that matches `dottedName`;
+ // construct its URL, using leftover `dottedName`
+ // content to form an anchor.
+ var pagetype = pages[i].charAt(pages[i].length-1);
+ var url = pagename + ((pagetype=="m")?"-module.html":
+ "-class.html");
+ if (dottedName.length > pagename.length)
+ url += "#" + dottedName.substring(pagename.length+1,
+ dottedName.length);
+ return url;
+ }
+ }
+ }
diff --git a/AndroidViewClient/doc/frames.html b/AndroidViewClient/doc/frames.html
new file mode 100755
index 0000000..050e24a
--- /dev/null
+++ b/AndroidViewClient/doc/frames.html
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+ "DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title> API Documentation </title>
+</head>
+<frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="toc.html" name="moduleListFrame"
+ id="moduleListFrame" />
+ <frame src="toc-everything.html" name="moduleFrame"
+ id="moduleFrame" />
+ </frameset>
+ <frame src="com.dtmilano.android-module.html" name="mainFrame" id="mainFrame" />
+</frameset>
+</html>
diff --git a/AndroidViewClient/doc/help.html b/AndroidViewClient/doc/help.html
new file mode 100755
index 0000000..e0afc93
--- /dev/null
+++ b/AndroidViewClient/doc/help.html
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Help</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Help </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%"> </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="help.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<h1 class="epydoc"> API Documentation </h1>
+
+<p> This document contains the API (Application Programming Interface)
+documentation for this project. Documentation for the Python
+objects defined by the project is divided into separate pages for each
+package, module, and class. The API documentation also includes two
+pages containing information about the project as a whole: a trees
+page, and an index page. </p>
+
+<h2> Object Documentation </h2>
+
+ <p>Each <strong>Package Documentation</strong> page contains: </p>
+ <ul>
+ <li> A description of the package. </li>
+ <li> A list of the modules and sub-packages contained by the
+ package. </li>
+ <li> A summary of the classes defined by the package. </li>
+ <li> A summary of the functions defined by the package. </li>
+ <li> A summary of the variables defined by the package. </li>
+ <li> A detailed description of each function defined by the
+ package. </li>
+ <li> A detailed description of each variable defined by the
+ package. </li>
+ </ul>
+
+ <p>Each <strong>Module Documentation</strong> page contains:</p>
+ <ul>
+ <li> A description of the module. </li>
+ <li> A summary of the classes defined by the module. </li>
+ <li> A summary of the functions defined by the module. </li>
+ <li> A summary of the variables defined by the module. </li>
+ <li> A detailed description of each function defined by the
+ module. </li>
+ <li> A detailed description of each variable defined by the
+ module. </li>
+ </ul>
+
+ <p>Each <strong>Class Documentation</strong> page contains: </p>
+ <ul>
+ <li> A class inheritance diagram. </li>
+ <li> A list of known subclasses. </li>
+ <li> A description of the class. </li>
+ <li> A summary of the methods defined by the class. </li>
+ <li> A summary of the instance variables defined by the class. </li>
+ <li> A summary of the class (static) variables defined by the
+ class. </li>
+ <li> A detailed description of each method defined by the
+ class. </li>
+ <li> A detailed description of each instance variable defined by the
+ class. </li>
+ <li> A detailed description of each class (static) variable defined
+ by the class. </li>
+ </ul>
+
+<h2> Project Documentation </h2>
+
+ <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p>
+ <ul>
+ <li> The <em>module hierarchy</em> lists every package and module, with
+ modules grouped into packages. At the top level, and within each
+ package, modules and sub-packages are listed alphabetically. </li>
+ <li> The <em>class hierarchy</em> lists every class, grouped by base
+ class. If a class has more than one base class, then it will be
+ listed under each base class. At the top level, and under each base
+ class, classes are listed alphabetically. </li>
+ </ul>
+
+ <p> The <strong>Index</strong> page contains indices of terms and
+ identifiers: </p>
+ <ul>
+ <li> The <em>term index</em> lists every term indexed by any object's
+ documentation. For each term, the index provides links to each
+ place where the term is indexed. </li>
+ <li> The <em>identifier index</em> lists the (short) name of every package,
+ module, class, method, function, variable, and parameter. For each
+ identifier, the index provides a short description, and a link to
+ its documentation. </li>
+ </ul>
+
+<h2> The Table of Contents </h2>
+
+<p> The table of contents occupies the two frames on the left side of
+the window. The upper-left frame displays the <em>project
+contents</em>, and the lower-left frame displays the <em>module
+contents</em>: </p>
+
+<table class="help summary" border="1" cellspacing="0" cellpadding="3">
+ <tr style="height: 30%">
+ <td align="center" style="font-size: small">
+ Project<br />Contents<hr />...</td>
+ <td align="center" style="font-size: small" rowspan="2" width="70%">
+ API<br />Documentation<br />Frame<br /><br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td align="center" style="font-size: small">
+ Module<br />Contents<hr /> <br />...<br />
+ </td>
+ </tr>
+</table><br />
+
+<p> The <strong>project contents frame</strong> contains a list of all packages
+and modules that are defined by the project. Clicking on an entry
+will display its contents in the module contents frame. Clicking on a
+special entry, labeled "Everything," will display the contents of
+the entire project. </p>
+
+<p> The <strong>module contents frame</strong> contains a list of every
+submodule, class, type, exception, function, and variable defined by a
+module or package. Clicking on an entry will display its
+documentation in the API documentation frame. Clicking on the name of
+the module, at the top of the frame, will display the documentation
+for the module itself. </p>
+
+<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top
+navigation bar can be used to control whether the table of contents is
+displayed or not. </p>
+
+<h2> The Navigation Bar </h2>
+
+<p> A navigation bar is located at the top and bottom of every page.
+It indicates what type of page you are currently viewing, and allows
+you to go to related pages. The following table describes the labels
+on the navigation bar. Note that not some labels (such as
+[Parent]) are not displayed on all pages. </p>
+
+<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%">
+<tr class="summary">
+ <th>Label</th>
+ <th>Highlighted when...</th>
+ <th>Links to...</th>
+</tr>
+ <tr><td valign="top"><strong>[Parent]</strong></td>
+ <td valign="top"><em>(never highlighted)</em></td>
+ <td valign="top"> the parent of the current package </td></tr>
+ <tr><td valign="top"><strong>[Package]</strong></td>
+ <td valign="top">viewing a package</td>
+ <td valign="top">the package containing the current object
+ </td></tr>
+ <tr><td valign="top"><strong>[Module]</strong></td>
+ <td valign="top">viewing a module</td>
+ <td valign="top">the module containing the current object
+ </td></tr>
+ <tr><td valign="top"><strong>[Class]</strong></td>
+ <td valign="top">viewing a class </td>
+ <td valign="top">the class containing the current object</td></tr>
+ <tr><td valign="top"><strong>[Trees]</strong></td>
+ <td valign="top">viewing the trees page</td>
+ <td valign="top"> the trees page </td></tr>
+ <tr><td valign="top"><strong>[Index]</strong></td>
+ <td valign="top">viewing the index page</td>
+ <td valign="top"> the index page </td></tr>
+ <tr><td valign="top"><strong>[Help]</strong></td>
+ <td valign="top">viewing the help page</td>
+ <td valign="top"> the help page </td></tr>
+</table>
+
+<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below
+the top navigation bar can be used to control whether documentation
+for private objects is displayed. Private objects are usually defined
+as objects whose (short) names begin with a single underscore, but do
+not end with an underscore. For example, "<code>_x</code>",
+"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>"
+are private objects; but "<code>re.sub</code>",
+"<code>__init__</code>", and "<code>type_</code>" are not. However,
+if a module defines the "<code>__all__</code>" variable, then its
+contents are used to decide which objects are private. </p>
+
+<p> A timestamp below the bottom navigation bar indicates when each
+page was last updated. </p>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Help </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:57 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/identifier-index.html b/AndroidViewClient/doc/identifier-index.html
new file mode 100755
index 0000000..c904d74
--- /dev/null
+++ b/AndroidViewClient/doc/identifier-index.html
@@ -0,0 +1,858 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Identifier Index</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Indices </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%"> </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="identifier-index.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<center><b>[
+ <a href="identifier-index.html">Identifiers</a>
+| <a href="deprecated-index.html">Deprecations</a>
+]</b></center><br />
+<table border="0" width="100%">
+<tr valign="bottom"><td>
+<h1 class="epydoc">Identifier Index</h1>
+</td><td>
+[
+ <a href="#A">A</a>
+ <a href="#B">B</a>
+ <a href="#C">C</a>
+ <a href="#D">D</a>
+ <a href="#E">E</a>
+ <a href="#F">F</a>
+ <a href="#G">G</a>
+ <a href="#H">H</a>
+ <a href="#I">I</a>
+ J
+ K
+ <a href="#L">L</a>
+ M
+ N
+ <a href="#O">O</a>
+ <a href="#P">P</a>
+ Q
+ R
+ <a href="#S">S</a>
+ <a href="#T">T</a>
+ <a href="#U">U</a>
+ <a href="#V">V</a>
+ <a href="#W">W</a>
+ X
+ Y
+ Z
+ <a href="#_">_</a>
+]
+</td></table>
+<table border="0" width="100%">
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="A">A</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb-module.html">adb</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android-module.html">com.dtmilano.android</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android-module.html">android</a><br />
+<span class="index-where">(in com.dtmilano)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT">ADB_DEFAULT_PORT</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#add">add()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse">assertServiceResponse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html">adbclient</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb-module.html">com.dtmilano.android.adb</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="B">B</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.EditText-class.html#backspace">backspace()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.EditText-class.html">EditText</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="C">C</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData">CharacterData()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkVersion">checkVersion()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData">CharacterData()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#close">close()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#checkConnected">checkConnected()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit">connectToDeviceOrExit()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="D">D</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#DEBUG">DEBUG</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR">DEBUG_GETATTR</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#distance">distance()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG">DEBUG</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED">DEBUG_RECEIVED</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#DOWN">DOWN</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS">DEBUG_BOUNDS</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR">DEBUG_STATUSBAR</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP">DOWN_AND_UP</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_CALL">DEBUG_CALL</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH">DEBUG_TOUCH</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#drag">drag()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_COORDS">DEBUG_COORDS</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_TREE">DEBUG_TREE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#dump">dump()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE">DEBUG_DEVICE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS">DEBUG_WINDOWS</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE">DEBUG_DISTANCE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.Device-class.html">Device</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="E">E</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.EditText-class.html">EditText</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement">EndElement()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement">EndElement()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#excerpt">excerpt()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="F">F</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.Device-class.html#factory">factory()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.Device-class.html">Device</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTag">findViewByTag()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches">findViewWithAttributeThatMatches()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#factory">factory()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTagOrRaise">findViewByTagOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescription">findViewWithContentDescription()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#FAIL">FAIL</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewsContainingPoint">findViewsContainingPoint()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescriptionOrRaise">findViewWithContentDescriptionOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewById">findViewById()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute">findViewWithAttribute()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText">findViewWithText()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise">findViewByIdOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise">findViewWithAttributeOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise">findViewWithTextOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="G">G</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY">GET_VISIBILITY_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds">getViewIds()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getProperty">getProperty()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById">getViewsById()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getClass">getClass()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getRestrictedScreen">getRestrictedScreen()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getRoot">getRoot()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSdkVersion">getSdkVersion()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getX">getX()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getDevices">getDevices()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#getSdkVersion">getSdkVersion()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getXY">getXY()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#getSystemProperty">getSystemProperty()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getY">getY()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getId">getId()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getText">getText()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#GONE">GONE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getParent">getParent()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="H">H</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#hammingDistance">hammingDistance()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8">HEIGHT_PROPERTY_API_8</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY">HEIGHT_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#HOSTNAME">HOSTNAME</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="I">I</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY">ID_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#INVISIBLE">INVISIBLE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isLocked">isLocked()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR">ID_PROPERTY_UI_AUTOMATOR</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#IP_RE">IP_RE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#isScreenOn">isScreenOn()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#ID_RE">ID_RE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#intersection">intersection()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#isKeyboardShown">isKeyboardShown()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="L">L</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY">LAYOUT_TOP_MARGIN_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8">LEFT_PROPERTY_API_8</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#list">list()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY">LEFT_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#levenshteinDistance">levenshteinDistance()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#longPress">longPress()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="O">O</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#OFFSET">OFFSET</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#OKAY">OKAY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="P">P</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse">Parse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#percentSame">percentSame()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#press">press()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse">Parse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#PORT">PORT</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="S">S</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#sameAs">sameAs()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setSerialno">setSerialno()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#sleep">sleep()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse">serviceResponse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#setViews">setViews()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#startActivity">startActivity()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setAlarm">setAlarm()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump">setViewsFromUiAutomatorDump()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement">StartElement()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm">setAlarm()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#shell">shell()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement">StartElement()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#setReconnect">setReconnect()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="T">T</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#takeSnapshot">takeSnapshot()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY">TOP_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter">traverseShowClassIdTextAndCenter()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY">TEXT_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8">TOP_PROPERTY_API_8</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription">traverseShowClassIdTextAndContentDescription()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10">TEXT_PROPERTY_API_10</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#touch">touch()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId">traverseShowClassIdTextAndUniqueId()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR">TEXT_PROPERTY_UI_AUTOMATOR</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#touch">touch()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize">traverseShowClassIdTextPositionAndSize()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.TextView-class.html">TextView</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverse">traverse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#type">type()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#TIMEOUT">TIMEOUT</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText">traverseShowClassIdAndText()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.EditText-class.html#type">type()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.EditText-class.html">EditText</a>)</span></td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="U">U</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#UP">UP</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#unlock">unlock()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES">USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="V">V</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html">View</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY">VERSION_RELEASE_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED">VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY">VERSION_RELEASE_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST">VIEW_SERVER_HOST</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VISIBLE">VISIBLE</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY">VERSION_SDK_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT">VIEW_SERVER_PORT</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY">VERSION_SDK_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html">viewclient</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android-module.html">com.dtmilano.android</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="W">W</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#wake">wake()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8">WIDTH_PROPERTY_API_8</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile">writeImageToFile()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#WARNINGS">WARNINGS</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Window-class.html">Window</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#WS">WS</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY">WIDTH_PROPERTY</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__call__">__call__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.Device-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.Device-class.html">Device</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__checkOk">__checkOk()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__connect">__connect()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree">__parseTree()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__copy">__copy()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump">__parseTreeFromUiAutomatorDump()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__del__">__del__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable">__pickleable()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__del__">__del__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__receive">__receive()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation">__dumpWindowsInformation()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Window-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Window-class.html">Window</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__send">__send()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree">__findViewWithAttributeInTree()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance">__levenshteinDistance()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__setTransport">__setTransport()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise">__findViewWithAttributeInTreeOrRaise()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo">__mapSerialNo()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches">__findViewWithAttributeInTreeThatMatches()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs">__splitAttrs()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath">__obtainAdbPath()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.Device-class.html#__str__">__str__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.Device-class.html">Device</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayHeight">__getDisplayHeight()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber">__obtainDeviceSerialNumber()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__str__">__str__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getDisplayWidth">__getDisplayWidth()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__obtainPxPy">__obtainPxPy()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.Window-class.html#__str__">__str__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.Window-class.html">Window</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__getFocusedWindowPosition">__getFocusedWindowPosition()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible">__obtainStatusBarDimensionsIfVisible()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__obtainVwVh">__obtainVwVh()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__traverse">__traverse()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__getProp">__getProp()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.View-class.html#__obtainVxVy">__obtainVxVy()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.View-class.html">View</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#_nd">_nd()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance">__hammingDistance()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android-module.html">com.dtmilano.android</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#_nh">_nh()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb.adbclient.AdbClient-class.html">AdbClient</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.adb-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.adb-module.html">com.dtmilano.android.adb</a>)</span></td>
+<td width="33%" class="link-index"><a href="com.dtmilano.android.viewclient-module.html#_ns">_ns()</a><br />
+<span class="index-where">(in <a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a>)</span></td>
+</tr>
+</table>
+</td></tr>
+</table>
+<br /><br /><!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Indices </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:57 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/index.html b/AndroidViewClient/doc/index.html
new file mode 100755
index 0000000..050e24a
--- /dev/null
+++ b/AndroidViewClient/doc/index.html
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+ "DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title> API Documentation </title>
+</head>
+<frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="toc.html" name="moduleListFrame"
+ id="moduleListFrame" />
+ <frame src="toc-everything.html" name="moduleFrame"
+ id="moduleFrame" />
+ </frameset>
+ <frame src="com.dtmilano.android-module.html" name="mainFrame" id="mainFrame" />
+</frameset>
+</html>
diff --git a/AndroidViewClient/doc/module-tree.html b/AndroidViewClient/doc/module-tree.html
new file mode 100755
index 0000000..88b9dba
--- /dev/null
+++ b/AndroidViewClient/doc/module-tree.html
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Module Hierarchy</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Trees </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%"> </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="module-tree.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<center><b>
+ [ <a href="module-tree.html">Module Hierarchy</a>
+ | <a href="class-tree.html">Class Hierarchy</a> ]
+</b></center><br />
+<h1 class="epydoc">Module Hierarchy</h1>
+<ul class="nomargin-top">
+ <li> <strong class="uidlink"><a href="com.dtmilano.android-module.html">com.dtmilano.android</a></strong>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb-module.html">com.dtmilano.android.adb</a></strong>
+ <ul>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.adb.adbclient-module.html">com.dtmilano.android.adb.adbclient</a></strong>: <em class="summary">Copyright (C) 2012-2013 Diego Torres Milano
+Created on Dec 1, 2012</em> </li>
+ </ul>
+ </li>
+ <li> <strong class="uidlink"><a href="com.dtmilano.android.viewclient-module.html">com.dtmilano.android.viewclient</a></strong>: <em class="summary">Copyright (C) 2012-2014 Diego Torres Milano
+Created on Feb 2, 2012</em> </li>
+ </ul>
+ </li>
+</ul>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Trees </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Thu May 22 01:35:57 2014
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/redirect.html b/AndroidViewClient/doc/redirect.html
new file mode 100755
index 0000000..5cceaab
--- /dev/null
+++ b/AndroidViewClient/doc/redirect.html
@@ -0,0 +1,38 @@
+<html><head><title>Epydoc Redirect Page</title>
+<meta http-equiv="cache-control" content="no-cache" />
+<meta http-equiv="expires" content="0" />
+<meta http-equiv="pragma" content="no-cache" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+<body>
+<script type="text/javascript">
+<!--
+var pages = ["com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-c", "com.dtmilano.android.viewclient.ViewNotFoundException-c", "com.dtmilano.android.adb.adbclient.AdbClient-c", "com.dtmilano.android.viewclient.Excerpt2Code-c", "com.dtmilano.android.viewclient.ViewClient-c", "com.dtmilano.android.adb.adbclient.Device-c", "com.dtmilano.android.viewclient.EditText-c", "com.dtmilano.android.viewclient.TextView-c", "com.dtmilano.android.viewclient.Window-c", "com.dtmilano.android.viewclient.View-c", "com.dtmilano.android.adb.adbclient-m", "com.dtmilano.android.viewclient-m", "com.dtmilano.android.adb-m", "com.dtmilano.android-m"];
+var dottedName = get_anchor();
+if (dottedName) {
+ var target = redirect_url(dottedName);
+ if (target) window.location.replace(target);
+}
+// -->
+</script>
+
+<h3>Epydoc Auto-redirect page</h3>
+
+<p>When javascript is enabled, this page will redirect URLs of
+the form <tt>redirect.html#<i>dotted.name</i></tt> to the
+documentation for the object with the given fully-qualified
+dotted name.</p>
+<p><a id="message"> </a></p>
+
+<script type="text/javascript">
+<!--
+if (dottedName) {
+ var msg = document.getElementById("message");
+ msg.innerHTML = "No documentation found for <tt>"+
+ dottedName+"</tt>";
+}
+// -->
+</script>
+
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android-module.html b/AndroidViewClient/doc/src.com.dtmilano.android-module.html
new file mode 100755
index 0000000..257bf20
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android-module.html
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ Package android
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== PACKAGE DESCRIPTION ==================== -->
+<h1 class="epydoc">Package android</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android-pysrc.html">source code</a></span></p>
+<!-- ==================== SUBMODULES ==================== -->
+<a name="section-Submodules"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Submodules</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Submodules"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr><td class="summary">
+ <ul class="nomargin">
+ <li> <strong class="uidlink"><a href="src.com.dtmilano.android.viewclient-module.html">src.com.dtmilano.android.viewclient</a></strong>: <em class="summary">Copyright (C) 2012-2013 Diego Torres Milano
+Created on Feb 2, 2012</em> </li>
+ </ul></td></tr>
+</table>
+
+<br />
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="None">None</code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:53 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android-pysrc.html b/AndroidViewClient/doc/src.com.dtmilano.android-pysrc.html
new file mode 100755
index 0000000..9bf6c0d
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android-pysrc.html
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ Package android
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="src.com.dtmilano.android-module.html">Package src.com.dtmilano.android</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno">1</tt> <tt class="py-line"> </tt>
+<a name="L2"></a><tt class="py-lineno">2</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th bgcolor="#70b0f0" class="navbar-select"
+ > Home </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:55 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-module.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-module.html
new file mode 100755
index 0000000..a0d8a06
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-module.html
@@ -0,0 +1,759 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ Module viewclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient-module.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module viewclient</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html">source code</a></span></p>
+<pre class="literalblock">
+
+Copyright (C) 2012-2013 Diego Torres Milano
+Created on Feb 2, 2012
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+
+</pre>
+
+<hr />
+<div class="fields"> <p><strong>Version:</strong>
+ 3.2.0
+ </p>
+</div><!-- ==================== CLASSES ==================== -->
+<a name="section-Classes"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Classes</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Classes"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.Window-class.html" class="summary-name">Window</a><br />
+ Window class
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html" class="summary-name">ViewNotFoundException</a><br />
+ ViewNotFoundException is raised when a View is not found.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.View-class.html" class="summary-name">View</a><br />
+ View class
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.TextView-class.html" class="summary-name">TextView</a><br />
+ TextView class.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.EditText-class.html" class="summary-name">EditText</a><br />
+ EditText class.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html" class="summary-name">UiAutomator2AndroidViewClient</a><br />
+ UiAutomator XML to AndroidViewClient
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html" class="summary-name">Excerpt2Code</a><br />
+ Excerpt XML to code
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.ViewClient-class.html" class="summary-name">ViewClient</a><br />
+ ViewClient is a <i>ViewServer</i> client.
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTIONS ==================== -->
+<a name="section-Functions"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Functions</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Functions"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient-module.html#__nd" class="summary-sig-name" onclick="show_private();">__nd</a>(<span class="summary-sig-arg">name</span>)</span><br />
+ Returns:
+ Returns a named decimal regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__nd">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient-module.html#__nh" class="summary-sig-name" onclick="show_private();">__nh</a>(<span class="summary-sig-arg">name</span>)</span><br />
+ Returns:
+ Returns a named hex regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__nh">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient-module.html#__ns" class="summary-sig-name" onclick="show_private();">__ns</a>(<span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">greedy</span>=<span class="summary-sig-default">False</span>)</span><br />
+ NOTICE: this is using a non-greedy (or minimal) regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__ns">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Variables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG"></a><span class="summary-name">DEBUG</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_DEVICE"></a><span class="summary-name">DEBUG_DEVICE</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_RECEIVED"></a><span class="summary-name">DEBUG_RECEIVED</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_TREE"></a><span class="summary-name">DEBUG_TREE</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_GETATTR"></a><span class="summary-name">DEBUG_GETATTR</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_CALL"></a><span class="summary-name">DEBUG_CALL</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_COORDS"></a><span class="summary-name">DEBUG_COORDS</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_TOUCH"></a><span class="summary-name">DEBUG_TOUCH</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_STATUSBAR"></a><span class="summary-name">DEBUG_STATUSBAR</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_WINDOWS"></a><span class="summary-name">DEBUG_WINDOWS</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_BOUNDS"></a><span class="summary-name">DEBUG_BOUNDS</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="DEBUG_DISTANCE"></a><span class="summary-name">DEBUG_DISTANCE</span> = <code title="DEBUG and False">DEBUG and False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WARNINGS"></a><span class="summary-name">WARNINGS</span> = <code title="False">False</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VIEW_SERVER_HOST"></a><span class="summary-name">VIEW_SERVER_HOST</span> = <code title="'localhost'">'localhost'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VIEW_SERVER_PORT"></a><span class="summary-name">VIEW_SERVER_PORT</span> = <code title="4939">4939</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ADB_DEFAULT_PORT"></a><span class="summary-name">ADB_DEFAULT_PORT</span> = <code title="5555">5555</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="OFFSET"></a><span class="summary-name">OFFSET</span> = <code title="25">25</code><br />
+ This assumes the smallest touchable view on the screen is
+ approximately 50px x 50px and touches it at <i
+ class="math">(x+OFFSET, y+OFFSET)</i>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient-module.html#USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES" class="summary-name">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a> = <code title="True">True</code><br />
+ Use monkeyrunner (<code>MonkeyDevice.getProperty()</code>) to obtain
+ the needed properties.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="summary-name">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a> = <code title="False">False</code><br />
+ Skips some classes related with the Action Bar and the
+ PhoneWindow$DecorView in the coordinates calculation
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VERSION_SDK_PROPERTY"></a><span class="summary-name">VERSION_SDK_PROPERTY</span> = <code title="'version.sdk'">'version.sdk'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_PROPERTY"></a><span class="summary-name">ID_PROPERTY</span> = <code title="'mID'">'mID'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_PROPERTY_UI_AUTOMATOR"></a><span class="summary-name">ID_PROPERTY_UI_AUTOMATOR</span> = <code title="'uniqueId'">'uniqueId'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY"></a><span class="summary-name">TEXT_PROPERTY</span> = <code title="'text:mText'">'text:mText'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY_API_10"></a><span class="summary-name">TEXT_PROPERTY_API_10</span> = <code title="'mText'">'mText'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TEXT_PROPERTY_UI_AUTOMATOR"></a><span class="summary-name">TEXT_PROPERTY_UI_AUTOMATOR</span> = <code title="'text'">'text'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WS"></a><span class="summary-name">WS</span> = <code title=""\xfe"">"\xfe"</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LEFT_PROPERTY"></a><span class="summary-name">LEFT_PROPERTY</span> = <code title="'layout:mLeft'">'layout:mLeft'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LEFT_PROPERTY_API_8"></a><span class="summary-name">LEFT_PROPERTY_API_8</span> = <code title="'mLeft'">'mLeft'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TOP_PROPERTY"></a><span class="summary-name">TOP_PROPERTY</span> = <code title="'layout:mTop'">'layout:mTop'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="TOP_PROPERTY_API_8"></a><span class="summary-name">TOP_PROPERTY_API_8</span> = <code title="'mTop'">'mTop'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WIDTH_PROPERTY"></a><span class="summary-name">WIDTH_PROPERTY</span> = <code title="'layout:getWidth()'">'layout:getWidth()'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="WIDTH_PROPERTY_API_8"></a><span class="summary-name">WIDTH_PROPERTY_API_8</span> = <code title="'getWidth()'">'getWidth()'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="HEIGHT_PROPERTY"></a><span class="summary-name">HEIGHT_PROPERTY</span> = <code title="'layout:getHeight()'">'layout:getHeight()'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="HEIGHT_PROPERTY_API_8"></a><span class="summary-name">HEIGHT_PROPERTY_API_8</span> = <code title="'getHeight()'">'getHeight()'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="GET_VISIBILITY_PROPERTY"></a><span class="summary-name">GET_VISIBILITY_PROPERTY</span> = <code title="'getVisibility()'">'getVisibility()'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="LAYOUT_TOP_MARGIN_PROPERTY"></a><span class="summary-name">LAYOUT_TOP_MARGIN_PROPERTY</span> = <code title="'layout:layout_topMargin'">'layout:layout_topMargin'</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="VISIBLE"></a><span class="summary-name">VISIBLE</span> = <code title="0x0">0x0</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="INVISIBLE"></a><span class="summary-name">INVISIBLE</span> = <code title="0x4">0x4</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="GONE"></a><span class="summary-name">GONE</span> = <code title="0x8">0x8</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="IP_RE"></a><span class="summary-name">IP_RE</span> = <code title="re.compile('^(\d{1,3}\.){3}\d{1,3}$')">re.compile('^(\d{1,3}\.){3}\d{1,3}$')</code>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ID_RE"></a><span class="summary-name">ID_RE</span> = <code title="re.compile('id/([^/]*)(/(\d+))?')">re.compile('id/([^/]*)(/(\d+))?')</code>
+ </td>
+ </tr>
+</table>
+<!-- ==================== FUNCTION DETAILS ==================== -->
+<a name="section-FunctionDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Function Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-FunctionDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__nd"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__nd</span>(<span class="sig-arg">name</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__nd">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>Returns a named decimal regex</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__nh"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__nh</span>(<span class="sig-arg">name</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__nh">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>Returns a named hex regex</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__ns"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__ns</span>(<span class="sig-arg">name</span>,
+ <span class="sig-arg">greedy</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#__ns">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>NOTICE: this is using a non-greedy (or minimal) regex</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>name</code></strong> (str) - the name used to tag the expression</li>
+ <li><strong class="pname"><code>greedy</code></strong> (bool) - Whether the regex is greedy or not</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>Returns a named string regex (only non-whitespace characters
+ allowed)</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== VARIABLES DETAILS ==================== -->
+<a name="section-VariablesDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Variables Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-VariablesDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</h3>
+ <p>Use monkeyrunner (<code>MonkeyDevice.getProperty()</code>) to obtain
+ the needed properties. If this is <code>False</code> then <code>adb shell
+ getprop</code> is used</p>
+ <dl class="fields">
+ </dl>
+ <dl class="fields">
+ <dt>Value:</dt>
+ <dd><table><tr><td><pre class="variable">
+True
+</pre></td></tr></table>
+</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</h3>
+ <p>Skips some classes related with the Action Bar and the
+ PhoneWindow$DecorView in the coordinates calculation</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a href="src.com.dtmilano.android.viewclient.View-class.html#getXY"
+ class="link">View.getXY()</a>
+ </p>
+</div> <dl class="fields">
+ <dt>Value:</dt>
+ <dd><table><tr><td><pre class="variable">
+False
+</pre></td></tr></table>
+</dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:53 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-pysrc.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-pysrc.html
new file mode 100755
index 0000000..63f1382
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient-pysrc.html
@@ -0,0 +1,2569 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ Module viewclient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient-pysrc.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="src.com.dtmilano.android.viewclient-module.html">Module src.com.dtmilano.android.viewclient</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt> <tt class="py-line"><tt class="py-comment"># -*- coding: utf-8 -*-</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt> <tt class="py-line"><tt class="py-docstring">Copyright (C) 2012-2013 Diego Torres Milano</tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt> <tt class="py-line"><tt class="py-docstring">Created on Feb 2, 2012</tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt> <tt class="py-line"><tt class="py-docstring">Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt> <tt class="py-line"><tt class="py-docstring">you may not use this file except in compliance with the License.</tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt> <tt class="py-line"><tt class="py-docstring">You may obtain a copy of the License at</tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L10"></a><tt class="py-lineno"> 10</tt> <tt class="py-line"><tt class="py-docstring"> http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
+<a name="L11"></a><tt class="py-lineno"> 11</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L12"></a><tt class="py-lineno"> 12</tt> <tt class="py-line"><tt class="py-docstring">Unless required by applicable law or agreed to in writing, software</tt> </tt>
+<a name="L13"></a><tt class="py-lineno"> 13</tt> <tt class="py-line"><tt class="py-docstring">distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
+<a name="L14"></a><tt class="py-lineno"> 14</tt> <tt class="py-line"><tt class="py-docstring">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
+<a name="L15"></a><tt class="py-lineno"> 15</tt> <tt class="py-line"><tt class="py-docstring">See the License for the specific language governing permissions and</tt> </tt>
+<a name="L16"></a><tt class="py-lineno"> 16</tt> <tt class="py-line"><tt class="py-docstring">limitations under the License.</tt> </tt>
+<a name="L17"></a><tt class="py-lineno"> 17</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L18"></a><tt class="py-lineno"> 18</tt> <tt class="py-line"><tt class="py-docstring">@author: Diego Torres Milano</tt> </tt>
+<a name="L19"></a><tt class="py-lineno"> 19</tt> <tt class="py-line"><tt class="py-docstring">'''</tt> </tt>
+<a name="L20"></a><tt class="py-lineno"> 20</tt> <tt class="py-line"> </tt>
+<a name="L21"></a><tt class="py-lineno"> 21</tt> <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'3.2.0'</tt> </tt>
+<a name="L22"></a><tt class="py-lineno"> 22</tt> <tt class="py-line"> </tt>
+<a name="L23"></a><tt class="py-lineno"> 23</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> </tt>
+<a name="L24"></a><tt class="py-lineno"> 24</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">subprocess</tt> </tt>
+<a name="L25"></a><tt class="py-lineno"> 25</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> </tt>
+<a name="L26"></a><tt class="py-lineno"> 26</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">socket</tt> </tt>
+<a name="L27"></a><tt class="py-lineno"> 27</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">os</tt> </tt>
+<a name="L28"></a><tt class="py-lineno"> 28</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">java</tt> </tt>
+<a name="L29"></a><tt class="py-lineno"> 29</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">types</tt> </tt>
+<a name="L30"></a><tt class="py-lineno"> 30</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">time</tt> </tt>
+<a name="L31"></a><tt class="py-lineno"> 31</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">signal</tt> </tt>
+<a name="L32"></a><tt class="py-lineno"> 32</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">warnings</tt> </tt>
+<a name="L33"></a><tt class="py-lineno"> 33</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">copy</tt> </tt>
+<a name="L34"></a><tt class="py-lineno"> 34</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">pickle</tt> </tt>
+<a name="L35"></a><tt class="py-lineno"> 35</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt> </tt>
+<a name="L36"></a><tt class="py-lineno"> 36</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">org</tt><tt class="py-op">.</tt><tt class="py-name">python</tt><tt class="py-op">.</tt><tt class="py-name">modules</tt><tt class="py-op">.</tt><tt class="py-name">sre</tt><tt class="py-op">.</tt><tt class="py-name">PatternObject</tt> </tt>
+<a name="L37"></a><tt class="py-lineno"> 37</tt> <tt class="py-line"><tt class="py-keyword">from</tt> <tt class="py-name">com</tt><tt class="py-op">.</tt><tt id="link-0" class="py-name" targets="Package src.com.dtmilano.android=src.com.dtmilano.android-module.html"><a title="src.com.dtmilano.android" class="py-name" href="#" onclick="return doclink('link-0', 'android', 'link-0');">android</a></tt><tt class="py-op">.</tt><tt class="py-name">monkeyrunner</tt> <tt class="py-keyword">import</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">,</tt> <tt class="py-name">MonkeyRunner</tt> </tt>
+<a name="L38"></a><tt class="py-lineno"> 38</tt> <tt class="py-line"> </tt>
+<a name="L39"></a><tt class="py-lineno"> 39</tt> <tt class="py-line"><tt id="link-1" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG=src.com.dtmilano.android.viewclient-module.html#DEBUG"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-1', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L40"></a><tt class="py-lineno"> 40</tt> <tt class="py-line"><tt id="link-2" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_DEVICE=src.com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-2', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt> <tt class="py-op">=</tt> <tt id="link-3" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-3', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L41"></a><tt class="py-lineno"> 41</tt> <tt class="py-line"><tt id="link-4" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_RECEIVED=src.com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-4', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt> <tt class="py-op">=</tt> <tt id="link-5" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-5', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L42"></a><tt class="py-lineno"> 42</tt> <tt class="py-line"><tt id="link-6" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_TREE=src.com.dtmilano.android.viewclient-module.html#DEBUG_TREE"><a title="src.com.dtmilano.android.viewclient.DEBUG_TREE" class="py-name" href="#" onclick="return doclink('link-6', 'DEBUG_TREE', 'link-6');">DEBUG_TREE</a></tt> <tt class="py-op">=</tt> <tt id="link-7" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-7', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L43"></a><tt class="py-lineno"> 43</tt> <tt class="py-line"><tt id="link-8" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_GETATTR=src.com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR"><a title="src.com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-8', 'DEBUG_GETATTR', 'link-8');">DEBUG_GETATTR</a></tt> <tt class="py-op">=</tt> <tt id="link-9" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-9', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L44"></a><tt class="py-lineno"> 44</tt> <tt class="py-line"><tt id="link-10" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_CALL=src.com.dtmilano.android.viewclient-module.html#DEBUG_CALL"><a title="src.com.dtmilano.android.viewclient.DEBUG_CALL" class="py-name" href="#" onclick="return doclink('link-10', 'DEBUG_CALL', 'link-10');">DEBUG_CALL</a></tt> <tt class="py-op">=</tt> <tt id="link-11" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-11', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L45"></a><tt class="py-lineno"> 45</tt> <tt class="py-line"><tt id="link-12" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_COORDS=src.com.dtmilano.android.viewclient-module.html#DEBUG_COORDS"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-12', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-op">=</tt> <tt id="link-13" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-13', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L46"></a><tt class="py-lineno"> 46</tt> <tt class="py-line"><tt id="link-14" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_TOUCH=src.com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH"><a title="src.com.dtmilano.android.viewclient.DEBUG_TOUCH" class="py-name" href="#" onclick="return doclink('link-14', 'DEBUG_TOUCH', 'link-14');">DEBUG_TOUCH</a></tt> <tt class="py-op">=</tt> <tt id="link-15" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-15', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L47"></a><tt class="py-lineno"> 47</tt> <tt class="py-line"><tt id="link-16" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR=src.com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-16', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt> <tt class="py-op">=</tt> <tt id="link-17" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-17', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L48"></a><tt class="py-lineno"> 48</tt> <tt class="py-line"><tt id="link-18" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_WINDOWS=src.com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS"><a title="src.com.dtmilano.android.viewclient.DEBUG_WINDOWS" class="py-name" href="#" onclick="return doclink('link-18', 'DEBUG_WINDOWS', 'link-18');">DEBUG_WINDOWS</a></tt> <tt class="py-op">=</tt> <tt id="link-19" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-19', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L49"></a><tt class="py-lineno"> 49</tt> <tt class="py-line"><tt id="link-20" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_BOUNDS=src.com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS"><a title="src.com.dtmilano.android.viewclient.DEBUG_BOUNDS" class="py-name" href="#" onclick="return doclink('link-20', 'DEBUG_BOUNDS', 'link-20');">DEBUG_BOUNDS</a></tt> <tt class="py-op">=</tt> <tt id="link-21" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-21', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L50"></a><tt class="py-lineno"> 50</tt> <tt class="py-line"><tt id="link-22" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.DEBUG_DISTANCE=src.com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-22', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt> <tt class="py-op">=</tt> <tt id="link-23" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-23', 'DEBUG', 'link-1');">DEBUG</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">False</tt> </tt>
+<a name="L51"></a><tt class="py-lineno"> 51</tt> <tt class="py-line"> </tt>
+<a name="L52"></a><tt class="py-lineno"> 52</tt> <tt class="py-line"><tt id="link-24" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.WARNINGS=src.com.dtmilano.android.viewclient-module.html#WARNINGS"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-24', 'WARNINGS', 'link-24');">WARNINGS</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L53"></a><tt class="py-lineno"> 53</tt> <tt class="py-line"> </tt>
+<a name="L54"></a><tt class="py-lineno"> 54</tt> <tt class="py-line"><tt id="link-25" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST=src.com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-25', 'VIEW_SERVER_HOST', 'link-25');">VIEW_SERVER_HOST</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'localhost'</tt> </tt>
+<a name="L55"></a><tt class="py-lineno"> 55</tt> <tt class="py-line"><tt id="link-26" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.VIEW_SERVER_PORT=src.com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-26', 'VIEW_SERVER_PORT', 'link-26');">VIEW_SERVER_PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">4939</tt> </tt>
+<a name="L56"></a><tt class="py-lineno"> 56</tt> <tt class="py-line"> </tt>
+<a name="L57"></a><tt class="py-lineno"> 57</tt> <tt class="py-line"><tt id="link-27" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.ADB_DEFAULT_PORT=src.com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT"><a title="src.com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-27', 'ADB_DEFAULT_PORT', 'link-27');">ADB_DEFAULT_PORT</a></tt> <tt class="py-op">=</tt> <tt class="py-number">5555</tt> </tt>
+<a name="L58"></a><tt class="py-lineno"> 58</tt> <tt class="py-line"> </tt>
+<a name="L59"></a><tt class="py-lineno"> 59</tt> <tt class="py-line"><tt id="link-28" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.OFFSET=src.com.dtmilano.android.viewclient-module.html#OFFSET"><a title="src.com.dtmilano.android.viewclient.OFFSET" class="py-name" href="#" onclick="return doclink('link-28', 'OFFSET', 'link-28');">OFFSET</a></tt> <tt class="py-op">=</tt> <tt class="py-number">25</tt> </tt>
+<a name="L60"></a><tt class="py-lineno"> 60</tt> <tt class="py-line"><tt class="py-string">''' This assumes the smallest touchable view on the screen is approximately 50px x 50px</tt> </tt>
+<a name="L61"></a><tt class="py-lineno"> 61</tt> <tt class="py-line"><tt class="py-string"> and touches it at M{(x+OFFSET, y+OFFSET)} '''</tt> </tt>
+<a name="L62"></a><tt class="py-lineno"> 62</tt> <tt class="py-line"> </tt>
+<a name="L63"></a><tt class="py-lineno"> 63</tt> <tt class="py-line"><tt id="link-29" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES=src.com.dtmilano.android.viewclient-module.html#USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES"><a title="src.com.dtmilano.android.viewclient.USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-29', 'USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES', 'link-29');">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a></tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L64"></a><tt class="py-lineno"> 64</tt> <tt class="py-line"><tt class="py-string">''' Use monkeyrunner (C{MonkeyDevice.getProperty()}) to obtain the needed properties. If this is</tt> </tt>
+<a name="L65"></a><tt class="py-lineno"> 65</tt> <tt class="py-line"><tt class="py-string"> C{False} then C{adb shell getprop} is used '''</tt> </tt>
+<a name="L66"></a><tt class="py-lineno"> 66</tt> <tt class="py-line"> </tt>
+<a name="L67"></a><tt class="py-lineno"> 67</tt> <tt class="py-line"><tt id="link-30" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED=src.com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"><a title="src.com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="py-name" href="#" onclick="return doclink('link-30', 'SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED', 'link-30');">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a></tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L68"></a><tt class="py-lineno"> 68</tt> <tt class="py-line"><tt class="py-string">''' Skips some classes related with the Action Bar and the PhoneWindow$DecorView in the</tt> </tt>
+<a name="L69"></a><tt class="py-lineno"> 69</tt> <tt class="py-line"><tt class="py-string"> coordinates calculation</tt> </tt>
+<a name="L70"></a><tt class="py-lineno"> 70</tt> <tt class="py-line"><tt class="py-string"> @see: L{View.getXY()} '''</tt> </tt>
+<a name="L71"></a><tt class="py-lineno"> 71</tt> <tt class="py-line"> </tt>
+<a name="L72"></a><tt class="py-lineno"> 72</tt> <tt class="py-line"><tt class="py-comment"># some device properties</tt> </tt>
+<a name="L73"></a><tt class="py-lineno"> 73</tt> <tt class="py-line"><tt id="link-31" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY=src.com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-31', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'version.sdk'</tt> </tt>
+<a name="L74"></a><tt class="py-lineno"> 74</tt> <tt class="py-line"> </tt>
+<a name="L75"></a><tt class="py-lineno"> 75</tt> <tt class="py-line"><tt class="py-comment"># some constants for the attributes</tt> </tt>
+<a name="L76"></a><tt class="py-lineno"> 76</tt> <tt class="py-line"><tt id="link-32" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.ID_PROPERTY=src.com.dtmilano.android.viewclient-module.html#ID_PROPERTY"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-32', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mID'</tt> </tt>
+<a name="L77"></a><tt class="py-lineno"> 77</tt> <tt class="py-line"><tt id="link-33" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR=src.com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-33', 'ID_PROPERTY_UI_AUTOMATOR', 'link-33');">ID_PROPERTY_UI_AUTOMATOR</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'uniqueId'</tt> </tt>
+<a name="L78"></a><tt class="py-lineno"> 78</tt> <tt class="py-line"><tt id="link-34" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.TEXT_PROPERTY=src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-34', 'TEXT_PROPERTY', 'link-34');">TEXT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'text:mText'</tt> </tt>
+<a name="L79"></a><tt class="py-lineno"> 79</tt> <tt class="py-line"><tt id="link-35" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10=src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-35', 'TEXT_PROPERTY_API_10', 'link-35');">TEXT_PROPERTY_API_10</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mText'</tt> </tt>
+<a name="L80"></a><tt class="py-lineno"> 80</tt> <tt class="py-line"><tt id="link-36" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR=src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-36', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-36');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'text'</tt> </tt>
+<a name="L81"></a><tt class="py-lineno"> 81</tt> <tt class="py-line"><tt id="link-37" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.WS=src.com.dtmilano.android.viewclient-module.html#WS"><a title="src.com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-37', 'WS', 'link-37');">WS</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"\xfe"</tt> <tt class="py-comment"># the whitespace replacement char for TEXT_PROPERTY</tt> </tt>
+<a name="L82"></a><tt class="py-lineno"> 82</tt> <tt class="py-line"><tt id="link-38" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.LEFT_PROPERTY=src.com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-38', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:mLeft'</tt> </tt>
+<a name="L83"></a><tt class="py-lineno"> 83</tt> <tt class="py-line"><tt id="link-39" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8=src.com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-39', 'LEFT_PROPERTY_API_8', 'link-39');">LEFT_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mLeft'</tt> </tt>
+<a name="L84"></a><tt class="py-lineno"> 84</tt> <tt class="py-line"><tt id="link-40" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.TOP_PROPERTY=src.com.dtmilano.android.viewclient-module.html#TOP_PROPERTY"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-40', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:mTop'</tt> </tt>
+<a name="L85"></a><tt class="py-lineno"> 85</tt> <tt class="py-line"><tt id="link-41" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.TOP_PROPERTY_API_8=src.com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-41', 'TOP_PROPERTY_API_8', 'link-41');">TOP_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'mTop'</tt> </tt>
+<a name="L86"></a><tt class="py-lineno"> 86</tt> <tt class="py-line"><tt id="link-42" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.WIDTH_PROPERTY=src.com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-42', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:getWidth()'</tt> </tt>
+<a name="L87"></a><tt class="py-lineno"> 87</tt> <tt class="py-line"><tt id="link-43" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8=src.com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-43', 'WIDTH_PROPERTY_API_8', 'link-43');">WIDTH_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getWidth()'</tt> </tt>
+<a name="L88"></a><tt class="py-lineno"> 88</tt> <tt class="py-line"><tt id="link-44" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY=src.com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-44', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:getHeight()'</tt> </tt>
+<a name="L89"></a><tt class="py-lineno"> 89</tt> <tt class="py-line"><tt id="link-45" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8=src.com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-45', 'HEIGHT_PROPERTY_API_8', 'link-45');">HEIGHT_PROPERTY_API_8</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getHeight()'</tt> </tt>
+<a name="L90"></a><tt class="py-lineno"> 90</tt> <tt class="py-line"><tt id="link-46" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY=src.com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-46', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'getVisibility()'</tt> </tt>
+<a name="L91"></a><tt class="py-lineno"> 91</tt> <tt class="py-line"><tt id="link-47" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY=src.com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY"><a title="src.com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY" class="py-name" href="#" onclick="return doclink('link-47', 'LAYOUT_TOP_MARGIN_PROPERTY', 'link-47');">LAYOUT_TOP_MARGIN_PROPERTY</a></tt> <tt class="py-op">=</tt> <tt class="py-string">'layout:layout_topMargin'</tt> </tt>
+<a name="L92"></a><tt class="py-lineno"> 92</tt> <tt class="py-line"> </tt>
+<a name="L93"></a><tt class="py-lineno"> 93</tt> <tt class="py-line"><tt class="py-comment"># visibility</tt> </tt>
+<a name="L94"></a><tt class="py-lineno"> 94</tt> <tt class="py-line"><tt id="link-48" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.VISIBLE=src.com.dtmilano.android.viewclient-module.html#VISIBLE"><a title="src.com.dtmilano.android.viewclient.VISIBLE" class="py-name" href="#" onclick="return doclink('link-48', 'VISIBLE', 'link-48');">VISIBLE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> </tt>
+<a name="L95"></a><tt class="py-lineno"> 95</tt> <tt class="py-line"><tt id="link-49" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.INVISIBLE=src.com.dtmilano.android.viewclient-module.html#INVISIBLE"><a title="src.com.dtmilano.android.viewclient.INVISIBLE" class="py-name" href="#" onclick="return doclink('link-49', 'INVISIBLE', 'link-49');">INVISIBLE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x4</tt> </tt>
+<a name="L96"></a><tt class="py-lineno"> 96</tt> <tt class="py-line"><tt id="link-50" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.GONE=src.com.dtmilano.android.viewclient-module.html#GONE"><a title="src.com.dtmilano.android.viewclient.GONE" class="py-name" href="#" onclick="return doclink('link-50', 'GONE', 'link-50');">GONE</a></tt> <tt class="py-op">=</tt> <tt class="py-number">0x8</tt> </tt>
+<a name="L97"></a><tt class="py-lineno"> 97</tt> <tt class="py-line"> </tt>
+<a name="L98"></a><tt class="py-lineno"> 98</tt> <tt class="py-line"><tt id="link-51" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.IP_RE=src.com.dtmilano.android.viewclient-module.html#IP_RE"><a title="src.com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-51', 'IP_RE', 'link-51');">IP_RE</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^(\d{1,3}\.){3}\d{1,3}$'</tt><tt class="py-op">)</tt> </tt>
+<a name="L99"></a><tt class="py-lineno"> 99</tt> <tt class="py-line"><tt id="link-52" class="py-name" targets="Variable src.com.dtmilano.android.viewclient.ID_RE=src.com.dtmilano.android.viewclient-module.html#ID_RE"><a title="src.com.dtmilano.android.viewclient.ID_RE" class="py-name" href="#" onclick="return doclink('link-52', 'ID_RE', 'link-52');">ID_RE</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'id/([^/]*)(/(\d+))?'</tt><tt class="py-op">)</tt> </tt>
+<a name="__nd"></a><div id="__nd-def"><a name="L100"></a><tt class="py-lineno"> 100</tt> <tt class="py-line"> </tt>
+<a name="L101"></a><tt class="py-lineno"> 101</tt> <a class="py-toggle" href="#" id="__nd-toggle" onclick="return toggle('__nd');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient-module.html#__nd">__nd</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="__nd-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="__nd-expanded"><a name="L102"></a><tt class="py-lineno"> 102</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L103"></a><tt class="py-lineno"> 103</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named decimal regex</tt> </tt>
+<a name="L104"></a><tt class="py-lineno"> 104</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L105"></a><tt class="py-lineno"> 105</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>\d+)'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+</div><a name="L106"></a><tt class="py-lineno"> 106</tt> <tt class="py-line"> </tt>
+<a name="__nh"></a><div id="__nh-def"><a name="L107"></a><tt class="py-lineno"> 107</tt> <a class="py-toggle" href="#" id="__nh-toggle" onclick="return toggle('__nh');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient-module.html#__nh">__nh</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="__nh-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="__nh-expanded"><a name="L108"></a><tt class="py-lineno"> 108</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L109"></a><tt class="py-lineno"> 109</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named hex regex</tt> </tt>
+<a name="L110"></a><tt class="py-lineno"> 110</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L111"></a><tt class="py-lineno"> 111</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>[0-9a-f]+)'</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt> </tt>
+</div><a name="L112"></a><tt class="py-lineno"> 112</tt> <tt class="py-line"> </tt>
+<a name="__ns"></a><div id="__ns-def"><a name="L113"></a><tt class="py-lineno"> 113</tt> <a class="py-toggle" href="#" id="__ns-toggle" onclick="return toggle('__ns');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient-module.html#__ns">__ns</a><tt class="py-op">(</tt><tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">greedy</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="__ns-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="__ns-expanded"><a name="L114"></a><tt class="py-lineno"> 114</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L115"></a><tt class="py-lineno"> 115</tt> <tt class="py-line"><tt class="py-docstring"> NOTICE: this is using a non-greedy (or minimal) regex</tt> </tt>
+<a name="L116"></a><tt class="py-lineno"> 116</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L117"></a><tt class="py-lineno"> 117</tt> <tt class="py-line"><tt class="py-docstring"> @type name: str</tt> </tt>
+<a name="L118"></a><tt class="py-lineno"> 118</tt> <tt class="py-line"><tt class="py-docstring"> @param name: the name used to tag the expression</tt> </tt>
+<a name="L119"></a><tt class="py-lineno"> 119</tt> <tt class="py-line"><tt class="py-docstring"> @type greedy: bool</tt> </tt>
+<a name="L120"></a><tt class="py-lineno"> 120</tt> <tt class="py-line"><tt class="py-docstring"> @param greedy: Whether the regex is greedy or not</tt> </tt>
+<a name="L121"></a><tt class="py-lineno"> 121</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L122"></a><tt class="py-lineno"> 122</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns a named string regex (only non-whitespace characters allowed)</tt> </tt>
+<a name="L123"></a><tt class="py-lineno"> 123</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L124"></a><tt class="py-lineno"> 124</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'(?P<%s>\S+%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt> <tt class="py-keyword">if</tt> <tt class="py-name">greedy</tt> <tt class="py-keyword">else</tt> <tt class="py-string">'?'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L125"></a><tt class="py-lineno"> 125</tt> <tt class="py-line"> </tt>
+<a name="Window"></a><div id="Window-def"><a name="L126"></a><tt class="py-lineno"> 126</tt> <tt class="py-line"> </tt>
+<a name="L127"></a><tt class="py-lineno"> 127</tt> <a class="py-toggle" href="#" id="Window-toggle" onclick="return toggle('Window');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Window-class.html">Window</a><tt class="py-op">:</tt> </tt>
+</div><div id="Window-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="Window-expanded"><a name="L128"></a><tt class="py-lineno"> 128</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L129"></a><tt class="py-lineno"> 129</tt> <tt class="py-line"><tt class="py-docstring"> Window class</tt> </tt>
+<a name="L130"></a><tt class="py-lineno"> 130</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L131"></a><tt class="py-lineno"> 131</tt> <tt class="py-line"> </tt>
+<a name="Window.__init__"></a><div id="Window.__init__-def"><a name="L132"></a><tt class="py-lineno"> 132</tt> <a class="py-toggle" href="#" id="Window.__init__-toggle" onclick="return toggle('Window.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Window-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">num</tt><tt class="py-op">,</tt> <tt class="py-param">winId</tt><tt class="py-op">,</tt> <tt class="py-param">activity</tt><tt class="py-op">,</tt> <tt class="py-param">wvx</tt><tt class="py-op">,</tt> <tt class="py-param">wvy</tt><tt class="py-op">,</tt> <tt class="py-param">wvw</tt><tt class="py-op">,</tt> <tt class="py-param">wvh</tt><tt class="py-op">,</tt> <tt class="py-param">px</tt><tt class="py-op">,</tt> <tt class="py-param">py</tt><tt class="py-op">,</tt> <tt class="py-param">visibility</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Window.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Window.__init__-expanded"><a name="L133"></a><tt class="py-lineno"> 133</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L134"></a><tt class="py-lineno"> 134</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L135"></a><tt class="py-lineno"> 135</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L136"></a><tt class="py-lineno"> 136</tt> <tt class="py-line"><tt class="py-docstring"> @type num: int</tt> </tt>
+<a name="L137"></a><tt class="py-lineno"> 137</tt> <tt class="py-line"><tt class="py-docstring"> @param num: Ordering number in Window Manager</tt> </tt>
+<a name="L138"></a><tt class="py-lineno"> 138</tt> <tt class="py-line"><tt class="py-docstring"> @type winId: str</tt> </tt>
+<a name="L139"></a><tt class="py-lineno"> 139</tt> <tt class="py-line"><tt class="py-docstring"> @param winId: the window ID</tt> </tt>
+<a name="L140"></a><tt class="py-lineno"> 140</tt> <tt class="py-line"><tt class="py-docstring"> @type activity: str</tt> </tt>
+<a name="L141"></a><tt class="py-lineno"> 141</tt> <tt class="py-line"><tt class="py-docstring"> @param activity: the activity (or sometimes other component) owning the window</tt> </tt>
+<a name="L142"></a><tt class="py-lineno"> 142</tt> <tt class="py-line"><tt class="py-docstring"> @type wvx: int</tt> </tt>
+<a name="L143"></a><tt class="py-lineno"> 143</tt> <tt class="py-line"><tt class="py-docstring"> @param wvx: window's virtual X</tt> </tt>
+<a name="L144"></a><tt class="py-lineno"> 144</tt> <tt class="py-line"><tt class="py-docstring"> @type wvy: int</tt> </tt>
+<a name="L145"></a><tt class="py-lineno"> 145</tt> <tt class="py-line"><tt class="py-docstring"> @param wvy: window's virtual Y</tt> </tt>
+<a name="L146"></a><tt class="py-lineno"> 146</tt> <tt class="py-line"><tt class="py-docstring"> @type wvw: int</tt> </tt>
+<a name="L147"></a><tt class="py-lineno"> 147</tt> <tt class="py-line"><tt class="py-docstring"> @param wvw: window's virtual width</tt> </tt>
+<a name="L148"></a><tt class="py-lineno"> 148</tt> <tt class="py-line"><tt class="py-docstring"> @type wvh: int</tt> </tt>
+<a name="L149"></a><tt class="py-lineno"> 149</tt> <tt class="py-line"><tt class="py-docstring"> @param wvh: window's virtual height</tt> </tt>
+<a name="L150"></a><tt class="py-lineno"> 150</tt> <tt class="py-line"><tt class="py-docstring"> @type px: int</tt> </tt>
+<a name="L151"></a><tt class="py-lineno"> 151</tt> <tt class="py-line"><tt class="py-docstring"> @param px: parent's X</tt> </tt>
+<a name="L152"></a><tt class="py-lineno"> 152</tt> <tt class="py-line"><tt class="py-docstring"> @type py: int</tt> </tt>
+<a name="L153"></a><tt class="py-lineno"> 153</tt> <tt class="py-line"><tt class="py-docstring"> @param py: parent's Y</tt> </tt>
+<a name="L154"></a><tt class="py-lineno"> 154</tt> <tt class="py-line"><tt class="py-docstring"> @type visibility: int</tt> </tt>
+<a name="L155"></a><tt class="py-lineno"> 155</tt> <tt class="py-line"><tt class="py-docstring"> @param visibility: visibility of the window</tt> </tt>
+<a name="L156"></a><tt class="py-lineno"> 156</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L157"></a><tt class="py-lineno"> 157</tt> <tt class="py-line"> </tt>
+<a name="L158"></a><tt class="py-lineno"> 158</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-53" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-53', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"Window(%d, %s, %s, %d, %d, %d, %d, %d, %d, %d)"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L159"></a><tt class="py-lineno"> 159</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt><tt class="py-op">)</tt> </tt>
+<a name="L160"></a><tt class="py-lineno"> 160</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">num</tt> <tt class="py-op">=</tt> <tt class="py-name">num</tt> </tt>
+<a name="L161"></a><tt class="py-lineno"> 161</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">winId</tt> <tt class="py-op">=</tt> <tt class="py-name">winId</tt> </tt>
+<a name="L162"></a><tt class="py-lineno"> 162</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt> <tt class="py-op">=</tt> <tt class="py-name">activity</tt> </tt>
+<a name="L163"></a><tt class="py-lineno"> 163</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-name">wvx</tt> </tt>
+<a name="L164"></a><tt class="py-lineno"> 164</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">wvy</tt> </tt>
+<a name="L165"></a><tt class="py-lineno"> 165</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt> <tt class="py-op">=</tt> <tt class="py-name">wvw</tt> </tt>
+<a name="L166"></a><tt class="py-lineno"> 166</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">wvh</tt> </tt>
+<a name="L167"></a><tt class="py-lineno"> 167</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-name">px</tt> </tt>
+<a name="L168"></a><tt class="py-lineno"> 168</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">py</tt> </tt>
+<a name="L169"></a><tt class="py-lineno"> 169</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-name">visibility</tt> </tt>
+</div><a name="L170"></a><tt class="py-lineno"> 170</tt> <tt class="py-line"> </tt>
+<a name="Window.__str__"></a><div id="Window.__str__-def"><a name="L171"></a><tt class="py-lineno"> 171</tt> <a class="py-toggle" href="#" id="Window.__str__-toggle" onclick="return toggle('Window.__str__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Window-class.html#__str__">__str__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Window.__str__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Window.__str__-expanded"><a name="L172"></a><tt class="py-lineno"> 172</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"Window(%d, wid=%s, a=%s, x=%d, y=%d, w=%d, h=%d, px=%d, py=%d, v=%d)"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L173"></a><tt class="py-lineno"> 173</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L174"></a><tt class="py-lineno"> 174</tt> <tt class="py-line"> </tt>
+<a name="ViewNotFoundException"></a><div id="ViewNotFoundException-def"><a name="L175"></a><tt class="py-lineno"> 175</tt> <tt class="py-line"> </tt>
+<a name="L176"></a><tt class="py-lineno"> 176</tt> <a class="py-toggle" href="#" id="ViewNotFoundException-toggle" onclick="return toggle('ViewNotFoundException');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a><tt class="py-op">(</tt><tt class="py-base-class">Exception</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewNotFoundException-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="ViewNotFoundException-expanded"><a name="L177"></a><tt class="py-lineno"> 177</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L178"></a><tt class="py-lineno"> 178</tt> <tt class="py-line"><tt class="py-docstring"> ViewNotFoundException is raised when a View is not found.</tt> </tt>
+<a name="L179"></a><tt class="py-lineno"> 179</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L180"></a><tt class="py-lineno"> 180</tt> <tt class="py-line"> </tt>
+<a name="ViewNotFoundException.__init__"></a><div id="ViewNotFoundException.__init__-def"><a name="L181"></a><tt class="py-lineno"> 181</tt> <a class="py-toggle" href="#" id="ViewNotFoundException.__init__-toggle" onclick="return toggle('ViewNotFoundException.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewNotFoundException.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewNotFoundException.__init__-expanded"><a name="L182"></a><tt class="py-lineno"> 182</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">value</tt><tt class="py-op">,</tt> <tt class="py-name">org</tt><tt class="py-op">.</tt><tt class="py-name">python</tt><tt class="py-op">.</tt><tt class="py-name">modules</tt><tt class="py-op">.</tt><tt class="py-name">sre</tt><tt class="py-op">.</tt><tt class="py-name">PatternObject</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L183"></a><tt class="py-lineno"> 183</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">"Couldn't find View with %s that matches '%s' in tree with root=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">value</tt><tt class="py-op">.</tt><tt class="py-name">pattern</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L184"></a><tt class="py-lineno"> 184</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L185"></a><tt class="py-lineno"> 185</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">"Couldn't find View with %s='%s' in tree with root=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">value</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L186"></a><tt class="py-lineno"> 186</tt> <tt class="py-line"> <tt class="py-name">super</tt><tt class="py-op">(</tt><tt class="py-name">Exception</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-54" class="py-name" targets="Method src.com.dtmilano.android.viewclient.Excerpt2Code.__init__()=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__,Method src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.__init__()=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__,Method src.com.dtmilano.android.viewclient.View.__init__()=src.com.dtmilano.android.viewclient.View-class.html#__init__,Method src.com.dtmilano.android.viewclient.ViewClient.__init__()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__init__,Method src.com.dtmilano.android.viewclient.ViewNotFoundException.__init__()=src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__,Method src.com.dtmilano.android.viewclient.Window.__init__()=src.com.dtmilano.android.viewclient.Window-class.html#__init__"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.__init__
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.__init__
+src.com.dtmilano.android.viewclient.View.__init__
+src.com.dtmilano.android.viewclient.ViewClient.__init__
+src.com.dtmilano.android.viewclient.ViewNotFoundException.__init__
+src.com.dtmilano.android.viewclient.Window.__init__" class="py-name" href="#" onclick="return doclink('link-54', '__init__', 'link-54');">__init__</a></tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L187"></a><tt class="py-lineno"> 187</tt> <tt class="py-line"> </tt>
+<a name="View"></a><div id="View-def"><a name="L188"></a><tt class="py-lineno"> 188</tt> <a class="py-toggle" href="#" id="View-toggle" onclick="return toggle('View');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html">View</a><tt class="py-op">:</tt> </tt>
+</div><div id="View-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="View-expanded"><a name="L189"></a><tt class="py-lineno"> 189</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L190"></a><tt class="py-lineno"> 190</tt> <tt class="py-line"><tt class="py-docstring"> View class</tt> </tt>
+<a name="L191"></a><tt class="py-lineno"> 191</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L192"></a><tt class="py-lineno"> 192</tt> <tt class="py-line"> </tt>
+<a name="L193"></a><tt class="py-lineno"> 193</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="View.factory"></a><div id="View.factory-def"><a name="L194"></a><tt class="py-lineno"> 194</tt> <a class="py-toggle" href="#" id="View.factory-toggle" onclick="return toggle('View.factory');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#factory">factory</a><tt class="py-op">(</tt><tt class="py-param">attrs</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.factory-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.factory-expanded"><a name="L195"></a><tt class="py-lineno"> 195</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L196"></a><tt class="py-lineno"> 196</tt> <tt class="py-line"><tt class="py-docstring"> View factory</tt> </tt>
+<a name="L197"></a><tt class="py-lineno"> 197</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L198"></a><tt class="py-lineno"> 198</tt> <tt class="py-line"> </tt>
+<a name="L199"></a><tt class="py-lineno"> 199</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">attrs</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L200"></a><tt class="py-lineno"> 200</tt> <tt class="py-line"> <tt class="py-name">clazz</tt> <tt class="py-op">=</tt> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L201"></a><tt class="py-lineno"> 201</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">clazz</tt> <tt class="py-op">==</tt> <tt class="py-string">'android.widget.TextView'</tt><tt class="py-op">:</tt> </tt>
+<a name="L202"></a><tt class="py-lineno"> 202</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-55" class="py-name" targets="Class src.com.dtmilano.android.viewclient.TextView=src.com.dtmilano.android.viewclient.TextView-class.html"><a title="src.com.dtmilano.android.viewclient.TextView" class="py-name" href="#" onclick="return doclink('link-55', 'TextView', 'link-55');">TextView</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L203"></a><tt class="py-lineno"> 203</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">clazz</tt> <tt class="py-op">==</tt> <tt class="py-string">'android.widget.EditText'</tt><tt class="py-op">:</tt> </tt>
+<a name="L204"></a><tt class="py-lineno"> 204</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-56" class="py-name" targets="Class src.com.dtmilano.android.viewclient.EditText=src.com.dtmilano.android.viewclient.EditText-class.html"><a title="src.com.dtmilano.android.viewclient.EditText" class="py-name" href="#" onclick="return doclink('link-56', 'EditText', 'link-56');">EditText</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L205"></a><tt class="py-lineno"> 205</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L206"></a><tt class="py-lineno"> 206</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-57" class="py-name" targets="Class src.com.dtmilano.android.viewclient.View=src.com.dtmilano.android.viewclient.View-class.html"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-57', 'View', 'link-57');">View</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+<a name="L207"></a><tt class="py-lineno"> 207</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L208"></a><tt class="py-lineno"> 208</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-58" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-58', 'View', 'link-57');">View</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">forceviewserveruse</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L209"></a><tt class="py-lineno"> 209</tt> <tt class="py-line"> </tt>
+<a name="View.__init__"></a><div id="View.__init__-def"><a name="L210"></a><tt class="py-lineno"> 210</tt> <a class="py-toggle" href="#" id="View.__init__-toggle" onclick="return toggle('View.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">map</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__init__-expanded"><a name="L211"></a><tt class="py-lineno"> 211</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L212"></a><tt class="py-lineno"> 212</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L213"></a><tt class="py-lineno"> 213</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L214"></a><tt class="py-lineno"> 214</tt> <tt class="py-line"><tt class="py-docstring"> @type map: map</tt> </tt>
+<a name="L215"></a><tt class="py-lineno"> 215</tt> <tt class="py-line"><tt class="py-docstring"> @param map: the map containing the (attribute, value) pairs</tt> </tt>
+<a name="L216"></a><tt class="py-lineno"> 216</tt> <tt class="py-line"><tt class="py-docstring"> @type device: MonkeyDevice</tt> </tt>
+<a name="L217"></a><tt class="py-lineno"> 217</tt> <tt class="py-line"><tt class="py-docstring"> @param device: the device containing this View</tt> </tt>
+<a name="L218"></a><tt class="py-lineno"> 218</tt> <tt class="py-line"><tt class="py-docstring"> @type version: int</tt> </tt>
+<a name="L219"></a><tt class="py-lineno"> 219</tt> <tt class="py-line"><tt class="py-docstring"> @param version: the Android SDK version number of the platform where this View belongs. If</tt> </tt>
+<a name="L220"></a><tt class="py-lineno"> 220</tt> <tt class="py-line"><tt class="py-docstring"> this is C{-1} then the Android SDK version will be obtained in this</tt> </tt>
+<a name="L221"></a><tt class="py-lineno"> 221</tt> <tt class="py-line"><tt class="py-docstring"> constructor.</tt> </tt>
+<a name="L222"></a><tt class="py-lineno"> 222</tt> <tt class="py-line"><tt class="py-docstring"> @type forceviewserveruse: boolean</tt> </tt>
+<a name="L223"></a><tt class="py-lineno"> 223</tt> <tt class="py-line"><tt class="py-docstring"> @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions were given</tt> </tt>
+<a name="L224"></a><tt class="py-lineno"> 224</tt> <tt class="py-line"><tt class="py-docstring"> to use C{UiAutomator}.</tt> </tt>
+<a name="L225"></a><tt class="py-lineno"> 225</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L226"></a><tt class="py-lineno"> 226</tt> <tt class="py-line"> </tt>
+<a name="L227"></a><tt class="py-lineno"> 227</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-op">=</tt> <tt class="py-name">map</tt> </tt>
+<a name="L228"></a><tt class="py-lineno"> 228</tt> <tt class="py-line"> <tt class="py-string">''' The map that contains the C{attr},C{value} pairs '''</tt> </tt>
+<a name="L229"></a><tt class="py-lineno"> 229</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L230"></a><tt class="py-lineno"> 230</tt> <tt class="py-line"> <tt class="py-string">''' The MonkeyDevice '''</tt> </tt>
+<a name="L231"></a><tt class="py-lineno"> 231</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">children</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L232"></a><tt class="py-lineno"> 232</tt> <tt class="py-line"> <tt class="py-string">''' The children of this View '''</tt> </tt>
+<a name="L233"></a><tt class="py-lineno"> 233</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L234"></a><tt class="py-lineno"> 234</tt> <tt class="py-line"> <tt class="py-string">''' The parent of this View '''</tt> </tt>
+<a name="L235"></a><tt class="py-lineno"> 235</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L236"></a><tt class="py-lineno"> 236</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L237"></a><tt class="py-lineno"> 237</tt> <tt class="py-line"> <tt class="py-string">''' The current focus '''</tt> </tt>
+<a name="L238"></a><tt class="py-lineno"> 238</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L239"></a><tt class="py-lineno"> 239</tt> <tt class="py-line"> <tt class="py-string">''' Build properties '''</tt> </tt>
+<a name="L240"></a><tt class="py-lineno"> 240</tt> <tt class="py-line"> </tt>
+<a name="L241"></a><tt class="py-lineno"> 241</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">!=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L242"></a><tt class="py-lineno"> 242</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-59" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-59', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">version</tt> </tt>
+<a name="L243"></a><tt class="py-lineno"> 243</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L244"></a><tt class="py-lineno"> 244</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L245"></a><tt class="py-lineno"> 245</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-60" class="py-name"><a title="src.com.dtmilano.android.viewclient.USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-60', 'USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES', 'link-29');">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L246"></a><tt class="py-lineno"> 246</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-61" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-61', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'build.'</tt> <tt class="py-op">+</tt> <tt id="link-62" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-62', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L247"></a><tt class="py-lineno"> 247</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L248"></a><tt class="py-lineno"> 248</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-63" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-63', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.build.'</tt> <tt class="py-op">+</tt> <tt id="link-64" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-64', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L249"></a><tt class="py-lineno"> 249</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L250"></a><tt class="py-lineno"> 250</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-65" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-65', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L251"></a><tt class="py-lineno"> 251</tt> <tt class="py-line"> </tt>
+<a name="L252"></a><tt class="py-lineno"> 252</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-66" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-66', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> </tt>
+<a name="L253"></a><tt class="py-lineno"> 253</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L254"></a><tt class="py-lineno"> 254</tt> <tt class="py-line"> <tt class="py-string">''' Whether to use UIAutomator or ViewServer '''</tt> </tt>
+<a name="L255"></a><tt class="py-lineno"> 255</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L256"></a><tt class="py-lineno"> 256</tt> <tt class="py-line"> <tt class="py-string">''' The id property depending on the View attribute format '''</tt> </tt>
+<a name="L257"></a><tt class="py-lineno"> 257</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L258"></a><tt class="py-lineno"> 258</tt> <tt class="py-line"> <tt class="py-string">''' The text property depending on the View attribute format '''</tt> </tt>
+<a name="L259"></a><tt class="py-lineno"> 259</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L260"></a><tt class="py-lineno"> 260</tt> <tt class="py-line"> <tt class="py-string">''' The left property depending on the View attribute format '''</tt> </tt>
+<a name="L261"></a><tt class="py-lineno"> 261</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L262"></a><tt class="py-lineno"> 262</tt> <tt class="py-line"> <tt class="py-string">''' The top property depending on the View attribute format '''</tt> </tt>
+<a name="L263"></a><tt class="py-lineno"> 263</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L264"></a><tt class="py-lineno"> 264</tt> <tt class="py-line"> <tt class="py-string">''' The width property depending on the View attribute format '''</tt> </tt>
+<a name="L265"></a><tt class="py-lineno"> 265</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L266"></a><tt class="py-lineno"> 266</tt> <tt class="py-line"> <tt class="py-string">''' The height property depending on the View attribute format '''</tt> </tt>
+<a name="L267"></a><tt class="py-lineno"> 267</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L268"></a><tt class="py-lineno"> 268</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-67" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-67', 'ID_PROPERTY_UI_AUTOMATOR', 'link-33');">ID_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L269"></a><tt class="py-lineno"> 269</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-68" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-68', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-36');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L270"></a><tt class="py-lineno"> 270</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-69" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-69', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L271"></a><tt class="py-lineno"> 271</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-70" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-70', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L272"></a><tt class="py-lineno"> 272</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-71" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-71', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L273"></a><tt class="py-lineno"> 273</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-72" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-72', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L274"></a><tt class="py-lineno"> 274</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">></tt> <tt class="py-number">10</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">16</tt> <tt class="py-keyword">or</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L275"></a><tt class="py-lineno"> 275</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-73" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-73', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L276"></a><tt class="py-lineno"> 276</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-74" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-74', 'TEXT_PROPERTY', 'link-34');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L277"></a><tt class="py-lineno"> 277</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-75" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-75', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L278"></a><tt class="py-lineno"> 278</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-76" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-76', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L279"></a><tt class="py-lineno"> 279</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-77" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-77', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L280"></a><tt class="py-lineno"> 280</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-78" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-78', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L281"></a><tt class="py-lineno"> 281</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">==</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L282"></a><tt class="py-lineno"> 282</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-79" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-79', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L283"></a><tt class="py-lineno"> 283</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-80" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-80', 'TEXT_PROPERTY_API_10', 'link-35');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L284"></a><tt class="py-lineno"> 284</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-81" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-81', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L285"></a><tt class="py-lineno"> 285</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-82" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-82', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L286"></a><tt class="py-lineno"> 286</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-83" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-83', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L287"></a><tt class="py-lineno"> 287</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-84" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-84', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L288"></a><tt class="py-lineno"> 288</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">>=</tt> <tt class="py-number">7</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L289"></a><tt class="py-lineno"> 289</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-85" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-85', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L290"></a><tt class="py-lineno"> 290</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-86" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-86', 'TEXT_PROPERTY_API_10', 'link-35');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L291"></a><tt class="py-lineno"> 291</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-87" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-87', 'LEFT_PROPERTY_API_8', 'link-39');">LEFT_PROPERTY_API_8</a></tt> </tt>
+<a name="L292"></a><tt class="py-lineno"> 292</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-88" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-88', 'TOP_PROPERTY_API_8', 'link-41');">TOP_PROPERTY_API_8</a></tt> </tt>
+<a name="L293"></a><tt class="py-lineno"> 293</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-89" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-89', 'WIDTH_PROPERTY_API_8', 'link-43');">WIDTH_PROPERTY_API_8</a></tt> </tt>
+<a name="L294"></a><tt class="py-lineno"> 294</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-90" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8" class="py-name" href="#" onclick="return doclink('link-90', 'HEIGHT_PROPERTY_API_8', 'link-45');">HEIGHT_PROPERTY_API_8</a></tt> </tt>
+<a name="L295"></a><tt class="py-lineno"> 295</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">7</tt><tt class="py-op">:</tt> </tt>
+<a name="L296"></a><tt class="py-lineno"> 296</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-91" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-91', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L297"></a><tt class="py-lineno"> 297</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-92" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-92', 'TEXT_PROPERTY_API_10', 'link-35');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L298"></a><tt class="py-lineno"> 298</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-93" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-93', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L299"></a><tt class="py-lineno"> 299</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-94" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-94', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L300"></a><tt class="py-lineno"> 300</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-95" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-95', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L301"></a><tt class="py-lineno"> 301</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-96" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-96', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L302"></a><tt class="py-lineno"> 302</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">version</tt> <tt class="py-op">==</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L303"></a><tt class="py-lineno"> 303</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-97" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-97', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L304"></a><tt class="py-lineno"> 304</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-98" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-98', 'TEXT_PROPERTY', 'link-34');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L305"></a><tt class="py-lineno"> 305</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-99" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-99', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L306"></a><tt class="py-lineno"> 306</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-100" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-100', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L307"></a><tt class="py-lineno"> 307</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-101" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-101', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L308"></a><tt class="py-lineno"> 308</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-102" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-102', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+<a name="L309"></a><tt class="py-lineno"> 309</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L310"></a><tt class="py-lineno"> 310</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt> <tt class="py-op">=</tt> <tt id="link-103" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_PROPERTY" class="py-name" href="#" onclick="return doclink('link-103', 'ID_PROPERTY', 'link-32');">ID_PROPERTY</a></tt> </tt>
+<a name="L311"></a><tt class="py-lineno"> 311</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-104" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-104', 'TEXT_PROPERTY', 'link-34');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L312"></a><tt class="py-lineno"> 312</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt> <tt class="py-op">=</tt> <tt id="link-105" class="py-name"><a title="src.com.dtmilano.android.viewclient.LEFT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-105', 'LEFT_PROPERTY', 'link-38');">LEFT_PROPERTY</a></tt> </tt>
+<a name="L313"></a><tt class="py-lineno"> 313</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt> <tt class="py-op">=</tt> <tt id="link-106" class="py-name"><a title="src.com.dtmilano.android.viewclient.TOP_PROPERTY" class="py-name" href="#" onclick="return doclink('link-106', 'TOP_PROPERTY', 'link-40');">TOP_PROPERTY</a></tt> </tt>
+<a name="L314"></a><tt class="py-lineno"> 314</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt> <tt class="py-op">=</tt> <tt id="link-107" class="py-name"><a title="src.com.dtmilano.android.viewclient.WIDTH_PROPERTY" class="py-name" href="#" onclick="return doclink('link-107', 'WIDTH_PROPERTY', 'link-42');">WIDTH_PROPERTY</a></tt> </tt>
+<a name="L315"></a><tt class="py-lineno"> 315</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt> <tt class="py-op">=</tt> <tt id="link-108" class="py-name"><a title="src.com.dtmilano.android.viewclient.HEIGHT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-108', 'HEIGHT_PROPERTY', 'link-44');">HEIGHT_PROPERTY</a></tt> </tt>
+</div><a name="L316"></a><tt class="py-lineno"> 316</tt> <tt class="py-line"> </tt>
+<a name="View.__getitem__"></a><div id="View.__getitem__-def"><a name="L317"></a><tt class="py-lineno"> 317</tt> <a class="py-toggle" href="#" id="View.__getitem__-toggle" onclick="return toggle('View.__getitem__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">key</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__getitem__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__getitem__-expanded"><a name="L318"></a><tt class="py-lineno"> 318</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">key</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L319"></a><tt class="py-lineno"> 319</tt> <tt class="py-line"> </tt>
+<a name="View.__getattr__"></a><div id="View.__getattr__-def"><a name="L320"></a><tt class="py-lineno"> 320</tt> <a class="py-toggle" href="#" id="View.__getattr__-toggle" onclick="return toggle('View.__getattr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__getattr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__getattr__-expanded"><a name="L321"></a><tt class="py-lineno"> 321</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-109" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-109', 'DEBUG_GETATTR', 'link-8');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L322"></a><tt class="py-lineno"> 322</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__getattr__(%s) version: %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-110" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-110', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L323"></a><tt class="py-lineno"> 323</tt> <tt class="py-line"> </tt>
+<a name="L324"></a><tt class="py-lineno"> 324</tt> <tt class="py-line"> <tt class="py-comment"># NOTE:</tt> </tt>
+<a name="L325"></a><tt class="py-lineno"> 325</tt> <tt class="py-line"> <tt class="py-comment"># I should try to see if 'name' is a defined method</tt> </tt>
+<a name="L326"></a><tt class="py-lineno"> 326</tt> <tt class="py-line"> <tt class="py-comment"># but it seems that if I call locals() here an infinite loop is entered</tt> </tt>
+<a name="L327"></a><tt class="py-lineno"> 327</tt> <tt class="py-line"> </tt>
+<a name="L328"></a><tt class="py-lineno"> 328</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L329"></a><tt class="py-lineno"> 329</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">name</tt><tt class="py-op">]</tt> </tt>
+<a name="L330"></a><tt class="py-lineno"> 330</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">name</tt> <tt class="py-op">+</tt> <tt class="py-string">'()'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L331"></a><tt class="py-lineno"> 331</tt> <tt class="py-line"> <tt class="py-comment"># the method names are stored in the map with their trailing '()'</tt> </tt>
+<a name="L332"></a><tt class="py-lineno"> 332</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">name</tt> <tt class="py-op">+</tt> <tt class="py-string">'()'</tt><tt class="py-op">]</tt> </tt>
+<a name="L333"></a><tt class="py-lineno"> 333</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">count</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L334"></a><tt class="py-lineno"> 334</tt> <tt class="py-line"> <tt class="py-name">mangledList</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-111" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.allPossibleNamesWithColon()=src.com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon"><a title="src.com.dtmilano.android.viewclient.View.allPossibleNamesWithColon" class="py-name" href="#" onclick="return doclink('link-111', 'allPossibleNamesWithColon', 'link-111');">allPossibleNamesWithColon</a></tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+<a name="L335"></a><tt class="py-lineno"> 335</tt> <tt class="py-line"> <tt class="py-name">mangledName</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-112" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.intersection()=src.com.dtmilano.android.viewclient.View-class.html#intersection"><a title="src.com.dtmilano.android.viewclient.View.intersection" class="py-name" href="#" onclick="return doclink('link-112', 'intersection', 'link-112');">intersection</a></tt><tt class="py-op">(</tt><tt class="py-name">mangledList</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">keys</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L336"></a><tt class="py-lineno"> 336</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">mangledName</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">mangledName</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L337"></a><tt class="py-lineno"> 337</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">mangledName</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">]</tt> </tt>
+<a name="L338"></a><tt class="py-lineno"> 338</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L339"></a><tt class="py-lineno"> 339</tt> <tt class="py-line"> <tt class="py-comment"># Default behavior</tt> </tt>
+<a name="L340"></a><tt class="py-lineno"> 340</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">AttributeError</tt><tt class="py-op">,</tt> <tt class="py-name">name</tt> </tt>
+<a name="L341"></a><tt class="py-lineno"> 341</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L342"></a><tt class="py-lineno"> 342</tt> <tt class="py-line"> <tt class="py-comment"># try removing 'is' prefix</tt> </tt>
+<a name="L343"></a><tt class="py-lineno"> 343</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-113" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-113', 'DEBUG_GETATTR', 'link-8');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L344"></a><tt class="py-lineno"> 344</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __getattr__: trying without 'is' prefix"</tt> </tt>
+<a name="L345"></a><tt class="py-lineno"> 345</tt> <tt class="py-line"> <tt class="py-name">suffix</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L346"></a><tt class="py-lineno"> 346</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-name">suffix</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L347"></a><tt class="py-lineno"> 347</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">suffix</tt><tt class="py-op">]</tt> </tt>
+<a name="L348"></a><tt class="py-lineno"> 348</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L349"></a><tt class="py-lineno"> 349</tt> <tt class="py-line"> <tt class="py-comment"># Default behavior</tt> </tt>
+<a name="L350"></a><tt class="py-lineno"> 350</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">AttributeError</tt><tt class="py-op">,</tt> <tt class="py-name">name</tt> </tt>
+<a name="L351"></a><tt class="py-lineno"> 351</tt> <tt class="py-line"> </tt>
+<a name="L352"></a><tt class="py-lineno"> 352</tt> <tt class="py-line"> <tt class="py-comment"># if the method name starts with 'is' let's assume its return value is boolean</tt> </tt>
+<a name="L353"></a><tt class="py-lineno"> 353</tt> <tt class="py-line"><tt class="py-comment"># if name[:2] == 'is':</tt> </tt>
+<a name="L354"></a><tt class="py-lineno"> 354</tt> <tt class="py-line"><tt class="py-comment"># r = True if r == 'true' else False</tt> </tt>
+<a name="L355"></a><tt class="py-lineno"> 355</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">r</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt><tt class="py-op">:</tt> </tt>
+<a name="L356"></a><tt class="py-lineno"> 356</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L357"></a><tt class="py-lineno"> 357</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">r</tt> <tt class="py-op">==</tt> <tt class="py-string">'false'</tt><tt class="py-op">:</tt> </tt>
+<a name="L358"></a><tt class="py-lineno"> 358</tt> <tt class="py-line"> <tt class="py-name">r</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L359"></a><tt class="py-lineno"> 359</tt> <tt class="py-line"> </tt>
+<a name="L360"></a><tt class="py-lineno"> 360</tt> <tt class="py-line"> <tt class="py-comment"># this should not cached in some way</tt> </tt>
+<a name="L361"></a><tt class="py-lineno"> 361</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">innerMethod</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L362"></a><tt class="py-lineno"> 362</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-114" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_GETATTR" class="py-name" href="#" onclick="return doclink('link-114', 'DEBUG_GETATTR', 'link-8');">DEBUG_GETATTR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L363"></a><tt class="py-lineno"> 363</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"innerMethod: %s returning %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">innerMethod</tt><tt class="py-op">.</tt><tt class="py-name">__name__</tt><tt class="py-op">,</tt> <tt class="py-name">r</tt><tt class="py-op">)</tt> </tt>
+<a name="L364"></a><tt class="py-lineno"> 364</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">r</tt> </tt>
+</div><a name="L365"></a><tt class="py-lineno"> 365</tt> <tt class="py-line"> </tt>
+<a name="L366"></a><tt class="py-lineno"> 366</tt> <tt class="py-line"> <tt class="py-name">innerMethod</tt><tt class="py-op">.</tt><tt class="py-name">__name__</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt> </tt>
+<a name="L367"></a><tt class="py-lineno"> 367</tt> <tt class="py-line"> </tt>
+<a name="L368"></a><tt class="py-lineno"> 368</tt> <tt class="py-line"> <tt class="py-comment"># this should work, but then there's problems with the arguments of innerMethod </tt> </tt>
+<a name="L369"></a><tt class="py-lineno"> 369</tt> <tt class="py-line"> <tt class="py-comment"># even if innerMethod(self) is added</tt> </tt>
+<a name="L370"></a><tt class="py-lineno"> 370</tt> <tt class="py-line"> <tt class="py-comment">#setattr(View, innerMethod.__name__, innerMethod)</tt> </tt>
+<a name="L371"></a><tt class="py-lineno"> 371</tt> <tt class="py-line"> <tt class="py-comment">#setattr(self, innerMethod.__name__, innerMethod)</tt> </tt>
+<a name="L372"></a><tt class="py-lineno"> 372</tt> <tt class="py-line"> </tt>
+<a name="L373"></a><tt class="py-lineno"> 373</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">innerMethod</tt> </tt>
+</div><a name="L374"></a><tt class="py-lineno"> 374</tt> <tt class="py-line"> </tt>
+<a name="View.__call__"></a><div id="View.__call__-def"><a name="L375"></a><tt class="py-lineno"> 375</tt> <a class="py-toggle" href="#" id="View.__call__-toggle" onclick="return toggle('View.__call__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">*</tt><tt class="py-param">args</tt><tt class="py-op">,</tt> <tt class="py-op">**</tt><tt class="py-param">kwargs</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__call__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__call__-expanded"><a name="L376"></a><tt class="py-lineno"> 376</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-115" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_CALL" class="py-name" href="#" onclick="return doclink('link-115', 'DEBUG_CALL', 'link-10');">DEBUG_CALL</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L377"></a><tt class="py-lineno"> 377</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__call__(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">args</tt> <tt class="py-keyword">if</tt> <tt class="py-name">args</tt> <tt class="py-keyword">else</tt> <tt class="py-name">None</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L378"></a><tt class="py-lineno"> 378</tt> <tt class="py-line"> </tt>
+<a name="View.getClass"></a><div id="View.getClass-def"><a name="L379"></a><tt class="py-lineno"> 379</tt> <a class="py-toggle" href="#" id="View.getClass-toggle" onclick="return toggle('View.getClass');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getClass-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getClass-expanded"><a name="L380"></a><tt class="py-lineno"> 380</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L381"></a><tt class="py-lineno"> 381</tt> <tt class="py-line"><tt class="py-docstring"> Gets the L{View} class</tt> </tt>
+<a name="L382"></a><tt class="py-lineno"> 382</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L383"></a><tt class="py-lineno"> 383</tt> <tt class="py-line"><tt class="py-docstring"> @return: the L{View} class or C{None} if not defined</tt> </tt>
+<a name="L384"></a><tt class="py-lineno"> 384</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L385"></a><tt class="py-lineno"> 385</tt> <tt class="py-line"> </tt>
+<a name="L386"></a><tt class="py-lineno"> 386</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L387"></a><tt class="py-lineno"> 387</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L388"></a><tt class="py-lineno"> 388</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L389"></a><tt class="py-lineno"> 389</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L390"></a><tt class="py-lineno"> 390</tt> <tt class="py-line"> </tt>
+<a name="View.getId"></a><div id="View.getId-def"><a name="L391"></a><tt class="py-lineno"> 391</tt> <a class="py-toggle" href="#" id="View.getId-toggle" onclick="return toggle('View.getId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getId">getId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getId-expanded"><a name="L392"></a><tt class="py-lineno"> 392</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L393"></a><tt class="py-lineno"> 393</tt> <tt class="py-line"><tt class="py-docstring"> Gets the L{View} Id</tt> </tt>
+<a name="L394"></a><tt class="py-lineno"> 394</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L395"></a><tt class="py-lineno"> 395</tt> <tt class="py-line"><tt class="py-docstring"> @return: the L{View} C{Id} or C{None} if not defined</tt> </tt>
+<a name="L396"></a><tt class="py-lineno"> 396</tt> <tt class="py-line"><tt class="py-docstring"> @see: L{getUniqueId()}</tt> </tt>
+<a name="L397"></a><tt class="py-lineno"> 397</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L398"></a><tt class="py-lineno"> 398</tt> <tt class="py-line"> </tt>
+<a name="L399"></a><tt class="py-lineno"> 399</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L400"></a><tt class="py-lineno"> 400</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idProperty</tt><tt class="py-op">]</tt> </tt>
+<a name="L401"></a><tt class="py-lineno"> 401</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L402"></a><tt class="py-lineno"> 402</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L403"></a><tt class="py-lineno"> 403</tt> <tt class="py-line"> </tt>
+<a name="View.getContentDescription"></a><div id="View.getContentDescription-def"><a name="L404"></a><tt class="py-lineno"> 404</tt> <a class="py-toggle" href="#" id="View.getContentDescription-toggle" onclick="return toggle('View.getContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getContentDescription-expanded"><a name="L405"></a><tt class="py-lineno"> 405</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L406"></a><tt class="py-lineno"> 406</tt> <tt class="py-line"><tt class="py-docstring"> Gets the content description.</tt> </tt>
+<a name="L407"></a><tt class="py-lineno"> 407</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L408"></a><tt class="py-lineno"> 408</tt> <tt class="py-line"> </tt>
+<a name="L409"></a><tt class="py-lineno"> 409</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L410"></a><tt class="py-lineno"> 410</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">]</tt> </tt>
+<a name="L411"></a><tt class="py-lineno"> 411</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L412"></a><tt class="py-lineno"> 412</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L413"></a><tt class="py-lineno"> 413</tt> <tt class="py-line"> </tt>
+<a name="View.getParent"></a><div id="View.getParent-def"><a name="L414"></a><tt class="py-lineno"> 414</tt> <a class="py-toggle" href="#" id="View.getParent-toggle" onclick="return toggle('View.getParent');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getParent-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getParent-expanded"><a name="L415"></a><tt class="py-lineno"> 415</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L416"></a><tt class="py-lineno"> 416</tt> <tt class="py-line"><tt class="py-docstring"> Gets the parent.</tt> </tt>
+<a name="L417"></a><tt class="py-lineno"> 417</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L418"></a><tt class="py-lineno"> 418</tt> <tt class="py-line"> </tt>
+<a name="L419"></a><tt class="py-lineno"> 419</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+</div><a name="L420"></a><tt class="py-lineno"> 420</tt> <tt class="py-line"> </tt>
+<a name="View.getText"></a><div id="View.getText-def"><a name="L421"></a><tt class="py-lineno"> 421</tt> <a class="py-toggle" href="#" id="View.getText-toggle" onclick="return toggle('View.getText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getText">getText</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getText-expanded"><a name="L422"></a><tt class="py-lineno"> 422</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L423"></a><tt class="py-lineno"> 423</tt> <tt class="py-line"><tt class="py-docstring"> Gets the text attribute.</tt> </tt>
+<a name="L424"></a><tt class="py-lineno"> 424</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L425"></a><tt class="py-lineno"> 425</tt> <tt class="py-line"><tt class="py-docstring"> @return: the text attribute or C{None} if not defined</tt> </tt>
+<a name="L426"></a><tt class="py-lineno"> 426</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L427"></a><tt class="py-lineno"> 427</tt> <tt class="py-line"> </tt>
+<a name="L428"></a><tt class="py-lineno"> 428</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L429"></a><tt class="py-lineno"> 429</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">]</tt> </tt>
+<a name="L430"></a><tt class="py-lineno"> 430</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">Exception</tt><tt class="py-op">:</tt> </tt>
+<a name="L431"></a><tt class="py-lineno"> 431</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L432"></a><tt class="py-lineno"> 432</tt> <tt class="py-line"> </tt>
+<a name="View.getHeight"></a><div id="View.getHeight-def"><a name="L433"></a><tt class="py-lineno"> 433</tt> <a class="py-toggle" href="#" id="View.getHeight-toggle" onclick="return toggle('View.getHeight');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getHeight-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getHeight-expanded"><a name="L434"></a><tt class="py-lineno"> 434</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L435"></a><tt class="py-lineno"> 435</tt> <tt class="py-line"><tt class="py-docstring"> Gets the height.</tt> </tt>
+<a name="L436"></a><tt class="py-lineno"> 436</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L437"></a><tt class="py-lineno"> 437</tt> <tt class="py-line"> </tt>
+<a name="L438"></a><tt class="py-lineno"> 438</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L439"></a><tt class="py-lineno"> 439</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-op">-</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L440"></a><tt class="py-lineno"> 440</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L441"></a><tt class="py-lineno"> 441</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L442"></a><tt class="py-lineno"> 442</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">heightProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L443"></a><tt class="py-lineno"> 443</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L444"></a><tt class="py-lineno"> 444</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-number">0</tt> </tt>
+</div><a name="L445"></a><tt class="py-lineno"> 445</tt> <tt class="py-line"> </tt>
+<a name="View.getWidth"></a><div id="View.getWidth-def"><a name="L446"></a><tt class="py-lineno"> 446</tt> <a class="py-toggle" href="#" id="View.getWidth-toggle" onclick="return toggle('View.getWidth');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getWidth-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getWidth-expanded"><a name="L447"></a><tt class="py-lineno"> 447</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L448"></a><tt class="py-lineno"> 448</tt> <tt class="py-line"><tt class="py-docstring"> Gets the width.</tt> </tt>
+<a name="L449"></a><tt class="py-lineno"> 449</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L450"></a><tt class="py-lineno"> 450</tt> <tt class="py-line"> </tt>
+<a name="L451"></a><tt class="py-lineno"> 451</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L452"></a><tt class="py-lineno"> 452</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">-</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L453"></a><tt class="py-lineno"> 453</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L454"></a><tt class="py-lineno"> 454</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L455"></a><tt class="py-lineno"> 455</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">widthProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L456"></a><tt class="py-lineno"> 456</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L457"></a><tt class="py-lineno"> 457</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-number">0</tt> </tt>
+</div><a name="L458"></a><tt class="py-lineno"> 458</tt> <tt class="py-line"> </tt>
+<a name="View.getUniqueId"></a><div id="View.getUniqueId-def"><a name="L459"></a><tt class="py-lineno"> 459</tt> <a class="py-toggle" href="#" id="View.getUniqueId-toggle" onclick="return toggle('View.getUniqueId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getUniqueId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getUniqueId-expanded"><a name="L460"></a><tt class="py-lineno"> 460</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L461"></a><tt class="py-lineno"> 461</tt> <tt class="py-line"><tt class="py-docstring"> Gets the unique Id of this View.</tt> </tt>
+<a name="L462"></a><tt class="py-lineno"> 462</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L463"></a><tt class="py-lineno"> 463</tt> <tt class="py-line"><tt class="py-docstring"> @see: L{ViewClient.__splitAttrs()} for a discussion on B{Unique Ids}</tt> </tt>
+<a name="L464"></a><tt class="py-lineno"> 464</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L465"></a><tt class="py-lineno"> 465</tt> <tt class="py-line"> </tt>
+<a name="L466"></a><tt class="py-lineno"> 466</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L467"></a><tt class="py-lineno"> 467</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> </tt>
+<a name="L468"></a><tt class="py-lineno"> 468</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L469"></a><tt class="py-lineno"> 469</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L470"></a><tt class="py-lineno"> 470</tt> <tt class="py-line"> </tt>
+<a name="View.getVisibility"></a><div id="View.getVisibility-def"><a name="L471"></a><tt class="py-lineno"> 471</tt> <a class="py-toggle" href="#" id="View.getVisibility-toggle" onclick="return toggle('View.getVisibility');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getVisibility-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getVisibility-expanded"><a name="L472"></a><tt class="py-lineno"> 472</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L473"></a><tt class="py-lineno"> 473</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View visibility</tt> </tt>
+<a name="L474"></a><tt class="py-lineno"> 474</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L475"></a><tt class="py-lineno"> 475</tt> <tt class="py-line"> </tt>
+<a name="L476"></a><tt class="py-lineno"> 476</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L477"></a><tt class="py-lineno"> 477</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-116" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-116', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L478"></a><tt class="py-lineno"> 478</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-117" class="py-name"><a title="src.com.dtmilano.android.viewclient.VISIBLE" class="py-name" href="#" onclick="return doclink('link-117', 'VISIBLE', 'link-48');">VISIBLE</a></tt> </tt>
+<a name="L479"></a><tt class="py-lineno"> 479</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-118" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-118', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'INVISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L480"></a><tt class="py-lineno"> 480</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-119" class="py-name"><a title="src.com.dtmilano.android.viewclient.INVISIBLE" class="py-name" href="#" onclick="return doclink('link-119', 'INVISIBLE', 'link-49');">INVISIBLE</a></tt> </tt>
+<a name="L481"></a><tt class="py-lineno"> 481</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-120" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-120', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'GONE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L482"></a><tt class="py-lineno"> 482</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-121" class="py-name"><a title="src.com.dtmilano.android.viewclient.GONE" class="py-name" href="#" onclick="return doclink('link-121', 'GONE', 'link-50');">GONE</a></tt> </tt>
+<a name="L483"></a><tt class="py-lineno"> 483</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L484"></a><tt class="py-lineno"> 484</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">-</tt><tt class="py-number">2</tt> </tt>
+<a name="L485"></a><tt class="py-lineno"> 485</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L486"></a><tt class="py-lineno"> 486</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+</div><a name="L487"></a><tt class="py-lineno"> 487</tt> <tt class="py-line"> </tt>
+<a name="View.getX"></a><div id="View.getX-def"><a name="L488"></a><tt class="py-lineno"> 488</tt> <a class="py-toggle" href="#" id="View.getX-toggle" onclick="return toggle('View.getX');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getX">getX</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getX-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getX-expanded"><a name="L489"></a><tt class="py-lineno"> 489</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L490"></a><tt class="py-lineno"> 490</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View X coordinate</tt> </tt>
+<a name="L491"></a><tt class="py-lineno"> 491</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L492"></a><tt class="py-lineno"> 492</tt> <tt class="py-line"> </tt>
+<a name="L493"></a><tt class="py-lineno"> 493</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-122" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-122', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L494"></a><tt class="py-lineno"> 494</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getX(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-123" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getClass()=src.com.dtmilano.android.viewclient.View-class.html#getClass"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-123', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-124" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getId()=src.com.dtmilano.android.viewclient.View-class.html#getId"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-124', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-125" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getUniqueId()=src.com.dtmilano.android.viewclient.View-class.html#getUniqueId"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-125', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L495"></a><tt class="py-lineno"> 495</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L496"></a><tt class="py-lineno"> 496</tt> <tt class="py-line"> </tt>
+<a name="L497"></a><tt class="py-lineno"> 497</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L498"></a><tt class="py-lineno"> 498</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
+<a name="L499"></a><tt class="py-lineno"> 499</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L500"></a><tt class="py-lineno"> 500</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L501"></a><tt class="py-lineno"> 501</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-126" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-126', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-127" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-127', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L502"></a><tt class="py-lineno"> 502</tt> <tt class="py-line"> <tt class="py-name">_x</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L503"></a><tt class="py-lineno"> 503</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-128" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-128', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getX: VISIBLE adding %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">_x</tt> </tt>
+<a name="L504"></a><tt class="py-lineno"> 504</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">+=</tt> <tt class="py-name">_x</tt> </tt>
+<a name="L505"></a><tt class="py-lineno"> 505</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L506"></a><tt class="py-lineno"> 506</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"View %s has no '%s' property"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-129" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-129', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">leftProperty</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L507"></a><tt class="py-lineno"> 507</tt> <tt class="py-line"> </tt>
+<a name="L508"></a><tt class="py-lineno"> 508</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-130" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-130', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getX: returning %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">)</tt> </tt>
+<a name="L509"></a><tt class="py-lineno"> 509</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">x</tt> </tt>
+</div><a name="L510"></a><tt class="py-lineno"> 510</tt> <tt class="py-line"> </tt>
+<a name="View.getY"></a><div id="View.getY-def"><a name="L511"></a><tt class="py-lineno"> 511</tt> <a class="py-toggle" href="#" id="View.getY-toggle" onclick="return toggle('View.getY');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getY">getY</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getY-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getY-expanded"><a name="L512"></a><tt class="py-lineno"> 512</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L513"></a><tt class="py-lineno"> 513</tt> <tt class="py-line"><tt class="py-docstring"> Gets the View Y coordinate</tt> </tt>
+<a name="L514"></a><tt class="py-lineno"> 514</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L515"></a><tt class="py-lineno"> 515</tt> <tt class="py-line"> </tt>
+<a name="L516"></a><tt class="py-lineno"> 516</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-131" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-131', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L517"></a><tt class="py-lineno"> 517</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getY(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-132" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-132', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-133" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-133', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-134" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-134', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L518"></a><tt class="py-lineno"> 518</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L519"></a><tt class="py-lineno"> 519</tt> <tt class="py-line"> </tt>
+<a name="L520"></a><tt class="py-lineno"> 520</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L521"></a><tt class="py-lineno"> 521</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L522"></a><tt class="py-lineno"> 522</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L523"></a><tt class="py-lineno"> 523</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L524"></a><tt class="py-lineno"> 524</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-135" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-135', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt id="link-136" class="py-name"><a title="src.com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY" class="py-name" href="#" onclick="return doclink('link-136', 'GET_VISIBILITY_PROPERTY', 'link-46');">GET_VISIBILITY_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'VISIBLE'</tt><tt class="py-op">:</tt> </tt>
+<a name="L525"></a><tt class="py-lineno"> 525</tt> <tt class="py-line"> <tt class="py-name">_y</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L526"></a><tt class="py-lineno"> 526</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-137" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-137', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getY: VISIBLE adding %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">_y</tt> </tt>
+<a name="L527"></a><tt class="py-lineno"> 527</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">+=</tt> <tt class="py-name">_y</tt> </tt>
+<a name="L528"></a><tt class="py-lineno"> 528</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L529"></a><tt class="py-lineno"> 529</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"View %s has no '%s' property"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-138" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-138', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">topProperty</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L530"></a><tt class="py-lineno"> 530</tt> <tt class="py-line"> </tt>
+<a name="L531"></a><tt class="py-lineno"> 531</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-139" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-139', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getY: returning %d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+<a name="L532"></a><tt class="py-lineno"> 532</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">y</tt> </tt>
+</div><a name="L533"></a><tt class="py-lineno"> 533</tt> <tt class="py-line"> </tt>
+<a name="View.getXY"></a><div id="View.getXY-def"><a name="L534"></a><tt class="py-lineno"> 534</tt> <a class="py-toggle" href="#" id="View.getXY-toggle" onclick="return toggle('View.getXY');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">debug</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getXY-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getXY-expanded"><a name="L535"></a><tt class="py-lineno"> 535</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L536"></a><tt class="py-lineno"> 536</tt> <tt class="py-line"><tt class="py-docstring"> Returns the I{screen} coordinates of this C{View}.</tt> </tt>
+<a name="L537"></a><tt class="py-lineno"> 537</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L538"></a><tt class="py-lineno"> 538</tt> <tt class="py-line"><tt class="py-docstring"> @return: The I{screen} coordinates of this C{View}</tt> </tt>
+<a name="L539"></a><tt class="py-lineno"> 539</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L540"></a><tt class="py-lineno"> 540</tt> <tt class="py-line"> </tt>
+<a name="L541"></a><tt class="py-lineno"> 541</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-140" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-140', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L542"></a><tt class="py-lineno"> 542</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L543"></a><tt class="py-lineno"> 543</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-141" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-141', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L544"></a><tt class="py-lineno"> 544</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L545"></a><tt class="py-lineno"> 545</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-string">"NO_ID"</tt> </tt>
+<a name="L546"></a><tt class="py-lineno"> 546</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getXY(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-142" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-142', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">id</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-143" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-143', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L547"></a><tt class="py-lineno"> 547</tt> <tt class="py-line"> </tt>
+<a name="L548"></a><tt class="py-lineno"> 548</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-144" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getX()=src.com.dtmilano.android.viewclient.View-class.html#getX"><a title="src.com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-144', 'getX', 'link-144');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L549"></a><tt class="py-lineno"> 549</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-145" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getY()=src.com.dtmilano.android.viewclient.View-class.html#getY"><a title="src.com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-145', 'getY', 'link-145');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L550"></a><tt class="py-lineno"> 550</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L551"></a><tt class="py-lineno"> 551</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-146" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-146', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: x=%s y=%s parent=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-147" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-147', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt> <tt class="py-keyword">else</tt> <tt class="py-string">"None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L552"></a><tt class="py-lineno"> 552</tt> <tt class="py-line"> <tt class="py-name">hx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L553"></a><tt class="py-lineno"> 553</tt> <tt class="py-line"> <tt class="py-string">''' Hierarchy accumulated X '''</tt> </tt>
+<a name="L554"></a><tt class="py-lineno"> 554</tt> <tt class="py-line"> <tt class="py-name">hy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L555"></a><tt class="py-lineno"> 555</tt> <tt class="py-line"> <tt class="py-string">''' Hierarchy accumulated Y '''</tt> </tt>
+<a name="L556"></a><tt class="py-lineno"> 556</tt> <tt class="py-line"> </tt>
+<a name="L557"></a><tt class="py-lineno"> 557</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L558"></a><tt class="py-lineno"> 558</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-148" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-148', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: not using UiAutomator, calculating ancestors coordinates"</tt> </tt>
+<a name="L559"></a><tt class="py-lineno"> 559</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">parent</tt> <tt class="py-op">!=</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L560"></a><tt class="py-lineno"> 560</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-149" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-149', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: parent: %s %s <<<<"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-150" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-150', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt> <tt class="py-keyword">else</tt> <tt class="py-string">"None"</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-151" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-151', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt> <tt class="py-keyword">else</tt> <tt class="py-string">"None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L561"></a><tt class="py-lineno"> 561</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-152" class="py-name"><a title="src.com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED" class="py-name" href="#" onclick="return doclink('link-152', 'SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED', 'link-30');">SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L562"></a><tt class="py-lineno"> 562</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-153" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-153', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt> <tt class="py-string">'com.android.internal.widget.ActionBarView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L563"></a><tt class="py-lineno"> 563</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.widget.ActionBarContextView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L564"></a><tt class="py-lineno"> 564</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.view.menu.ActionMenuView'</tt><tt class="py-op">,</tt> </tt>
+<a name="L565"></a><tt class="py-lineno"> 565</tt> <tt class="py-line"> <tt class="py-string">'com.android.internal.policy.impl.PhoneWindow$DecorView'</tt> <tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L566"></a><tt class="py-lineno"> 566</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-154" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-154', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: skipping %s %s (%d,%d)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-155" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-155', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-156" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-156', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-157" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-157', 'getX', 'link-144');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-158" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-158', 'getY', 'link-145');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L567"></a><tt class="py-lineno"> 567</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L568"></a><tt class="py-lineno"> 568</tt> <tt class="py-line"> <tt class="py-keyword">continue</tt> </tt>
+<a name="L569"></a><tt class="py-lineno"> 569</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-159" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-159', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: parent=%s x=%d hx=%d y=%d hy=%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-160" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-160', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-161" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-161', 'getX', 'link-144');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">hx</tt><tt class="py-op">,</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-162" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-162', 'getY', 'link-145');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">hy</tt><tt class="py-op">)</tt> </tt>
+<a name="L570"></a><tt class="py-lineno"> 570</tt> <tt class="py-line"> <tt class="py-name">hx</tt> <tt class="py-op">+=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-163" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getX" class="py-name" href="#" onclick="return doclink('link-163', 'getX', 'link-144');">getX</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L571"></a><tt class="py-lineno"> 571</tt> <tt class="py-line"> <tt class="py-name">hy</tt> <tt class="py-op">+=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-164" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getY" class="py-name" href="#" onclick="return doclink('link-164', 'getY', 'link-145');">getY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L572"></a><tt class="py-lineno"> 572</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> </tt>
+<a name="L573"></a><tt class="py-lineno"> 573</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-165" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-165', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: parent=%s hx=%d hy=%d (end of loop)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-166" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-166', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-name">parent</tt> <tt class="py-keyword">else</tt> <tt class="py-string">"None"</tt><tt class="py-op">,</tt> <tt class="py-name">hx</tt><tt class="py-op">,</tt> <tt class="py-name">hy</tt><tt class="py-op">)</tt> </tt>
+<a name="L574"></a><tt class="py-lineno"> 574</tt> <tt class="py-line"> </tt>
+<a name="L575"></a><tt class="py-lineno"> 575</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-167" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__dumpWindowsInformation()=src.com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation"><a title="src.com.dtmilano.android.viewclient.View.__dumpWindowsInformation" class="py-name" href="#" onclick="return doclink('link-167', '__dumpWindowsInformation', 'link-167');">__dumpWindowsInformation</a></tt><tt class="py-op">(</tt><tt class="py-name">debug</tt><tt class="py-op">=</tt><tt class="py-name">debug</tt><tt class="py-op">)</tt> </tt>
+<a name="L576"></a><tt class="py-lineno"> 576</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-168" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-168', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L577"></a><tt class="py-lineno"> 577</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: wv=(%d, %d) (windows information)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L578"></a><tt class="py-lineno"> 578</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L579"></a><tt class="py-lineno"> 579</tt> <tt class="py-line"> <tt class="py-name">fw</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L580"></a><tt class="py-lineno"> 580</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-169" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-169', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L581"></a><tt class="py-lineno"> 581</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: focused window="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt> </tt>
+<a name="L582"></a><tt class="py-lineno"> 582</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: deciding whether to consider statusbar offset because current focused windows is at"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-string">"parent"</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+<a name="L583"></a><tt class="py-lineno"> 583</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">KeyError</tt><tt class="py-op">:</tt> </tt>
+<a name="L584"></a><tt class="py-lineno"> 584</tt> <tt class="py-line"> <tt class="py-name">fw</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L585"></a><tt class="py-lineno"> 585</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-170" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__obtainStatusBarDimensionsIfVisible()=src.com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible"><a title="src.com.dtmilano.android.viewclient.View.__obtainStatusBarDimensionsIfVisible" class="py-name" href="#" onclick="return doclink('link-170', '__obtainStatusBarDimensionsIfVisible', 'link-170');">__obtainStatusBarDimensionsIfVisible</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L586"></a><tt class="py-lineno"> 586</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-171" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-171', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L587"></a><tt class="py-lineno"> 587</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: sb=(%d, %d) (statusbar dimensions)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+<a name="L588"></a><tt class="py-lineno"> 588</tt> <tt class="py-line"> <tt class="py-name">statusBarOffset</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L589"></a><tt class="py-lineno"> 589</tt> <tt class="py-line"> <tt class="py-name">pwx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L590"></a><tt class="py-lineno"> 590</tt> <tt class="py-line"> <tt class="py-name">pwy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L591"></a><tt class="py-lineno"> 591</tt> <tt class="py-line"> </tt>
+<a name="L592"></a><tt class="py-lineno"> 592</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">:</tt> </tt>
+<a name="L593"></a><tt class="py-lineno"> 593</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-172" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-172', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L594"></a><tt class="py-lineno"> 594</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: focused window="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">,</tt> <tt class="py-string">"sb="</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+<a name="L595"></a><tt class="py-lineno"> 595</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op"><=</tt> <tt class="py-name">sbh</tt><tt class="py-op">:</tt> <tt class="py-comment"># it's very unlikely that fw.wvy < sbh, that is a window over the statusbar</tt> </tt>
+<a name="L596"></a><tt class="py-lineno"> 596</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-173" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-173', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: yes, considering offset="</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L597"></a><tt class="py-lineno"> 597</tt> <tt class="py-line"> <tt class="py-name">statusBarOffset</tt> <tt class="py-op">=</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L598"></a><tt class="py-lineno"> 598</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L599"></a><tt class="py-lineno"> 599</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-174" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-174', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: no, ignoring statusbar offset fw.wvy="</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-string">">"</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt> </tt>
+<a name="L600"></a><tt class="py-lineno"> 600</tt> <tt class="py-line"> </tt>
+<a name="L601"></a><tt class="py-lineno"> 601</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> <tt class="py-op">==</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">:</tt> </tt>
+<a name="L602"></a><tt class="py-lineno"> 602</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-175" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-175', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: but wait, fw.py == fw.wvy so we are adjusting by "</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+<a name="L603"></a><tt class="py-lineno"> 603</tt> <tt class="py-line"> <tt class="py-name">pwx</tt> <tt class="py-op">=</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">px</tt> </tt>
+<a name="L604"></a><tt class="py-lineno"> 604</tt> <tt class="py-line"> <tt class="py-name">pwy</tt> <tt class="py-op">=</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt> </tt>
+<a name="L605"></a><tt class="py-lineno"> 605</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L606"></a><tt class="py-lineno"> 606</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-176" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-176', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: fw.py=%d <= fw.wvy=%d, no adjustment"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">fw</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L607"></a><tt class="py-lineno"> 607</tt> <tt class="py-line"> </tt>
+<a name="L608"></a><tt class="py-lineno"> 608</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-177" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-177', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt id="link-178" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_STATUSBAR" class="py-name" href="#" onclick="return doclink('link-178', 'DEBUG_STATUSBAR', 'link-16');">DEBUG_STATUSBAR</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L609"></a><tt class="py-lineno"> 609</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" getXY: returning (%d, %d) ***"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">hx</tt><tt class="py-op">+</tt><tt class="py-name">wvx</tt><tt class="py-op">+</tt><tt class="py-name">pwx</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">hy</tt><tt class="py-op">+</tt><tt class="py-name">wvy</tt><tt class="py-op">-</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">+</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+<a name="L610"></a><tt class="py-lineno"> 610</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" x=%d+%d+%d+%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt><tt class="py-name">hx</tt><tt class="py-op">,</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt><tt class="py-name">pwx</tt><tt class="py-op">)</tt> </tt>
+<a name="L611"></a><tt class="py-lineno"> 611</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" y=%d+%d+%d-%d+%d"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt><tt class="py-op">,</tt><tt class="py-name">hy</tt><tt class="py-op">,</tt><tt class="py-name">wvy</tt><tt class="py-op">,</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">,</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+<a name="L612"></a><tt class="py-lineno"> 612</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">hx</tt><tt class="py-op">+</tt><tt class="py-name">wvx</tt><tt class="py-op">+</tt><tt class="py-name">pwx</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">hy</tt><tt class="py-op">+</tt><tt class="py-name">wvy</tt><tt class="py-op">-</tt><tt class="py-name">statusBarOffset</tt><tt class="py-op">+</tt><tt class="py-name">pwy</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L613"></a><tt class="py-lineno"> 613</tt> <tt class="py-line"> </tt>
+<a name="View.getCoords"></a><div id="View.getCoords-def"><a name="L614"></a><tt class="py-lineno"> 614</tt> <a class="py-toggle" href="#" id="View.getCoords-toggle" onclick="return toggle('View.getCoords');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getCoords-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getCoords-expanded"><a name="L615"></a><tt class="py-lineno"> 615</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L616"></a><tt class="py-lineno"> 616</tt> <tt class="py-line"><tt class="py-docstring"> Gets the coords of the View</tt> </tt>
+<a name="L617"></a><tt class="py-lineno"> 617</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L618"></a><tt class="py-lineno"> 618</tt> <tt class="py-line"><tt class="py-docstring"> @return: A tuple containing the View's coordinates ((L, T), (R, B))</tt> </tt>
+<a name="L619"></a><tt class="py-lineno"> 619</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L620"></a><tt class="py-lineno"> 620</tt> <tt class="py-line"> </tt>
+<a name="L621"></a><tt class="py-lineno"> 621</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-179" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-179', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L622"></a><tt class="py-lineno"> 622</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"getCoords(%s %s ## %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-180" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-180', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-181" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-181', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-182" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-182', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L623"></a><tt class="py-lineno"> 623</tt> <tt class="py-line"> </tt>
+<a name="L624"></a><tt class="py-lineno"> 624</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-183" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getXY()=src.com.dtmilano.android.viewclient.View-class.html#getXY"><a title="src.com.dtmilano.android.viewclient.View.getXY" class="py-name" href="#" onclick="return doclink('link-183', 'getXY', 'link-183');">getXY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">;</tt> </tt>
+<a name="L625"></a><tt class="py-lineno"> 625</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-184" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getWidth()=src.com.dtmilano.android.viewclient.View-class.html#getWidth"><a title="src.com.dtmilano.android.viewclient.View.getWidth" class="py-name" href="#" onclick="return doclink('link-184', 'getWidth', 'link-184');">getWidth</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L626"></a><tt class="py-lineno"> 626</tt> <tt class="py-line"> <tt class="py-name">h</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-185" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getHeight()=src.com.dtmilano.android.viewclient.View-class.html#getHeight"><a title="src.com.dtmilano.android.viewclient.View.getHeight" class="py-name" href="#" onclick="return doclink('link-185', 'getHeight', 'link-185');">getHeight</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L627"></a><tt class="py-lineno"> 627</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-name">h</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L628"></a><tt class="py-lineno"> 628</tt> <tt class="py-line"> </tt>
+<a name="View.getPositionAndSize"></a><div id="View.getPositionAndSize-def"><a name="L629"></a><tt class="py-lineno"> 629</tt> <a class="py-toggle" href="#" id="View.getPositionAndSize-toggle" onclick="return toggle('View.getPositionAndSize');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getPositionAndSize-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getPositionAndSize-expanded"><a name="L630"></a><tt class="py-lineno"> 630</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L631"></a><tt class="py-lineno"> 631</tt> <tt class="py-line"><tt class="py-docstring"> Gets the position and size (X,Y, W, H)</tt> </tt>
+<a name="L632"></a><tt class="py-lineno"> 632</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L633"></a><tt class="py-lineno"> 633</tt> <tt class="py-line"><tt class="py-docstring"> @return: A tuple containing the View's coordinates (X, Y, W, H)</tt> </tt>
+<a name="L634"></a><tt class="py-lineno"> 634</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L635"></a><tt class="py-lineno"> 635</tt> <tt class="py-line"> </tt>
+<a name="L636"></a><tt class="py-lineno"> 636</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-186" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getXY" class="py-name" href="#" onclick="return doclink('link-186', 'getXY', 'link-183');">getXY</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">;</tt> </tt>
+<a name="L637"></a><tt class="py-lineno"> 637</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-187" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getWidth" class="py-name" href="#" onclick="return doclink('link-187', 'getWidth', 'link-184');">getWidth</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L638"></a><tt class="py-lineno"> 638</tt> <tt class="py-line"> <tt class="py-name">h</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-188" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getHeight" class="py-name" href="#" onclick="return doclink('link-188', 'getHeight', 'link-185');">getHeight</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L639"></a><tt class="py-lineno"> 639</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-name">h</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L640"></a><tt class="py-lineno"> 640</tt> <tt class="py-line"> </tt>
+<a name="L641"></a><tt class="py-lineno"> 641</tt> <tt class="py-line"> </tt>
+<a name="View.getCenter"></a><div id="View.getCenter-def"><a name="L642"></a><tt class="py-lineno"> 642</tt> <a class="py-toggle" href="#" id="View.getCenter-toggle" onclick="return toggle('View.getCenter');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.getCenter-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.getCenter-expanded"><a name="L643"></a><tt class="py-lineno"> 643</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L644"></a><tt class="py-lineno"> 644</tt> <tt class="py-line"><tt class="py-docstring"> Gets the center coords of the View</tt> </tt>
+<a name="L645"></a><tt class="py-lineno"> 645</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L646"></a><tt class="py-lineno"> 646</tt> <tt class="py-line"><tt class="py-docstring"> @author: U{Dean Morin <https://github.com/deanmorin>}</tt> </tt>
+<a name="L647"></a><tt class="py-lineno"> 647</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L648"></a><tt class="py-lineno"> 648</tt> <tt class="py-line"> </tt>
+<a name="L649"></a><tt class="py-lineno"> 649</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">left</tt><tt class="py-op">,</tt> <tt class="py-name">top</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">right</tt><tt class="py-op">,</tt> <tt class="py-name">bottom</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-189" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getCoords()=src.com.dtmilano.android.viewclient.View-class.html#getCoords"><a title="src.com.dtmilano.android.viewclient.View.getCoords" class="py-name" href="#" onclick="return doclink('link-189', 'getCoords', 'link-189');">getCoords</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L650"></a><tt class="py-lineno"> 650</tt> <tt class="py-line"> <tt class="py-name">x</tt> <tt class="py-op">=</tt> <tt class="py-name">left</tt> <tt class="py-op">+</tt> <tt class="py-op">(</tt><tt class="py-name">right</tt> <tt class="py-op">-</tt> <tt class="py-name">left</tt><tt class="py-op">)</tt> <tt class="py-op">/</tt> <tt class="py-number">2</tt> </tt>
+<a name="L651"></a><tt class="py-lineno"> 651</tt> <tt class="py-line"> <tt class="py-name">y</tt> <tt class="py-op">=</tt> <tt class="py-name">top</tt> <tt class="py-op">+</tt> <tt class="py-op">(</tt><tt class="py-name">bottom</tt> <tt class="py-op">-</tt> <tt class="py-name">top</tt><tt class="py-op">)</tt> <tt class="py-op">/</tt> <tt class="py-number">2</tt> </tt>
+<a name="L652"></a><tt class="py-lineno"> 652</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L653"></a><tt class="py-lineno"> 653</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainStatusBarDimensionsIfVisible"></a><div id="View.__obtainStatusBarDimensionsIfVisible-def"><a name="L654"></a><tt class="py-lineno"> 654</tt> <a class="py-toggle" href="#" id="View.__obtainStatusBarDimensionsIfVisible-toggle" onclick="return toggle('View.__obtainStatusBarDimensionsIfVisible');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__obtainStatusBarDimensionsIfVisible">__obtainStatusBarDimensionsIfVisible</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainStatusBarDimensionsIfVisible-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainStatusBarDimensionsIfVisible-expanded"><a name="L655"></a><tt class="py-lineno"> 655</tt> <tt class="py-line"> <tt class="py-name">sbw</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L656"></a><tt class="py-lineno"> 656</tt> <tt class="py-line"> <tt class="py-name">sbh</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L657"></a><tt class="py-lineno"> 657</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">winId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">:</tt> </tt>
+<a name="L658"></a><tt class="py-lineno"> 658</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">winId</tt><tt class="py-op">]</tt> </tt>
+<a name="L659"></a><tt class="py-lineno"> 659</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-190" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-190', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __obtainStatusBarDimensionsIfVisible: w="</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">,</tt> <tt class="py-string">" w.activity="</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-string">"%%%"</tt> </tt>
+<a name="L660"></a><tt class="py-lineno"> 660</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">activity</tt> <tt class="py-op">==</tt> <tt class="py-string">'StatusBar'</tt><tt class="py-op">:</tt> </tt>
+<a name="L661"></a><tt class="py-lineno"> 661</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt> <tt class="py-keyword">and</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L662"></a><tt class="py-lineno"> 662</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-191" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-191', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" __obtainStatusBarDimensionsIfVisible: statusBar="</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt><tt class="py-op">)</tt> </tt>
+<a name="L663"></a><tt class="py-lineno"> 663</tt> <tt class="py-line"> <tt class="py-name">sbw</tt> <tt class="py-op">=</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvw</tt> </tt>
+<a name="L664"></a><tt class="py-lineno"> 664</tt> <tt class="py-line"> <tt class="py-name">sbh</tt> <tt class="py-op">=</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvh</tt> </tt>
+<a name="L665"></a><tt class="py-lineno"> 665</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L666"></a><tt class="py-lineno"> 666</tt> <tt class="py-line"> </tt>
+<a name="L667"></a><tt class="py-lineno"> 667</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">sbw</tt><tt class="py-op">,</tt> <tt class="py-name">sbh</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L668"></a><tt class="py-lineno"> 668</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainVxVy"></a><div id="View.__obtainVxVy-def"><a name="L669"></a><tt class="py-lineno"> 669</tt> <a class="py-toggle" href="#" id="View.__obtainVxVy-toggle" onclick="return toggle('View.__obtainVxVy');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__obtainVxVy">__obtainVxVy</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainVxVy-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainVxVy-expanded"><a name="L670"></a><tt class="py-lineno"> 670</tt> <tt class="py-line"> <tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L671"></a><tt class="py-lineno"> 671</tt> <tt class="py-line"> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L672"></a><tt class="py-lineno"> 672</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> </tt>
+</div><a name="L673"></a><tt class="py-lineno"> 673</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainVwVh"></a><div id="View.__obtainVwVh-def"><a name="L674"></a><tt class="py-lineno"> 674</tt> <a class="py-toggle" href="#" id="View.__obtainVwVh-toggle" onclick="return toggle('View.__obtainVwVh');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__obtainVwVh">__obtainVwVh</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainVwVh-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainVwVh-expanded"><a name="L675"></a><tt class="py-lineno"> 675</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-192" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__obtainVxVy()=src.com.dtmilano.android.viewclient.View-class.html#__obtainVxVy"><a title="src.com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-192', '__obtainVxVy', 'link-192');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L676"></a><tt class="py-lineno"> 676</tt> <tt class="py-line"> <tt class="py-name">wvx1</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L677"></a><tt class="py-lineno"> 677</tt> <tt class="py-line"> <tt class="py-name">wvy1</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L678"></a><tt class="py-lineno"> 678</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">wvx1</tt><tt class="py-op">-</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy1</tt><tt class="py-op">-</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L679"></a><tt class="py-lineno"> 679</tt> <tt class="py-line"> </tt>
+<a name="View.__obtainPxPy"></a><div id="View.__obtainPxPy-def"><a name="L680"></a><tt class="py-lineno"> 680</tt> <a class="py-toggle" href="#" id="View.__obtainPxPy-toggle" onclick="return toggle('View.__obtainPxPy');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__obtainPxPy">__obtainPxPy</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">m</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__obtainPxPy-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__obtainPxPy-expanded"><a name="L681"></a><tt class="py-lineno"> 681</tt> <tt class="py-line"> <tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L682"></a><tt class="py-lineno"> 682</tt> <tt class="py-line"> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L683"></a><tt class="py-lineno"> 683</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L684"></a><tt class="py-lineno"> 684</tt> <tt class="py-line"> </tt>
+<a name="View.__dumpWindowsInformation"></a><div id="View.__dumpWindowsInformation-def"><a name="L685"></a><tt class="py-lineno"> 685</tt> <a class="py-toggle" href="#" id="View.__dumpWindowsInformation-toggle" onclick="return toggle('View.__dumpWindowsInformation');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__dumpWindowsInformation">__dumpWindowsInformation</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">debug</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__dumpWindowsInformation-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__dumpWindowsInformation-expanded"><a name="L686"></a><tt class="py-lineno"> 686</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L687"></a><tt class="py-lineno"> 687</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L688"></a><tt class="py-lineno"> 688</tt> <tt class="py-line"> <tt class="py-name">dww</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys window windows'</tt><tt class="py-op">)</tt> </tt>
+<a name="L689"></a><tt class="py-lineno"> 689</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-193" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_WINDOWS" class="py-name" href="#" onclick="return doclink('link-193', 'DEBUG_WINDOWS', 'link-18');">DEBUG_WINDOWS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">dww</tt> </tt>
+<a name="L690"></a><tt class="py-lineno"> 690</tt> <tt class="py-line"> <tt class="py-name">lines</tt> <tt class="py-op">=</tt> <tt class="py-name">dww</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt> </tt>
+<a name="L691"></a><tt class="py-lineno"> 691</tt> <tt class="py-line"> <tt class="py-name">widRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *Window #%s Window{%s (u\d+ )?%s?.*}:'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L692"></a><tt class="py-lineno"> 692</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-194" class="py-name" targets="Function src.com.dtmilano.android.viewclient.__nd()=src.com.dtmilano.android.viewclient-module.html#__nd"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-194', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'num'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-195" class="py-name" targets="Function src.com.dtmilano.android.viewclient.__nh()=src.com.dtmilano.android.viewclient-module.html#__nh"><a title="src.com.dtmilano.android.viewclient.__nh" class="py-name" href="#" onclick="return doclink('link-195', '__nh', 'link-195');">__nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-196" class="py-name" targets="Function src.com.dtmilano.android.viewclient.__ns()=src.com.dtmilano.android.viewclient-module.html#__ns"><a title="src.com.dtmilano.android.viewclient.__ns" class="py-name" href="#" onclick="return doclink('link-196', '__ns', 'link-196');">__ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'activity'</tt><tt class="py-op">,</tt> <tt class="py-name">greedy</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L693"></a><tt class="py-lineno"> 693</tt> <tt class="py-line"> <tt class="py-name">currentFocusRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ mCurrentFocus=Window{%s .*'</tt> <tt class="py-op">%</tt> <tt id="link-197" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nh" class="py-name" href="#" onclick="return doclink('link-197', '__nh', 'link-195');">__nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L694"></a><tt class="py-lineno"> 694</tt> <tt class="py-line"> <tt class="py-name">viewVisibilityRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">' mViewVisibility=0x%s '</tt> <tt class="py-op">%</tt> <tt id="link-198" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nh" class="py-name" href="#" onclick="return doclink('link-198', '__nh', 'link-195');">__nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'visibility'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L695"></a><tt class="py-lineno"> 695</tt> <tt class="py-line"> <tt class="py-comment"># This is for 4.0.4 API-15</tt> </tt>
+<a name="L696"></a><tt class="py-lineno"> 696</tt> <tt class="py-line"> <tt class="py-name">containingFrameRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *mContainingFrame=\[%s,%s\]\[%s,%s\] mParentFrame=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L697"></a><tt class="py-lineno"> 697</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-199" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-199', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-200" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-200', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-201" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-201', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-202" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-202', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ch'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-203" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-203', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-204" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-204', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-205" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-205', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'pw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-206" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-206', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ph'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L698"></a><tt class="py-lineno"> 698</tt> <tt class="py-line"> <tt class="py-name">contentFrameRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *mContentFrame=\[%s,%s\]\[%s,%s\] mVisibleFrame=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L699"></a><tt class="py-lineno"> 699</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-207" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-207', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'x'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-208" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-208', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'y'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-209" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-209', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-210" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-210', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'h'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-211" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-211', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-212" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-212', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-213" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-213', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-214" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-214', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L700"></a><tt class="py-lineno"> 700</tt> <tt class="py-line"> <tt class="py-comment"># This is for 4.1 API-16</tt> </tt>
+<a name="L701"></a><tt class="py-lineno"> 701</tt> <tt class="py-line"> <tt class="py-name">framesRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *Frames: containing=\[%s,%s\]\[%s,%s\] parent=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L702"></a><tt class="py-lineno"> 702</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-215" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-215', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-216" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-216', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-217" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-217', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'cw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-218" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-218', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ch'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-219" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-219', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'px'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-220" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-220', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'py'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-221" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-221', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'pw'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-222" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-222', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'ph'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L703"></a><tt class="py-lineno"> 703</tt> <tt class="py-line"> <tt class="py-name">contentRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^ *content=\[%s,%s\]\[%s,%s\] visible=\[%s,%s\]\[%s,%s\]'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L704"></a><tt class="py-lineno"> 704</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt id="link-223" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-223', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'x'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-224" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-224', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'y'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-225" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-225', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-226" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-226', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'h'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-227" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-227', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-228" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-228', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-229" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-229', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vx1'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-230" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-230', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'vy1'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L705"></a><tt class="py-lineno"> 705</tt> <tt class="py-line"> <tt class="py-name">policyVisibilityRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'mPolicyVisibility=%s '</tt> <tt class="py-op">%</tt> <tt id="link-231" class="py-name"><a title="src.com.dtmilano.android.viewclient.__ns" class="py-name" href="#" onclick="return doclink('link-231', '__ns', 'link-196');">__ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'policyVisibility'</tt><tt class="py-op">,</tt> <tt class="py-name">greedy</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L706"></a><tt class="py-lineno"> 706</tt> <tt class="py-line"> </tt>
+<a name="L707"></a><tt class="py-lineno"> 707</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">l</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L708"></a><tt class="py-lineno"> 708</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">widRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L709"></a><tt class="py-lineno"> 709</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L710"></a><tt class="py-lineno"> 710</tt> <tt class="py-line"> <tt class="py-name">num</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'num'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L711"></a><tt class="py-lineno"> 711</tt> <tt class="py-line"> <tt class="py-name">winId</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L712"></a><tt class="py-lineno"> 712</tt> <tt class="py-line"> <tt class="py-name">activity</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'activity'</tt><tt class="py-op">)</tt> </tt>
+<a name="L713"></a><tt class="py-lineno"> 713</tt> <tt class="py-line"> <tt class="py-name">wvx</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L714"></a><tt class="py-lineno"> 714</tt> <tt class="py-line"> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L715"></a><tt class="py-lineno"> 715</tt> <tt class="py-line"> <tt class="py-name">wvw</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L716"></a><tt class="py-lineno"> 716</tt> <tt class="py-line"> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L717"></a><tt class="py-lineno"> 717</tt> <tt class="py-line"> <tt class="py-name">px</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L718"></a><tt class="py-lineno"> 718</tt> <tt class="py-line"> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L719"></a><tt class="py-lineno"> 719</tt> <tt class="py-line"> <tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L720"></a><tt class="py-lineno"> 720</tt> <tt class="py-line"> <tt class="py-name">policyVisibility</tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> </tt>
+<a name="L721"></a><tt class="py-lineno"> 721</tt> <tt class="py-line"> </tt>
+<a name="L722"></a><tt class="py-lineno"> 722</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">l2</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">l</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L723"></a><tt class="py-lineno"> 723</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">widRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L724"></a><tt class="py-lineno"> 724</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L725"></a><tt class="py-lineno"> 725</tt> <tt class="py-line"> <tt class="py-name">l</tt> <tt class="py-op">+=</tt> <tt class="py-op">(</tt><tt class="py-name">l2</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L726"></a><tt class="py-lineno"> 726</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L727"></a><tt class="py-lineno"> 727</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">viewVisibilityRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L728"></a><tt class="py-lineno"> 728</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L729"></a><tt class="py-lineno"> 729</tt> <tt class="py-line"> <tt class="py-name">visibility</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'visibility'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L730"></a><tt class="py-lineno"> 730</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-232" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-232', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: visibility="</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt> </tt>
+<a name="L731"></a><tt class="py-lineno"> 731</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-233" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-233', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">17</tt><tt class="py-op">:</tt> </tt>
+<a name="L732"></a><tt class="py-lineno"> 732</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L733"></a><tt class="py-lineno"> 733</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L734"></a><tt class="py-lineno"> 734</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-234" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-234', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">:</tt> </tt>
+<a name="L735"></a><tt class="py-lineno"> 735</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">framesRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L736"></a><tt class="py-lineno"> 736</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L737"></a><tt class="py-lineno"> 737</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-235" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__obtainPxPy()=src.com.dtmilano.android.viewclient.View-class.html#__obtainPxPy"><a title="src.com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-235', '__obtainPxPy', 'link-235');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L738"></a><tt class="py-lineno"> 738</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L739"></a><tt class="py-lineno"> 739</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L740"></a><tt class="py-lineno"> 740</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: the information provided by 'dumpsys window windows' in 4.2.1 (API 16)</tt> </tt>
+<a name="L741"></a><tt class="py-lineno"> 741</tt> <tt class="py-line"> <tt class="py-comment"># when there's a system dialog may not be correct and causes the View coordinates</tt> </tt>
+<a name="L742"></a><tt class="py-lineno"> 742</tt> <tt class="py-line"> <tt class="py-comment"># be offset by this amount, see</tt> </tt>
+<a name="L743"></a><tt class="py-lineno"> 743</tt> <tt class="py-line"> <tt class="py-comment"># https://github.com/dtmilano/AndroidViewClient/issues/29</tt> </tt>
+<a name="L744"></a><tt class="py-lineno"> 744</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-236" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-236', '__obtainVxVy', 'link-192');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L745"></a><tt class="py-lineno"> 745</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-237" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__obtainVwVh()=src.com.dtmilano.android.viewclient.View-class.html#__obtainVwVh"><a title="src.com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-237', '__obtainVwVh', 'link-237');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L746"></a><tt class="py-lineno"> 746</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-238" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-238', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-number">15</tt><tt class="py-op">:</tt> </tt>
+<a name="L747"></a><tt class="py-lineno"> 747</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">containingFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L748"></a><tt class="py-lineno"> 748</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L749"></a><tt class="py-lineno"> 749</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-239" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-239', '__obtainPxPy', 'link-235');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L750"></a><tt class="py-lineno"> 750</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L751"></a><tt class="py-lineno"> 751</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L752"></a><tt class="py-lineno"> 752</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-240" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-240', '__obtainVxVy', 'link-192');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L753"></a><tt class="py-lineno"> 753</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-241" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-241', '__obtainVwVh', 'link-237');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L754"></a><tt class="py-lineno"> 754</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-242" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-242', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L755"></a><tt class="py-lineno"> 755</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">containingFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L756"></a><tt class="py-lineno"> 756</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L757"></a><tt class="py-lineno"> 757</tt> <tt class="py-line"> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-243" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainPxPy" class="py-name" href="#" onclick="return doclink('link-243', '__obtainPxPy', 'link-235');">__obtainPxPy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L758"></a><tt class="py-lineno"> 758</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">contentFrameRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L759"></a><tt class="py-lineno"> 759</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L760"></a><tt class="py-lineno"> 760</tt> <tt class="py-line"> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-244" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainVxVy" class="py-name" href="#" onclick="return doclink('link-244', '__obtainVxVy', 'link-192');">__obtainVxVy</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L761"></a><tt class="py-lineno"> 761</tt> <tt class="py-line"> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-245" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__obtainVwVh" class="py-name" href="#" onclick="return doclink('link-245', '__obtainVwVh', 'link-237');">__obtainVwVh</a></tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">)</tt> </tt>
+<a name="L762"></a><tt class="py-lineno"> 762</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L763"></a><tt class="py-lineno"> 763</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Unsupported Android version %d"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-246" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-246', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L764"></a><tt class="py-lineno"> 764</tt> <tt class="py-line"> </tt>
+<a name="L765"></a><tt class="py-lineno"> 765</tt> <tt class="py-line"> <tt class="py-comment">#print >> sys.stderr, "Searching policyVisibility in", lines[l2]</tt> </tt>
+<a name="L766"></a><tt class="py-lineno"> 766</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">policyVisibilityRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L767"></a><tt class="py-lineno"> 767</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L768"></a><tt class="py-lineno"> 768</tt> <tt class="py-line"> <tt class="py-name">policyVisibility</tt> <tt class="py-op">=</tt> <tt class="py-number">0x0</tt> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'policyVisibility'</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">'true'</tt> <tt class="py-keyword">else</tt> <tt class="py-number">0x8</tt> </tt>
+<a name="L769"></a><tt class="py-lineno"> 769</tt> <tt class="py-line"> </tt>
+<a name="L770"></a><tt class="py-lineno"> 770</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">winId</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt id="link-247" class="py-name" targets="Class src.com.dtmilano.android.viewclient.Window=src.com.dtmilano.android.viewclient.Window-class.html"><a title="src.com.dtmilano.android.viewclient.Window" class="py-name" href="#" onclick="return doclink('link-247', 'Window', 'link-247');">Window</a></tt><tt class="py-op">(</tt><tt class="py-name">num</tt><tt class="py-op">,</tt> <tt class="py-name">winId</tt><tt class="py-op">,</tt> <tt class="py-name">activity</tt><tt class="py-op">,</tt> <tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">wvy</tt><tt class="py-op">,</tt> <tt class="py-name">wvw</tt><tt class="py-op">,</tt> <tt class="py-name">wvh</tt><tt class="py-op">,</tt> <tt class="py-name">px</tt><tt class="py-op">,</tt> <tt class="py-name">py</tt><tt class="py-op">,</tt> <tt class="py-name">visibility</tt> <tt class="py-op">+</tt> <tt class="py-name">policyVisibility</tt><tt class="py-op">)</tt> </tt>
+<a name="L771"></a><tt class="py-lineno"> 771</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L772"></a><tt class="py-lineno"> 772</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">currentFocusRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">lines</tt><tt class="py-op">[</tt><tt class="py-name">l</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L773"></a><tt class="py-lineno"> 773</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L774"></a><tt class="py-lineno"> 774</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'winId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L775"></a><tt class="py-lineno"> 775</tt> <tt class="py-line"> </tt>
+<a name="L776"></a><tt class="py-lineno"> 776</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-keyword">and</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">visibility</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L777"></a><tt class="py-lineno"> 777</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-248" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-248', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt> <tt class="py-keyword">or</tt> <tt class="py-name">debug</tt><tt class="py-op">:</tt> </tt>
+<a name="L778"></a><tt class="py-lineno"> 778</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: focus="</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt> </tt>
+<a name="L779"></a><tt class="py-lineno"> 779</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation:"</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L780"></a><tt class="py-lineno"> 780</tt> <tt class="py-line"> <tt class="py-name">w</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">currentFocus</tt><tt class="py-op">]</tt> </tt>
+<a name="L781"></a><tt class="py-lineno"> 781</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvx</tt><tt class="py-op">,</tt> <tt class="py-name">w</tt><tt class="py-op">.</tt><tt class="py-name">wvy</tt><tt class="py-op">)</tt> </tt>
+<a name="L782"></a><tt class="py-lineno"> 782</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L783"></a><tt class="py-lineno"> 783</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-249" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_COORDS" class="py-name" href="#" onclick="return doclink('link-249', 'DEBUG_COORDS', 'link-12');">DEBUG_COORDS</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__dumpWindowsInformation: (0,0)"</tt> </tt>
+<a name="L784"></a><tt class="py-lineno"> 784</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L785"></a><tt class="py-lineno"> 785</tt> <tt class="py-line"> </tt>
+<a name="View.touch"></a><div id="View.touch-def"><a name="L786"></a><tt class="py-lineno"> 786</tt> <a class="py-toggle" href="#" id="View.touch-toggle" onclick="return toggle('View.touch');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#touch">touch</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">type</tt><tt class="py-op">=</tt><tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">DOWN_AND_UP</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.touch-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.touch-expanded"><a name="L787"></a><tt class="py-lineno"> 787</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L788"></a><tt class="py-lineno"> 788</tt> <tt class="py-line"><tt class="py-docstring"> Touches the center of this C{View}</tt> </tt>
+<a name="L789"></a><tt class="py-lineno"> 789</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L790"></a><tt class="py-lineno"> 790</tt> <tt class="py-line"> </tt>
+<a name="L791"></a><tt class="py-lineno"> 791</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-250" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getCenter()=src.com.dtmilano.android.viewclient.View-class.html#getCenter"><a title="src.com.dtmilano.android.viewclient.View.getCenter" class="py-name" href="#" onclick="return doclink('link-250', 'getCenter', 'link-250');">getCenter</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L792"></a><tt class="py-lineno"> 792</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-251" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_TOUCH" class="py-name" href="#" onclick="return doclink('link-251', 'DEBUG_TOUCH', 'link-14');">DEBUG_TOUCH</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L793"></a><tt class="py-lineno"> 793</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"should touch @ (%d, %d)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">)</tt> </tt>
+<a name="L794"></a><tt class="py-lineno"> 794</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-252" class="py-name" targets="Method src.com.dtmilano.android.viewclient.EditText.type()=src.com.dtmilano.android.viewclient.EditText-class.html#type"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-252', 'type', 'link-252');">type</a></tt> <tt class="py-op">==</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">DOWN_AND_UP</tt><tt class="py-op">:</tt> </tt>
+<a name="L795"></a><tt class="py-lineno"> 795</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-253" class="py-name"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-253', 'WARNINGS', 'link-24');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L796"></a><tt class="py-lineno"> 796</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: touch workaround enabled"</tt> </tt>
+<a name="L797"></a><tt class="py-lineno"> 797</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-254" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.touch()=src.com.dtmilano.android.viewclient.View-class.html#touch"><a title="src.com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-254', 'touch', 'link-254');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">DOWN</tt><tt class="py-op">)</tt> </tt>
+<a name="L798"></a><tt class="py-lineno"> 798</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-255" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.sleep()=src.com.dtmilano.android.viewclient.ViewClient-class.html#sleep"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-255', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">50</tt><tt class="py-op">/</tt><tt class="py-number">1000.0</tt><tt class="py-op">)</tt> </tt>
+<a name="L799"></a><tt class="py-lineno"> 799</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-256" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-256', 'touch', 'link-254');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">+</tt><tt class="py-number">10</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">+</tt><tt class="py-number">10</tt><tt class="py-op">,</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">UP</tt><tt class="py-op">)</tt> </tt>
+<a name="L800"></a><tt class="py-lineno"> 800</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L801"></a><tt class="py-lineno"> 801</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-257" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-257', 'touch', 'link-254');">touch</a></tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">,</tt> <tt id="link-258" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-258', 'type', 'link-252');">type</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L802"></a><tt class="py-lineno"> 802</tt> <tt class="py-line"> </tt>
+<a name="View.allPossibleNamesWithColon"></a><div id="View.allPossibleNamesWithColon-def"><a name="L803"></a><tt class="py-lineno"> 803</tt> <a class="py-toggle" href="#" id="View.allPossibleNamesWithColon-toggle" onclick="return toggle('View.allPossibleNamesWithColon');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.allPossibleNamesWithColon-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.allPossibleNamesWithColon-expanded"><a name="L804"></a><tt class="py-lineno"> 804</tt> <tt class="py-line"> <tt class="py-name">l</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L805"></a><tt class="py-lineno"> 805</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">count</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L806"></a><tt class="py-lineno"> 806</tt> <tt class="py-line"> <tt class="py-name">name</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">"_"</tt><tt class="py-op">,</tt> <tt class="py-string">":"</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L807"></a><tt class="py-lineno"> 807</tt> <tt class="py-line"> <tt class="py-name">l</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+<a name="L808"></a><tt class="py-lineno"> 808</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">l</tt> </tt>
+</div><a name="L809"></a><tt class="py-lineno"> 809</tt> <tt class="py-line"> </tt>
+<a name="View.intersection"></a><div id="View.intersection-def"><a name="L810"></a><tt class="py-lineno"> 810</tt> <a class="py-toggle" href="#" id="View.intersection-toggle" onclick="return toggle('View.intersection');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">l1</tt><tt class="py-op">,</tt> <tt class="py-param">l2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.intersection-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.intersection-expanded"><a name="L811"></a><tt class="py-lineno"> 811</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-259" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.list()=src.com.dtmilano.android.viewclient.ViewClient-class.html#list"><a title="src.com.dtmilano.android.viewclient.ViewClient.list" class="py-name" href="#" onclick="return doclink('link-259', 'list', 'link-259');">list</a></tt><tt class="py-op">(</tt><tt class="py-name">set</tt><tt class="py-op">(</tt><tt class="py-name">l1</tt><tt class="py-op">)</tt> <tt class="py-op">&</tt> <tt class="py-name">set</tt><tt class="py-op">(</tt><tt class="py-name">l2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L812"></a><tt class="py-lineno"> 812</tt> <tt class="py-line"> </tt>
+<a name="View.containsPoint"></a><div id="View.containsPoint-def"><a name="L813"></a><tt class="py-lineno"> 813</tt> <a class="py-toggle" href="#" id="View.containsPoint-toggle" onclick="return toggle('View.containsPoint');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x</tt><tt class="py-op">,</tt> <tt class="py-param">y</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.containsPoint-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.containsPoint-expanded"><a name="L814"></a><tt class="py-lineno"> 814</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">X</tt><tt class="py-op">,</tt> <tt class="py-name">Y</tt><tt class="py-op">,</tt> <tt class="py-name">W</tt><tt class="py-op">,</tt> <tt class="py-name">H</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-260" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getPositionAndSize()=src.com.dtmilano.android.viewclient.View-class.html#getPositionAndSize"><a title="src.com.dtmilano.android.viewclient.View.getPositionAndSize" class="py-name" href="#" onclick="return doclink('link-260', 'getPositionAndSize', 'link-260');">getPositionAndSize</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L815"></a><tt class="py-lineno"> 815</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt> <tt class="py-op">>=</tt> <tt class="py-name">X</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">x</tt> <tt class="py-op"><=</tt> <tt class="py-op">(</tt><tt class="py-name">X</tt><tt class="py-op">+</tt><tt class="py-name">W</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">y</tt> <tt class="py-op">>=</tt> <tt class="py-name">Y</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">y</tt> <tt class="py-op"><=</tt> <tt class="py-op">(</tt><tt class="py-name">Y</tt><tt class="py-op">+</tt><tt class="py-name">H</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L816"></a><tt class="py-lineno"> 816</tt> <tt class="py-line"> </tt>
+<a name="View.add"></a><div id="View.add-def"><a name="L817"></a><tt class="py-lineno"> 817</tt> <a class="py-toggle" href="#" id="View.add-toggle" onclick="return toggle('View.add');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#add">add</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">child</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.add-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.add-expanded"><a name="L818"></a><tt class="py-lineno"> 818</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L819"></a><tt class="py-lineno"> 819</tt> <tt class="py-line"><tt class="py-docstring"> Adds a child</tt> </tt>
+<a name="L820"></a><tt class="py-lineno"> 820</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L821"></a><tt class="py-lineno"> 821</tt> <tt class="py-line"><tt class="py-docstring"> @type child: View</tt> </tt>
+<a name="L822"></a><tt class="py-lineno"> 822</tt> <tt class="py-line"><tt class="py-docstring"> @param child: The child to add</tt> </tt>
+<a name="L823"></a><tt class="py-lineno"> 823</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L824"></a><tt class="py-lineno"> 824</tt> <tt class="py-line"> <tt class="py-name">child</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt> </tt>
+<a name="L825"></a><tt class="py-lineno"> 825</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L826"></a><tt class="py-lineno"> 826</tt> <tt class="py-line"> </tt>
+<a name="View.isClickable"></a><div id="View.isClickable-def"><a name="L827"></a><tt class="py-lineno"> 827</tt> <a class="py-toggle" href="#" id="View.isClickable-toggle" onclick="return toggle('View.isClickable');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.isClickable-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.isClickable-expanded"><a name="L828"></a><tt class="py-lineno"> 828</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-261" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__getattr__()=src.com.dtmilano.android.viewclient.View-class.html#__getattr__"><a title="src.com.dtmilano.android.viewclient.View.__getattr__" class="py-name" href="#" onclick="return doclink('link-261', '__getattr__', 'link-261');">__getattr__</a></tt><tt class="py-op">(</tt><tt class="py-string">'isClickable'</tt><tt class="py-op">)</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L829"></a><tt class="py-lineno"> 829</tt> <tt class="py-line"> </tt>
+<a name="View.variableNameFromId"></a><div id="View.variableNameFromId-def"><a name="L830"></a><tt class="py-lineno"> 830</tt> <a class="py-toggle" href="#" id="View.variableNameFromId-toggle" onclick="return toggle('View.variableNameFromId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.variableNameFromId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.variableNameFromId-expanded"><a name="L831"></a><tt class="py-lineno"> 831</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt id="link-262" class="py-name"><a title="src.com.dtmilano.android.viewclient.ID_RE" class="py-name" href="#" onclick="return doclink('link-262', 'ID_RE', 'link-52');">ID_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-263" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-263', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L832"></a><tt class="py-lineno"> 832</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L833"></a><tt class="py-lineno"> 833</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L834"></a><tt class="py-lineno"> 834</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L835"></a><tt class="py-lineno"> 835</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">+=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt> </tt>
+<a name="L836"></a><tt class="py-lineno"> 836</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^\d'</tt><tt class="py-op">,</tt> <tt class="py-name">var</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L837"></a><tt class="py-lineno"> 837</tt> <tt class="py-line"> <tt class="py-name">var</tt> <tt class="py-op">=</tt> <tt class="py-string">'id_'</tt> <tt class="py-op">+</tt> <tt class="py-name">var</tt> </tt>
+<a name="L838"></a><tt class="py-lineno"> 838</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">var</tt> </tt>
+</div><a name="L839"></a><tt class="py-lineno"> 839</tt> <tt class="py-line"> </tt>
+<a name="View.writeImageToFile"></a><div id="View.writeImageToFile-def"><a name="L840"></a><tt class="py-lineno"> 840</tt> <a class="py-toggle" href="#" id="View.writeImageToFile-toggle" onclick="return toggle('View.writeImageToFile');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">format</tt><tt class="py-op">=</tt><tt class="py-string">"PNG"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.writeImageToFile-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.writeImageToFile-expanded"><a name="L841"></a><tt class="py-lineno"> 841</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L842"></a><tt class="py-lineno"> 842</tt> <tt class="py-line"><tt class="py-docstring"> Write the View image to the specified filename in the specified format.</tt> </tt>
+<a name="L843"></a><tt class="py-lineno"> 843</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L844"></a><tt class="py-lineno"> 844</tt> <tt class="py-line"><tt class="py-docstring"> @type filename: str</tt> </tt>
+<a name="L845"></a><tt class="py-lineno"> 845</tt> <tt class="py-line"><tt class="py-docstring"> @param filename: Absolute path and optional filename receiving the image. If this points to</tt> </tt>
+<a name="L846"></a><tt class="py-lineno"> 846</tt> <tt class="py-line"><tt class="py-docstring"> a directory, then the filename is determined by this View unique ID and</tt> </tt>
+<a name="L847"></a><tt class="py-lineno"> 847</tt> <tt class="py-line"><tt class="py-docstring"> format extension.</tt> </tt>
+<a name="L848"></a><tt class="py-lineno"> 848</tt> <tt class="py-line"><tt class="py-docstring"> @type format: str</tt> </tt>
+<a name="L849"></a><tt class="py-lineno"> 849</tt> <tt class="py-line"><tt class="py-docstring"> @param format: Image format (default format is PNG)</tt> </tt>
+<a name="L850"></a><tt class="py-lineno"> 850</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L851"></a><tt class="py-lineno"> 851</tt> <tt class="py-line"> </tt>
+<a name="L852"></a><tt class="py-lineno"> 852</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L853"></a><tt class="py-lineno"> 853</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"writeImageToFile expects an absolute path"</tt><tt class="py-op">)</tt> </tt>
+<a name="L854"></a><tt class="py-lineno"> 854</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L855"></a><tt class="py-lineno"> 855</tt> <tt class="py-line"> <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-264" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.variableNameFromId()=src.com.dtmilano.android.viewclient.View-class.html#variableNameFromId"><a title="src.com.dtmilano.android.viewclient.View.variableNameFromId" class="py-name" href="#" onclick="return doclink('link-264', 'variableNameFromId', 'link-264');">variableNameFromId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> <tt class="py-op">+</tt> <tt class="py-name">format</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L856"></a><tt class="py-lineno"> 856</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-265" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-265', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L857"></a><tt class="py-lineno"> 857</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"writeImageToFile: saving image to '%s' in %s format"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+<a name="L858"></a><tt class="py-lineno"> 858</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">takeSnapshot</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">getSubImage</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-266" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getPositionAndSize" class="py-name" href="#" onclick="return doclink('link-266', 'getPositionAndSize', 'link-260');">getPositionAndSize</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">writeToFile</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L859"></a><tt class="py-lineno"> 859</tt> <tt class="py-line"> </tt>
+<a name="View.__smallStr__"></a><div id="View.__smallStr__-def"><a name="L860"></a><tt class="py-lineno"> 860</tt> <a class="py-toggle" href="#" id="View.__smallStr__-toggle" onclick="return toggle('View.__smallStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__smallStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__smallStr__-expanded"><a name="L861"></a><tt class="py-lineno"> 861</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L862"></a><tt class="py-lineno"> 862</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L863"></a><tt class="py-lineno"> 863</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> </tt>
+<a name="L864"></a><tt class="py-lineno"> 864</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-267" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-267', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L865"></a><tt class="py-lineno"> 865</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" ] parent="</tt> </tt>
+<a name="L866"></a><tt class="py-lineno"> 866</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-keyword">and</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L867"></a><tt class="py-lineno"> 867</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt> </tt>
+<a name="L868"></a><tt class="py-lineno"> 868</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L869"></a><tt class="py-lineno"> 869</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"None"</tt> </tt>
+<a name="L870"></a><tt class="py-lineno"> 870</tt> <tt class="py-line"> </tt>
+<a name="L871"></a><tt class="py-lineno"> 871</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L872"></a><tt class="py-lineno"> 872</tt> <tt class="py-line"> </tt>
+<a name="View.__tinyStr__"></a><div id="View.__tinyStr__-def"><a name="L873"></a><tt class="py-lineno"> 873</tt> <a class="py-toggle" href="#" id="View.__tinyStr__-toggle" onclick="return toggle('View.__tinyStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__tinyStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__tinyStr__-expanded"><a name="L874"></a><tt class="py-lineno"> 874</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L875"></a><tt class="py-lineno"> 875</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L876"></a><tt class="py-lineno"> 876</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'.*\.'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L877"></a><tt class="py-lineno"> 877</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-268" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-268', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L878"></a><tt class="py-lineno"> 878</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" ]"</tt> </tt>
+<a name="L879"></a><tt class="py-lineno"> 879</tt> <tt class="py-line"> </tt>
+<a name="L880"></a><tt class="py-lineno"> 880</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L881"></a><tt class="py-lineno"> 881</tt> <tt class="py-line"> </tt>
+<a name="View.__microStr__"></a><div id="View.__microStr__-def"><a name="L882"></a><tt class="py-lineno"> 882</tt> <a class="py-toggle" href="#" id="View.__microStr__-toggle" onclick="return toggle('View.__microStr__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__microStr__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__microStr__-expanded"><a name="L883"></a><tt class="py-lineno"> 883</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L884"></a><tt class="py-lineno"> 884</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L885"></a><tt class="py-lineno"> 885</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'.*\.'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L886"></a><tt class="py-lineno"> 886</tt> <tt class="py-line"> <tt class="py-name">id</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-269" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-269', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'id/no_id/'</tt><tt class="py-op">,</tt> <tt class="py-string">'-'</tt><tt class="py-op">)</tt> </tt>
+<a name="L887"></a><tt class="py-lineno"> 887</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">id</tt> </tt>
+<a name="L888"></a><tt class="py-lineno"> 888</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">L</tt><tt class="py-op">,</tt> <tt class="py-name">T</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">R</tt><tt class="py-op">,</tt> <tt class="py-name">B</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-270" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getCoords" class="py-name" href="#" onclick="return doclink('link-270', 'getCoords', 'link-189');">getCoords</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L889"></a><tt class="py-lineno"> 889</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">'@%04d%04d%04d%04d'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">L</tt><tt class="py-op">,</tt> <tt class="py-name">T</tt><tt class="py-op">,</tt> <tt class="py-name">R</tt><tt class="py-op">,</tt> <tt class="py-name">B</tt><tt class="py-op">)</tt> </tt>
+<a name="L890"></a><tt class="py-lineno"> 890</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">''</tt> </tt>
+<a name="L891"></a><tt class="py-lineno"> 891</tt> <tt class="py-line"> </tt>
+<a name="L892"></a><tt class="py-lineno"> 892</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div><a name="L893"></a><tt class="py-lineno"> 893</tt> <tt class="py-line"> </tt>
+<a name="L894"></a><tt class="py-lineno"> 894</tt> <tt class="py-line"> </tt>
+<a name="View.__str__"></a><div id="View.__str__-def"><a name="L895"></a><tt class="py-lineno"> 895</tt> <a class="py-toggle" href="#" id="View.__str__-toggle" onclick="return toggle('View.__str__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="View.__str__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="View.__str__-expanded"><a name="L896"></a><tt class="py-lineno"> 896</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"View["</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L897"></a><tt class="py-lineno"> 897</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L898"></a><tt class="py-lineno"> 898</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">" class="</tt> <tt class="py-op">+</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt id="link-271" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__str__()=src.com.dtmilano.android.viewclient.View-class.html#__str__,Method src.com.dtmilano.android.viewclient.Window.__str__()=src.com.dtmilano.android.viewclient.Window-class.html#__str__"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-271', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">" "</tt> </tt>
+<a name="L899"></a><tt class="py-lineno"> 899</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">a</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L900"></a><tt class="py-lineno"> 900</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">a</tt> <tt class="py-op">+</tt> <tt class="py-string">"="</tt> <tt class="py-op">+</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">a</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">" "</tt> </tt>
+<a name="L901"></a><tt class="py-lineno"> 901</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"] parent="</tt> </tt>
+<a name="L902"></a><tt class="py-lineno"> 902</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">:</tt> </tt>
+<a name="L903"></a><tt class="py-lineno"> 903</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">"class"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">:</tt> </tt>
+<a name="L904"></a><tt class="py-lineno"> 904</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-string">"class"</tt><tt class="py-op">]</tt> </tt>
+<a name="L905"></a><tt class="py-lineno"> 905</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L906"></a><tt class="py-lineno"> 906</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-272" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-272', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-273" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-273', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L907"></a><tt class="py-lineno"> 907</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L908"></a><tt class="py-lineno"> 908</tt> <tt class="py-line"> <tt class="py-name">__str</tt> <tt class="py-op">+=</tt> <tt class="py-string">"None"</tt> </tt>
+<a name="L909"></a><tt class="py-lineno"> 909</tt> <tt class="py-line"> </tt>
+<a name="L910"></a><tt class="py-lineno"> 910</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">__str</tt> </tt>
+</div></div><a name="L911"></a><tt class="py-lineno"> 911</tt> <tt class="py-line"> </tt>
+<a name="TextView"></a><div id="TextView-def"><a name="L912"></a><tt class="py-lineno"> 912</tt> <a class="py-toggle" href="#" id="TextView-toggle" onclick="return toggle('TextView');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.TextView-class.html">TextView</a><tt class="py-op">(</tt><tt class="py-base-class">View</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="TextView-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="TextView-expanded"><a name="L913"></a><tt class="py-lineno"> 913</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L914"></a><tt class="py-lineno"> 914</tt> <tt class="py-line"><tt class="py-docstring"> TextView class.</tt> </tt>
+<a name="L915"></a><tt class="py-lineno"> 915</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L916"></a><tt class="py-lineno"> 916</tt> <tt class="py-line"> </tt>
+<a name="L917"></a><tt class="py-lineno"> 917</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L918"></a><tt class="py-lineno"> 918</tt> <tt class="py-line"> </tt>
+<a name="EditText"></a><div id="EditText-def"><a name="L919"></a><tt class="py-lineno"> 919</tt> <a class="py-toggle" href="#" id="EditText-toggle" onclick="return toggle('EditText');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.EditText-class.html">EditText</a><tt class="py-op">(</tt><tt class="py-base-class">TextView</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="EditText-expanded"><a name="L920"></a><tt class="py-lineno"> 920</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L921"></a><tt class="py-lineno"> 921</tt> <tt class="py-line"><tt class="py-docstring"> EditText class.</tt> </tt>
+<a name="L922"></a><tt class="py-lineno"> 922</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L923"></a><tt class="py-lineno"> 923</tt> <tt class="py-line"> </tt>
+<a name="EditText.type"></a><div id="EditText.type-def"><a name="L924"></a><tt class="py-lineno"> 924</tt> <a class="py-toggle" href="#" id="EditText.type-toggle" onclick="return toggle('EditText.type');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.EditText-class.html#type">type</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText.type-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="EditText.type-expanded"><a name="L925"></a><tt class="py-lineno"> 925</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-274" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-274', 'touch', 'link-254');">touch</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L926"></a><tt class="py-lineno"> 926</tt> <tt class="py-line"> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt id="link-275" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-275', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L927"></a><tt class="py-lineno"> 927</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">c</tt> <tt class="py-keyword">in</tt> <tt class="py-name">text</tt><tt class="py-op">:</tt> </tt>
+<a name="L928"></a><tt class="py-lineno"> 928</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">c</tt> <tt class="py-op">!=</tt> <tt class="py-string">' '</tt><tt class="py-op">:</tt> </tt>
+<a name="L929"></a><tt class="py-lineno"> 929</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt id="link-276" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-276', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">c</tt><tt class="py-op">)</tt> </tt>
+<a name="L930"></a><tt class="py-lineno"> 930</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L931"></a><tt class="py-lineno"> 931</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">press</tt><tt class="py-op">(</tt><tt class="py-string">'KEYCODE_SPACE'</tt><tt class="py-op">,</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">DOWN_AND_UP</tt><tt class="py-op">)</tt> </tt>
+<a name="L932"></a><tt class="py-lineno"> 932</tt> <tt class="py-line"> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt id="link-277" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-277', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L933"></a><tt class="py-lineno"> 933</tt> <tt class="py-line"> </tt>
+<a name="EditText.backspace"></a><div id="EditText.backspace-def"><a name="L934"></a><tt class="py-lineno"> 934</tt> <a class="py-toggle" href="#" id="EditText.backspace-toggle" onclick="return toggle('EditText.backspace');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.EditText-class.html#backspace">backspace</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="EditText.backspace-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="EditText.backspace-expanded"><a name="L935"></a><tt class="py-lineno"> 935</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-278" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.touch" class="py-name" href="#" onclick="return doclink('link-278', 'touch', 'link-254');">touch</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L936"></a><tt class="py-lineno"> 936</tt> <tt class="py-line"> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt id="link-279" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-279', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L937"></a><tt class="py-lineno"> 937</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">press</tt><tt class="py-op">(</tt><tt class="py-string">'KEYCODE_DEL'</tt><tt class="py-op">,</tt> <tt class="py-name">MonkeyDevice</tt><tt class="py-op">.</tt><tt class="py-name">DOWN_AND_UP</tt><tt class="py-op">)</tt> </tt>
+</div></div><a name="L938"></a><tt class="py-lineno"> 938</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient"></a><div id="UiAutomator2AndroidViewClient-def"><a name="L939"></a><tt class="py-lineno"> 939</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient-toggle" onclick="return toggle('UiAutomator2AndroidViewClient');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html">UiAutomator2AndroidViewClient</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="UiAutomator2AndroidViewClient-expanded"><a name="L940"></a><tt class="py-lineno"> 940</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L941"></a><tt class="py-lineno"> 941</tt> <tt class="py-line"><tt class="py-docstring"> UiAutomator XML to AndroidViewClient</tt> </tt>
+<a name="L942"></a><tt class="py-lineno"> 942</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L943"></a><tt class="py-lineno"> 943</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.__init__"></a><div id="UiAutomator2AndroidViewClient.__init__-def"><a name="L944"></a><tt class="py-lineno"> 944</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.__init__-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">version</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.__init__-expanded"><a name="L945"></a><tt class="py-lineno"> 945</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L946"></a><tt class="py-lineno"> 946</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">version</tt> </tt>
+<a name="L947"></a><tt class="py-lineno"> 947</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L948"></a><tt class="py-lineno"> 948</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L949"></a><tt class="py-lineno"> 949</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L950"></a><tt class="py-lineno"> 950</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L951"></a><tt class="py-lineno"> 951</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+</div><a name="L952"></a><tt class="py-lineno"> 952</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.StartElement"></a><div id="UiAutomator2AndroidViewClient.StartElement-def"><a name="L953"></a><tt class="py-lineno"> 953</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.StartElement-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.StartElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement">StartElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">attributes</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.StartElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.StartElement-expanded"><a name="L954"></a><tt class="py-lineno"> 954</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L955"></a><tt class="py-lineno"> 955</tt> <tt class="py-line"><tt class="py-docstring"> Expat start element event handler</tt> </tt>
+<a name="L956"></a><tt class="py-lineno"> 956</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L957"></a><tt class="py-lineno"> 957</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'hierarchy'</tt><tt class="py-op">:</tt> </tt>
+<a name="L958"></a><tt class="py-lineno"> 958</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L959"></a><tt class="py-lineno"> 959</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'node'</tt><tt class="py-op">:</tt> </tt>
+<a name="L960"></a><tt class="py-lineno"> 960</tt> <tt class="py-line"> <tt class="py-comment"># Instantiate an Element object</tt> </tt>
+<a name="L961"></a><tt class="py-lineno"> 961</tt> <tt class="py-line"> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-string">'id/no_id/%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> </tt>
+<a name="L962"></a><tt class="py-lineno"> 962</tt> <tt class="py-line"> <tt class="py-name">bounds</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'[\][,]'</tt><tt class="py-op">,</tt> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L963"></a><tt class="py-lineno"> 963</tt> <tt class="py-line"> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">bounds</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L964"></a><tt class="py-lineno"> 964</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-280" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_BOUNDS" class="py-name" href="#" onclick="return doclink('link-280', 'DEBUG_BOUNDS', 'link-20');">DEBUG_BOUNDS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L965"></a><tt class="py-lineno"> 965</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"bounds="</tt><tt class="py-op">,</tt> <tt class="py-name">attributes</tt><tt class="py-op">[</tt><tt class="py-string">'bounds'</tt><tt class="py-op">]</tt> </tt>
+<a name="L966"></a><tt class="py-lineno"> 966</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">idCount</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L967"></a><tt class="py-lineno"> 967</tt> <tt class="py-line"> <tt class="py-name">child</tt> <tt class="py-op">=</tt> <tt id="link-281" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-281', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-282" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.View.factory()=src.com.dtmilano.android.viewclient.View-class.html#factory"><a title="src.com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-282', 'factory', 'link-282');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attributes</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">version</tt><tt class="py-op">)</tt> </tt>
+<a name="L968"></a><tt class="py-lineno"> 968</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L969"></a><tt class="py-lineno"> 969</tt> <tt class="py-line"> <tt class="py-comment"># Push element onto the stack and make it a child of parent</tt> </tt>
+<a name="L970"></a><tt class="py-lineno"> 970</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">:</tt> </tt>
+<a name="L971"></a><tt class="py-lineno"> 971</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L972"></a><tt class="py-lineno"> 972</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L973"></a><tt class="py-lineno"> 973</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L974"></a><tt class="py-lineno"> 974</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-283" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.add()=src.com.dtmilano.android.viewclient.View-class.html#add"><a title="src.com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-283', 'add', 'link-283');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L975"></a><tt class="py-lineno"> 975</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L976"></a><tt class="py-lineno"> 976</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.EndElement"></a><div id="UiAutomator2AndroidViewClient.EndElement-def"><a name="L977"></a><tt class="py-lineno"> 977</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.EndElement-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.EndElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement">EndElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.EndElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.EndElement-expanded"><a name="L978"></a><tt class="py-lineno"> 978</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L979"></a><tt class="py-lineno"> 979</tt> <tt class="py-line"><tt class="py-docstring"> Expat end element event handler</tt> </tt>
+<a name="L980"></a><tt class="py-lineno"> 980</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L981"></a><tt class="py-lineno"> 981</tt> <tt class="py-line"> </tt>
+<a name="L982"></a><tt class="py-lineno"> 982</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'hierarchy'</tt><tt class="py-op">:</tt> </tt>
+<a name="L983"></a><tt class="py-lineno"> 983</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L984"></a><tt class="py-lineno"> 984</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'node'</tt><tt class="py-op">:</tt> </tt>
+<a name="L985"></a><tt class="py-lineno"> 985</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L986"></a><tt class="py-lineno"> 986</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.CharacterData"></a><div id="UiAutomator2AndroidViewClient.CharacterData-def"><a name="L987"></a><tt class="py-lineno"> 987</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.CharacterData-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.CharacterData');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData">CharacterData</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">data</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.CharacterData-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.CharacterData-expanded"><a name="L988"></a><tt class="py-lineno"> 988</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L989"></a><tt class="py-lineno"> 989</tt> <tt class="py-line"><tt class="py-docstring"> Expat character data event handler</tt> </tt>
+<a name="L990"></a><tt class="py-lineno"> 990</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L991"></a><tt class="py-lineno"> 991</tt> <tt class="py-line"> </tt>
+<a name="L992"></a><tt class="py-lineno"> 992</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L993"></a><tt class="py-lineno"> 993</tt> <tt class="py-line"> <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L994"></a><tt class="py-lineno"> 994</tt> <tt class="py-line"> <tt class="py-name">element</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">nodeStack</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L995"></a><tt class="py-lineno"> 995</tt> <tt class="py-line"> <tt class="py-name">element</tt><tt class="py-op">.</tt><tt class="py-name">cdata</tt> <tt class="py-op">+=</tt> <tt class="py-name">data</tt> </tt>
+</div><a name="L996"></a><tt class="py-lineno"> 996</tt> <tt class="py-line"> </tt>
+<a name="UiAutomator2AndroidViewClient.Parse"></a><div id="UiAutomator2AndroidViewClient.Parse-def"><a name="L997"></a><tt class="py-lineno"> 997</tt> <a class="py-toggle" href="#" id="UiAutomator2AndroidViewClient.Parse-toggle" onclick="return toggle('UiAutomator2AndroidViewClient.Parse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse">Parse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">uiautomatorxml</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="UiAutomator2AndroidViewClient.Parse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="UiAutomator2AndroidViewClient.Parse-expanded"><a name="L998"></a><tt class="py-lineno"> 998</tt> <tt class="py-line"> <tt class="py-comment"># Create an Expat parser</tt> </tt>
+<a name="L999"></a><tt class="py-lineno"> 999</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ParserCreate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1000"></a><tt class="py-lineno">1000</tt> <tt class="py-line"> <tt class="py-comment"># Set the Expat event handlers to our methods</tt> </tt>
+<a name="L1001"></a><tt class="py-lineno">1001</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">StartElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-284" class="py-name" targets="Method src.com.dtmilano.android.viewclient.Excerpt2Code.StartElement()=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement,Method src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement()=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#StartElement"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.StartElement
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement" class="py-name" href="#" onclick="return doclink('link-284', 'StartElement', 'link-284');">StartElement</a></tt> </tt>
+<a name="L1002"></a><tt class="py-lineno">1002</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">EndElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-285" class="py-name" targets="Method src.com.dtmilano.android.viewclient.Excerpt2Code.EndElement()=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement,Method src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement()=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#EndElement"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.EndElement
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement" class="py-name" href="#" onclick="return doclink('link-285', 'EndElement', 'link-285');">EndElement</a></tt> </tt>
+<a name="L1003"></a><tt class="py-lineno">1003</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">CharacterDataHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-286" class="py-name" targets="Method src.com.dtmilano.android.viewclient.Excerpt2Code.CharacterData()=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData,Method src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData()=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#CharacterData"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.CharacterData
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData" class="py-name" href="#" onclick="return doclink('link-286', 'CharacterData', 'link-286');">CharacterData</a></tt> </tt>
+<a name="L1004"></a><tt class="py-lineno">1004</tt> <tt class="py-line"> <tt class="py-comment"># Parse the XML File</tt> </tt>
+<a name="L1005"></a><tt class="py-lineno">1005</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1006"></a><tt class="py-lineno">1006</tt> <tt class="py-line"> <tt class="py-name">parserStatus</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-287" class="py-name" targets="Method src.com.dtmilano.android.viewclient.Excerpt2Code.Parse()=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse,Method src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse()=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html#Parse"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.Parse
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-287', 'Parse', 'link-287');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">uiautomatorxml</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1007"></a><tt class="py-lineno">1007</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ExpatError</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1008"></a><tt class="py-lineno">1008</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: Offending XML:\n"</tt><tt class="py-op">,</tt> <tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">uiautomatorxml</tt><tt class="py-op">)</tt> </tt>
+<a name="L1009"></a><tt class="py-lineno">1009</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-name">ex</tt><tt class="py-op">)</tt> </tt>
+<a name="L1010"></a><tt class="py-lineno">1010</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+</div></div><a name="L1011"></a><tt class="py-lineno">1011</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code"></a><div id="Excerpt2Code-def"><a name="L1012"></a><tt class="py-lineno">1012</tt> <a class="py-toggle" href="#" id="Excerpt2Code-toggle" onclick="return toggle('Excerpt2Code');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html">Excerpt2Code</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="Excerpt2Code-expanded"><a name="L1013"></a><tt class="py-lineno">1013</tt> <tt class="py-line"> <tt class="py-docstring">''' Excerpt XML to code '''</tt> </tt>
+<a name="L1014"></a><tt class="py-lineno">1014</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.__init__"></a><div id="Excerpt2Code.__init__-def"><a name="L1015"></a><tt class="py-lineno">1015</tt> <a class="py-toggle" href="#" id="Excerpt2Code.__init__-toggle" onclick="return toggle('Excerpt2Code.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.__init__-expanded"><a name="L1016"></a><tt class="py-lineno">1016</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L1017"></a><tt class="py-lineno">1017</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.StartElement"></a><div id="Excerpt2Code.StartElement-def"><a name="L1018"></a><tt class="py-lineno">1018</tt> <a class="py-toggle" href="#" id="Excerpt2Code.StartElement-toggle" onclick="return toggle('Excerpt2Code.StartElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#StartElement">StartElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">,</tt> <tt class="py-param">attributes</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.StartElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.StartElement-expanded"><a name="L1019"></a><tt class="py-lineno">1019</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1020"></a><tt class="py-lineno">1020</tt> <tt class="py-line"><tt class="py-docstring"> Expat start element event handler</tt> </tt>
+<a name="L1021"></a><tt class="py-lineno">1021</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1022"></a><tt class="py-lineno">1022</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'excerpt'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1023"></a><tt class="py-lineno">1023</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1024"></a><tt class="py-lineno">1024</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1025"></a><tt class="py-lineno">1025</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Unexpected element: '%s'"</tt> <tt class="py-op">%</tt> <tt class="py-name">name</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1026"></a><tt class="py-lineno">1026</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.EndElement"></a><div id="Excerpt2Code.EndElement-def"><a name="L1027"></a><tt class="py-lineno">1027</tt> <a class="py-toggle" href="#" id="Excerpt2Code.EndElement-toggle" onclick="return toggle('Excerpt2Code.EndElement');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#EndElement">EndElement</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.EndElement-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.EndElement-expanded"><a name="L1028"></a><tt class="py-lineno">1028</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1029"></a><tt class="py-lineno">1029</tt> <tt class="py-line"><tt class="py-docstring"> Expat end element event handler</tt> </tt>
+<a name="L1030"></a><tt class="py-lineno">1030</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1031"></a><tt class="py-lineno">1031</tt> <tt class="py-line"> </tt>
+<a name="L1032"></a><tt class="py-lineno">1032</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">name</tt> <tt class="py-op">==</tt> <tt class="py-string">'excerpt'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1033"></a><tt class="py-lineno">1033</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L1034"></a><tt class="py-lineno">1034</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.CharacterData"></a><div id="Excerpt2Code.CharacterData-def"><a name="L1035"></a><tt class="py-lineno">1035</tt> <a class="py-toggle" href="#" id="Excerpt2Code.CharacterData-toggle" onclick="return toggle('Excerpt2Code.CharacterData');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#CharacterData">CharacterData</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">data</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.CharacterData-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.CharacterData-expanded"><a name="L1036"></a><tt class="py-lineno">1036</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1037"></a><tt class="py-lineno">1037</tt> <tt class="py-line"><tt class="py-docstring"> Expat character data event handler</tt> </tt>
+<a name="L1038"></a><tt class="py-lineno">1038</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1039"></a><tt class="py-lineno">1039</tt> <tt class="py-line"> </tt>
+<a name="L1040"></a><tt class="py-lineno">1040</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1041"></a><tt class="py-lineno">1041</tt> <tt class="py-line"> <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1042"></a><tt class="py-lineno">1042</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt><tt class="py-op">:</tt> </tt>
+<a name="L1043"></a><tt class="py-lineno">1043</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">data</tt> </tt>
+<a name="L1044"></a><tt class="py-lineno">1044</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1045"></a><tt class="py-lineno">1045</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> <tt class="py-op">+=</tt> <tt class="py-name">data</tt> </tt>
+</div><a name="L1046"></a><tt class="py-lineno">1046</tt> <tt class="py-line"> </tt>
+<a name="Excerpt2Code.Parse"></a><div id="Excerpt2Code.Parse-def"><a name="L1047"></a><tt class="py-lineno">1047</tt> <a class="py-toggle" href="#" id="Excerpt2Code.Parse-toggle" onclick="return toggle('Excerpt2Code.Parse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html#Parse">Parse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">excerpt</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="Excerpt2Code.Parse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="Excerpt2Code.Parse-expanded"><a name="L1048"></a><tt class="py-lineno">1048</tt> <tt class="py-line"> <tt class="py-comment"># Create an Expat parser</tt> </tt>
+<a name="L1049"></a><tt class="py-lineno">1049</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt class="py-name">xml</tt><tt class="py-op">.</tt><tt class="py-name">parsers</tt><tt class="py-op">.</tt><tt class="py-name">expat</tt><tt class="py-op">.</tt><tt class="py-name">ParserCreate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1050"></a><tt class="py-lineno">1050</tt> <tt class="py-line"> <tt class="py-comment"># Set the Expat event handlers to our methods</tt> </tt>
+<a name="L1051"></a><tt class="py-lineno">1051</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">StartElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-288" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.StartElement
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.StartElement" class="py-name" href="#" onclick="return doclink('link-288', 'StartElement', 'link-284');">StartElement</a></tt> </tt>
+<a name="L1052"></a><tt class="py-lineno">1052</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">EndElementHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-289" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.EndElement
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.EndElement" class="py-name" href="#" onclick="return doclink('link-289', 'EndElement', 'link-285');">EndElement</a></tt> </tt>
+<a name="L1053"></a><tt class="py-lineno">1053</tt> <tt class="py-line"> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">CharacterDataHandler</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-290" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.CharacterData
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.CharacterData" class="py-name" href="#" onclick="return doclink('link-290', 'CharacterData', 'link-286');">CharacterData</a></tt> </tt>
+<a name="L1054"></a><tt class="py-lineno">1054</tt> <tt class="py-line"> <tt class="py-comment"># Parse the XML</tt> </tt>
+<a name="L1055"></a><tt class="py-lineno">1055</tt> <tt class="py-line"> <tt class="py-name">parserStatus</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-291" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.Parse
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-291', 'Parse', 'link-287');">Parse</a></tt><tt class="py-op">(</tt><tt id="link-292" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.excerpt()=src.com.dtmilano.android.viewclient.ViewClient-class.html#excerpt"><a title="src.com.dtmilano.android.viewclient.ViewClient.excerpt" class="py-name" href="#" onclick="return doclink('link-292', 'excerpt', 'link-292');">excerpt</a></tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1056"></a><tt class="py-lineno">1056</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">data</tt> </tt>
+</div></div><a name="L1057"></a><tt class="py-lineno">1057</tt> <tt class="py-line"> </tt>
+<a name="ViewClient"></a><div id="ViewClient-def"><a name="L1058"></a><tt class="py-lineno">1058</tt> <a class="py-toggle" href="#" id="ViewClient-toggle" onclick="return toggle('ViewClient');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html">ViewClient</a><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient-collapsed" style="display:none;" pad="++++" indent="++++"></div><div id="ViewClient-expanded"><a name="L1059"></a><tt class="py-lineno">1059</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1060"></a><tt class="py-lineno">1060</tt> <tt class="py-line"><tt class="py-docstring"> ViewClient is a I{ViewServer} client.</tt> </tt>
+<a name="L1061"></a><tt class="py-lineno">1061</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1062"></a><tt class="py-lineno">1062</tt> <tt class="py-line"><tt class="py-docstring"> ViewServer backend</tt> </tt>
+<a name="L1063"></a><tt class="py-lineno">1063</tt> <tt class="py-line"><tt class="py-docstring"> ==================</tt> </tt>
+<a name="L1064"></a><tt class="py-lineno">1064</tt> <tt class="py-line"><tt class="py-docstring"> If not running the ViewServer is started on the target device or emulator and then the port</tt> </tt>
+<a name="L1065"></a><tt class="py-lineno">1065</tt> <tt class="py-line"><tt class="py-docstring"> mapping is created.</tt> </tt>
+<a name="L1066"></a><tt class="py-lineno">1066</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1067"></a><tt class="py-lineno">1067</tt> <tt class="py-line"><tt class="py-docstring"> UiAutomator backend</tt> </tt>
+<a name="L1068"></a><tt class="py-lineno">1068</tt> <tt class="py-line"><tt class="py-docstring"> ===================</tt> </tt>
+<a name="L1069"></a><tt class="py-lineno">1069</tt> <tt class="py-line"><tt class="py-docstring"> No service is started.</tt> </tt>
+<a name="L1070"></a><tt class="py-lineno">1070</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1071"></a><tt class="py-lineno">1071</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__init__"></a><div id="ViewClient.__init__-def"><a name="L1072"></a><tt class="py-lineno">1072</tt> <a class="py-toggle" href="#" id="ViewClient.__init__-toggle" onclick="return toggle('ViewClient.__init__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">device</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">,</tt> <tt class="py-param">adb</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">autodump</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">forceviewserveruse</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">localport</tt><tt class="py-op">=</tt><tt id="link-293" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-293', 'VIEW_SERVER_PORT', 'link-26');">VIEW_SERVER_PORT</a></tt><tt class="py-op">,</tt> <tt class="py-param">remoteport</tt><tt class="py-op">=</tt><tt id="link-294" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_PORT" class="py-name" href="#" onclick="return doclink('link-294', 'VIEW_SERVER_PORT', 'link-26');">VIEW_SERVER_PORT</a></tt><tt class="py-op">,</tt> <tt class="py-param">startviewserver</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> <tt class="py-param">ignoreuiautomatorkilled</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__init__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__init__-expanded"><a name="L1073"></a><tt class="py-lineno">1073</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1074"></a><tt class="py-lineno">1074</tt> <tt class="py-line"><tt class="py-docstring"> Constructor</tt> </tt>
+<a name="L1075"></a><tt class="py-lineno">1075</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1076"></a><tt class="py-lineno">1076</tt> <tt class="py-line"><tt class="py-docstring"> @type device: MonkeyDevice</tt> </tt>
+<a name="L1077"></a><tt class="py-lineno">1077</tt> <tt class="py-line"><tt class="py-docstring"> @param device: The device running the C{View server} to which this client will connect</tt> </tt>
+<a name="L1078"></a><tt class="py-lineno">1078</tt> <tt class="py-line"><tt class="py-docstring"> @type serialno: str</tt> </tt>
+<a name="L1079"></a><tt class="py-lineno">1079</tt> <tt class="py-line"><tt class="py-docstring"> @param serialno: the serial number of the device or emulator to connect to</tt> </tt>
+<a name="L1080"></a><tt class="py-lineno">1080</tt> <tt class="py-line"><tt class="py-docstring"> @type adb: str</tt> </tt>
+<a name="L1081"></a><tt class="py-lineno">1081</tt> <tt class="py-line"><tt class="py-docstring"> @param adb: the path of the C{adb} executable or None and C{ViewClient} will try to find it</tt> </tt>
+<a name="L1082"></a><tt class="py-lineno">1082</tt> <tt class="py-line"><tt class="py-docstring"> @type autodump: boolean</tt> </tt>
+<a name="L1083"></a><tt class="py-lineno">1083</tt> <tt class="py-line"><tt class="py-docstring"> @param autodump: whether an automatic dump is performed at the end of this constructor</tt> </tt>
+<a name="L1084"></a><tt class="py-lineno">1084</tt> <tt class="py-line"><tt class="py-docstring"> @type forceviewserveruse: boolean</tt> </tt>
+<a name="L1085"></a><tt class="py-lineno">1085</tt> <tt class="py-line"><tt class="py-docstring"> @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions to use</tt> </tt>
+<a name="L1086"></a><tt class="py-lineno">1086</tt> <tt class="py-line"><tt class="py-docstring"> C{UiAutomator} are satisfied </tt> </tt>
+<a name="L1087"></a><tt class="py-lineno">1087</tt> <tt class="py-line"><tt class="py-docstring"> @type localport: int</tt> </tt>
+<a name="L1088"></a><tt class="py-lineno">1088</tt> <tt class="py-line"><tt class="py-docstring"> @param localport: the local port used in the redirection</tt> </tt>
+<a name="L1089"></a><tt class="py-lineno">1089</tt> <tt class="py-line"><tt class="py-docstring"> @type remoteport: int</tt> </tt>
+<a name="L1090"></a><tt class="py-lineno">1090</tt> <tt class="py-line"><tt class="py-docstring"> @param remoteport: the remote port used to start the C{ViewServer} in the device or</tt> </tt>
+<a name="L1091"></a><tt class="py-lineno">1091</tt> <tt class="py-line"><tt class="py-docstring"> emulator</tt> </tt>
+<a name="L1092"></a><tt class="py-lineno">1092</tt> <tt class="py-line"><tt class="py-docstring"> @type startviewserver: boolean</tt> </tt>
+<a name="L1093"></a><tt class="py-lineno">1093</tt> <tt class="py-line"><tt class="py-docstring"> @param startviewserver: Whether to start the B{global} ViewServer</tt> </tt>
+<a name="L1094"></a><tt class="py-lineno">1094</tt> <tt class="py-line"><tt class="py-docstring"> @type ignoreuiautomatorkilled: boolean</tt> </tt>
+<a name="L1095"></a><tt class="py-lineno">1095</tt> <tt class="py-line"><tt class="py-docstring"> @param ignoreuiautomatorkilled: Ignores received B{Killed} message from C{uiautomator}</tt> </tt>
+<a name="L1096"></a><tt class="py-lineno">1096</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1097"></a><tt class="py-lineno">1097</tt> <tt class="py-line"> </tt>
+<a name="L1098"></a><tt class="py-lineno">1098</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">device</tt><tt class="py-op">:</tt> </tt>
+<a name="L1099"></a><tt class="py-lineno">1099</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'Device is not connected'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1100"></a><tt class="py-lineno">1100</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt> </tt>
+<a name="L1101"></a><tt class="py-lineno">1101</tt> <tt class="py-line"> <tt class="py-string">''' The C{MonkeyDevice} device instance '''</tt> </tt>
+<a name="L1102"></a><tt class="py-lineno">1102</tt> <tt class="py-line"> </tt>
+<a name="L1103"></a><tt class="py-lineno">1103</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1104"></a><tt class="py-lineno">1104</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Serialno cannot be None"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1105"></a><tt class="py-lineno">1105</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-295" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__mapSerialNo()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo"><a title="src.com.dtmilano.android.viewclient.ViewClient.__mapSerialNo" class="py-name" href="#" onclick="return doclink('link-295', '__mapSerialNo', 'link-295');">__mapSerialNo</a></tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L1106"></a><tt class="py-lineno">1106</tt> <tt class="py-line"> <tt class="py-string">''' The serial number of the device '''</tt> </tt>
+<a name="L1107"></a><tt class="py-lineno">1107</tt> <tt class="py-line"> </tt>
+<a name="L1108"></a><tt class="py-lineno">1108</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-296" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-296', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: using device with serialno"</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> </tt>
+<a name="L1109"></a><tt class="py-lineno">1109</tt> <tt class="py-line"> </tt>
+<a name="L1110"></a><tt class="py-lineno">1110</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">adb</tt><tt class="py-op">:</tt> </tt>
+<a name="L1111"></a><tt class="py-lineno">1111</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt class="py-name">adb</tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1112"></a><tt class="py-lineno">1112</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'adb="%s" is not executable'</tt> <tt class="py-op">%</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt> </tt>
+<a name="L1113"></a><tt class="py-lineno">1113</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1114"></a><tt class="py-lineno">1114</tt> <tt class="py-line"> <tt class="py-name">adb</tt> <tt class="py-op">=</tt> <tt id="link-297" class="py-name" targets="Class src.com.dtmilano.android.viewclient.ViewClient=src.com.dtmilano.android.viewclient.ViewClient-class.html"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-297', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-298" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath"><a title="src.com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath" class="py-name" href="#" onclick="return doclink('link-298', '__obtainAdbPath', 'link-298');">__obtainAdbPath</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1115"></a><tt class="py-lineno">1115</tt> <tt class="py-line"> </tt>
+<a name="L1116"></a><tt class="py-lineno">1116</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">adb</tt> <tt class="py-op">=</tt> <tt class="py-name">adb</tt> </tt>
+<a name="L1117"></a><tt class="py-lineno">1117</tt> <tt class="py-line"> <tt class="py-string">''' The adb command '''</tt> </tt>
+<a name="L1118"></a><tt class="py-lineno">1118</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1119"></a><tt class="py-lineno">1119</tt> <tt class="py-line"> <tt class="py-string">''' The root node '''</tt> </tt>
+<a name="L1120"></a><tt class="py-lineno">1120</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1121"></a><tt class="py-lineno">1121</tt> <tt class="py-line"> <tt class="py-string">''' The map containing all the L{View}s indexed by their L{View.getUniqueId()} '''</tt> </tt>
+<a name="L1122"></a><tt class="py-lineno">1122</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1123"></a><tt class="py-lineno">1123</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's display properties: width, height and density '''</tt> </tt>
+<a name="L1124"></a><tt class="py-lineno">1124</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt> <tt class="py-string">'width'</tt><tt class="py-op">,</tt> <tt class="py-string">'height'</tt><tt class="py-op">,</tt> <tt class="py-string">'density'</tt> <tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1125"></a><tt class="py-lineno">1125</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1126"></a><tt class="py-lineno">1126</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-299" class="py-name"><a title="src.com.dtmilano.android.viewclient.USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-299', 'USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES', 'link-29');">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1127"></a><tt class="py-lineno">1127</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1128"></a><tt class="py-lineno">1128</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">display</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'display.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1129"></a><tt class="py-lineno">1129</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1130"></a><tt class="py-lineno">1130</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-300" class="py-name"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-300', 'WARNINGS', 'link-24');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1131"></a><tt class="py-lineno">1131</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine display %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1132"></a><tt class="py-lineno">1132</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1133"></a><tt class="py-lineno">1133</tt> <tt class="py-line"> <tt class="py-comment"># these values are usually not defined as properties, so we stick to the -1 set</tt> </tt>
+<a name="L1134"></a><tt class="py-lineno">1134</tt> <tt class="py-line"> <tt class="py-comment"># before</tt> </tt>
+<a name="L1135"></a><tt class="py-lineno">1135</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1136"></a><tt class="py-lineno">1136</tt> <tt class="py-line"> </tt>
+<a name="L1137"></a><tt class="py-lineno">1137</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1138"></a><tt class="py-lineno">1138</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's build properties: version.sdk, version.release '''</tt> </tt>
+<a name="L1139"></a><tt class="py-lineno">1139</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt><tt id="link-301" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-301', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">,</tt> <tt class="py-string">'version.release'</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1140"></a><tt class="py-lineno">1140</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1141"></a><tt class="py-lineno">1141</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1142"></a><tt class="py-lineno">1142</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-302" class="py-name"><a title="src.com.dtmilano.android.viewclient.USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES" class="py-name" href="#" onclick="return doclink('link-302', 'USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES', 'link-29');">USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1143"></a><tt class="py-lineno">1143</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'build.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1144"></a><tt class="py-lineno">1144</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1145"></a><tt class="py-lineno">1145</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.build.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1146"></a><tt class="py-lineno">1146</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1147"></a><tt class="py-lineno">1147</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-303" class="py-name"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-303', 'WARNINGS', 'link-24');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1148"></a><tt class="py-lineno">1148</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine build %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1149"></a><tt class="py-lineno">1149</tt> <tt class="py-line"> </tt>
+<a name="L1150"></a><tt class="py-lineno">1150</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">prop</tt> <tt class="py-op">==</tt> <tt id="link-304" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-304', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1151"></a><tt class="py-lineno">1151</tt> <tt class="py-line"> <tt class="py-comment"># we expect it to be an int</tt> </tt>
+<a name="L1152"></a><tt class="py-lineno">1152</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-keyword">else</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1153"></a><tt class="py-lineno">1153</tt> <tt class="py-line"> </tt>
+<a name="L1154"></a><tt class="py-lineno">1154</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1155"></a><tt class="py-lineno">1155</tt> <tt class="py-line"> <tt class="py-string">''' The map containing the device's ro properties: secure, debuggable '''</tt> </tt>
+<a name="L1156"></a><tt class="py-lineno">1156</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">prop</tt> <tt class="py-keyword">in</tt> <tt class="py-op">[</tt><tt class="py-string">'secure'</tt><tt class="py-op">,</tt> <tt class="py-string">'debuggable'</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1157"></a><tt class="py-lineno">1157</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1158"></a><tt class="py-lineno">1158</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.'</tt> <tt class="py-op">+</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1159"></a><tt class="py-lineno">1159</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1160"></a><tt class="py-lineno">1160</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-305" class="py-name"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-305', 'WARNINGS', 'link-24');">WARNINGS</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1161"></a><tt class="py-lineno">1161</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't determine ro %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">prop</tt><tt class="py-op">)</tt> </tt>
+<a name="L1162"></a><tt class="py-lineno">1162</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-name">prop</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-string">'UNKNOWN'</tt> </tt>
+<a name="L1163"></a><tt class="py-lineno">1163</tt> <tt class="py-line"> </tt>
+<a name="L1164"></a><tt class="py-lineno">1164</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt> <tt class="py-op">=</tt> <tt class="py-name">forceviewserveruse</tt> </tt>
+<a name="L1165"></a><tt class="py-lineno">1165</tt> <tt class="py-line"> <tt class="py-string">''' Force the use of ViewServer even if the conditions to use UiAutomator are satisfied '''</tt> </tt>
+<a name="L1166"></a><tt class="py-lineno">1166</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-306" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-306', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op">>=</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">forceviewserveruse</tt> <tt class="py-comment"># jelly bean 4.1 & 4.2</tt> </tt>
+<a name="L1167"></a><tt class="py-lineno">1167</tt> <tt class="py-line"> <tt class="py-string">''' If UIAutomator is supported by the device it will be used '''</tt> </tt>
+<a name="L1168"></a><tt class="py-lineno">1168</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ignoreUiAutomatorKilled</tt> <tt class="py-op">=</tt> <tt class="py-name">ignoreuiautomatorkilled</tt> </tt>
+<a name="L1169"></a><tt class="py-lineno">1169</tt> <tt class="py-line"> <tt class="py-string">''' On some devices (i.e. Nexus 7 running 4.2.2) uiautomator is killed just after generating</tt> </tt>
+<a name="L1170"></a><tt class="py-lineno">1170</tt> <tt class="py-line"><tt class="py-string"> the dump file. In many cases the file is already complete so we can ask to ignore the 'Killed'</tt> </tt>
+<a name="L1171"></a><tt class="py-lineno">1171</tt> <tt class="py-line"><tt class="py-string"> message by setting L{ignoreuiautomatorkilled} to C{True}.</tt> </tt>
+<a name="L1172"></a><tt class="py-lineno">1172</tt> <tt class="py-line"><tt class="py-string"> </tt> </tt>
+<a name="L1173"></a><tt class="py-lineno">1173</tt> <tt class="py-line"><tt class="py-string"> Changes in 2.3.21 that uses C{/dev/tty} instead of a file may have turned this variable</tt> </tt>
+<a name="L1174"></a><tt class="py-lineno">1174</tt> <tt class="py-line"><tt class="py-string"> unnnecessary, however it has been kept for backward compatibility.</tt> </tt>
+<a name="L1175"></a><tt class="py-lineno">1175</tt> <tt class="py-line"><tt class="py-string"> '''</tt> </tt>
+<a name="L1176"></a><tt class="py-lineno">1176</tt> <tt class="py-line"> </tt>
+<a name="L1177"></a><tt class="py-lineno">1177</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1178"></a><tt class="py-lineno">1178</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-307" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR" class="py-name" href="#" onclick="return doclink('link-307', 'TEXT_PROPERTY_UI_AUTOMATOR', 'link-36');">TEXT_PROPERTY_UI_AUTOMATOR</a></tt> </tt>
+<a name="L1179"></a><tt class="py-lineno">1179</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1180"></a><tt class="py-lineno">1180</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-308" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-308', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> <tt class="py-op"><=</tt> <tt class="py-number">10</tt><tt class="py-op">:</tt> </tt>
+<a name="L1181"></a><tt class="py-lineno">1181</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-309" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10" class="py-name" href="#" onclick="return doclink('link-309', 'TEXT_PROPERTY_API_10', 'link-35');">TEXT_PROPERTY_API_10</a></tt> </tt>
+<a name="L1182"></a><tt class="py-lineno">1182</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1183"></a><tt class="py-lineno">1183</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt> <tt class="py-op">=</tt> <tt id="link-310" class="py-name"><a title="src.com.dtmilano.android.viewclient.TEXT_PROPERTY" class="py-name" href="#" onclick="return doclink('link-310', 'TEXT_PROPERTY', 'link-34');">TEXT_PROPERTY</a></tt> </tt>
+<a name="L1184"></a><tt class="py-lineno">1184</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">startviewserver</tt><tt class="py-op">:</tt> </tt>
+<a name="L1185"></a><tt class="py-lineno">1185</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-311" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.serviceResponse()=src.com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse"><a title="src.com.dtmilano.android.viewclient.ViewClient.serviceResponse" class="py-name" href="#" onclick="return doclink('link-311', 'serviceResponse', 'link-311');">serviceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'service call window 3'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1186"></a><tt class="py-lineno">1186</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1187"></a><tt class="py-lineno">1187</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-312" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.assertServiceResponse()=src.com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse"><a title="src.com.dtmilano.android.viewclient.ViewClient.assertServiceResponse" class="py-name" href="#" onclick="return doclink('link-312', 'assertServiceResponse', 'link-312');">assertServiceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'service call window 1 i32 %d'</tt> <tt class="py-op">%</tt> </tt>
+<a name="L1188"></a><tt class="py-lineno">1188</tt> <tt class="py-line"> <tt class="py-name">remoteport</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1189"></a><tt class="py-lineno">1189</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1190"></a><tt class="py-lineno">1190</tt> <tt class="py-line"> <tt class="py-name">msg</tt> <tt class="py-op">=</tt> <tt class="py-string">'Cannot start View server.\n'</tt> \ </tt>
+<a name="L1191"></a><tt class="py-lineno">1191</tt> <tt class="py-line"> <tt class="py-string">'This only works on emulator and devices running developer versions.\n'</tt> \ </tt>
+<a name="L1192"></a><tt class="py-lineno">1192</tt> <tt class="py-line"> <tt class="py-string">'Does hierarchyviewer work on your device?\n'</tt> \ </tt>
+<a name="L1193"></a><tt class="py-lineno">1193</tt> <tt class="py-line"> <tt class="py-string">'See https://github.com/dtmilano/AndroidViewClient/wiki/Secure-mode\n\n'</tt> \ </tt>
+<a name="L1194"></a><tt class="py-lineno">1194</tt> <tt class="py-line"> <tt class="py-string">'Device properties:\n'</tt> \ </tt>
+<a name="L1195"></a><tt class="py-lineno">1195</tt> <tt class="py-line"> <tt class="py-string">' ro.secure=%s\n'</tt> \ </tt>
+<a name="L1196"></a><tt class="py-lineno">1196</tt> <tt class="py-line"> <tt class="py-string">' ro.debuggable=%s\n'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-string">'secure'</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ro</tt><tt class="py-op">[</tt><tt class="py-string">'debuggable'</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1197"></a><tt class="py-lineno">1197</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-name">msg</tt><tt class="py-op">)</tt> </tt>
+<a name="L1198"></a><tt class="py-lineno">1198</tt> <tt class="py-line"> </tt>
+<a name="L1199"></a><tt class="py-lineno">1199</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt> <tt class="py-op">=</tt> <tt class="py-name">localport</tt> </tt>
+<a name="L1200"></a><tt class="py-lineno">1200</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">remotePort</tt> <tt class="py-op">=</tt> <tt class="py-name">remoteport</tt> </tt>
+<a name="L1201"></a><tt class="py-lineno">1201</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: it seems there's no way of obtaining the serialno from the MonkeyDevice</tt> </tt>
+<a name="L1202"></a><tt class="py-lineno">1202</tt> <tt class="py-line"> <tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">check_call</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">adb</tt><tt class="py-op">,</tt> <tt class="py-string">'-s'</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt class="py-string">'forward'</tt><tt class="py-op">,</tt> <tt class="py-string">'tcp:%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> </tt>
+<a name="L1203"></a><tt class="py-lineno">1203</tt> <tt class="py-line"> <tt class="py-string">'tcp:%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">remotePort</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1204"></a><tt class="py-lineno">1204</tt> <tt class="py-line"> </tt>
+<a name="L1205"></a><tt class="py-lineno">1205</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1206"></a><tt class="py-lineno">1206</tt> <tt class="py-line"> <tt class="py-string">''' The list of windows as obtained by L{ViewClient.list()} '''</tt> </tt>
+<a name="L1207"></a><tt class="py-lineno">1207</tt> <tt class="py-line"> </tt>
+<a name="L1208"></a><tt class="py-lineno">1208</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">autodump</tt><tt class="py-op">:</tt> </tt>
+<a name="L1209"></a><tt class="py-lineno">1209</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-313" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.dump()=src.com.dtmilano.android.viewclient.ViewClient-class.html#dump"><a title="src.com.dtmilano.android.viewclient.ViewClient.dump" class="py-name" href="#" onclick="return doclink('link-313', 'dump', 'link-313');">dump</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1210"></a><tt class="py-lineno">1210</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__del__"></a><div id="ViewClient.__del__-def"><a name="L1211"></a><tt class="py-lineno">1211</tt> <a class="py-toggle" href="#" id="ViewClient.__del__-toggle" onclick="return toggle('ViewClient.__del__');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__del__">__del__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__del__-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__del__-expanded"><a name="L1212"></a><tt class="py-lineno">1212</tt> <tt class="py-line"> <tt class="py-comment"># should clean up some things</tt> </tt>
+<a name="L1213"></a><tt class="py-lineno">1213</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+</div><a name="L1214"></a><tt class="py-lineno">1214</tt> <tt class="py-line"> </tt>
+<a name="L1215"></a><tt class="py-lineno">1215</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__obtainAdbPath"></a><div id="ViewClient.__obtainAdbPath-def"><a name="L1216"></a><tt class="py-lineno">1216</tt> <a class="py-toggle" href="#" id="ViewClient.__obtainAdbPath-toggle" onclick="return toggle('ViewClient.__obtainAdbPath');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__obtainAdbPath">__obtainAdbPath</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__obtainAdbPath-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__obtainAdbPath-expanded"><a name="L1217"></a><tt class="py-lineno">1217</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1218"></a><tt class="py-lineno">1218</tt> <tt class="py-line"><tt class="py-docstring"> Obtains the ADB path attempting know locations for different OSs</tt> </tt>
+<a name="L1219"></a><tt class="py-lineno">1219</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1220"></a><tt class="py-lineno">1220</tt> <tt class="py-line"> </tt>
+<a name="L1221"></a><tt class="py-lineno">1221</tt> <tt class="py-line"> <tt class="py-name">osName</tt> <tt class="py-op">=</tt> <tt class="py-name">java</tt><tt class="py-op">.</tt><tt class="py-name">lang</tt><tt class="py-op">.</tt><tt class="py-name">System</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'os.name'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1222"></a><tt class="py-lineno">1222</tt> <tt class="py-line"> <tt class="py-name">isWindows</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L1223"></a><tt class="py-lineno">1223</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1224"></a><tt class="py-lineno">1224</tt> <tt class="py-line"> <tt class="py-name">adb</tt> <tt class="py-op">=</tt> <tt class="py-string">'adb.exe'</tt> </tt>
+<a name="L1225"></a><tt class="py-lineno">1225</tt> <tt class="py-line"> <tt class="py-name">isWindows</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1226"></a><tt class="py-lineno">1226</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1227"></a><tt class="py-lineno">1227</tt> <tt class="py-line"> <tt class="py-name">adb</tt> <tt class="py-op">=</tt> <tt class="py-string">'adb'</tt> </tt>
+<a name="L1228"></a><tt class="py-lineno">1228</tt> <tt class="py-line"> </tt>
+<a name="L1229"></a><tt class="py-lineno">1229</tt> <tt class="py-line"> <tt class="py-name">ANDROID_HOME</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_HOME'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'ANDROID_HOME'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">'/opt/android-sdk'</tt> </tt>
+<a name="L1230"></a><tt class="py-lineno">1230</tt> <tt class="py-line"> <tt class="py-name">HOME</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'HOME'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'HOME'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1231"></a><tt class="py-lineno">1231</tt> <tt class="py-line"> </tt>
+<a name="L1232"></a><tt class="py-lineno">1232</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">ANDROID_HOME</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1233"></a><tt class="py-lineno">1233</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1234"></a><tt class="py-lineno">1234</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
+<a name="L1235"></a><tt class="py-lineno">1235</tt> <tt class="py-line"> <tt class="py-name">adb</tt><tt class="py-op">,</tt> </tt>
+<a name="L1236"></a><tt class="py-lineno">1236</tt> <tt class="py-line"> <tt class="py-op">]</tt> </tt>
+<a name="L1237"></a><tt class="py-lineno">1237</tt> <tt class="py-line"> </tt>
+<a name="L1238"></a><tt class="py-lineno">1238</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1239"></a><tt class="py-lineno">1239</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"""C:\Program Files\Android\android-sdk\platform-tools"""</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1240"></a><tt class="py-lineno">1240</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"""C:\Program Files (x86)\Android\android-sdk\platform-tools"""</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1241"></a><tt class="py-lineno">1241</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Linux'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1242"></a><tt class="py-lineno">1242</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1243"></a><tt class="py-lineno">1243</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1244"></a><tt class="py-lineno">1244</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-linux"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1245"></a><tt class="py-lineno">1245</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Mac'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1246"></a><tt class="py-lineno">1246</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1247"></a><tt class="py-lineno">1247</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1248"></a><tt class="py-lineno">1248</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1249"></a><tt class="py-lineno">1249</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"opt"</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1250"></a><tt class="py-lineno">1250</tt> <tt class="py-line"> <tt class="py-name">possibleChoices</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">HOME</tt><tt class="py-op">,</tt> <tt class="py-string">"android-sdk-mac_x86"</tt><tt class="py-op">,</tt> <tt class="py-string">'platform-tools'</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1251"></a><tt class="py-lineno">1251</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1252"></a><tt class="py-lineno">1252</tt> <tt class="py-line"> <tt class="py-comment"># Unsupported OS</tt> </tt>
+<a name="L1253"></a><tt class="py-lineno">1253</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1254"></a><tt class="py-lineno">1254</tt> <tt class="py-line"> </tt>
+<a name="L1255"></a><tt class="py-lineno">1255</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">exeFile</tt> <tt class="py-keyword">in</tt> <tt class="py-name">possibleChoices</tt><tt class="py-op">:</tt> </tt>
+<a name="L1256"></a><tt class="py-lineno">1256</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt class="py-name">exeFile</tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1257"></a><tt class="py-lineno">1257</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">exeFile</tt> </tt>
+<a name="L1258"></a><tt class="py-lineno">1258</tt> <tt class="py-line"> </tt>
+<a name="L1259"></a><tt class="py-lineno">1259</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">path</tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">"PATH"</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">pathsep</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1260"></a><tt class="py-lineno">1260</tt> <tt class="py-line"> <tt class="py-name">exeFile</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt> </tt>
+<a name="L1261"></a><tt class="py-lineno">1261</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">exeFile</tt> <tt class="py-op">!=</tt> <tt class="py-name">None</tt> <tt class="py-keyword">and</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">access</tt><tt class="py-op">(</tt><tt class="py-name">exeFile</tt><tt class="py-op">,</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">X_OK</tt> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">isWindows</tt> <tt class="py-keyword">else</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">F_OK</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1262"></a><tt class="py-lineno">1262</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">exeFile</tt> </tt>
+<a name="L1263"></a><tt class="py-lineno">1263</tt> <tt class="py-line"> </tt>
+<a name="L1264"></a><tt class="py-lineno">1264</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'adb="%s" is not executable. Did you forget to set ANDROID_HOME in the environment?'</tt> <tt class="py-op">%</tt> <tt class="py-name">adb</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1265"></a><tt class="py-lineno">1265</tt> <tt class="py-line"> </tt>
+<a name="L1266"></a><tt class="py-lineno">1266</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__mapSerialNo"></a><div id="ViewClient.__mapSerialNo-def"><a name="L1267"></a><tt class="py-lineno">1267</tt> <a class="py-toggle" href="#" id="ViewClient.__mapSerialNo-toggle" onclick="return toggle('ViewClient.__mapSerialNo');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__mapSerialNo">__mapSerialNo</a><tt class="py-op">(</tt><tt class="py-param">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__mapSerialNo-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__mapSerialNo-expanded"><a name="L1268"></a><tt class="py-lineno">1268</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1269"></a><tt class="py-lineno">1269</tt> <tt class="py-line"> <tt class="py-comment">#ipRE = re.compile('^\d+\.\d+.\d+.\d+$')</tt> </tt>
+<a name="L1270"></a><tt class="py-lineno">1270</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-314" class="py-name"><a title="src.com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-314', 'IP_RE', 'link-51');">IP_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1271"></a><tt class="py-lineno">1271</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-315" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-315', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: adding default port to serialno"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt id="link-316" class="py-name"><a title="src.com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-316', 'ADB_DEFAULT_PORT', 'link-27');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1272"></a><tt class="py-lineno">1272</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> <tt class="py-op">+</tt> <tt class="py-string">':%d'</tt> <tt class="py-op">%</tt> <tt id="link-317" class="py-name"><a title="src.com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-317', 'ADB_DEFAULT_PORT', 'link-27');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1273"></a><tt class="py-lineno">1273</tt> <tt class="py-line"> </tt>
+<a name="L1274"></a><tt class="py-lineno">1274</tt> <tt class="py-line"> <tt class="py-name">ipPortRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'^\d+\.\d+.\d+.\d+:\d+$'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1275"></a><tt class="py-lineno">1275</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">ipPortRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1276"></a><tt class="py-lineno">1276</tt> <tt class="py-line"> <tt class="py-comment"># nothing to map</tt> </tt>
+<a name="L1277"></a><tt class="py-lineno">1277</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1278"></a><tt class="py-lineno">1278</tt> <tt class="py-line"> </tt>
+<a name="L1279"></a><tt class="py-lineno">1279</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"[.*()+]"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1280"></a><tt class="py-lineno">1280</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Regular expression not supported as serialno in ViewClient"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1281"></a><tt class="py-lineno">1281</tt> <tt class="py-line"> </tt>
+<a name="L1282"></a><tt class="py-lineno">1282</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1283"></a><tt class="py-lineno">1283</tt> <tt class="py-line"> </tt>
+<a name="L1284"></a><tt class="py-lineno">1284</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__obtainDeviceSerialNumber"></a><div id="ViewClient.__obtainDeviceSerialNumber-def"><a name="L1285"></a><tt class="py-lineno">1285</tt> <a class="py-toggle" href="#" id="ViewClient.__obtainDeviceSerialNumber-toggle" onclick="return toggle('ViewClient.__obtainDeviceSerialNumber');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber">__obtainDeviceSerialNumber</a><tt class="py-op">(</tt><tt class="py-param">device</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__obtainDeviceSerialNumber-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__obtainDeviceSerialNumber-expanded"><a name="L1286"></a><tt class="py-lineno">1286</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-318" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-318', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ViewClient: obtaining serial number for connected device"</tt> </tt>
+<a name="L1287"></a><tt class="py-lineno">1287</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'ro.serialno'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1288"></a><tt class="py-lineno">1288</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1289"></a><tt class="py-lineno">1289</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.serialno'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1290"></a><tt class="py-lineno">1290</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1291"></a><tt class="py-lineno">1291</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">serialno</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1292"></a><tt class="py-lineno">1292</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1293"></a><tt class="py-lineno">1293</tt> <tt class="py-line"> <tt class="py-name">qemu</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'getprop ro.kernel.qemu'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1294"></a><tt class="py-lineno">1294</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">qemu</tt><tt class="py-op">:</tt> </tt>
+<a name="L1295"></a><tt class="py-lineno">1295</tt> <tt class="py-line"> <tt class="py-name">qemu</tt> <tt class="py-op">=</tt> <tt class="py-name">qemu</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
+<a name="L1296"></a><tt class="py-lineno">1296</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">qemu</tt> <tt class="py-keyword">and</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">qemu</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L1297"></a><tt class="py-lineno">1297</tt> <tt class="py-line"> <tt class="py-comment"># FIXME !!!!!</tt> </tt>
+<a name="L1298"></a><tt class="py-lineno">1298</tt> <tt class="py-line"> <tt class="py-comment"># this must be calculated from somewhere, though using a fixed serialno for now</tt> </tt>
+<a name="L1299"></a><tt class="py-lineno">1299</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Running on emulator but no serial number was specified then 'emulator-5554' is used"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1300"></a><tt class="py-lineno">1300</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-string">'emulator-5554'</tt> </tt>
+<a name="L1301"></a><tt class="py-lineno">1301</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1302"></a><tt class="py-lineno">1302</tt> <tt class="py-line"> <tt class="py-comment"># If there's only one device connected get its serialno</tt> </tt>
+<a name="L1303"></a><tt class="py-lineno">1303</tt> <tt class="py-line"> <tt class="py-name">adb</tt> <tt class="py-op">=</tt> <tt id="link-319" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-319', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-320" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__obtainAdbPath" class="py-name" href="#" onclick="return doclink('link-320', '__obtainAdbPath', 'link-298');">__obtainAdbPath</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1304"></a><tt class="py-lineno">1304</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-321" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-321', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" using adb=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">adb</tt> </tt>
+<a name="L1305"></a><tt class="py-lineno">1305</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">Popen</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt class="py-name">adb</tt><tt class="py-op">,</tt> <tt class="py-string">'get-serialno'</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">stdout</tt><tt class="py-op">=</tt><tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">PIPE</tt><tt class="py-op">,</tt> <tt class="py-name">stderr</tt><tt class="py-op">=</tt><tt class="py-name">subprocess</tt><tt class="py-op">.</tt><tt class="py-name">PIPE</tt><tt class="py-op">,</tt> <tt class="py-name">env</tt><tt class="py-op">=</tt><tt class="py-op">{</tt><tt class="py-op">}</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">communicate</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L1306"></a><tt class="py-lineno">1306</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt> <tt class="py-op">!=</tt> <tt class="py-string">'unknown'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1307"></a><tt class="py-lineno">1307</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">s</tt> </tt>
+<a name="L1308"></a><tt class="py-lineno">1308</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-322" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DEVICE" class="py-name" href="#" onclick="return doclink('link-322', 'DEBUG_DEVICE', 'link-2');">DEBUG_DEVICE</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" serialno=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1309"></a><tt class="py-lineno">1309</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">serialno</tt><tt class="py-op">:</tt> </tt>
+<a name="L1310"></a><tt class="py-lineno">1310</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Couldn't obtain the serialno of the connected device"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1311"></a><tt class="py-lineno">1311</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1312"></a><tt class="py-lineno">1312</tt> <tt class="py-line"> </tt>
+<a name="L1313"></a><tt class="py-lineno">1313</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.setAlarm"></a><div id="ViewClient.setAlarm-def"><a name="L1314"></a><tt class="py-lineno">1314</tt> <a class="py-toggle" href="#" id="ViewClient.setAlarm-toggle" onclick="return toggle('ViewClient.setAlarm');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm">setAlarm</a><tt class="py-op">(</tt><tt class="py-param">timeout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setAlarm-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setAlarm-expanded"><a name="L1315"></a><tt class="py-lineno">1315</tt> <tt class="py-line"> <tt class="py-name">osName</tt> <tt class="py-op">=</tt> <tt class="py-name">java</tt><tt class="py-op">.</tt><tt class="py-name">lang</tt><tt class="py-op">.</tt><tt class="py-name">System</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'os.name'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1316"></a><tt class="py-lineno">1316</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">osName</tt><tt class="py-op">.</tt><tt class="py-name">startswith</tt><tt class="py-op">(</tt><tt class="py-string">'Windows'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> <tt class="py-comment"># alarm is not implemented in Windows</tt> </tt>
+<a name="L1317"></a><tt class="py-lineno">1317</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L1318"></a><tt class="py-lineno">1318</tt> <tt class="py-line"> <tt class="py-name">signal</tt><tt class="py-op">.</tt><tt class="py-name">alarm</tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1319"></a><tt class="py-lineno">1319</tt> <tt class="py-line"> </tt>
+<a name="L1320"></a><tt class="py-lineno">1320</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.connectToDeviceOrExit"></a><div id="ViewClient.connectToDeviceOrExit-def"><a name="L1321"></a><tt class="py-lineno">1321</tt> <a class="py-toggle" href="#" id="ViewClient.connectToDeviceOrExit-toggle" onclick="return toggle('ViewClient.connectToDeviceOrExit');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit">connectToDeviceOrExit</a><tt class="py-op">(</tt><tt class="py-param">timeout</tt><tt class="py-op">=</tt><tt class="py-number">60</tt><tt class="py-op">,</tt> <tt class="py-param">verbose</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">ignoresecuredevice</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> <tt class="py-param">serialno</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.connectToDeviceOrExit-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.connectToDeviceOrExit-expanded"><a name="L1322"></a><tt class="py-lineno">1322</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1323"></a><tt class="py-lineno">1323</tt> <tt class="py-line"><tt class="py-docstring"> Connects to a device which serial number is obtained from the script arguments if available</tt> </tt>
+<a name="L1324"></a><tt class="py-lineno">1324</tt> <tt class="py-line"><tt class="py-docstring"> or using the default regex C{.*}.</tt> </tt>
+<a name="L1325"></a><tt class="py-lineno">1325</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1326"></a><tt class="py-lineno">1326</tt> <tt class="py-line"><tt class="py-docstring"> If the connection is not successful the script exits.</tt> </tt>
+<a name="L1327"></a><tt class="py-lineno">1327</tt> <tt class="py-line"><tt class="py-docstring"> L{MonkeyRunner.waitForConnection()} returns a L{MonkeyDevice} even if the connection failed.</tt> </tt>
+<a name="L1328"></a><tt class="py-lineno">1328</tt> <tt class="py-line"><tt class="py-docstring"> Then, to detect this situation, C{device.wake()} is attempted and if it fails then it is</tt> </tt>
+<a name="L1329"></a><tt class="py-lineno">1329</tt> <tt class="py-line"><tt class="py-docstring"> assumed the previous connection failed.</tt> </tt>
+<a name="L1330"></a><tt class="py-lineno">1330</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1331"></a><tt class="py-lineno">1331</tt> <tt class="py-line"><tt class="py-docstring"> @type timeout: int</tt> </tt>
+<a name="L1332"></a><tt class="py-lineno">1332</tt> <tt class="py-line"><tt class="py-docstring"> @param timeout: timeout for the connection</tt> </tt>
+<a name="L1333"></a><tt class="py-lineno">1333</tt> <tt class="py-line"><tt class="py-docstring"> @type verbose: bool</tt> </tt>
+<a name="L1334"></a><tt class="py-lineno">1334</tt> <tt class="py-line"><tt class="py-docstring"> @param verbose: Verbose output</tt> </tt>
+<a name="L1335"></a><tt class="py-lineno">1335</tt> <tt class="py-line"><tt class="py-docstring"> @type ignoresecuredevice: bool</tt> </tt>
+<a name="L1336"></a><tt class="py-lineno">1336</tt> <tt class="py-line"><tt class="py-docstring"> @param ignoresecuredevice: Ignores the check for a secure device</tt> </tt>
+<a name="L1337"></a><tt class="py-lineno">1337</tt> <tt class="py-line"><tt class="py-docstring"> @type serialno: str</tt> </tt>
+<a name="L1338"></a><tt class="py-lineno">1338</tt> <tt class="py-line"><tt class="py-docstring"> @param serialno: The device or emulator serial number </tt> </tt>
+<a name="L1339"></a><tt class="py-lineno">1339</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1340"></a><tt class="py-lineno">1340</tt> <tt class="py-line"><tt class="py-docstring"> @return: the device and serialno used for the connection</tt> </tt>
+<a name="L1341"></a><tt class="py-lineno">1341</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1342"></a><tt class="py-lineno">1342</tt> <tt class="py-line"> </tt>
+<a name="L1343"></a><tt class="py-lineno">1343</tt> <tt class="py-line"> <tt class="py-name">progname</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">basename</tt><tt class="py-op">(</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1344"></a><tt class="py-lineno">1344</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">serialno</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L1345"></a><tt class="py-lineno">1345</tt> <tt class="py-line"> <tt class="py-comment"># eat all the extra options the invoking script may have added</tt> </tt>
+<a name="L1346"></a><tt class="py-lineno">1346</tt> <tt class="py-line"> <tt class="py-name">args</tt> <tt class="py-op">=</tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt> </tt>
+<a name="L1347"></a><tt class="py-lineno">1347</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">args</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">1</tt> <tt class="py-keyword">and</tt> <tt class="py-name">args</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'-'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1348"></a><tt class="py-lineno">1348</tt> <tt class="py-line"> <tt class="py-name">args</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1349"></a><tt class="py-lineno">1349</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt class="py-name">args</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">args</tt><tt class="py-op">)</tt> <tt class="py-op">></tt> <tt class="py-number">1</tt> <tt class="py-keyword">else</tt> \ </tt>
+<a name="L1350"></a><tt class="py-lineno">1350</tt> <tt class="py-line"> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">[</tt><tt class="py-string">'ANDROID_SERIAL'</tt><tt class="py-op">]</tt> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">environ</tt><tt class="py-op">.</tt><tt class="py-name">has_key</tt><tt class="py-op">(</tt><tt class="py-string">'ANDROID_SERIAL'</tt><tt class="py-op">)</tt> \ </tt>
+<a name="L1351"></a><tt class="py-lineno">1351</tt> <tt class="py-line"> <tt class="py-keyword">else</tt> <tt class="py-string">'.*'</tt> </tt>
+<a name="L1352"></a><tt class="py-lineno">1352</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-323" class="py-name"><a title="src.com.dtmilano.android.viewclient.IP_RE" class="py-name" href="#" onclick="return doclink('link-323', 'IP_RE', 'link-51');">IP_RE</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1353"></a><tt class="py-lineno">1353</tt> <tt class="py-line"> <tt class="py-comment"># If matches an IP address format and port was not specified add the default</tt> </tt>
+<a name="L1354"></a><tt class="py-lineno">1354</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">+=</tt> <tt class="py-string">':%d'</tt> <tt class="py-op">%</tt> <tt id="link-324" class="py-name"><a title="src.com.dtmilano.android.viewclient.ADB_DEFAULT_PORT" class="py-name" href="#" onclick="return doclink('link-324', 'ADB_DEFAULT_PORT', 'link-27');">ADB_DEFAULT_PORT</a></tt> </tt>
+<a name="L1355"></a><tt class="py-lineno">1355</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1356"></a><tt class="py-lineno">1356</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Connecting to a device with serialno=%s with a timeout of %d secs...'</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L1357"></a><tt class="py-lineno">1357</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt class="py-name">timeout</tt><tt class="py-op">)</tt> </tt>
+<a name="L1358"></a><tt class="py-lineno">1358</tt> <tt class="py-line"> <tt class="py-comment"># Sometimes MonkeyRunner doesn't even timeout (i.e. two connections from same process), so let's</tt> </tt>
+<a name="L1359"></a><tt class="py-lineno">1359</tt> <tt class="py-line"> <tt class="py-comment"># handle it here</tt> </tt>
+<a name="L1360"></a><tt class="py-lineno">1360</tt> <tt class="py-line"> <tt id="link-325" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-325', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-326" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.setAlarm()=src.com.dtmilano.android.viewclient.ViewClient-class.html#setAlarm"><a title="src.com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-326', 'setAlarm', 'link-326');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">+</tt><tt class="py-number">5</tt><tt class="py-op">)</tt> </tt>
+<a name="L1361"></a><tt class="py-lineno">1361</tt> <tt class="py-line"> <tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt class="py-name">waitForConnection</tt><tt class="py-op">(</tt><tt class="py-name">timeout</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt> </tt>
+<a name="L1362"></a><tt class="py-lineno">1362</tt> <tt class="py-line"> <tt id="link-327" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-327', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-328" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-328', 'setAlarm', 'link-326');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1363"></a><tt class="py-lineno">1363</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1364"></a><tt class="py-lineno">1364</tt> <tt class="py-line"> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">wake</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1365"></a><tt class="py-lineno">1365</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">java</tt><tt class="py-op">.</tt><tt class="py-name">lang</tt><tt class="py-op">.</tt><tt class="py-name">NullPointerException</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">:</tt> </tt>
+<a name="L1366"></a><tt class="py-lineno">1366</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"%s: ERROR: Couldn't connect to %s: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">progname</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">)</tt> </tt>
+<a name="L1367"></a><tt class="py-lineno">1367</tt> <tt class="py-line"> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">exit</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt> </tt>
+<a name="L1368"></a><tt class="py-lineno">1368</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1369"></a><tt class="py-lineno">1369</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Connected to device with serialno=%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1370"></a><tt class="py-lineno">1370</tt> <tt class="py-line"> <tt class="py-name">secure</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getSystemProperty</tt><tt class="py-op">(</tt><tt class="py-string">'ro.secure'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1371"></a><tt class="py-lineno">1371</tt> <tt class="py-line"> <tt class="py-name">debuggable</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getSystemProperty</tt><tt class="py-op">(</tt><tt class="py-string">'ro.debuggable'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1372"></a><tt class="py-lineno">1372</tt> <tt class="py-line"> <tt class="py-name">versionProperty</tt> <tt class="py-op">=</tt> <tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">getProperty</tt><tt class="py-op">(</tt><tt class="py-string">'build.'</tt> <tt class="py-op">+</tt> <tt id="link-329" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-329', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1373"></a><tt class="py-lineno">1373</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">versionProperty</tt><tt class="py-op">:</tt> </tt>
+<a name="L1374"></a><tt class="py-lineno">1374</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">versionProperty</tt><tt class="py-op">)</tt> </tt>
+<a name="L1375"></a><tt class="py-lineno">1375</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1376"></a><tt class="py-lineno">1376</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1377"></a><tt class="py-lineno">1377</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"Couldn't obtain device SDK version"</tt> </tt>
+<a name="L1378"></a><tt class="py-lineno">1378</tt> <tt class="py-line"> <tt class="py-name">version</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1379"></a><tt class="py-lineno">1379</tt> <tt class="py-line"> </tt>
+<a name="L1380"></a><tt class="py-lineno">1380</tt> <tt class="py-line"> <tt class="py-comment"># we are going to use UiAutomator for versions >= 16 that's why we ignore if the device</tt> </tt>
+<a name="L1381"></a><tt class="py-lineno">1381</tt> <tt class="py-line"> <tt class="py-comment"># is secure if this is true</tt> </tt>
+<a name="L1382"></a><tt class="py-lineno">1382</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">secure</tt> <tt class="py-op">==</tt> <tt class="py-string">'1'</tt> <tt class="py-keyword">and</tt> <tt class="py-name">debuggable</tt> <tt class="py-op">==</tt> <tt class="py-string">'0'</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">ignoresecuredevice</tt> <tt class="py-keyword">and</tt> <tt class="py-name">version</tt> <tt class="py-op"><</tt> <tt class="py-number">16</tt><tt class="py-op">:</tt> </tt>
+<a name="L1383"></a><tt class="py-lineno">1383</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"%s: ERROR: Device is secure, AndroidViewClient won't work."</tt> <tt class="py-op">%</tt> <tt class="py-name">progname</tt> </tt>
+<a name="L1384"></a><tt class="py-lineno">1384</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1385"></a><tt class="py-lineno">1385</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" secure=%s debuggable=%s version=%d ignoresecuredevice=%s"</tt> <tt class="py-op">%</tt> \ </tt>
+<a name="L1386"></a><tt class="py-lineno">1386</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">secure</tt><tt class="py-op">,</tt> <tt class="py-name">debuggable</tt><tt class="py-op">,</tt> <tt class="py-name">version</tt><tt class="py-op">,</tt> <tt class="py-name">ignoresecuredevice</tt><tt class="py-op">)</tt> </tt>
+<a name="L1387"></a><tt class="py-lineno">1387</tt> <tt class="py-line"> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">exit</tt><tt class="py-op">(</tt><tt class="py-number">2</tt><tt class="py-op">)</tt> </tt>
+<a name="L1388"></a><tt class="py-lineno">1388</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"[.*()+]"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">"(\d{1,3}\.){3}\d{1,3}"</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1389"></a><tt class="py-lineno">1389</tt> <tt class="py-line"> <tt class="py-comment"># if a regex was used we have to determine the serialno used</tt> </tt>
+<a name="L1390"></a><tt class="py-lineno">1390</tt> <tt class="py-line"> <tt class="py-name">serialno</tt> <tt class="py-op">=</tt> <tt id="link-330" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-330', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-331" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__obtainDeviceSerialNumber()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__obtainDeviceSerialNumber"><a title="src.com.dtmilano.android.viewclient.ViewClient.__obtainDeviceSerialNumber" class="py-name" href="#" onclick="return doclink('link-331', '__obtainDeviceSerialNumber', 'link-331');">__obtainDeviceSerialNumber</a></tt><tt class="py-op">(</tt><tt class="py-name">device</tt><tt class="py-op">)</tt> </tt>
+<a name="L1391"></a><tt class="py-lineno">1391</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">verbose</tt><tt class="py-op">:</tt> </tt>
+<a name="L1392"></a><tt class="py-lineno">1392</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">'Actual device serialno=%s'</tt> <tt class="py-op">%</tt> <tt class="py-name">serialno</tt> </tt>
+<a name="L1393"></a><tt class="py-lineno">1393</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">serialno</tt> </tt>
+</div><a name="L1394"></a><tt class="py-lineno">1394</tt> <tt class="py-line"> </tt>
+<a name="L1395"></a><tt class="py-lineno">1395</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdAndText"></a><div id="ViewClient.traverseShowClassIdAndText-def"><a name="L1396"></a><tt class="py-lineno">1396</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdAndText-toggle" onclick="return toggle('ViewClient.traverseShowClassIdAndText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText">traverseShowClassIdAndText</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">,</tt> <tt class="py-param">extraInfo</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-param">noextrainfo</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdAndText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdAndText-expanded"><a name="L1397"></a><tt class="py-lineno">1397</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1398"></a><tt class="py-lineno">1398</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1399"></a><tt class="py-lineno">1399</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1400"></a><tt class="py-lineno">1400</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1401"></a><tt class="py-lineno">1401</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1402"></a><tt class="py-lineno">1402</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1403"></a><tt class="py-lineno">1403</tt> <tt class="py-line"><tt class="py-docstring"> @type extraInfo: method</tt> </tt>
+<a name="L1404"></a><tt class="py-lineno">1404</tt> <tt class="py-line"><tt class="py-docstring"> @param extraInfo: the View method to add extra info</tt> </tt>
+<a name="L1405"></a><tt class="py-lineno">1405</tt> <tt class="py-line"><tt class="py-docstring"> @type noextrainfo: bool</tt> </tt>
+<a name="L1406"></a><tt class="py-lineno">1406</tt> <tt class="py-line"><tt class="py-docstring"> @param noextrainfo: Don't add extra info</tt> </tt>
+<a name="L1407"></a><tt class="py-lineno">1407</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1408"></a><tt class="py-lineno">1408</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available </tt> </tt>
+<a name="L1409"></a><tt class="py-lineno">1409</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1410"></a><tt class="py-lineno">1410</tt> <tt class="py-line"> </tt>
+<a name="L1411"></a><tt class="py-lineno">1411</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1412"></a><tt class="py-lineno">1412</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1413"></a><tt class="py-lineno">1413</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">extraInfo</tt><tt class="py-op">:</tt> </tt>
+<a name="L1414"></a><tt class="py-lineno">1414</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-name">extraInfo</tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-332" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-332', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1415"></a><tt class="py-lineno">1415</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">eis</tt> <tt class="py-keyword">and</tt> <tt class="py-name">noextrainfo</tt><tt class="py-op">:</tt> </tt>
+<a name="L1416"></a><tt class="py-lineno">1416</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-name">noextrainfo</tt> </tt>
+<a name="L1417"></a><tt class="py-lineno">1417</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">eis</tt><tt class="py-op">:</tt> </tt>
+<a name="L1418"></a><tt class="py-lineno">1418</tt> <tt class="py-line"> <tt class="py-name">eis</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">eis</tt> </tt>
+<a name="L1419"></a><tt class="py-lineno">1419</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"%s %s %s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-333" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getClass" class="py-name" href="#" onclick="return doclink('link-333', 'getClass', 'link-123');">getClass</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-334" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-334', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-335" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getText()=src.com.dtmilano.android.viewclient.View-class.html#getText"><a title="src.com.dtmilano.android.viewclient.View.getText" class="py-name" href="#" onclick="return doclink('link-335', 'getText', 'link-335');">getText</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">eis</tt><tt class="py-op">)</tt> </tt>
+<a name="L1420"></a><tt class="py-lineno">1420</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">Exception</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">:</tt> </tt>
+<a name="L1421"></a><tt class="py-lineno">1421</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"Exception in view=%s: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">.</tt><tt id="link-336" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__smallStr__()=src.com.dtmilano.android.viewclient.View-class.html#__smallStr__"><a title="src.com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-336', '__smallStr__', 'link-336');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1422"></a><tt class="py-lineno">1422</tt> <tt class="py-line"> </tt>
+<a name="L1423"></a><tt class="py-lineno">1423</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndUniqueId"></a><div id="ViewClient.traverseShowClassIdTextAndUniqueId-def"><a name="L1424"></a><tt class="py-lineno">1424</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndUniqueId-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndUniqueId');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId">traverseShowClassIdTextAndUniqueId</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndUniqueId-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndUniqueId-expanded"><a name="L1425"></a><tt class="py-lineno">1425</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1426"></a><tt class="py-lineno">1426</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id, text if available and unique id.</tt> </tt>
+<a name="L1427"></a><tt class="py-lineno">1427</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1428"></a><tt class="py-lineno">1428</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1429"></a><tt class="py-lineno">1429</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1430"></a><tt class="py-lineno">1430</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1431"></a><tt class="py-lineno">1431</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available and unique Id</tt> </tt>
+<a name="L1432"></a><tt class="py-lineno">1432</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1433"></a><tt class="py-lineno">1433</tt> <tt class="py-line"> </tt>
+<a name="L1434"></a><tt class="py-lineno">1434</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-337" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-337', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-338" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-338', 'traverseShowClassIdAndText', 'link-338');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-339" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-339', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-340" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-340', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1435"></a><tt class="py-lineno">1435</tt> <tt class="py-line"> </tt>
+<a name="L1436"></a><tt class="py-lineno">1436</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndContentDescription"></a><div id="ViewClient.traverseShowClassIdTextAndContentDescription-def"><a name="L1437"></a><tt class="py-lineno">1437</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndContentDescription-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription">traverseShowClassIdTextAndContentDescription</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndContentDescription-expanded"><a name="L1438"></a><tt class="py-lineno">1438</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1439"></a><tt class="py-lineno">1439</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id, text if available and unique id.</tt> </tt>
+<a name="L1440"></a><tt class="py-lineno">1440</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1441"></a><tt class="py-lineno">1441</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1442"></a><tt class="py-lineno">1442</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1443"></a><tt class="py-lineno">1443</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1444"></a><tt class="py-lineno">1444</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available and the content description</tt> </tt>
+<a name="L1445"></a><tt class="py-lineno">1445</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1446"></a><tt class="py-lineno">1446</tt> <tt class="py-line"> </tt>
+<a name="L1447"></a><tt class="py-lineno">1447</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-341" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-341', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-342" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-342', 'traverseShowClassIdAndText', 'link-338');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-343" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-343', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-344" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.getContentDescription()=src.com.dtmilano.android.viewclient.View-class.html#getContentDescription"><a title="src.com.dtmilano.android.viewclient.View.getContentDescription" class="py-name" href="#" onclick="return doclink('link-344', 'getContentDescription', 'link-344');">getContentDescription</a></tt><tt class="py-op">,</tt> <tt class="py-string">'NAF'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1448"></a><tt class="py-lineno">1448</tt> <tt class="py-line"> </tt>
+<a name="L1449"></a><tt class="py-lineno">1449</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextAndCenter"></a><div id="ViewClient.traverseShowClassIdTextAndCenter-def"><a name="L1450"></a><tt class="py-lineno">1450</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextAndCenter-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextAndCenter');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter">traverseShowClassIdTextAndCenter</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextAndCenter-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextAndCenter-expanded"><a name="L1451"></a><tt class="py-lineno">1451</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1452"></a><tt class="py-lineno">1452</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1453"></a><tt class="py-lineno">1453</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1454"></a><tt class="py-lineno">1454</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1455"></a><tt class="py-lineno">1455</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1456"></a><tt class="py-lineno">1456</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1457"></a><tt class="py-lineno">1457</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available </tt> </tt>
+<a name="L1458"></a><tt class="py-lineno">1458</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1459"></a><tt class="py-lineno">1459</tt> <tt class="py-line"> </tt>
+<a name="L1460"></a><tt class="py-lineno">1460</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-345" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-345', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-346" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-346', 'traverseShowClassIdAndText', 'link-338');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-347" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-347', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-348" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getCenter" class="py-name" href="#" onclick="return doclink('link-348', 'getCenter', 'link-250');">getCenter</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1461"></a><tt class="py-lineno">1461</tt> <tt class="py-line"> </tt>
+<a name="L1462"></a><tt class="py-lineno">1462</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.traverseShowClassIdTextPositionAndSize"></a><div id="ViewClient.traverseShowClassIdTextPositionAndSize-def"><a name="L1463"></a><tt class="py-lineno">1463</tt> <a class="py-toggle" href="#" id="ViewClient.traverseShowClassIdTextPositionAndSize-toggle" onclick="return toggle('ViewClient.traverseShowClassIdTextPositionAndSize');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize">traverseShowClassIdTextPositionAndSize</a><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverseShowClassIdTextPositionAndSize-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverseShowClassIdTextPositionAndSize-expanded"><a name="L1464"></a><tt class="py-lineno">1464</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1465"></a><tt class="py-lineno">1465</tt> <tt class="py-line"><tt class="py-docstring"> Shows the View class, id and text if available.</tt> </tt>
+<a name="L1466"></a><tt class="py-lineno">1466</tt> <tt class="py-line"><tt class="py-docstring"> This function can be used as a transform function to L{ViewClient.traverse()}</tt> </tt>
+<a name="L1467"></a><tt class="py-lineno">1467</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1468"></a><tt class="py-lineno">1468</tt> <tt class="py-line"><tt class="py-docstring"> @type view: I{View}</tt> </tt>
+<a name="L1469"></a><tt class="py-lineno">1469</tt> <tt class="py-line"><tt class="py-docstring"> @param view: the View</tt> </tt>
+<a name="L1470"></a><tt class="py-lineno">1470</tt> <tt class="py-line"><tt class="py-docstring"> @return: the string containing class, id, and text if available </tt> </tt>
+<a name="L1471"></a><tt class="py-lineno">1471</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1472"></a><tt class="py-lineno">1472</tt> <tt class="py-line"> </tt>
+<a name="L1473"></a><tt class="py-lineno">1473</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-349" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-349', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-350" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-350', 'traverseShowClassIdAndText', 'link-338');">traverseShowClassIdAndText</a></tt><tt class="py-op">(</tt><tt class="py-name">view</tt><tt class="py-op">,</tt> <tt id="link-351" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-351', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-352" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getPositionAndSize" class="py-name" href="#" onclick="return doclink('link-352', 'getPositionAndSize', 'link-260');">getPositionAndSize</a></tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1474"></a><tt class="py-lineno">1474</tt> <tt class="py-line"> </tt>
+<a name="L1475"></a><tt class="py-lineno">1475</tt> <tt class="py-line"> <tt class="py-comment"># methods that can be used to transform ViewClient.traverse output</tt> </tt>
+<a name="L1476"></a><tt class="py-lineno">1476</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CIT</tt> <tt class="py-op">=</tt> <tt id="link-353" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdAndText" class="py-name" href="#" onclick="return doclink('link-353', 'traverseShowClassIdAndText', 'link-338');">traverseShowClassIdAndText</a></tt> </tt>
+<a name="L1477"></a><tt class="py-lineno">1477</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdAndText(view)} '''</tt> </tt>
+<a name="L1478"></a><tt class="py-lineno">1478</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITUI</tt> <tt class="py-op">=</tt> <tt id="link-354" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndUniqueId()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndUniqueId" class="py-name" href="#" onclick="return doclink('link-354', 'traverseShowClassIdTextAndUniqueId', 'link-354');">traverseShowClassIdTextAndUniqueId</a></tt> </tt>
+<a name="L1479"></a><tt class="py-lineno">1479</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndUniqueId(view)} '''</tt> </tt>
+<a name="L1480"></a><tt class="py-lineno">1480</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITCD</tt> <tt class="py-op">=</tt> <tt id="link-355" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndContentDescription()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndContentDescription" class="py-name" href="#" onclick="return doclink('link-355', 'traverseShowClassIdTextAndContentDescription', 'link-355');">traverseShowClassIdTextAndContentDescription</a></tt> </tt>
+<a name="L1481"></a><tt class="py-lineno">1481</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndContentDescription(view)} '''</tt> </tt>
+<a name="L1482"></a><tt class="py-lineno">1482</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITC</tt> <tt class="py-op">=</tt> <tt id="link-356" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndCenter()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextAndCenter" class="py-name" href="#" onclick="return doclink('link-356', 'traverseShowClassIdTextAndCenter', 'link-356');">traverseShowClassIdTextAndCenter</a></tt> </tt>
+<a name="L1483"></a><tt class="py-lineno">1483</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextAndCenter(view)} '''</tt> </tt>
+<a name="L1484"></a><tt class="py-lineno">1484</tt> <tt class="py-line"> <tt class="py-name">TRAVERSE_CITPS</tt> <tt class="py-op">=</tt> <tt id="link-357" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextPositionAndSize()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverseShowClassIdTextPositionAndSize" class="py-name" href="#" onclick="return doclink('link-357', 'traverseShowClassIdTextPositionAndSize', 'link-357');">traverseShowClassIdTextPositionAndSize</a></tt> </tt>
+<a name="L1485"></a><tt class="py-lineno">1485</tt> <tt class="py-line"> <tt class="py-string">''' An alias for L{traverseShowClassIdTextPositionAndSize(view)} '''</tt> </tt>
+<a name="L1486"></a><tt class="py-lineno">1486</tt> <tt class="py-line"> </tt>
+<a name="L1487"></a><tt class="py-lineno">1487</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.sleep"></a><div id="ViewClient.sleep-def"><a name="L1488"></a><tt class="py-lineno">1488</tt> <a class="py-toggle" href="#" id="ViewClient.sleep-toggle" onclick="return toggle('ViewClient.sleep');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#sleep">sleep</a><tt class="py-op">(</tt><tt class="py-param">secs</tt><tt class="py-op">=</tt><tt class="py-number">1.0</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.sleep-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.sleep-expanded"><a name="L1489"></a><tt class="py-lineno">1489</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1490"></a><tt class="py-lineno">1490</tt> <tt class="py-line"><tt class="py-docstring"> Sleeps for the specified number of seconds.</tt> </tt>
+<a name="L1491"></a><tt class="py-lineno">1491</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1492"></a><tt class="py-lineno">1492</tt> <tt class="py-line"><tt class="py-docstring"> @type secs: float</tt> </tt>
+<a name="L1493"></a><tt class="py-lineno">1493</tt> <tt class="py-line"><tt class="py-docstring"> @param secs: number of seconds</tt> </tt>
+<a name="L1494"></a><tt class="py-lineno">1494</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1495"></a><tt class="py-lineno">1495</tt> <tt class="py-line"> <tt class="py-name">time</tt><tt class="py-op">.</tt><tt id="link-358" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-358', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt class="py-name">secs</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1496"></a><tt class="py-lineno">1496</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.assertServiceResponse"></a><div id="ViewClient.assertServiceResponse-def"><a name="L1497"></a><tt class="py-lineno">1497</tt> <a class="py-toggle" href="#" id="ViewClient.assertServiceResponse-toggle" onclick="return toggle('ViewClient.assertServiceResponse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse">assertServiceResponse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.assertServiceResponse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.assertServiceResponse-expanded"><a name="L1498"></a><tt class="py-lineno">1498</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1499"></a><tt class="py-lineno">1499</tt> <tt class="py-line"><tt class="py-docstring"> Checks whether the response received from the server is correct or raises and Exception.</tt> </tt>
+<a name="L1500"></a><tt class="py-lineno">1500</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1501"></a><tt class="py-lineno">1501</tt> <tt class="py-line"><tt class="py-docstring"> @type response: str</tt> </tt>
+<a name="L1502"></a><tt class="py-lineno">1502</tt> <tt class="py-line"><tt class="py-docstring"> @param response: Response received from the server</tt> </tt>
+<a name="L1503"></a><tt class="py-lineno">1503</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1504"></a><tt class="py-lineno">1504</tt> <tt class="py-line"><tt class="py-docstring"> @raise Exception: If the response received from the server is invalid</tt> </tt>
+<a name="L1505"></a><tt class="py-lineno">1505</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1506"></a><tt class="py-lineno">1506</tt> <tt class="py-line"> </tt>
+<a name="L1507"></a><tt class="py-lineno">1507</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-359" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.serviceResponse" class="py-name" href="#" onclick="return doclink('link-359', 'serviceResponse', 'link-311');">serviceResponse</a></tt><tt class="py-op">(</tt><tt class="py-name">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1508"></a><tt class="py-lineno">1508</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">'Invalid response received from service.'</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1509"></a><tt class="py-lineno">1509</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.serviceResponse"></a><div id="ViewClient.serviceResponse-def"><a name="L1510"></a><tt class="py-lineno">1510</tt> <a class="py-toggle" href="#" id="ViewClient.serviceResponse-toggle" onclick="return toggle('ViewClient.serviceResponse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse">serviceResponse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">response</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.serviceResponse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.serviceResponse-expanded"><a name="L1511"></a><tt class="py-lineno">1511</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1512"></a><tt class="py-lineno">1512</tt> <tt class="py-line"><tt class="py-docstring"> Checks the response received from the I{ViewServer}.</tt> </tt>
+<a name="L1513"></a><tt class="py-lineno">1513</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1514"></a><tt class="py-lineno">1514</tt> <tt class="py-line"><tt class="py-docstring"> @return: C{True} if the response received matches L{PARCEL_TRUE}, C{False} otherwise</tt> </tt>
+<a name="L1515"></a><tt class="py-lineno">1515</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1516"></a><tt class="py-lineno">1516</tt> <tt class="py-line"> </tt>
+<a name="L1517"></a><tt class="py-lineno">1517</tt> <tt class="py-line"> <tt class="py-name">PARCEL_TRUE</tt> <tt class="py-op">=</tt> <tt class="py-string">"Result: Parcel(00000000 00000001 '........')\r\n"</tt> </tt>
+<a name="L1518"></a><tt class="py-lineno">1518</tt> <tt class="py-line"> <tt class="py-string">''' The TRUE response parcel '''</tt> </tt>
+<a name="L1519"></a><tt class="py-lineno">1519</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-360" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-360', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1520"></a><tt class="py-lineno">1520</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"serviceResponse: comparing '%s' vs Parcel(%s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">response</tt><tt class="py-op">,</tt> <tt class="py-name">PARCEL_TRUE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1521"></a><tt class="py-lineno">1521</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">response</tt> <tt class="py-op">==</tt> <tt class="py-name">PARCEL_TRUE</tt> </tt>
+</div><a name="L1522"></a><tt class="py-lineno">1522</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.setViews"></a><div id="ViewClient.setViews-def"><a name="L1523"></a><tt class="py-lineno">1523</tt> <a class="py-toggle" href="#" id="ViewClient.setViews-toggle" onclick="return toggle('ViewClient.setViews');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setViews">setViews</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setViews-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setViews-expanded"><a name="L1524"></a><tt class="py-lineno">1524</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1525"></a><tt class="py-lineno">1525</tt> <tt class="py-line"><tt class="py-docstring"> Sets L{self.views} to the received value splitting it into lines.</tt> </tt>
+<a name="L1526"></a><tt class="py-lineno">1526</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1527"></a><tt class="py-lineno">1527</tt> <tt class="py-line"><tt class="py-docstring"> @type received: str</tt> </tt>
+<a name="L1528"></a><tt class="py-lineno">1528</tt> <tt class="py-line"><tt class="py-docstring"> @param received: the string received from the I{View Server}</tt> </tt>
+<a name="L1529"></a><tt class="py-lineno">1529</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1530"></a><tt class="py-lineno">1530</tt> <tt class="py-line"> </tt>
+<a name="L1531"></a><tt class="py-lineno">1531</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt> <tt class="py-keyword">or</tt> <tt class="py-name">received</tt> <tt class="py-op">==</tt> <tt class="py-string">""</tt><tt class="py-op">:</tt> </tt>
+<a name="L1532"></a><tt class="py-lineno">1532</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"received is empty"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1533"></a><tt class="py-lineno">1533</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1534"></a><tt class="py-lineno">1534</tt> <tt class="py-line"> <tt class="py-string">''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''</tt> </tt>
+<a name="L1535"></a><tt class="py-lineno">1535</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-361" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__parseTree()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree"><a title="src.com.dtmilano.android.viewclient.ViewClient.__parseTree" class="py-name" href="#" onclick="return doclink('link-361', '__parseTree', 'link-361');">__parseTree</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">"\n"</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1536"></a><tt class="py-lineno">1536</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-362" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-362', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1537"></a><tt class="py-lineno">1537</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"there are %d views in this dump"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1538"></a><tt class="py-lineno">1538</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.setViewsFromUiAutomatorDump"></a><div id="ViewClient.setViewsFromUiAutomatorDump-def"><a name="L1539"></a><tt class="py-lineno">1539</tt> <a class="py-toggle" href="#" id="ViewClient.setViewsFromUiAutomatorDump-toggle" onclick="return toggle('ViewClient.setViewsFromUiAutomatorDump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump">setViewsFromUiAutomatorDump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.setViewsFromUiAutomatorDump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.setViewsFromUiAutomatorDump-expanded"><a name="L1540"></a><tt class="py-lineno">1540</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1541"></a><tt class="py-lineno">1541</tt> <tt class="py-line"><tt class="py-docstring"> Sets L{self.views} to the received value parsing the received XML.</tt> </tt>
+<a name="L1542"></a><tt class="py-lineno">1542</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1543"></a><tt class="py-lineno">1543</tt> <tt class="py-line"><tt class="py-docstring"> @type received: str</tt> </tt>
+<a name="L1544"></a><tt class="py-lineno">1544</tt> <tt class="py-line"><tt class="py-docstring"> @param received: the string received from the I{UI Automator}</tt> </tt>
+<a name="L1545"></a><tt class="py-lineno">1545</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1546"></a><tt class="py-lineno">1546</tt> <tt class="py-line"> </tt>
+<a name="L1547"></a><tt class="py-lineno">1547</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt> <tt class="py-keyword">or</tt> <tt class="py-name">received</tt> <tt class="py-op">==</tt> <tt class="py-string">""</tt><tt class="py-op">:</tt> </tt>
+<a name="L1548"></a><tt class="py-lineno">1548</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"received is empty"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1549"></a><tt class="py-lineno">1549</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1550"></a><tt class="py-lineno">1550</tt> <tt class="py-line"> <tt class="py-string">''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''</tt> </tt>
+<a name="L1551"></a><tt class="py-lineno">1551</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-363" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__parseTreeFromUiAutomatorDump()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump"><a title="src.com.dtmilano.android.viewclient.ViewClient.__parseTreeFromUiAutomatorDump" class="py-name" href="#" onclick="return doclink('link-363', '__parseTreeFromUiAutomatorDump', 'link-363');">__parseTreeFromUiAutomatorDump</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1552"></a><tt class="py-lineno">1552</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-364" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-364', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1553"></a><tt class="py-lineno">1553</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"there are %d views in this dump"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1554"></a><tt class="py-lineno">1554</tt> <tt class="py-line"> </tt>
+<a name="L1555"></a><tt class="py-lineno">1555</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__splitAttrs"></a><div id="ViewClient.__splitAttrs-def"><a name="L1556"></a><tt class="py-lineno">1556</tt> <a class="py-toggle" href="#" id="ViewClient.__splitAttrs-toggle" onclick="return toggle('ViewClient.__splitAttrs');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs">__splitAttrs</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">strArgs</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__splitAttrs-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__splitAttrs-expanded"><a name="L1557"></a><tt class="py-lineno">1557</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1558"></a><tt class="py-lineno">1558</tt> <tt class="py-line"><tt class="py-docstring"> Splits the C{View} attributes in C{strArgs} and optionally adds the view id to the C{viewsById} list.</tt> </tt>
+<a name="L1559"></a><tt class="py-lineno">1559</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1560"></a><tt class="py-lineno">1560</tt> <tt class="py-line"><tt class="py-docstring"> Unique Ids</tt> </tt>
+<a name="L1561"></a><tt class="py-lineno">1561</tt> <tt class="py-line"><tt class="py-docstring"> ==========</tt> </tt>
+<a name="L1562"></a><tt class="py-lineno">1562</tt> <tt class="py-line"><tt class="py-docstring"> It is very common to find C{View}s having B{NO_ID} as the Id. This turns very difficult to </tt> </tt>
+<a name="L1563"></a><tt class="py-lineno">1563</tt> <tt class="py-line"><tt class="py-docstring"> use L{self.findViewById()}. To help in this situation this method assigns B{unique Ids}.</tt> </tt>
+<a name="L1564"></a><tt class="py-lineno">1564</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1565"></a><tt class="py-lineno">1565</tt> <tt class="py-line"><tt class="py-docstring"> The B{unique Ids} are generated using the pattern C{id/no_id/<number>} with C{<number>} starting</tt> </tt>
+<a name="L1566"></a><tt class="py-lineno">1566</tt> <tt class="py-line"><tt class="py-docstring"> at 1.</tt> </tt>
+<a name="L1567"></a><tt class="py-lineno">1567</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1568"></a><tt class="py-lineno">1568</tt> <tt class="py-line"><tt class="py-docstring"> @type strArgs: str</tt> </tt>
+<a name="L1569"></a><tt class="py-lineno">1569</tt> <tt class="py-line"><tt class="py-docstring"> @param strArgs: the string containing the raw list of attributes and values</tt> </tt>
+<a name="L1570"></a><tt class="py-lineno">1570</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1571"></a><tt class="py-lineno">1571</tt> <tt class="py-line"><tt class="py-docstring"> @return: Returns the attributes map.</tt> </tt>
+<a name="L1572"></a><tt class="py-lineno">1572</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1573"></a><tt class="py-lineno">1573</tt> <tt class="py-line"> </tt>
+<a name="L1574"></a><tt class="py-lineno">1574</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1575"></a><tt class="py-lineno">1575</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"This method is not compatible with UIAutomator"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1576"></a><tt class="py-lineno">1576</tt> <tt class="py-line"> <tt class="py-comment"># replace the spaces in text:mText to preserve them in later split</tt> </tt>
+<a name="L1577"></a><tt class="py-lineno">1577</tt> <tt class="py-line"> <tt class="py-comment"># they are translated back after the attribute matches</tt> </tt>
+<a name="L1578"></a><tt class="py-lineno">1578</tt> <tt class="py-line"> <tt class="py-name">textRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s=%s,'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt id="link-365" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-365', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1579"></a><tt class="py-lineno">1579</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">textRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">strArgs</tt><tt class="py-op">)</tt> </tt>
+<a name="L1580"></a><tt class="py-lineno">1580</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1581"></a><tt class="py-lineno">1581</tt> <tt class="py-line"> <tt class="py-name">__textStart</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">end</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1582"></a><tt class="py-lineno">1582</tt> <tt class="py-line"> <tt class="py-name">__textLen</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1583"></a><tt class="py-lineno">1583</tt> <tt class="py-line"> <tt class="py-name">__textEnd</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">end</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-name">__textLen</tt> </tt>
+<a name="L1584"></a><tt class="py-lineno">1584</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-name">strArgs</tt><tt class="py-op">[</tt><tt class="py-name">__textStart</tt><tt class="py-op">:</tt><tt class="py-name">__textEnd</tt><tt class="py-op">]</tt> </tt>
+<a name="L1585"></a><tt class="py-lineno">1585</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-name">s1</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt id="link-366" class="py-name"><a title="src.com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-366', 'WS', 'link-37');">WS</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1586"></a><tt class="py-lineno">1586</tt> <tt class="py-line"> <tt class="py-name">strArgs</tt> <tt class="py-op">=</tt> <tt class="py-name">strArgs</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">,</tt> <tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L1587"></a><tt class="py-lineno">1587</tt> <tt class="py-line"> </tt>
+<a name="L1588"></a><tt class="py-lineno">1588</tt> <tt class="py-line"> <tt class="py-name">idRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"(?P<viewId>id/\S+)"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1589"></a><tt class="py-lineno">1589</tt> <tt class="py-line"> <tt class="py-name">attrRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s(?P<parens>\(\))?=%s,(?P<val>[^ ]*)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-367" class="py-name"><a title="src.com.dtmilano.android.viewclient.__ns" class="py-name" href="#" onclick="return doclink('link-367', '__ns', 'link-196');">__ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'attr'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-368" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nd" class="py-name" href="#" onclick="return doclink('link-368', '__nd', 'link-194');">__nd</a></tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">flags</tt><tt class="py-op">=</tt><tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">DOTALL</tt><tt class="py-op">)</tt> </tt>
+<a name="L1590"></a><tt class="py-lineno">1590</tt> <tt class="py-line"> <tt class="py-name">hashRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'%s@%s'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-369" class="py-name"><a title="src.com.dtmilano.android.viewclient.__ns" class="py-name" href="#" onclick="return doclink('link-369', '__ns', 'link-196');">__ns</a></tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt id="link-370" class="py-name"><a title="src.com.dtmilano.android.viewclient.__nh" class="py-name" href="#" onclick="return doclink('link-370', '__nh', 'link-195');">__nh</a></tt><tt class="py-op">(</tt><tt class="py-string">'oid'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1591"></a><tt class="py-lineno">1591</tt> <tt class="py-line"> </tt>
+<a name="L1592"></a><tt class="py-lineno">1592</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1593"></a><tt class="py-lineno">1593</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1594"></a><tt class="py-lineno">1594</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">idRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">strArgs</tt><tt class="py-op">)</tt> </tt>
+<a name="L1595"></a><tt class="py-lineno">1595</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1596"></a><tt class="py-lineno">1596</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'viewId'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1597"></a><tt class="py-lineno">1597</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-371" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-371', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1598"></a><tt class="py-lineno">1598</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"found view with id=%s"</tt> <tt class="py-op">%</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1599"></a><tt class="py-lineno">1599</tt> <tt class="py-line"> </tt>
+<a name="L1600"></a><tt class="py-lineno">1600</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">strArgs</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1601"></a><tt class="py-lineno">1601</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">attrRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">)</tt> </tt>
+<a name="L1602"></a><tt class="py-lineno">1602</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1603"></a><tt class="py-lineno">1603</tt> <tt class="py-line"> <tt class="py-name">__attr</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'attr'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1604"></a><tt class="py-lineno">1604</tt> <tt class="py-line"> <tt class="py-name">__parens</tt> <tt class="py-op">=</tt> <tt class="py-string">'()'</tt> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'parens'</tt><tt class="py-op">)</tt> <tt class="py-keyword">else</tt> <tt class="py-string">''</tt> </tt>
+<a name="L1605"></a><tt class="py-lineno">1605</tt> <tt class="py-line"> <tt class="py-name">__len</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'len'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1606"></a><tt class="py-lineno">1606</tt> <tt class="py-line"> <tt class="py-name">__val</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'val'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1607"></a><tt class="py-lineno">1607</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-372" class="py-name"><a title="src.com.dtmilano.android.viewclient.WARNINGS" class="py-name" href="#" onclick="return doclink('link-372', 'WARNINGS', 'link-24');">WARNINGS</a></tt> <tt class="py-keyword">and</tt> <tt class="py-name">__len</tt> <tt class="py-op">!=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">__val</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1608"></a><tt class="py-lineno">1608</tt> <tt class="py-line"> <tt class="py-name">warnings</tt><tt class="py-op">.</tt><tt class="py-name">warn</tt><tt class="py-op">(</tt><tt class="py-string">"Invalid len: expected: %d found: %d s=%s e=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">__len</tt><tt class="py-op">,</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">__val</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">__val</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">50</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">__val</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">50</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1609"></a><tt class="py-lineno">1609</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">__attr</tt> <tt class="py-op">==</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">:</tt> </tt>
+<a name="L1610"></a><tt class="py-lineno">1610</tt> <tt class="py-line"> <tt class="py-comment"># restore spaces that have been replaced</tt> </tt>
+<a name="L1611"></a><tt class="py-lineno">1611</tt> <tt class="py-line"> <tt class="py-name">__val</tt> <tt class="py-op">=</tt> <tt class="py-name">__val</tt><tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt id="link-373" class="py-name"><a title="src.com.dtmilano.android.viewclient.WS" class="py-name" href="#" onclick="return doclink('link-373', 'WS', 'link-37');">WS</a></tt><tt class="py-op">,</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> </tt>
+<a name="L1612"></a><tt class="py-lineno">1612</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-name">__attr</tt> <tt class="py-op">+</tt> <tt class="py-name">__parens</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">__val</tt> </tt>
+<a name="L1613"></a><tt class="py-lineno">1613</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1614"></a><tt class="py-lineno">1614</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">hashRE</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">)</tt> </tt>
+<a name="L1615"></a><tt class="py-lineno">1615</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L1616"></a><tt class="py-lineno">1616</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'class'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'class'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1617"></a><tt class="py-lineno">1617</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'oid'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'oid'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1618"></a><tt class="py-lineno">1618</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1619"></a><tt class="py-lineno">1619</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-374" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-374', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1620"></a><tt class="py-lineno">1620</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-string">"doesn't match"</tt> </tt>
+<a name="L1621"></a><tt class="py-lineno">1621</tt> <tt class="py-line"> </tt>
+<a name="L1622"></a><tt class="py-lineno">1622</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> <tt class="py-comment"># was assignViewById</tt> </tt>
+<a name="L1623"></a><tt class="py-lineno">1623</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1624"></a><tt class="py-lineno">1624</tt> <tt class="py-line"> <tt class="py-comment"># If the view has NO_ID we are assigning a default id here (id/no_id) which is</tt> </tt>
+<a name="L1625"></a><tt class="py-lineno">1625</tt> <tt class="py-line"> <tt class="py-comment"># immediately incremented if another view with no id was found before to generate</tt> </tt>
+<a name="L1626"></a><tt class="py-lineno">1626</tt> <tt class="py-line"> <tt class="py-comment"># a unique id</tt> </tt>
+<a name="L1627"></a><tt class="py-lineno">1627</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-string">"id/no_id/1"</tt> </tt>
+<a name="L1628"></a><tt class="py-lineno">1628</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">:</tt> </tt>
+<a name="L1629"></a><tt class="py-lineno">1629</tt> <tt class="py-line"> <tt class="py-comment"># sometimes the view ids are not unique, so let's generate a unique id here</tt> </tt>
+<a name="L1630"></a><tt class="py-lineno">1630</tt> <tt class="py-line"> <tt class="py-name">i</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L1631"></a><tt class="py-lineno">1631</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1632"></a><tt class="py-lineno">1632</tt> <tt class="py-line"> <tt class="py-name">newId</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'/\d+$'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'/%d'</tt> <tt class="py-op">%</tt> <tt class="py-name">i</tt> </tt>
+<a name="L1633"></a><tt class="py-lineno">1633</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">newId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">:</tt> </tt>
+<a name="L1634"></a><tt class="py-lineno">1634</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1635"></a><tt class="py-lineno">1635</tt> <tt class="py-line"> <tt class="py-name">i</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
+<a name="L1636"></a><tt class="py-lineno">1636</tt> <tt class="py-line"> <tt class="py-name">viewId</tt> <tt class="py-op">=</tt> <tt class="py-name">newId</tt> </tt>
+<a name="L1637"></a><tt class="py-lineno">1637</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-375" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-375', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1638"></a><tt class="py-lineno">1638</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"adding viewById %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1639"></a><tt class="py-lineno">1639</tt> <tt class="py-line"> <tt class="py-comment"># We are assigning a new attribute to keep the original id preserved, which could have</tt> </tt>
+<a name="L1640"></a><tt class="py-lineno">1640</tt> <tt class="py-line"> <tt class="py-comment"># been NO_ID repeated multiple times</tt> </tt>
+<a name="L1641"></a><tt class="py-lineno">1641</tt> <tt class="py-line"> <tt class="py-name">attrs</tt><tt class="py-op">[</tt><tt class="py-string">'uniqueId'</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">viewId</tt> </tt>
+<a name="L1642"></a><tt class="py-lineno">1642</tt> <tt class="py-line"> </tt>
+<a name="L1643"></a><tt class="py-lineno">1643</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">attrs</tt> </tt>
+</div><a name="L1644"></a><tt class="py-lineno">1644</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__parseTree"></a><div id="ViewClient.__parseTree-def"><a name="L1645"></a><tt class="py-lineno">1645</tt> <a class="py-toggle" href="#" id="ViewClient.__parseTree-toggle" onclick="return toggle('ViewClient.__parseTree');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree">__parseTree</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">receivedLines</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__parseTree-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__parseTree-expanded"><a name="L1646"></a><tt class="py-lineno">1646</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1647"></a><tt class="py-lineno">1647</tt> <tt class="py-line"><tt class="py-docstring"> Parses the View tree contained in L{receivedLines}. The tree is created and the root node assigned to L{self.root}.</tt> </tt>
+<a name="L1648"></a><tt class="py-lineno">1648</tt> <tt class="py-line"><tt class="py-docstring"> This method also assigns L{self.viewsById} values using L{View.getUniqueId} as the key.</tt> </tt>
+<a name="L1649"></a><tt class="py-lineno">1649</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1650"></a><tt class="py-lineno">1650</tt> <tt class="py-line"><tt class="py-docstring"> @type receivedLines: str</tt> </tt>
+<a name="L1651"></a><tt class="py-lineno">1651</tt> <tt class="py-line"><tt class="py-docstring"> @param receivedLines: the string received from B{View Server}</tt> </tt>
+<a name="L1652"></a><tt class="py-lineno">1652</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1653"></a><tt class="py-lineno">1653</tt> <tt class="py-line"> </tt>
+<a name="L1654"></a><tt class="py-lineno">1654</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1655"></a><tt class="py-lineno">1655</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1656"></a><tt class="py-lineno">1656</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1657"></a><tt class="py-lineno">1657</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1658"></a><tt class="py-lineno">1658</tt> <tt class="py-line"> <tt class="py-name">parents</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
+<a name="L1659"></a><tt class="py-lineno">1659</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1660"></a><tt class="py-lineno">1660</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">-</tt><tt class="py-number">1</tt> </tt>
+<a name="L1661"></a><tt class="py-lineno">1661</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1662"></a><tt class="py-lineno">1662</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">receivedLines</tt><tt class="py-op">:</tt> </tt>
+<a name="L1663"></a><tt class="py-lineno">1663</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">''</tt> <tt class="py-keyword">or</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">'DONE'</tt> <tt class="py-keyword">or</tt> <tt class="py-name">v</tt> <tt class="py-op">==</tt> <tt class="py-string">'DONE.'</tt><tt class="py-op">:</tt> </tt>
+<a name="L1664"></a><tt class="py-lineno">1664</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1665"></a><tt class="py-lineno">1665</tt> <tt class="py-line"> <tt class="py-name">attrs</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-376" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__splitAttrs()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs"><a title="src.com.dtmilano.android.viewclient.ViewClient.__splitAttrs" class="py-name" href="#" onclick="return doclink('link-376', '__splitAttrs', 'link-376');">__splitAttrs</a></tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt> </tt>
+<a name="L1666"></a><tt class="py-lineno">1666</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L1667"></a><tt class="py-lineno">1667</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">' '</tt><tt class="py-op">:</tt> </tt>
+<a name="L1668"></a><tt class="py-lineno">1668</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"Unexpected root element starting with ' '."</tt><tt class="py-op">)</tt> </tt>
+<a name="L1669"></a><tt class="py-lineno">1669</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt id="link-377" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-377', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-378" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-378', 'factory', 'link-282');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-379" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-379', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt><tt class="py-op">)</tt> </tt>
+<a name="L1670"></a><tt class="py-lineno">1670</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-380" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-380', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">raw</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+<a name="L1671"></a><tt class="py-lineno">1671</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L1672"></a><tt class="py-lineno">1672</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
+<a name="L1673"></a><tt class="py-lineno">1673</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1674"></a><tt class="py-lineno">1674</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1675"></a><tt class="py-lineno">1675</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1676"></a><tt class="py-lineno">1676</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1677"></a><tt class="py-lineno">1677</tt> <tt class="py-line"> <tt class="py-name">newLevel</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt> <tt class="py-op">-</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt class="py-name">lstrip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1678"></a><tt class="py-lineno">1678</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1679"></a><tt class="py-lineno">1679</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"newLevel==0 treeLevel=%d but tree can have only one root, v=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">treeLevel</tt><tt class="py-op">,</tt> <tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1680"></a><tt class="py-lineno">1680</tt> <tt class="py-line"> <tt class="py-name">child</tt> <tt class="py-op">=</tt> <tt id="link-381" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-381', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-382" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.factory" class="py-name" href="#" onclick="return doclink('link-382', 'factory', 'link-282');">factory</a></tt><tt class="py-op">(</tt><tt class="py-name">attrs</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-383" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-383', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">forceViewServerUse</tt><tt class="py-op">)</tt> </tt>
+<a name="L1681"></a><tt class="py-lineno">1681</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-384" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-384', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-name">child</tt><tt class="py-op">.</tt><tt class="py-name">raw</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+<a name="L1682"></a><tt class="py-lineno">1682</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">==</tt> <tt class="py-name">treeLevel</tt><tt class="py-op">:</tt> </tt>
+<a name="L1683"></a><tt class="py-lineno">1683</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-385" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-385', 'add', 'link-283');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1684"></a><tt class="py-lineno">1684</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1685"></a><tt class="py-lineno">1685</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">newLevel</tt> <tt class="py-op">></tt> <tt class="py-name">treeLevel</tt><tt class="py-op">:</tt> </tt>
+<a name="L1686"></a><tt class="py-lineno">1686</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">newLevel</tt> <tt class="py-op">-</tt> <tt class="py-name">treeLevel</tt><tt class="py-op">)</tt> <tt class="py-op">!=</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
+<a name="L1687"></a><tt class="py-lineno">1687</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"newLevel jumps %d levels, v=%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">newLevel</tt><tt class="py-op">-</tt><tt class="py-name">treeLevel</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1688"></a><tt class="py-lineno">1688</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">lastView</tt> </tt>
+<a name="L1689"></a><tt class="py-lineno">1689</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1690"></a><tt class="py-lineno">1690</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-386" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-386', 'add', 'link-283');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1691"></a><tt class="py-lineno">1691</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1692"></a><tt class="py-lineno">1692</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-name">newLevel</tt> </tt>
+<a name="L1693"></a><tt class="py-lineno">1693</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> <tt class="py-comment"># newLevel < treeLevel</tt> </tt>
+<a name="L1694"></a><tt class="py-lineno">1694</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-name">treeLevel</tt> <tt class="py-op">-</tt> <tt class="py-name">newLevel</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1695"></a><tt class="py-lineno">1695</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1696"></a><tt class="py-lineno">1696</tt> <tt class="py-line"> <tt class="py-name">parent</tt> <tt class="py-op">=</tt> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">pop</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1697"></a><tt class="py-lineno">1697</tt> <tt class="py-line"> <tt class="py-name">parents</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">parent</tt><tt class="py-op">)</tt> </tt>
+<a name="L1698"></a><tt class="py-lineno">1698</tt> <tt class="py-line"> <tt class="py-name">parent</tt><tt class="py-op">.</tt><tt id="link-387" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.add" class="py-name" href="#" onclick="return doclink('link-387', 'add', 'link-283');">add</a></tt><tt class="py-op">(</tt><tt class="py-name">child</tt><tt class="py-op">)</tt> </tt>
+<a name="L1699"></a><tt class="py-lineno">1699</tt> <tt class="py-line"> <tt class="py-name">treeLevel</tt> <tt class="py-op">=</tt> <tt class="py-name">newLevel</tt> </tt>
+<a name="L1700"></a><tt class="py-lineno">1700</tt> <tt class="py-line"> <tt class="py-name">lastView</tt> <tt class="py-op">=</tt> <tt class="py-name">child</tt> </tt>
+<a name="L1701"></a><tt class="py-lineno">1701</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-name">lastView</tt><tt class="py-op">)</tt> </tt>
+<a name="L1702"></a><tt class="py-lineno">1702</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">[</tt><tt class="py-name">lastView</tt><tt class="py-op">.</tt><tt id="link-388" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-388', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">lastView</tt> </tt>
+</div><a name="L1703"></a><tt class="py-lineno">1703</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__parseTreeFromUiAutomatorDump"></a><div id="ViewClient.__parseTreeFromUiAutomatorDump-def"><a name="L1704"></a><tt class="py-lineno">1704</tt> <a class="py-toggle" href="#" id="ViewClient.__parseTreeFromUiAutomatorDump-toggle" onclick="return toggle('ViewClient.__parseTreeFromUiAutomatorDump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__parseTreeFromUiAutomatorDump">__parseTreeFromUiAutomatorDump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">receivedXml</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__parseTreeFromUiAutomatorDump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__parseTreeFromUiAutomatorDump-expanded"><a name="L1705"></a><tt class="py-lineno">1705</tt> <tt class="py-line"> <tt class="py-name">parser</tt> <tt class="py-op">=</tt> <tt id="link-389" class="py-name" targets="Class src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient=src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"><a title="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient" class="py-name" href="#" onclick="return doclink('link-389', 'UiAutomator2AndroidViewClient', 'link-389');">UiAutomator2AndroidViewClient</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-390" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-390', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
+<a name="L1706"></a><tt class="py-lineno">1706</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt id="link-391" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.Parse
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-391', 'Parse', 'link-287');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">receivedXml</tt><tt class="py-op">)</tt> </tt>
+<a name="L1707"></a><tt class="py-lineno">1707</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-op">=</tt> <tt class="py-name">parser</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> </tt>
+<a name="L1708"></a><tt class="py-lineno">1708</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1709"></a><tt class="py-lineno">1709</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">:</tt> </tt>
+<a name="L1710"></a><tt class="py-lineno">1710</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt><tt class="py-op">[</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt id="link-392" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-392', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">v</tt> </tt>
+</div><a name="L1711"></a><tt class="py-lineno">1711</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getRoot"></a><div id="ViewClient.getRoot-def"><a name="L1712"></a><tt class="py-lineno">1712</tt> <a class="py-toggle" href="#" id="ViewClient.getRoot-toggle" onclick="return toggle('ViewClient.getRoot');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getRoot">getRoot</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getRoot-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getRoot-expanded"><a name="L1713"></a><tt class="py-lineno">1713</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1714"></a><tt class="py-lineno">1714</tt> <tt class="py-line"><tt class="py-docstring"> Gets the root node of the C{View} tree</tt> </tt>
+<a name="L1715"></a><tt class="py-lineno">1715</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1716"></a><tt class="py-lineno">1716</tt> <tt class="py-line"><tt class="py-docstring"> @return: the root node of the C{View} tree</tt> </tt>
+<a name="L1717"></a><tt class="py-lineno">1717</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1718"></a><tt class="py-lineno">1718</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+</div><a name="L1719"></a><tt class="py-lineno">1719</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.traverse"></a><div id="ViewClient.traverse-def"><a name="L1720"></a><tt class="py-lineno">1720</tt> <a class="py-toggle" href="#" id="ViewClient.traverse-toggle" onclick="return toggle('ViewClient.traverse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse">traverse</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">indent</tt><tt class="py-op">=</tt><tt class="py-string">""</tt><tt class="py-op">,</tt> <tt class="py-param">transform</tt><tt class="py-op">=</tt><tt id="link-393" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-393', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-394" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-394', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-param">stream</tt><tt class="py-op">=</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.traverse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.traverse-expanded"><a name="L1721"></a><tt class="py-lineno">1721</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1722"></a><tt class="py-lineno">1722</tt> <tt class="py-line"><tt class="py-docstring"> Traverses the C{View} tree and prints its nodes.</tt> </tt>
+<a name="L1723"></a><tt class="py-lineno">1723</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1724"></a><tt class="py-lineno">1724</tt> <tt class="py-line"><tt class="py-docstring"> The nodes are printed converting them to string but other transformations can be specified</tt> </tt>
+<a name="L1725"></a><tt class="py-lineno">1725</tt> <tt class="py-line"><tt class="py-docstring"> by providing a method name as the C{transform} parameter.</tt> </tt>
+<a name="L1726"></a><tt class="py-lineno">1726</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1727"></a><tt class="py-lineno">1727</tt> <tt class="py-line"><tt class="py-docstring"> @type root: L{View}</tt> </tt>
+<a name="L1728"></a><tt class="py-lineno">1728</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node from where the traverse starts</tt> </tt>
+<a name="L1729"></a><tt class="py-lineno">1729</tt> <tt class="py-line"><tt class="py-docstring"> @type indent: str</tt> </tt>
+<a name="L1730"></a><tt class="py-lineno">1730</tt> <tt class="py-line"><tt class="py-docstring"> @param indent: the indentation string to use to print the nodes</tt> </tt>
+<a name="L1731"></a><tt class="py-lineno">1731</tt> <tt class="py-line"><tt class="py-docstring"> @type transform: method</tt> </tt>
+<a name="L1732"></a><tt class="py-lineno">1732</tt> <tt class="py-line"><tt class="py-docstring"> @param transform: a method to use to transform the node before is printed </tt> </tt>
+<a name="L1733"></a><tt class="py-lineno">1733</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1734"></a><tt class="py-lineno">1734</tt> <tt class="py-line"> </tt>
+<a name="L1735"></a><tt class="py-lineno">1735</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-395" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-395', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L1736"></a><tt class="py-lineno">1736</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L1737"></a><tt class="py-lineno">1737</tt> <tt class="py-line"> </tt>
+<a name="L1738"></a><tt class="py-lineno">1738</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-396" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-396', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-397" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__traverse()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__traverse"><a title="src.com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-397', '__traverse', 'link-397');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">indent</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">,</tt> <tt class="py-name">stream</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1739"></a><tt class="py-lineno">1739</tt> <tt class="py-line"><tt class="py-comment"># if not root:</tt> </tt>
+<a name="L1740"></a><tt class="py-lineno">1740</tt> <tt class="py-line"><tt class="py-comment"># return</tt> </tt>
+<a name="L1741"></a><tt class="py-lineno">1741</tt> <tt class="py-line"><tt class="py-comment"># </tt> </tt>
+<a name="L1742"></a><tt class="py-lineno">1742</tt> <tt class="py-line"><tt class="py-comment"># s = transform(root)</tt> </tt>
+<a name="L1743"></a><tt class="py-lineno">1743</tt> <tt class="py-line"><tt class="py-comment"># if s:</tt> </tt>
+<a name="L1744"></a><tt class="py-lineno">1744</tt> <tt class="py-line"><tt class="py-comment"># print >>stream, "%s%s" % (indent, s)</tt> </tt>
+<a name="L1745"></a><tt class="py-lineno">1745</tt> <tt class="py-line"><tt class="py-comment"># </tt> </tt>
+<a name="L1746"></a><tt class="py-lineno">1746</tt> <tt class="py-line"><tt class="py-comment"># for ch in root.children:</tt> </tt>
+<a name="L1747"></a><tt class="py-lineno">1747</tt> <tt class="py-line"><tt class="py-comment"># self.traverse(ch, indent=indent+" ", transform=transform, stream=stream)</tt> </tt>
+<a name="L1748"></a><tt class="py-lineno">1748</tt> <tt class="py-line"> </tt>
+<a name="L1749"></a><tt class="py-lineno">1749</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__traverse"></a><div id="ViewClient.__traverse-def"><a name="L1750"></a><tt class="py-lineno">1750</tt> <a class="py-toggle" href="#" id="ViewClient.__traverse-toggle" onclick="return toggle('ViewClient.__traverse');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__traverse">__traverse</a><tt class="py-op">(</tt><tt class="py-param">root</tt><tt class="py-op">,</tt> <tt class="py-param">indent</tt><tt class="py-op">=</tt><tt class="py-string">""</tt><tt class="py-op">,</tt> <tt class="py-param">transform</tt><tt class="py-op">=</tt><tt id="link-398" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-398', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-399" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-399', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-param">stream</tt><tt class="py-op">=</tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__traverse-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__traverse-expanded"><a name="L1751"></a><tt class="py-lineno">1751</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L1752"></a><tt class="py-lineno">1752</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> </tt>
+<a name="L1753"></a><tt class="py-lineno">1753</tt> <tt class="py-line"> </tt>
+<a name="L1754"></a><tt class="py-lineno">1754</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">transform</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L1755"></a><tt class="py-lineno">1755</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt><tt class="py-op">:</tt> </tt>
+<a name="L1756"></a><tt class="py-lineno">1756</tt> <tt class="py-line"> <tt class="py-name">us</tt> <tt class="py-op">=</tt> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1757"></a><tt class="py-lineno">1757</tt> <tt class="py-line"> <tt class="py-name">ius</tt> <tt class="py-op">=</tt> <tt class="py-name">unicode</tt><tt class="py-op">(</tt><tt class="py-string">"%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">indent</tt><tt class="py-op">,</tt> <tt class="py-name">us</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1758"></a><tt class="py-lineno">1758</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">stream</tt><tt class="py-op">,</tt> <tt class="py-name">ius</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'replace'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1759"></a><tt class="py-lineno">1759</tt> <tt class="py-line"> </tt>
+<a name="L1760"></a><tt class="py-lineno">1760</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L1761"></a><tt class="py-lineno">1761</tt> <tt class="py-line"> <tt id="link-400" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-400', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-401" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-401', '__traverse', 'link-397');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">indent</tt><tt class="py-op">=</tt><tt class="py-name">indent</tt><tt class="py-op">+</tt><tt class="py-string">" "</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">=</tt><tt class="py-name">transform</tt><tt class="py-op">,</tt> <tt class="py-name">stream</tt><tt class="py-op">=</tt><tt class="py-name">stream</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L1762"></a><tt class="py-lineno">1762</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.dump"></a><div id="ViewClient.dump-def"><a name="L1763"></a><tt class="py-lineno">1763</tt> <a class="py-toggle" href="#" id="ViewClient.dump-toggle" onclick="return toggle('ViewClient.dump');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#dump">dump</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">window</tt><tt class="py-op">=</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-param">sleep</tt><tt class="py-op">=</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.dump-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.dump-expanded"><a name="L1764"></a><tt class="py-lineno">1764</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1765"></a><tt class="py-lineno">1765</tt> <tt class="py-line"><tt class="py-docstring"> Dumps the window content.</tt> </tt>
+<a name="L1766"></a><tt class="py-lineno">1766</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1767"></a><tt class="py-lineno">1767</tt> <tt class="py-line"><tt class="py-docstring"> Sleep is useful to wait some time before obtaining the new content when something in the</tt> </tt>
+<a name="L1768"></a><tt class="py-lineno">1768</tt> <tt class="py-line"><tt class="py-docstring"> window has changed.</tt> </tt>
+<a name="L1769"></a><tt class="py-lineno">1769</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1770"></a><tt class="py-lineno">1770</tt> <tt class="py-line"><tt class="py-docstring"> @type window: int or str</tt> </tt>
+<a name="L1771"></a><tt class="py-lineno">1771</tt> <tt class="py-line"><tt class="py-docstring"> @param window: the window id or name of the window to dump.</tt> </tt>
+<a name="L1772"></a><tt class="py-lineno">1772</tt> <tt class="py-line"><tt class="py-docstring"> The B{name} is the package name or the window name (i.e. StatusBar) for</tt> </tt>
+<a name="L1773"></a><tt class="py-lineno">1773</tt> <tt class="py-line"><tt class="py-docstring"> system windows.</tt> </tt>
+<a name="L1774"></a><tt class="py-lineno">1774</tt> <tt class="py-line"><tt class="py-docstring"> The window id can be provided as C{int} or C{str}. The C{str} should represent</tt> </tt>
+<a name="L1775"></a><tt class="py-lineno">1775</tt> <tt class="py-line"><tt class="py-docstring"> and C{int} in either base 10 or 16.</tt> </tt>
+<a name="L1776"></a><tt class="py-lineno">1776</tt> <tt class="py-line"><tt class="py-docstring"> Use -1 to dump all windows.</tt> </tt>
+<a name="L1777"></a><tt class="py-lineno">1777</tt> <tt class="py-line"><tt class="py-docstring"> This parameter only is used when the backend is B{ViewServer} and it's</tt> </tt>
+<a name="L1778"></a><tt class="py-lineno">1778</tt> <tt class="py-line"><tt class="py-docstring"> ignored for B{UiAutomator}.</tt> </tt>
+<a name="L1779"></a><tt class="py-lineno">1779</tt> <tt class="py-line"><tt class="py-docstring"> @type sleep: int</tt> </tt>
+<a name="L1780"></a><tt class="py-lineno">1780</tt> <tt class="py-line"><tt class="py-docstring"> @param sleep: sleep in seconds before proceeding to dump the content</tt> </tt>
+<a name="L1781"></a><tt class="py-lineno">1781</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1782"></a><tt class="py-lineno">1782</tt> <tt class="py-line"><tt class="py-docstring"> @return: the list of Views as C{str} received from the server after being split into lines</tt> </tt>
+<a name="L1783"></a><tt class="py-lineno">1783</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1784"></a><tt class="py-lineno">1784</tt> <tt class="py-line"> </tt>
+<a name="L1785"></a><tt class="py-lineno">1785</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-402" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-402', 'sleep', 'link-255');">sleep</a></tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1786"></a><tt class="py-lineno">1786</tt> <tt class="py-line"> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt id="link-403" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-403', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt id="link-404" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-404', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1787"></a><tt class="py-lineno">1787</tt> <tt class="py-line"> </tt>
+<a name="L1788"></a><tt class="py-lineno">1788</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1789"></a><tt class="py-lineno">1789</tt> <tt class="py-line"> <tt class="py-comment"># NOTICE:</tt> </tt>
+<a name="L1790"></a><tt class="py-lineno">1790</tt> <tt class="py-line"> <tt class="py-comment"># Using /dev/tty this works even on devices with no sdcard</tt> </tt>
+<a name="L1791"></a><tt class="py-lineno">1791</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'uiautomator dump /dev/tty >/dev/null'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1792"></a><tt class="py-lineno">1792</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">received</tt><tt class="py-op">:</tt> </tt>
+<a name="L1793"></a><tt class="py-lineno">1793</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'ERROR: Empty UiAutomator dump was received'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1794"></a><tt class="py-lineno">1794</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'utf-8'</tt><tt class="py-op">,</tt> <tt class="py-string">'ignore'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1795"></a><tt class="py-lineno">1795</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-405" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-405', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1796"></a><tt class="py-lineno">1796</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1797"></a><tt class="py-lineno">1797</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-406" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-406', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1798"></a><tt class="py-lineno">1798</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1799"></a><tt class="py-lineno">1799</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1800"></a><tt class="py-lineno">1800</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">repr</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1801"></a><tt class="py-lineno">1801</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1802"></a><tt class="py-lineno">1802</tt> <tt class="py-line"> <tt class="py-name">onlyKilledRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'[\n\S]*Killed[\n\r\S]*'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1803"></a><tt class="py-lineno">1803</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">onlyKilledRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1804"></a><tt class="py-lineno">1804</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'''ERROR: UiAutomator output contains no valid information. UiAutomator was killed, no reason given.'''</tt><tt class="py-op">)</tt> </tt>
+<a name="L1805"></a><tt class="py-lineno">1805</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">ignoreUiAutomatorKilled</tt><tt class="py-op">:</tt> </tt>
+<a name="L1806"></a><tt class="py-lineno">1806</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-407" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-407', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1807"></a><tt class="py-lineno">1807</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ignoring UiAutomator Killed"</tt> </tt>
+<a name="L1808"></a><tt class="py-lineno">1808</tt> <tt class="py-line"> <tt class="py-name">killedRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'</hierarchy>[\n\S]*Killed'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1809"></a><tt class="py-lineno">1809</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">killedRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1810"></a><tt class="py-lineno">1810</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-name">killedRE</tt><tt class="py-op">,</tt> <tt class="py-string">'</hierarchy>'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1811"></a><tt class="py-lineno">1811</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt id="link-408" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-408', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1812"></a><tt class="py-lineno">1812</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"UiAutomator Killed: NOT FOUND!"</tt> </tt>
+<a name="L1813"></a><tt class="py-lineno">1813</tt> <tt class="py-line"> <tt class="py-comment"># It seems that API18 uiautomator spits this message to stdout</tt> </tt>
+<a name="L1814"></a><tt class="py-lineno">1814</tt> <tt class="py-line"> <tt class="py-name">dumpedToDevTtyRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'</hierarchy>[\n\S]*UI hierchary dumped to: /dev/tty.*'</tt><tt class="py-op">,</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">MULTILINE</tt><tt class="py-op">)</tt> </tt>
+<a name="L1815"></a><tt class="py-lineno">1815</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">dumpedToDevTtyRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1816"></a><tt class="py-lineno">1816</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-name">dumpedToDevTtyRE</tt><tt class="py-op">,</tt> <tt class="py-string">'</hierarchy>'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1817"></a><tt class="py-lineno">1817</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-409" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-409', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1818"></a><tt class="py-lineno">1818</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received="</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1819"></a><tt class="py-lineno">1819</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-string">'\[: not found'</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1820"></a><tt class="py-lineno">1820</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">'''ERROR: Some emulator images (i.e. android 4.1.2 API 16 generic_x86) does not include the '[' command.</tt> </tt>
+<a name="L1821"></a><tt class="py-lineno">1821</tt> <tt class="py-line"><tt class="py-string">While UiAutomator back-end might be supported 'uiautomator' command fails.</tt> </tt>
+<a name="L1822"></a><tt class="py-lineno">1822</tt> <tt class="py-line"><tt class="py-string">You should force ViewServer back-end.'''</tt><tt class="py-op">)</tt> </tt>
+<a name="L1823"></a><tt class="py-lineno">1823</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-410" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.setViewsFromUiAutomatorDump()=src.com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump"><a title="src.com.dtmilano.android.viewclient.ViewClient.setViewsFromUiAutomatorDump" class="py-name" href="#" onclick="return doclink('link-410', 'setViewsFromUiAutomatorDump', 'link-410');">setViewsFromUiAutomatorDump</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1824"></a><tt class="py-lineno">1824</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1825"></a><tt class="py-lineno">1825</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-name">str</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1826"></a><tt class="py-lineno">1826</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-411" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.list" class="py-name" href="#" onclick="return doclink('link-411', 'list', 'link-259');">list</a></tt><tt class="py-op">(</tt><tt id="link-412" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-412', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">=</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1827"></a><tt class="py-lineno">1827</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">False</tt> </tt>
+<a name="L1828"></a><tt class="py-lineno">1828</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">wId</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">:</tt> </tt>
+<a name="L1829"></a><tt class="py-lineno">1829</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1830"></a><tt class="py-lineno">1830</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">window</tt> <tt class="py-op">==</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">wId</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
+<a name="L1831"></a><tt class="py-lineno">1831</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1832"></a><tt class="py-lineno">1832</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1833"></a><tt class="py-lineno">1833</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1834"></a><tt class="py-lineno">1834</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1835"></a><tt class="py-lineno">1835</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1836"></a><tt class="py-lineno">1836</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1837"></a><tt class="py-lineno">1837</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">wId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1838"></a><tt class="py-lineno">1838</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1839"></a><tt class="py-lineno">1839</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1840"></a><tt class="py-lineno">1840</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1841"></a><tt class="py-lineno">1841</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1842"></a><tt class="py-lineno">1842</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1843"></a><tt class="py-lineno">1843</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1844"></a><tt class="py-lineno">1844</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">wId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1845"></a><tt class="py-lineno">1845</tt> <tt class="py-line"> <tt class="py-name">window</tt> <tt class="py-op">=</tt> <tt class="py-name">wId</tt> </tt>
+<a name="L1846"></a><tt class="py-lineno">1846</tt> <tt class="py-line"> <tt class="py-name">found</tt> <tt class="py-op">=</tt> <tt class="py-name">True</tt> </tt>
+<a name="L1847"></a><tt class="py-lineno">1847</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1848"></a><tt class="py-lineno">1848</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L1849"></a><tt class="py-lineno">1849</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt>
+<a name="L1850"></a><tt class="py-lineno">1850</tt> <tt class="py-line"> </tt>
+<a name="L1851"></a><tt class="py-lineno">1851</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">found</tt><tt class="py-op">:</tt> </tt>
+<a name="L1852"></a><tt class="py-lineno">1852</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Cannot find window '%s' in %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">window</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1853"></a><tt class="py-lineno">1853</tt> <tt class="py-line"> </tt>
+<a name="L1854"></a><tt class="py-lineno">1854</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">(</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">AF_INET</tt><tt class="py-op">,</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">SOCK_STREAM</tt><tt class="py-op">)</tt> </tt>
+<a name="L1855"></a><tt class="py-lineno">1855</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1856"></a><tt class="py-lineno">1856</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">connect</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt id="link-413" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-413', 'VIEW_SERVER_HOST', 'link-25');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1857"></a><tt class="py-lineno">1857</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">error</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1858"></a><tt class="py-lineno">1858</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Connecting to %s:%d: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-414" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-414', 'VIEW_SERVER_HOST', 'link-25');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1859"></a><tt class="py-lineno">1859</tt> <tt class="py-line"> <tt class="py-name">cmd</tt> <tt class="py-op">=</tt> <tt class="py-string">'dump %x\r\n'</tt> <tt class="py-op">%</tt> <tt class="py-name">window</tt> </tt>
+<a name="L1860"></a><tt class="py-lineno">1860</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-415" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-415', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1861"></a><tt class="py-lineno">1861</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"executing: '%s'"</tt> <tt class="py-op">%</tt> <tt class="py-name">cmd</tt> </tt>
+<a name="L1862"></a><tt class="py-lineno">1862</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">send</tt><tt class="py-op">(</tt><tt class="py-name">cmd</tt><tt class="py-op">)</tt> </tt>
+<a name="L1863"></a><tt class="py-lineno">1863</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-string">""</tt> </tt>
+<a name="L1864"></a><tt class="py-lineno">1864</tt> <tt class="py-line"> <tt class="py-name">doneRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"DONE"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1865"></a><tt class="py-lineno">1865</tt> <tt class="py-line"> <tt id="link-416" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-416', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-417" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-417', 'setAlarm', 'link-326');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">120</tt><tt class="py-op">)</tt> </tt>
+<a name="L1866"></a><tt class="py-lineno">1866</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1867"></a><tt class="py-lineno">1867</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-418" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-418', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1868"></a><tt class="py-lineno">1868</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">" reading from socket..."</tt> </tt>
+<a name="L1869"></a><tt class="py-lineno">1869</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">+=</tt> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">1024</tt><tt class="py-op">)</tt> </tt>
+<a name="L1870"></a><tt class="py-lineno">1870</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">7</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1871"></a><tt class="py-lineno">1871</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1872"></a><tt class="py-lineno">1872</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">close</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1873"></a><tt class="py-lineno">1873</tt> <tt class="py-line"> <tt id="link-419" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-419', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-420" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.setAlarm" class="py-name" href="#" onclick="return doclink('link-420', 'setAlarm', 'link-326');">setAlarm</a></tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
+<a name="L1874"></a><tt class="py-lineno">1874</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-421" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-421', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1875"></a><tt class="py-lineno">1875</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1876"></a><tt class="py-lineno">1876</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-422" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-422', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1877"></a><tt class="py-lineno">1877</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1878"></a><tt class="py-lineno">1878</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1879"></a><tt class="py-lineno">1879</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1880"></a><tt class="py-lineno">1880</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1881"></a><tt class="py-lineno">1881</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-423" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.setViews()=src.com.dtmilano.android.viewclient.ViewClient-class.html#setViews"><a title="src.com.dtmilano.android.viewclient.ViewClient.setViews" class="py-name" href="#" onclick="return doclink('link-423', 'setViews', 'link-423');">setViews</a></tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1882"></a><tt class="py-lineno">1882</tt> <tt class="py-line"> </tt>
+<a name="L1883"></a><tt class="py-lineno">1883</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-424" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_TREE" class="py-name" href="#" onclick="return doclink('link-424', 'DEBUG_TREE', 'link-6');">DEBUG_TREE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1884"></a><tt class="py-lineno">1884</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-425" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.traverse()=src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"><a title="src.com.dtmilano.android.viewclient.ViewClient.traverse" class="py-name" href="#" onclick="return doclink('link-425', 'traverse', 'link-425');">traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L1885"></a><tt class="py-lineno">1885</tt> <tt class="py-line"> </tt>
+<a name="L1886"></a><tt class="py-lineno">1886</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> </tt>
+</div><a name="L1887"></a><tt class="py-lineno">1887</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.list"></a><div id="ViewClient.list-def"><a name="L1888"></a><tt class="py-lineno">1888</tt> <a class="py-toggle" href="#" id="ViewClient.list-toggle" onclick="return toggle('ViewClient.list');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#list">list</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">sleep</tt><tt class="py-op">=</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.list-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.list-expanded"><a name="L1889"></a><tt class="py-lineno">1889</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1890"></a><tt class="py-lineno">1890</tt> <tt class="py-line"><tt class="py-docstring"> List the windows.</tt> </tt>
+<a name="L1891"></a><tt class="py-lineno">1891</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1892"></a><tt class="py-lineno">1892</tt> <tt class="py-line"><tt class="py-docstring"> Sleep is useful to wait some time before obtaining the new content when something in the</tt> </tt>
+<a name="L1893"></a><tt class="py-lineno">1893</tt> <tt class="py-line"><tt class="py-docstring"> window has changed.</tt> </tt>
+<a name="L1894"></a><tt class="py-lineno">1894</tt> <tt class="py-line"><tt class="py-docstring"> This also sets L{self.windows} as the list of windows.</tt> </tt>
+<a name="L1895"></a><tt class="py-lineno">1895</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1896"></a><tt class="py-lineno">1896</tt> <tt class="py-line"><tt class="py-docstring"> @type sleep: int</tt> </tt>
+<a name="L1897"></a><tt class="py-lineno">1897</tt> <tt class="py-line"><tt class="py-docstring"> @param sleep: sleep in seconds before proceeding to dump the content</tt> </tt>
+<a name="L1898"></a><tt class="py-lineno">1898</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1899"></a><tt class="py-lineno">1899</tt> <tt class="py-line"><tt class="py-docstring"> @return: the list of windows</tt> </tt>
+<a name="L1900"></a><tt class="py-lineno">1900</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1901"></a><tt class="py-lineno">1901</tt> <tt class="py-line"> </tt>
+<a name="L1902"></a><tt class="py-lineno">1902</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-426" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-426', 'sleep', 'link-255');">sleep</a></tt> <tt class="py-op">></tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L1903"></a><tt class="py-lineno">1903</tt> <tt class="py-line"> <tt class="py-name">MonkeyRunner</tt><tt class="py-op">.</tt><tt id="link-427" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-427', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">(</tt><tt id="link-428" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.sleep" class="py-name" href="#" onclick="return doclink('link-428', 'sleep', 'link-255');">sleep</a></tt><tt class="py-op">)</tt> </tt>
+<a name="L1904"></a><tt class="py-lineno">1904</tt> <tt class="py-line"> </tt>
+<a name="L1905"></a><tt class="py-lineno">1905</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">useUiAutomator</tt><tt class="py-op">:</tt> </tt>
+<a name="L1906"></a><tt class="py-lineno">1906</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">Exception</tt><tt class="py-op">(</tt><tt class="py-string">"Not implemented yet: listing windows with UiAutomator"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1907"></a><tt class="py-lineno">1907</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1908"></a><tt class="py-lineno">1908</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">socket</tt><tt class="py-op">(</tt><tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">AF_INET</tt><tt class="py-op">,</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">SOCK_STREAM</tt><tt class="py-op">)</tt> </tt>
+<a name="L1909"></a><tt class="py-lineno">1909</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L1910"></a><tt class="py-lineno">1910</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">connect</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt id="link-429" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-429', 'VIEW_SERVER_HOST', 'link-25');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1911"></a><tt class="py-lineno">1911</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">socket</tt><tt class="py-op">.</tt><tt class="py-name">error</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">:</tt> </tt>
+<a name="L1912"></a><tt class="py-lineno">1912</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">RuntimeError</tt><tt class="py-op">(</tt><tt class="py-string">"ERROR: Connecting to %s:%d: %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt id="link-430" class="py-name"><a title="src.com.dtmilano.android.viewclient.VIEW_SERVER_HOST" class="py-name" href="#" onclick="return doclink('link-430', 'VIEW_SERVER_HOST', 'link-25');">VIEW_SERVER_HOST</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">localPort</tt><tt class="py-op">,</tt> <tt class="py-name">ex</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L1913"></a><tt class="py-lineno">1913</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">send</tt><tt class="py-op">(</tt><tt class="py-string">'list\r\n'</tt><tt class="py-op">)</tt> </tt>
+<a name="L1914"></a><tt class="py-lineno">1914</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-string">""</tt> </tt>
+<a name="L1915"></a><tt class="py-lineno">1915</tt> <tt class="py-line"> <tt class="py-name">doneRE</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">"DONE"</tt><tt class="py-op">)</tt> </tt>
+<a name="L1916"></a><tt class="py-lineno">1916</tt> <tt class="py-line"> <tt class="py-keyword">while</tt> <tt class="py-name">True</tt><tt class="py-op">:</tt> </tt>
+<a name="L1917"></a><tt class="py-lineno">1917</tt> <tt class="py-line"> <tt class="py-name">received</tt> <tt class="py-op">+=</tt> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">recv</tt><tt class="py-op">(</tt><tt class="py-number">1024</tt><tt class="py-op">)</tt> </tt>
+<a name="L1918"></a><tt class="py-lineno">1918</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">7</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1919"></a><tt class="py-lineno">1919</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1920"></a><tt class="py-lineno">1920</tt> <tt class="py-line"> <tt class="py-name">s</tt><tt class="py-op">.</tt><tt class="py-name">close</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1921"></a><tt class="py-lineno">1921</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-431" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-431', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1922"></a><tt class="py-lineno">1922</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">received</tt> <tt class="py-op">=</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1923"></a><tt class="py-lineno">1923</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-432" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_RECEIVED" class="py-name" href="#" onclick="return doclink('link-432', 'DEBUG_RECEIVED', 'link-4');">DEBUG_RECEIVED</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L1924"></a><tt class="py-lineno">1924</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"received %d chars"</tt> <tt class="py-op">%</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">received</tt><tt class="py-op">)</tt> </tt>
+<a name="L1925"></a><tt class="py-lineno">1925</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1926"></a><tt class="py-lineno">1926</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-name">received</tt> </tt>
+<a name="L1927"></a><tt class="py-lineno">1927</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt> </tt>
+<a name="L1928"></a><tt class="py-lineno">1928</tt> <tt class="py-line"> </tt>
+<a name="L1929"></a><tt class="py-lineno">1929</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> <tt class="py-op">=</tt> <tt class="py-op">{</tt><tt class="py-op">}</tt> </tt>
+<a name="L1930"></a><tt class="py-lineno">1930</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">line</tt> <tt class="py-keyword">in</tt> <tt class="py-name">received</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1931"></a><tt class="py-lineno">1931</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">line</tt><tt class="py-op">:</tt> </tt>
+<a name="L1932"></a><tt class="py-lineno">1932</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1933"></a><tt class="py-lineno">1933</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">doneRE</tt><tt class="py-op">.</tt><tt class="py-name">search</tt><tt class="py-op">(</tt><tt class="py-name">line</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1934"></a><tt class="py-lineno">1934</tt> <tt class="py-line"> <tt class="py-keyword">break</tt> </tt>
+<a name="L1935"></a><tt class="py-lineno">1935</tt> <tt class="py-line"> <tt class="py-op">(</tt><tt class="py-name">wid</tt><tt class="py-op">,</tt> <tt class="py-name">package</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-name">line</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L1936"></a><tt class="py-lineno">1936</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt><tt class="py-op">[</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-string">'0x'</tt> <tt class="py-op">+</tt> <tt class="py-name">wid</tt><tt class="py-op">,</tt> <tt class="py-number">16</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">package</tt> </tt>
+<a name="L1937"></a><tt class="py-lineno">1937</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">windows</tt> </tt>
+</div><a name="L1938"></a><tt class="py-lineno">1938</tt> <tt class="py-line"> </tt>
+<a name="L1939"></a><tt class="py-lineno">1939</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewById"></a><div id="ViewClient.findViewById-def"><a name="L1940"></a><tt class="py-lineno">1940</tt> <a class="py-toggle" href="#" id="ViewClient.findViewById-toggle" onclick="return toggle('ViewClient.findViewById');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewById">findViewById</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">viewId</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">viewFilter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewById-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewById-expanded"><a name="L1941"></a><tt class="py-lineno">1941</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1942"></a><tt class="py-lineno">1942</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified viewId.</tt> </tt>
+<a name="L1943"></a><tt class="py-lineno">1943</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1944"></a><tt class="py-lineno">1944</tt> <tt class="py-line"><tt class="py-docstring"> @type viewId: str</tt> </tt>
+<a name="L1945"></a><tt class="py-lineno">1945</tt> <tt class="py-line"><tt class="py-docstring"> @param viewId: the ID of the view to find</tt> </tt>
+<a name="L1946"></a><tt class="py-lineno">1946</tt> <tt class="py-line"><tt class="py-docstring"> @type root: str</tt> </tt>
+<a name="L1947"></a><tt class="py-lineno">1947</tt> <tt class="py-line"><tt class="py-docstring"> @type root: View</tt> </tt>
+<a name="L1948"></a><tt class="py-lineno">1948</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node of the tree where the View will be searched</tt> </tt>
+<a name="L1949"></a><tt class="py-lineno">1949</tt> <tt class="py-line"><tt class="py-docstring"> @type: viewFilter: function</tt> </tt>
+<a name="L1950"></a><tt class="py-lineno">1950</tt> <tt class="py-line"><tt class="py-docstring"> @param viewFilter: a function that will be invoked providing the candidate View as a parameter</tt> </tt>
+<a name="L1951"></a><tt class="py-lineno">1951</tt> <tt class="py-line"><tt class="py-docstring"> and depending on the return value (C{True} or C{False}) the View will be</tt> </tt>
+<a name="L1952"></a><tt class="py-lineno">1952</tt> <tt class="py-line"><tt class="py-docstring"> selected and returned as the result of C{findViewById()} or ignored.</tt> </tt>
+<a name="L1953"></a><tt class="py-lineno">1953</tt> <tt class="py-line"><tt class="py-docstring"> This can be C{None} and no extra filtering is applied.</tt> </tt>
+<a name="L1954"></a><tt class="py-lineno">1954</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1955"></a><tt class="py-lineno">1955</tt> <tt class="py-line"><tt class="py-docstring"> @return: the C{View} found or C{None}</tt> </tt>
+<a name="L1956"></a><tt class="py-lineno">1956</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L1957"></a><tt class="py-lineno">1957</tt> <tt class="py-line"> </tt>
+<a name="L1958"></a><tt class="py-lineno">1958</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L1959"></a><tt class="py-lineno">1959</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L1960"></a><tt class="py-lineno">1960</tt> <tt class="py-line"> </tt>
+<a name="L1961"></a><tt class="py-lineno">1961</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-433" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-433', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L1962"></a><tt class="py-lineno">1962</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-434" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.findViewById()=src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewById"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-434', 'findViewById', 'link-434');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L1963"></a><tt class="py-lineno">1963</tt> <tt class="py-line"> </tt>
+<a name="L1964"></a><tt class="py-lineno">1964</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-435" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getId" class="py-name" href="#" onclick="return doclink('link-435', 'getId', 'link-124');">getId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1965"></a><tt class="py-lineno">1965</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L1966"></a><tt class="py-lineno">1966</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1967"></a><tt class="py-lineno">1967</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L1968"></a><tt class="py-lineno">1968</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1969"></a><tt class="py-lineno">1969</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L1970"></a><tt class="py-lineno">1970</tt> <tt class="py-line"> </tt>
+<a name="L1971"></a><tt class="py-lineno">1971</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^id/no_id'</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-string">'^id/.+/.+'</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1972"></a><tt class="py-lineno">1972</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-436" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.getUniqueId" class="py-name" href="#" onclick="return doclink('link-436', 'getUniqueId', 'link-125');">getUniqueId</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">viewId</tt><tt class="py-op">:</tt> </tt>
+<a name="L1973"></a><tt class="py-lineno">1973</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L1974"></a><tt class="py-lineno">1974</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1975"></a><tt class="py-lineno">1975</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt><tt class="py-op">;</tt> </tt>
+<a name="L1976"></a><tt class="py-lineno">1976</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1977"></a><tt class="py-lineno">1977</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L1978"></a><tt class="py-lineno">1978</tt> <tt class="py-line"> </tt>
+<a name="L1979"></a><tt class="py-lineno">1979</tt> <tt class="py-line"> </tt>
+<a name="L1980"></a><tt class="py-lineno">1980</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L1981"></a><tt class="py-lineno">1981</tt> <tt class="py-line"> <tt class="py-name">foundView</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-437" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-437', 'findViewById', 'link-434');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L1982"></a><tt class="py-lineno">1982</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">foundView</tt><tt class="py-op">:</tt> </tt>
+<a name="L1983"></a><tt class="py-lineno">1983</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">:</tt> </tt>
+<a name="L1984"></a><tt class="py-lineno">1984</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">(</tt><tt class="py-name">foundView</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L1985"></a><tt class="py-lineno">1985</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">foundView</tt> </tt>
+<a name="L1986"></a><tt class="py-lineno">1986</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L1987"></a><tt class="py-lineno">1987</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">foundView</tt> </tt>
+</div><a name="L1988"></a><tt class="py-lineno">1988</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByIdOrRaise"></a><div id="ViewClient.findViewByIdOrRaise-def"><a name="L1989"></a><tt class="py-lineno">1989</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByIdOrRaise-toggle" onclick="return toggle('ViewClient.findViewByIdOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise">findViewByIdOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">viewId</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">,</tt> <tt class="py-param">viewFilter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByIdOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByIdOrRaise-expanded"><a name="L1990"></a><tt class="py-lineno">1990</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L1991"></a><tt class="py-lineno">1991</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L1992"></a><tt class="py-lineno">1992</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L1993"></a><tt class="py-lineno">1993</tt> <tt class="py-line"><tt class="py-docstring"> @type viewId: str</tt> </tt>
+<a name="L1994"></a><tt class="py-lineno">1994</tt> <tt class="py-line"><tt class="py-docstring"> @param viewId: the ID of the view to find</tt> </tt>
+<a name="L1995"></a><tt class="py-lineno">1995</tt> <tt class="py-line"><tt class="py-docstring"> @type root: str</tt> </tt>
+<a name="L1996"></a><tt class="py-lineno">1996</tt> <tt class="py-line"><tt class="py-docstring"> @type root: View</tt> </tt>
+<a name="L1997"></a><tt class="py-lineno">1997</tt> <tt class="py-line"><tt class="py-docstring"> @param root: the root node of the tree where the View will be searched</tt> </tt>
+<a name="L1998"></a><tt class="py-lineno">1998</tt> <tt class="py-line"><tt class="py-docstring"> @type: viewFilter: function</tt> </tt>
+<a name="L1999"></a><tt class="py-lineno">1999</tt> <tt class="py-line"><tt class="py-docstring"> @param viewFilter: a function that will be invoked providing the candidate View as a parameter</tt> </tt>
+<a name="L2000"></a><tt class="py-lineno">2000</tt> <tt class="py-line"><tt class="py-docstring"> and depending on the return value (C{True} or C{False}) the View will be</tt> </tt>
+<a name="L2001"></a><tt class="py-lineno">2001</tt> <tt class="py-line"><tt class="py-docstring"> selected and returned as the result of C{findViewById()} or ignored.</tt> </tt>
+<a name="L2002"></a><tt class="py-lineno">2002</tt> <tt class="py-line"><tt class="py-docstring"> This can be C{None} and no extra filtering is applied.</tt> </tt>
+<a name="L2003"></a><tt class="py-lineno">2003</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2004"></a><tt class="py-lineno">2004</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2005"></a><tt class="py-lineno">2005</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2006"></a><tt class="py-lineno">2006</tt> <tt class="py-line"> </tt>
+<a name="L2007"></a><tt class="py-lineno">2007</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-438" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewById" class="py-name" href="#" onclick="return doclink('link-438', 'findViewById', 'link-434');">findViewById</a></tt><tt class="py-op">(</tt><tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">,</tt> <tt class="py-name">viewFilter</tt><tt class="py-op">)</tt> </tt>
+<a name="L2008"></a><tt class="py-lineno">2008</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2009"></a><tt class="py-lineno">2009</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2010"></a><tt class="py-lineno">2010</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2011"></a><tt class="py-lineno">2011</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-439" class="py-name" targets="Class src.com.dtmilano.android.viewclient.ViewNotFoundException=src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html"><a title="src.com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-439', 'ViewNotFoundException', 'link-439');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"ID"</tt><tt class="py-op">,</tt> <tt class="py-name">viewId</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2012"></a><tt class="py-lineno">2012</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByTag"></a><div id="ViewClient.findViewByTag-def"><a name="L2013"></a><tt class="py-lineno">2013</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByTag-toggle" onclick="return toggle('ViewClient.findViewByTag');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTag">findViewByTag</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tag</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByTag-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByTag-expanded"><a name="L2014"></a><tt class="py-lineno">2014</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2015"></a><tt class="py-lineno">2015</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified tag</tt> </tt>
+<a name="L2016"></a><tt class="py-lineno">2016</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2017"></a><tt class="py-lineno">2017</tt> <tt class="py-line"> </tt>
+<a name="L2018"></a><tt class="py-lineno">2018</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-440" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute()=src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-440', 'findViewWithAttribute', 'link-440');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-string">'getTag()'</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2019"></a><tt class="py-lineno">2019</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewByTagOrRaise"></a><div id="ViewClient.findViewByTagOrRaise-def"><a name="L2020"></a><tt class="py-lineno">2020</tt> <a class="py-toggle" href="#" id="ViewClient.findViewByTagOrRaise-toggle" onclick="return toggle('ViewClient.findViewByTagOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewByTagOrRaise">findViewByTagOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tag</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewByTagOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewByTagOrRaise-expanded"><a name="L2021"></a><tt class="py-lineno">2021</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2022"></a><tt class="py-lineno">2022</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified tag or raise a ViewNotFoundException</tt> </tt>
+<a name="L2023"></a><tt class="py-lineno">2023</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2024"></a><tt class="py-lineno">2024</tt> <tt class="py-line"> </tt>
+<a name="L2025"></a><tt class="py-lineno">2025</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-441" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-441', 'findViewWithAttribute', 'link-440');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-string">'getTag()'</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2026"></a><tt class="py-lineno">2026</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2027"></a><tt class="py-lineno">2027</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2028"></a><tt class="py-lineno">2028</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2029"></a><tt class="py-lineno">2029</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-442" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-442', 'ViewNotFoundException', 'link-439');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"tag"</tt><tt class="py-op">,</tt> <tt class="py-name">tag</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2030"></a><tt class="py-lineno">2030</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTree"></a><div id="ViewClient.__findViewWithAttributeInTree-def"><a name="L2031"></a><tt class="py-lineno">2031</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTree-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTree');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree">__findViewWithAttributeInTree</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTree-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTree-expanded"><a name="L2032"></a><tt class="py-lineno">2032</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L2033"></a><tt class="py-lineno">2033</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: no root, did you forget to call dump()?"</tt> </tt>
+<a name="L2034"></a><tt class="py-lineno">2034</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L2035"></a><tt class="py-lineno">2035</tt> <tt class="py-line"> </tt>
+<a name="L2036"></a><tt class="py-lineno">2036</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-443" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-443', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2037"></a><tt class="py-lineno">2037</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L2038"></a><tt class="py-lineno">2038</tt> <tt class="py-line"> </tt>
+<a name="L2039"></a><tt class="py-lineno">2039</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-444" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-444', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: type val="</tt><tt class="py-op">,</tt> <tt id="link-445" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-445', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">val</tt><tt class="py-op">)</tt> </tt>
+<a name="L2040"></a><tt class="py-lineno">2040</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-446" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-446', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: checking if root=%s has attr=%s == %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-447" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-447', '__smallStr__', 'link-336');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">)</tt> </tt>
+<a name="L2041"></a><tt class="py-lineno">2041</tt> <tt class="py-line"> </tt>
+<a name="L2042"></a><tt class="py-lineno">2042</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">org</tt><tt class="py-op">.</tt><tt class="py-name">python</tt><tt class="py-op">.</tt><tt class="py-name">modules</tt><tt class="py-op">.</tt><tt class="py-name">sre</tt><tt class="py-op">.</tt><tt class="py-name">PatternObject</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2043"></a><tt class="py-lineno">2043</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-448" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-448', '__findViewWithAttributeInTreeThatMatches', 'link-448');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2044"></a><tt class="py-lineno">2044</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2045"></a><tt class="py-lineno">2045</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt> <tt class="py-keyword">and</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">attr</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-name">val</tt><tt class="py-op">:</tt> </tt>
+<a name="L2046"></a><tt class="py-lineno">2046</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-449" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-449', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTree: FOUND: %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-450" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-450', '__smallStr__', 'link-336');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L2047"></a><tt class="py-lineno">2047</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2048"></a><tt class="py-lineno">2048</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2049"></a><tt class="py-lineno">2049</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L2050"></a><tt class="py-lineno">2050</tt> <tt class="py-line"> <tt class="py-name">v</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-451" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTree"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-451', '__findViewWithAttributeInTree', 'link-451');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">)</tt> </tt>
+<a name="L2051"></a><tt class="py-lineno">2051</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> </tt>
+<a name="L2052"></a><tt class="py-lineno">2052</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">v</tt> </tt>
+<a name="L2053"></a><tt class="py-lineno">2053</tt> <tt class="py-line"> </tt>
+<a name="L2054"></a><tt class="py-lineno">2054</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2055"></a><tt class="py-lineno">2055</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTreeOrRaise"></a><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-def"><a name="L2056"></a><tt class="py-lineno">2056</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTreeOrRaise-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTreeOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise">__findViewWithAttributeInTreeOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTreeOrRaise-expanded"><a name="L2057"></a><tt class="py-lineno">2057</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-452" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-452', '__findViewWithAttributeInTree', 'link-451');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2058"></a><tt class="py-lineno">2058</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2059"></a><tt class="py-lineno">2059</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2060"></a><tt class="py-lineno">2060</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2061"></a><tt class="py-lineno">2061</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-453" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-453', 'ViewNotFoundException', 'link-439');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2062"></a><tt class="py-lineno">2062</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__findViewWithAttributeInTreeThatMatches"></a><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-def"><a name="L2063"></a><tt class="py-lineno">2063</tt> <a class="py-toggle" href="#" id="ViewClient.__findViewWithAttributeInTreeThatMatches-toggle" onclick="return toggle('ViewClient.__findViewWithAttributeInTreeThatMatches');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeThatMatches">__findViewWithAttributeInTreeThatMatches</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">regex</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">,</tt> <tt class="py-param">rlist</tt><tt class="py-op">=</tt><tt class="py-op">[</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__findViewWithAttributeInTreeThatMatches-expanded"><a name="L2064"></a><tt class="py-lineno">2064</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt><tt class="py-op">:</tt> </tt>
+<a name="L2065"></a><tt class="py-lineno">2065</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"ERROR: no root, did you forget to call dump()?"</tt> </tt>
+<a name="L2066"></a><tt class="py-lineno">2066</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+<a name="L2067"></a><tt class="py-lineno">2067</tt> <tt class="py-line"> </tt>
+<a name="L2068"></a><tt class="py-lineno">2068</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-454" class="py-name"><a title="src.com.dtmilano.android.viewclient.EditText.type" class="py-name" href="#" onclick="return doclink('link-454', 'type', 'link-252');">type</a></tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-name">types</tt><tt class="py-op">.</tt><tt class="py-name">StringType</tt> <tt class="py-keyword">and</tt> <tt class="py-name">root</tt> <tt class="py-op">==</tt> <tt class="py-string">"ROOT"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2069"></a><tt class="py-lineno">2069</tt> <tt class="py-line"> <tt class="py-name">root</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">root</tt> </tt>
+<a name="L2070"></a><tt class="py-lineno">2070</tt> <tt class="py-line"> </tt>
+<a name="L2071"></a><tt class="py-lineno">2071</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-455" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-455', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTreeThatMatches: checking if root=%s attr=%s matches %s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-456" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-456', '__smallStr__', 'link-336');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">)</tt> </tt>
+<a name="L2072"></a><tt class="py-lineno">2072</tt> <tt class="py-line"> </tt>
+<a name="L2073"></a><tt class="py-lineno">2073</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">root</tt> <tt class="py-keyword">and</tt> <tt class="py-name">attr</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt> <tt class="py-keyword">and</tt> <tt class="py-name">regex</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">map</tt><tt class="py-op">[</tt><tt class="py-name">attr</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2074"></a><tt class="py-lineno">2074</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-457" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-457', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"__findViewWithAttributeInTreeThatMatches: FOUND: %s"</tt> <tt class="py-op">%</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt id="link-458" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__smallStr__" class="py-name" href="#" onclick="return doclink('link-458', '__smallStr__', 'link-336');">__smallStr__</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L2075"></a><tt class="py-lineno">2075</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">root</tt> </tt>
+<a name="L2076"></a><tt class="py-lineno">2076</tt> <tt class="py-line"> <tt class="py-comment">#print >>sys.stderr, "appending root=%s to rlist=%s" % (root.__smallStr__(), rlist)</tt> </tt>
+<a name="L2077"></a><tt class="py-lineno">2077</tt> <tt class="py-line"> <tt class="py-comment">#return rlist.append(root)</tt> </tt>
+<a name="L2078"></a><tt class="py-lineno">2078</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2079"></a><tt class="py-lineno">2079</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">ch</tt> <tt class="py-keyword">in</tt> <tt class="py-name">root</tt><tt class="py-op">.</tt><tt class="py-name">children</tt><tt class="py-op">:</tt> </tt>
+<a name="L2080"></a><tt class="py-lineno">2080</tt> <tt class="py-line"> <tt class="py-name">v</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-459" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-459', '__findViewWithAttributeInTreeThatMatches', 'link-448');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">,</tt> <tt class="py-name">ch</tt><tt class="py-op">,</tt> <tt class="py-name">rlist</tt><tt class="py-op">)</tt> </tt>
+<a name="L2081"></a><tt class="py-lineno">2081</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> </tt>
+<a name="L2082"></a><tt class="py-lineno">2082</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">v</tt> </tt>
+<a name="L2083"></a><tt class="py-lineno">2083</tt> <tt class="py-line"> <tt class="py-comment">#print >>sys.stderr, "appending v=%s to rlist=%s" % (v.__smallStr__(), rlist)</tt> </tt>
+<a name="L2084"></a><tt class="py-lineno">2084</tt> <tt class="py-line"> <tt class="py-comment">#return rlist.append(v)</tt> </tt>
+<a name="L2085"></a><tt class="py-lineno">2085</tt> <tt class="py-line"> </tt>
+<a name="L2086"></a><tt class="py-lineno">2086</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2087"></a><tt class="py-lineno">2087</tt> <tt class="py-line"> <tt class="py-comment">#return rlist</tt> </tt>
+<a name="L2088"></a><tt class="py-lineno">2088</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttribute"></a><div id="ViewClient.findViewWithAttribute-def"><a name="L2089"></a><tt class="py-lineno">2089</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttribute-toggle" onclick="return toggle('ViewClient.findViewWithAttribute');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttribute">findViewWithAttribute</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttribute-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttribute-expanded"><a name="L2090"></a><tt class="py-lineno">2090</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2091"></a><tt class="py-lineno">2091</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified attribute and value</tt> </tt>
+<a name="L2092"></a><tt class="py-lineno">2092</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2093"></a><tt class="py-lineno">2093</tt> <tt class="py-line"> </tt>
+<a name="L2094"></a><tt class="py-lineno">2094</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-460" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-460', '__findViewWithAttributeInTree', 'link-451');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2095"></a><tt class="py-lineno">2095</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttributeOrRaise"></a><div id="ViewClient.findViewWithAttributeOrRaise-def"><a name="L2096"></a><tt class="py-lineno">2096</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttributeOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithAttributeOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise">findViewWithAttributeOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">val</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttributeOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttributeOrRaise-expanded"><a name="L2097"></a><tt class="py-lineno">2097</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2098"></a><tt class="py-lineno">2098</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L2099"></a><tt class="py-lineno">2099</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2100"></a><tt class="py-lineno">2100</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2101"></a><tt class="py-lineno">2101</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2102"></a><tt class="py-lineno">2102</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2103"></a><tt class="py-lineno">2103</tt> <tt class="py-line"> </tt>
+<a name="L2104"></a><tt class="py-lineno">2104</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-461" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-461', 'findViewWithAttribute', 'link-440');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2105"></a><tt class="py-lineno">2105</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2106"></a><tt class="py-lineno">2106</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2107"></a><tt class="py-lineno">2107</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2108"></a><tt class="py-lineno">2108</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-462" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-462', 'ViewNotFoundException', 'link-439');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">val</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2109"></a><tt class="py-lineno">2109</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithAttributeThatMatches"></a><div id="ViewClient.findViewWithAttributeThatMatches-def"><a name="L2110"></a><tt class="py-lineno">2110</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithAttributeThatMatches-toggle" onclick="return toggle('ViewClient.findViewWithAttributeThatMatches');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches">findViewWithAttributeThatMatches</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">attr</tt><tt class="py-op">,</tt> <tt class="py-param">regex</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithAttributeThatMatches-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithAttributeThatMatches-expanded"><a name="L2111"></a><tt class="py-lineno">2111</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2112"></a><tt class="py-lineno">2112</tt> <tt class="py-line"><tt class="py-docstring"> Finds the list of Views with the specified attribute matching</tt> </tt>
+<a name="L2113"></a><tt class="py-lineno">2113</tt> <tt class="py-line"><tt class="py-docstring"> regex</tt> </tt>
+<a name="L2114"></a><tt class="py-lineno">2114</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2115"></a><tt class="py-lineno">2115</tt> <tt class="py-line"> </tt>
+<a name="L2116"></a><tt class="py-lineno">2116</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-463" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeThatMatches" class="py-name" href="#" onclick="return doclink('link-463', '__findViewWithAttributeInTreeThatMatches', 'link-448');">__findViewWithAttributeInTreeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">attr</tt><tt class="py-op">,</tt> <tt class="py-name">regex</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2117"></a><tt class="py-lineno">2117</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithText"></a><div id="ViewClient.findViewWithText-def"><a name="L2118"></a><tt class="py-lineno">2118</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithText-toggle" onclick="return toggle('ViewClient.findViewWithText');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText">findViewWithText</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithText-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithText-expanded"><a name="L2119"></a><tt class="py-lineno">2119</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-464" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-464', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2120"></a><tt class="py-lineno">2120</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"findViewWithText(%s, %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2121"></a><tt class="py-lineno">2121</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">isinstance</tt><tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">org</tt><tt class="py-op">.</tt><tt class="py-name">python</tt><tt class="py-op">.</tt><tt class="py-name">modules</tt><tt class="py-op">.</tt><tt class="py-name">sre</tt><tt class="py-op">.</tt><tt class="py-name">PatternObject</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2122"></a><tt class="py-lineno">2122</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-465" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeThatMatches()=src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeThatMatches"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttributeThatMatches" class="py-name" href="#" onclick="return doclink('link-465', 'findViewWithAttributeThatMatches', 'link-465');">findViewWithAttributeThatMatches</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2123"></a><tt class="py-lineno">2123</tt> <tt class="py-line"> <tt class="py-comment">#l = self.findViewWithAttributeThatMatches(TEXT_PROPERTY, text)</tt> </tt>
+<a name="L2124"></a><tt class="py-lineno">2124</tt> <tt class="py-line"> <tt class="py-comment">#ll = len(l)</tt> </tt>
+<a name="L2125"></a><tt class="py-lineno">2125</tt> <tt class="py-line"> <tt class="py-comment">#if ll == 0:</tt> </tt>
+<a name="L2126"></a><tt class="py-lineno">2126</tt> <tt class="py-line"> <tt class="py-comment"># return None</tt> </tt>
+<a name="L2127"></a><tt class="py-lineno">2127</tt> <tt class="py-line"> <tt class="py-comment">#elif ll == 1:</tt> </tt>
+<a name="L2128"></a><tt class="py-lineno">2128</tt> <tt class="py-line"> <tt class="py-comment"># return l[0]</tt> </tt>
+<a name="L2129"></a><tt class="py-lineno">2129</tt> <tt class="py-line"> <tt class="py-comment">#else:</tt> </tt>
+<a name="L2130"></a><tt class="py-lineno">2130</tt> <tt class="py-line"> <tt class="py-comment"># print >>sys.stderr, "WARNING: findViewWithAttributeThatMatches invoked by findViewWithText returns %d items." % ll</tt> </tt>
+<a name="L2131"></a><tt class="py-lineno">2131</tt> <tt class="py-line"> <tt class="py-comment"># return l</tt> </tt>
+<a name="L2132"></a><tt class="py-lineno">2132</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2133"></a><tt class="py-lineno">2133</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-466" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithAttribute" class="py-name" href="#" onclick="return doclink('link-466', 'findViewWithAttribute', 'link-440');">findViewWithAttribute</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">textProperty</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2134"></a><tt class="py-lineno">2134</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithTextOrRaise"></a><div id="ViewClient.findViewWithTextOrRaise-def"><a name="L2135"></a><tt class="py-lineno">2135</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithTextOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithTextOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise">findViewWithTextOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">text</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithTextOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithTextOrRaise-expanded"><a name="L2136"></a><tt class="py-lineno">2136</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2137"></a><tt class="py-lineno">2137</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View or raise a ViewNotFoundException.</tt> </tt>
+<a name="L2138"></a><tt class="py-lineno">2138</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2139"></a><tt class="py-lineno">2139</tt> <tt class="py-line"><tt class="py-docstring"> @return: the View found</tt> </tt>
+<a name="L2140"></a><tt class="py-lineno">2140</tt> <tt class="py-line"><tt class="py-docstring"> @raise ViewNotFoundException: raise the exception if View not found</tt> </tt>
+<a name="L2141"></a><tt class="py-lineno">2141</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2142"></a><tt class="py-lineno">2142</tt> <tt class="py-line"> </tt>
+<a name="L2143"></a><tt class="py-lineno">2143</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-467" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-467', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2144"></a><tt class="py-lineno">2144</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"findViewWithTextOrRaise(%s, %s)"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2145"></a><tt class="py-lineno">2145</tt> <tt class="py-line"> <tt class="py-name">view</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-468" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.findViewWithText()=src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithText"><a title="src.com.dtmilano.android.viewclient.ViewClient.findViewWithText" class="py-name" href="#" onclick="return doclink('link-468', 'findViewWithText', 'link-468');">findViewWithText</a></tt><tt class="py-op">(</tt><tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+<a name="L2146"></a><tt class="py-lineno">2146</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">view</tt><tt class="py-op">:</tt> </tt>
+<a name="L2147"></a><tt class="py-lineno">2147</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">view</tt> </tt>
+<a name="L2148"></a><tt class="py-lineno">2148</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2149"></a><tt class="py-lineno">2149</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt id="link-469" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewNotFoundException" class="py-name" href="#" onclick="return doclink('link-469', 'ViewNotFoundException', 'link-439');">ViewNotFoundException</a></tt><tt class="py-op">(</tt><tt class="py-string">"text"</tt><tt class="py-op">,</tt> <tt class="py-name">text</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2150"></a><tt class="py-lineno">2150</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithContentDescription"></a><div id="ViewClient.findViewWithContentDescription-def"><a name="L2151"></a><tt class="py-lineno">2151</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithContentDescription-toggle" onclick="return toggle('ViewClient.findViewWithContentDescription');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescription">findViewWithContentDescription</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithContentDescription-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithContentDescription-expanded"><a name="L2152"></a><tt class="py-lineno">2152</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2153"></a><tt class="py-lineno">2153</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified content description</tt> </tt>
+<a name="L2154"></a><tt class="py-lineno">2154</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2155"></a><tt class="py-lineno">2155</tt> <tt class="py-line"> </tt>
+<a name="L2156"></a><tt class="py-lineno">2156</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-470" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTree" class="py-name" href="#" onclick="return doclink('link-470', '__findViewWithAttributeInTree', 'link-451');">__findViewWithAttributeInTree</a></tt><tt class="py-op">(</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">,</tt> <tt class="py-name">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2157"></a><tt class="py-lineno">2157</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewWithContentDescriptionOrRaise"></a><div id="ViewClient.findViewWithContentDescriptionOrRaise-def"><a name="L2158"></a><tt class="py-lineno">2158</tt> <a class="py-toggle" href="#" id="ViewClient.findViewWithContentDescriptionOrRaise-toggle" onclick="return toggle('ViewClient.findViewWithContentDescriptionOrRaise');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithContentDescriptionOrRaise">findViewWithContentDescriptionOrRaise</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-param">root</tt><tt class="py-op">=</tt><tt class="py-string">"ROOT"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewWithContentDescriptionOrRaise-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewWithContentDescriptionOrRaise-expanded"><a name="L2159"></a><tt class="py-lineno">2159</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2160"></a><tt class="py-lineno">2160</tt> <tt class="py-line"><tt class="py-docstring"> Finds the View with the specified content description</tt> </tt>
+<a name="L2161"></a><tt class="py-lineno">2161</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2162"></a><tt class="py-lineno">2162</tt> <tt class="py-line"> </tt>
+<a name="L2163"></a><tt class="py-lineno">2163</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt id="link-471" class="py-name" targets="Method src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeOrRaise()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__findViewWithAttributeInTreeOrRaise"><a title="src.com.dtmilano.android.viewclient.ViewClient.__findViewWithAttributeInTreeOrRaise" class="py-name" href="#" onclick="return doclink('link-471', '__findViewWithAttributeInTreeOrRaise', 'link-471');">__findViewWithAttributeInTreeOrRaise</a></tt><tt class="py-op">(</tt><tt class="py-string">'content-desc'</tt><tt class="py-op">,</tt> <tt class="py-name">contentdescription</tt><tt class="py-op">,</tt> <tt class="py-name">root</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2164"></a><tt class="py-lineno">2164</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.findViewsContainingPoint"></a><div id="ViewClient.findViewsContainingPoint-def"><a name="L2165"></a><tt class="py-lineno">2165</tt> <a class="py-toggle" href="#" id="ViewClient.findViewsContainingPoint-toggle" onclick="return toggle('ViewClient.findViewsContainingPoint');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewsContainingPoint">findViewsContainingPoint</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt><tt class="py-param">x</tt><tt class="py-op">,</tt> <tt class="py-param">y</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-param">filter</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.findViewsContainingPoint-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.findViewsContainingPoint-expanded"><a name="L2166"></a><tt class="py-lineno">2166</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2167"></a><tt class="py-lineno">2167</tt> <tt class="py-line"><tt class="py-docstring"> Finds the list of Views that contain the point (x, y).</tt> </tt>
+<a name="L2168"></a><tt class="py-lineno">2168</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2169"></a><tt class="py-lineno">2169</tt> <tt class="py-line"> </tt>
+<a name="L2170"></a><tt class="py-lineno">2170</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">filter</tt><tt class="py-op">:</tt> </tt>
+<a name="L2171"></a><tt class="py-lineno">2171</tt> <tt class="py-line"> <tt class="py-name">filter</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">v</tt><tt class="py-op">:</tt> <tt class="py-name">True</tt> </tt>
+<a name="L2172"></a><tt class="py-lineno">2172</tt> <tt class="py-line"> </tt>
+<a name="L2173"></a><tt class="py-lineno">2173</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-op">[</tt><tt class="py-name">v</tt> <tt class="py-keyword">for</tt> <tt class="py-name">v</tt> <tt class="py-keyword">in</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt> <tt class="py-keyword">if</tt> <tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">.</tt><tt id="link-472" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.containsPoint()=src.com.dtmilano.android.viewclient.View-class.html#containsPoint"><a title="src.com.dtmilano.android.viewclient.View.containsPoint" class="py-name" href="#" onclick="return doclink('link-472', 'containsPoint', 'link-472');">containsPoint</a></tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">,</tt><tt class="py-name">y</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-name">filter</tt><tt class="py-op">(</tt><tt class="py-name">v</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2174"></a><tt class="py-lineno">2174</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getViewIds"></a><div id="ViewClient.getViewIds-def"><a name="L2175"></a><tt class="py-lineno">2175</tt> <a class="py-toggle" href="#" id="ViewClient.getViewIds-toggle" onclick="return toggle('ViewClient.getViewIds');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds">getViewIds</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getViewIds-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getViewIds-expanded"><a name="L2176"></a><tt class="py-lineno">2176</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2177"></a><tt class="py-lineno">2177</tt> <tt class="py-line"><tt class="py-docstring"> @deprecated: Use L{getViewsById} instead.</tt> </tt>
+<a name="L2178"></a><tt class="py-lineno">2178</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2179"></a><tt class="py-lineno">2179</tt> <tt class="py-line"><tt class="py-docstring"> Returns the Views map.</tt> </tt>
+<a name="L2180"></a><tt class="py-lineno">2180</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2181"></a><tt class="py-lineno">2181</tt> <tt class="py-line"> </tt>
+<a name="L2182"></a><tt class="py-lineno">2182</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> </tt>
+</div><a name="L2183"></a><tt class="py-lineno">2183</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getViewsById"></a><div id="ViewClient.getViewsById-def"><a name="L2184"></a><tt class="py-lineno">2184</tt> <a class="py-toggle" href="#" id="ViewClient.getViewsById-toggle" onclick="return toggle('ViewClient.getViewsById');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById">getViewsById</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getViewsById-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getViewsById-expanded"><a name="L2185"></a><tt class="py-lineno">2185</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2186"></a><tt class="py-lineno">2186</tt> <tt class="py-line"><tt class="py-docstring"> Returns the Views map. The keys are C{uniqueIds} and the values are C{View}s.</tt> </tt>
+<a name="L2187"></a><tt class="py-lineno">2187</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2188"></a><tt class="py-lineno">2188</tt> <tt class="py-line"> </tt>
+<a name="L2189"></a><tt class="py-lineno">2189</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">viewsById</tt> </tt>
+</div><a name="L2190"></a><tt class="py-lineno">2190</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.__getFocusedWindowPosition"></a><div id="ViewClient.__getFocusedWindowPosition-def"><a name="L2191"></a><tt class="py-lineno">2191</tt> <a class="py-toggle" href="#" id="ViewClient.__getFocusedWindowPosition-toggle" onclick="return toggle('ViewClient.__getFocusedWindowPosition');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__getFocusedWindowPosition">__getFocusedWindowPosition</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__getFocusedWindowPosition-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__getFocusedWindowPosition-expanded"><a name="L2192"></a><tt class="py-lineno">2192</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">__getFocusedWindowId</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2193"></a><tt class="py-lineno">2193</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.getSdkVersion"></a><div id="ViewClient.getSdkVersion-def"><a name="L2194"></a><tt class="py-lineno">2194</tt> <a class="py-toggle" href="#" id="ViewClient.getSdkVersion-toggle" onclick="return toggle('ViewClient.getSdkVersion');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getSdkVersion">getSdkVersion</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.getSdkVersion-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.getSdkVersion-expanded"><a name="L2195"></a><tt class="py-lineno">2195</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2196"></a><tt class="py-lineno">2196</tt> <tt class="py-line"><tt class="py-docstring"> Gets the SDK version.</tt> </tt>
+<a name="L2197"></a><tt class="py-lineno">2197</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2198"></a><tt class="py-lineno">2198</tt> <tt class="py-line"> </tt>
+<a name="L2199"></a><tt class="py-lineno">2199</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">build</tt><tt class="py-op">[</tt><tt id="link-473" class="py-name"><a title="src.com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY" class="py-name" href="#" onclick="return doclink('link-473', 'VERSION_SDK_PROPERTY', 'link-31');">VERSION_SDK_PROPERTY</a></tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2200"></a><tt class="py-lineno">2200</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.isKeyboardShown"></a><div id="ViewClient.isKeyboardShown-def"><a name="L2201"></a><tt class="py-lineno">2201</tt> <a class="py-toggle" href="#" id="ViewClient.isKeyboardShown-toggle" onclick="return toggle('ViewClient.isKeyboardShown');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#isKeyboardShown">isKeyboardShown</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.isKeyboardShown-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.isKeyboardShown-expanded"><a name="L2202"></a><tt class="py-lineno">2202</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2203"></a><tt class="py-lineno">2203</tt> <tt class="py-line"><tt class="py-docstring"> Whether the keyboard is displayed.</tt> </tt>
+<a name="L2204"></a><tt class="py-lineno">2204</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2205"></a><tt class="py-lineno">2205</tt> <tt class="py-line"> </tt>
+<a name="L2206"></a><tt class="py-lineno">2206</tt> <tt class="py-line"> <tt class="py-name">dim</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">shell</tt><tt class="py-op">(</tt><tt class="py-string">'dumpsys input_method'</tt><tt class="py-op">)</tt> </tt>
+<a name="L2207"></a><tt class="py-lineno">2207</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">dim</tt><tt class="py-op">:</tt> </tt>
+<a name="L2208"></a><tt class="py-lineno">2208</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: API >= 15 ?</tt> </tt>
+<a name="L2209"></a><tt class="py-lineno">2209</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">"mInputShown=true"</tt> <tt class="py-keyword">in</tt> <tt class="py-name">dim</tt> </tt>
+<a name="L2210"></a><tt class="py-lineno">2210</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">False</tt> </tt>
+</div><a name="L2211"></a><tt class="py-lineno">2211</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.writeImageToFile"></a><div id="ViewClient.writeImageToFile-def"><a name="L2212"></a><tt class="py-lineno">2212</tt> <a class="py-toggle" href="#" id="ViewClient.writeImageToFile-toggle" onclick="return toggle('ViewClient.writeImageToFile');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile">writeImageToFile</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">format</tt><tt class="py-op">=</tt><tt class="py-string">"PNG"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.writeImageToFile-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.writeImageToFile-expanded"><a name="L2213"></a><tt class="py-lineno">2213</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2214"></a><tt class="py-lineno">2214</tt> <tt class="py-line"><tt class="py-docstring"> Write the View image to the specified filename in the specified format.</tt> </tt>
+<a name="L2215"></a><tt class="py-lineno">2215</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2216"></a><tt class="py-lineno">2216</tt> <tt class="py-line"><tt class="py-docstring"> @type filename: str</tt> </tt>
+<a name="L2217"></a><tt class="py-lineno">2217</tt> <tt class="py-line"><tt class="py-docstring"> @param filename: Absolute path and optional filename receiving the image. If this points to</tt> </tt>
+<a name="L2218"></a><tt class="py-lineno">2218</tt> <tt class="py-line"><tt class="py-docstring"> a directory, then the filename is determined by the serialno of the device and</tt> </tt>
+<a name="L2219"></a><tt class="py-lineno">2219</tt> <tt class="py-line"><tt class="py-docstring"> format extension.</tt> </tt>
+<a name="L2220"></a><tt class="py-lineno">2220</tt> <tt class="py-line"><tt class="py-docstring"> @type format: str</tt> </tt>
+<a name="L2221"></a><tt class="py-lineno">2221</tt> <tt class="py-line"><tt class="py-docstring"> @param format: Image format (default format is PNG)</tt> </tt>
+<a name="L2222"></a><tt class="py-lineno">2222</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2223"></a><tt class="py-lineno">2223</tt> <tt class="py-line"> </tt>
+<a name="L2224"></a><tt class="py-lineno">2224</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2225"></a><tt class="py-lineno">2225</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"writeImageToFile expects an absolute path"</tt><tt class="py-op">)</tt> </tt>
+<a name="L2226"></a><tt class="py-lineno">2226</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2227"></a><tt class="py-lineno">2227</tt> <tt class="py-line"> <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">serialno</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> <tt class="py-op">+</tt> <tt class="py-name">format</tt><tt class="py-op">.</tt><tt class="py-name">lower</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2228"></a><tt class="py-lineno">2228</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-474" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG" class="py-name" href="#" onclick="return doclink('link-474', 'DEBUG', 'link-1');">DEBUG</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2229"></a><tt class="py-lineno">2229</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"writeImageToFile: saving image to '%s' in %s format"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+<a name="L2230"></a><tt class="py-lineno">2230</tt> <tt class="py-line"> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">device</tt><tt class="py-op">.</tt><tt class="py-name">takeSnapshot</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">writeToFile</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">format</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2231"></a><tt class="py-lineno">2231</tt> <tt class="py-line"> </tt>
+<a name="L2232"></a><tt class="py-lineno">2232</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__pickleable"></a><div id="ViewClient.__pickleable-def"><a name="L2233"></a><tt class="py-lineno">2233</tt> <a class="py-toggle" href="#" id="ViewClient.__pickleable-toggle" onclick="return toggle('ViewClient.__pickleable');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable">__pickleable</a><tt class="py-op">(</tt><tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__pickleable-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__pickleable-expanded"><a name="L2234"></a><tt class="py-lineno">2234</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2235"></a><tt class="py-lineno">2235</tt> <tt class="py-line"><tt class="py-docstring"> Makes the tree pickleable.</tt> </tt>
+<a name="L2236"></a><tt class="py-lineno">2236</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2237"></a><tt class="py-lineno">2237</tt> <tt class="py-line"> </tt>
+<a name="L2238"></a><tt class="py-lineno">2238</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">removeDeviceReference</tt><tt class="py-op">(</tt><tt class="py-param">view</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2239"></a><tt class="py-lineno">2239</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2240"></a><tt class="py-lineno">2240</tt> <tt class="py-line"><tt class="py-docstring"> Removes the reference to a L{MonkeyDevice}.</tt> </tt>
+<a name="L2241"></a><tt class="py-lineno">2241</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2242"></a><tt class="py-lineno">2242</tt> <tt class="py-line"> </tt>
+<a name="L2243"></a><tt class="py-lineno">2243</tt> <tt class="py-line"> <tt class="py-name">view</tt><tt class="py-op">.</tt><tt class="py-name">device</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+</div><a name="L2244"></a><tt class="py-lineno">2244</tt> <tt class="py-line"> </tt>
+<a name="L2245"></a><tt class="py-lineno">2245</tt> <tt class="py-line"> <tt class="py-comment">###########################################################################################</tt> </tt>
+<a name="L2246"></a><tt class="py-lineno">2246</tt> <tt class="py-line"> <tt class="py-comment"># FIXME: Unfortunatelly deepcopy does not work with MonkeyDevice objects, which is</tt> </tt>
+<a name="L2247"></a><tt class="py-lineno">2247</tt> <tt class="py-line"> <tt class="py-comment"># sadly the reason why we cannot pickle the tree and we need to remove the MonkeyDevice</tt> </tt>
+<a name="L2248"></a><tt class="py-lineno">2248</tt> <tt class="py-line"> <tt class="py-comment"># references.</tt> </tt>
+<a name="L2249"></a><tt class="py-lineno">2249</tt> <tt class="py-line"> <tt class="py-comment"># We wanted to copy the tree to preserve the original and make piclkleable the copy.</tt> </tt>
+<a name="L2250"></a><tt class="py-lineno">2250</tt> <tt class="py-line"> <tt class="py-comment">#treeCopy = copy.deepcopy(tree)</tt> </tt>
+<a name="L2251"></a><tt class="py-lineno">2251</tt> <tt class="py-line"> <tt class="py-name">treeCopy</tt> <tt class="py-op">=</tt> <tt class="py-name">tree</tt> </tt>
+<a name="L2252"></a><tt class="py-lineno">2252</tt> <tt class="py-line"> <tt class="py-comment"># IMPORTANT:</tt> </tt>
+<a name="L2253"></a><tt class="py-lineno">2253</tt> <tt class="py-line"> <tt class="py-comment"># This assumes that the first element in the list is the tree root</tt> </tt>
+<a name="L2254"></a><tt class="py-lineno">2254</tt> <tt class="py-line"> <tt id="link-475" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-475', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-476" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__traverse" class="py-name" href="#" onclick="return doclink('link-476', '__traverse', 'link-397');">__traverse</a></tt><tt class="py-op">(</tt><tt class="py-name">treeCopy</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">transform</tt><tt class="py-op">=</tt><tt class="py-name">removeDeviceReference</tt><tt class="py-op">)</tt> </tt>
+<a name="L2255"></a><tt class="py-lineno">2255</tt> <tt class="py-line"> <tt class="py-comment">###########################################################################################</tt> </tt>
+<a name="L2256"></a><tt class="py-lineno">2256</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">treeCopy</tt> </tt>
+</div><a name="L2257"></a><tt class="py-lineno">2257</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.distance"></a><div id="ViewClient.distance-def"><a name="L2258"></a><tt class="py-lineno">2258</tt> <a class="py-toggle" href="#" id="ViewClient.distance-toggle" onclick="return toggle('ViewClient.distance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#distance">distance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.distance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.distance-expanded"><a name="L2259"></a><tt class="py-lineno">2259</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2260"></a><tt class="py-lineno">2260</tt> <tt class="py-line"><tt class="py-docstring"> Calculates the distance between this tree and the tree passed as argument.</tt> </tt>
+<a name="L2261"></a><tt class="py-lineno">2261</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2262"></a><tt class="py-lineno">2262</tt> <tt class="py-line"><tt class="py-docstring"> @type tree: list of Views</tt> </tt>
+<a name="L2263"></a><tt class="py-lineno">2263</tt> <tt class="py-line"><tt class="py-docstring"> @param tree: Tree of Views</tt> </tt>
+<a name="L2264"></a><tt class="py-lineno">2264</tt> <tt class="py-line"><tt class="py-docstring"> @return: the distance</tt> </tt>
+<a name="L2265"></a><tt class="py-lineno">2265</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2266"></a><tt class="py-lineno">2266</tt> <tt class="py-line"> <tt class="py-comment">################################################################</tt> </tt>
+<a name="L2267"></a><tt class="py-lineno">2267</tt> <tt class="py-line"> <tt class="py-comment">#FIXME: this should copy the entire tree and then transform it #</tt> </tt>
+<a name="L2268"></a><tt class="py-lineno">2268</tt> <tt class="py-line"> <tt class="py-comment">################################################################</tt> </tt>
+<a name="L2269"></a><tt class="py-lineno">2269</tt> <tt class="py-line"> <tt class="py-name">pickleableViews</tt> <tt class="py-op">=</tt> <tt id="link-477" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-477', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-478" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__pickleable()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__pickleable"><a title="src.com.dtmilano.android.viewclient.ViewClient.__pickleable" class="py-name" href="#" onclick="return doclink('link-478', '__pickleable', 'link-478');">__pickleable</a></tt><tt class="py-op">(</tt><tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt> </tt>
+<a name="L2270"></a><tt class="py-lineno">2270</tt> <tt class="py-line"> <tt class="py-name">pickleableTree</tt> <tt class="py-op">=</tt> <tt id="link-479" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-479', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-480" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__pickleable" class="py-name" href="#" onclick="return doclink('link-480', '__pickleable', 'link-478');">__pickleable</a></tt><tt class="py-op">(</tt><tt class="py-name">tree</tt><tt class="py-op">)</tt> </tt>
+<a name="L2271"></a><tt class="py-lineno">2271</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-name">pickle</tt><tt class="py-op">.</tt><tt class="py-name">dumps</tt><tt class="py-op">(</tt><tt class="py-name">pickleableViews</tt><tt class="py-op">)</tt> </tt>
+<a name="L2272"></a><tt class="py-lineno">2272</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-name">pickle</tt><tt class="py-op">.</tt><tt class="py-name">dumps</tt><tt class="py-op">(</tt><tt class="py-name">pickleableTree</tt><tt class="py-op">)</tt> </tt>
+<a name="L2273"></a><tt class="py-lineno">2273</tt> <tt class="py-line"> </tt>
+<a name="L2274"></a><tt class="py-lineno">2274</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-481" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-481', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2275"></a><tt class="py-lineno">2275</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: calculating distance between"</tt><tt class="py-op">,</tt> <tt class="py-name">s1</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">20</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-string">"and"</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">20</tt><tt class="py-op">]</tt> </tt>
+<a name="L2276"></a><tt class="py-lineno">2276</tt> <tt class="py-line"> </tt>
+<a name="L2277"></a><tt class="py-lineno">2277</tt> <tt class="py-line"> <tt class="py-name">l1</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2278"></a><tt class="py-lineno">2278</tt> <tt class="py-line"> <tt class="py-name">l2</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+<a name="L2279"></a><tt class="py-lineno">2279</tt> <tt class="py-line"> <tt class="py-name">t</tt> <tt class="py-op">=</tt> <tt class="py-name">float</tt><tt class="py-op">(</tt><tt class="py-name">max</tt><tt class="py-op">(</tt><tt class="py-name">l1</tt><tt class="py-op">,</tt> <tt class="py-name">l2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2280"></a><tt class="py-lineno">2280</tt> <tt class="py-line"> </tt>
+<a name="L2281"></a><tt class="py-lineno">2281</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">l1</tt> <tt class="py-op">==</tt> <tt class="py-name">l2</tt><tt class="py-op">:</tt> </tt>
+<a name="L2282"></a><tt class="py-lineno">2282</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-482" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-482', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2283"></a><tt class="py-lineno">2283</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: trees have same length, using Hamming distance"</tt> </tt>
+<a name="L2284"></a><tt class="py-lineno">2284</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-483" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-483', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-484" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__hammingDistance()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance"><a title="src.com.dtmilano.android.viewclient.ViewClient.__hammingDistance" class="py-name" href="#" onclick="return doclink('link-484', '__hammingDistance', 'link-484');">__hammingDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">/</tt><tt class="py-name">t</tt> </tt>
+<a name="L2285"></a><tt class="py-lineno">2285</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2286"></a><tt class="py-lineno">2286</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-485" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-485', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2287"></a><tt class="py-lineno">2287</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"distance: trees have different length, using Levenshtein distance"</tt> </tt>
+<a name="L2288"></a><tt class="py-lineno">2288</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-486" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-486', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-487" class="py-name" targets="Static Method src.com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance()=src.com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance"><a title="src.com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance" class="py-name" href="#" onclick="return doclink('link-487', '__levenshteinDistance', 'link-487');">__levenshteinDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">/</tt><tt class="py-name">t</tt> </tt>
+</div><a name="L2289"></a><tt class="py-lineno">2289</tt> <tt class="py-line"> </tt>
+<a name="L2290"></a><tt class="py-lineno">2290</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__hammingDistance"></a><div id="ViewClient.__hammingDistance-def"><a name="L2291"></a><tt class="py-lineno">2291</tt> <a class="py-toggle" href="#" id="ViewClient.__hammingDistance-toggle" onclick="return toggle('ViewClient.__hammingDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance">__hammingDistance</a><tt class="py-op">(</tt><tt class="py-param">s1</tt><tt class="py-op">,</tt> <tt class="py-param">s2</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__hammingDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__hammingDistance-expanded"><a name="L2292"></a><tt class="py-lineno">2292</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2293"></a><tt class="py-lineno">2293</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Hamming distance between two strings.</tt> </tt>
+<a name="L2294"></a><tt class="py-lineno">2294</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2295"></a><tt class="py-lineno">2295</tt> <tt class="py-line"><tt class="py-docstring"> @param s1: string</tt> </tt>
+<a name="L2296"></a><tt class="py-lineno">2296</tt> <tt class="py-line"><tt class="py-docstring"> @param s2: string</tt> </tt>
+<a name="L2297"></a><tt class="py-lineno">2297</tt> <tt class="py-line"><tt class="py-docstring"> @return: the distance</tt> </tt>
+<a name="L2298"></a><tt class="py-lineno">2298</tt> <tt class="py-line"><tt class="py-docstring"> @raise ValueError: if the lenght of the strings differ</tt> </tt>
+<a name="L2299"></a><tt class="py-lineno">2299</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2300"></a><tt class="py-lineno">2300</tt> <tt class="py-line"> </tt>
+<a name="L2301"></a><tt class="py-lineno">2301</tt> <tt class="py-line"> <tt class="py-name">l1</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2302"></a><tt class="py-lineno">2302</tt> <tt class="py-line"> <tt class="py-name">l2</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+<a name="L2303"></a><tt class="py-lineno">2303</tt> <tt class="py-line"> </tt>
+<a name="L2304"></a><tt class="py-lineno">2304</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">l1</tt> <tt class="py-op">!=</tt> <tt class="py-name">l2</tt><tt class="py-op">:</tt> </tt>
+<a name="L2305"></a><tt class="py-lineno">2305</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Hamming distance requires strings of same size."</tt><tt class="py-op">)</tt> </tt>
+<a name="L2306"></a><tt class="py-lineno">2306</tt> <tt class="py-line"> </tt>
+<a name="L2307"></a><tt class="py-lineno">2307</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">sum</tt><tt class="py-op">(</tt><tt class="py-name">ch1</tt> <tt class="py-op">!=</tt> <tt class="py-name">ch2</tt> <tt class="py-keyword">for</tt> <tt class="py-name">ch1</tt><tt class="py-op">,</tt> <tt class="py-name">ch2</tt> <tt class="py-keyword">in</tt> <tt class="py-name">zip</tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2308"></a><tt class="py-lineno">2308</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.hammingDistance"></a><div id="ViewClient.hammingDistance-def"><a name="L2309"></a><tt class="py-lineno">2309</tt> <a class="py-toggle" href="#" id="ViewClient.hammingDistance-toggle" onclick="return toggle('ViewClient.hammingDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#hammingDistance">hammingDistance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.hammingDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.hammingDistance-expanded"><a name="L2310"></a><tt class="py-lineno">2310</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2311"></a><tt class="py-lineno">2311</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Hamming distance between this tree and the one passed as argument.</tt> </tt>
+<a name="L2312"></a><tt class="py-lineno">2312</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2313"></a><tt class="py-lineno">2313</tt> <tt class="py-line"> </tt>
+<a name="L2314"></a><tt class="py-lineno">2314</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-488" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-488', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-489" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-489', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2315"></a><tt class="py-lineno">2315</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-490" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-490', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-491" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__str__
+src.com.dtmilano.android.viewclient.Window.__str__" class="py-name" href="#" onclick="return doclink('link-491', '__str__', 'link-271');">__str__</a></tt><tt class="py-op">,</tt> <tt class="py-name">tree</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2316"></a><tt class="py-lineno">2316</tt> <tt class="py-line"> </tt>
+<a name="L2317"></a><tt class="py-lineno">2317</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-492" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-492', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-493" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__hammingDistance" class="py-name" href="#" onclick="return doclink('link-493', '__hammingDistance', 'link-484');">__hammingDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2318"></a><tt class="py-lineno">2318</tt> <tt class="py-line"> </tt>
+<a name="L2319"></a><tt class="py-lineno">2319</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.__levenshteinDistance"></a><div id="ViewClient.__levenshteinDistance-def"><a name="L2320"></a><tt class="py-lineno">2320</tt> <a class="py-toggle" href="#" id="ViewClient.__levenshteinDistance-toggle" onclick="return toggle('ViewClient.__levenshteinDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance">__levenshteinDistance</a><tt class="py-op">(</tt><tt class="py-param">s</tt><tt class="py-op">,</tt> <tt class="py-param">t</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.__levenshteinDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.__levenshteinDistance-expanded"><a name="L2321"></a><tt class="py-lineno">2321</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2322"></a><tt class="py-lineno">2322</tt> <tt class="py-line"><tt class="py-docstring"> Find the Levenshtein distance between two Strings.</tt> </tt>
+<a name="L2323"></a><tt class="py-lineno">2323</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2324"></a><tt class="py-lineno">2324</tt> <tt class="py-line"><tt class="py-docstring"> Python version of Levenshtein distance method implemented in Java at</tt> </tt>
+<a name="L2325"></a><tt class="py-lineno">2325</tt> <tt class="py-line"><tt class="py-docstring"> U{http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm}.</tt> </tt>
+<a name="L2326"></a><tt class="py-lineno">2326</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2327"></a><tt class="py-lineno">2327</tt> <tt class="py-line"><tt class="py-docstring"> This is the number of changes needed to change one String into</tt> </tt>
+<a name="L2328"></a><tt class="py-lineno">2328</tt> <tt class="py-line"><tt class="py-docstring"> another, where each change is a single character modification (deletion,</tt> </tt>
+<a name="L2329"></a><tt class="py-lineno">2329</tt> <tt class="py-line"><tt class="py-docstring"> insertion or substitution).</tt> </tt>
+<a name="L2330"></a><tt class="py-lineno">2330</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2331"></a><tt class="py-lineno">2331</tt> <tt class="py-line"><tt class="py-docstring"> The previous implementation of the Levenshtein distance algorithm</tt> </tt>
+<a name="L2332"></a><tt class="py-lineno">2332</tt> <tt class="py-line"><tt class="py-docstring"> was from U{http://www.merriampark.com/ld.htm}</tt> </tt>
+<a name="L2333"></a><tt class="py-lineno">2333</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2334"></a><tt class="py-lineno">2334</tt> <tt class="py-line"><tt class="py-docstring"> Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError</tt> </tt>
+<a name="L2335"></a><tt class="py-lineno">2335</tt> <tt class="py-line"><tt class="py-docstring"> which can occur when my Java implementation is used with very large strings.</tt> </tt>
+<a name="L2336"></a><tt class="py-lineno">2336</tt> <tt class="py-line"><tt class="py-docstring"> This implementation of the Levenshtein distance algorithm</tt> </tt>
+<a name="L2337"></a><tt class="py-lineno">2337</tt> <tt class="py-line"><tt class="py-docstring"> is from U{http://www.merriampark.com/ldjava.htm}::</tt> </tt>
+<a name="L2338"></a><tt class="py-lineno">2338</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2339"></a><tt class="py-lineno">2339</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException</tt> </tt>
+<a name="L2340"></a><tt class="py-lineno">2340</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance(*, null) = IllegalArgumentException</tt> </tt>
+<a name="L2341"></a><tt class="py-lineno">2341</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("","") = 0</tt> </tt>
+<a name="L2342"></a><tt class="py-lineno">2342</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("","a") = 1</tt> </tt>
+<a name="L2343"></a><tt class="py-lineno">2343</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("aaapppp", "") = 7</tt> </tt>
+<a name="L2344"></a><tt class="py-lineno">2344</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("frog", "fog") = 1</tt> </tt>
+<a name="L2345"></a><tt class="py-lineno">2345</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("fly", "ant") = 3</tt> </tt>
+<a name="L2346"></a><tt class="py-lineno">2346</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("elephant", "hippo") = 7</tt> </tt>
+<a name="L2347"></a><tt class="py-lineno">2347</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hippo", "elephant") = 7</tt> </tt>
+<a name="L2348"></a><tt class="py-lineno">2348</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8</tt> </tt>
+<a name="L2349"></a><tt class="py-lineno">2349</tt> <tt class="py-line"><tt class="py-docstring"> StringUtils.getLevenshteinDistance("hello", "hallo") = 1</tt> </tt>
+<a name="L2350"></a><tt class="py-lineno">2350</tt> <tt class="py-line"><tt class="py-docstring"> </tt> </tt>
+<a name="L2351"></a><tt class="py-lineno">2351</tt> <tt class="py-line"><tt class="py-docstring"> @param s: the first String, must not be null</tt> </tt>
+<a name="L2352"></a><tt class="py-lineno">2352</tt> <tt class="py-line"><tt class="py-docstring"> @param t: the second String, must not be null</tt> </tt>
+<a name="L2353"></a><tt class="py-lineno">2353</tt> <tt class="py-line"><tt class="py-docstring"> @return: result distance</tt> </tt>
+<a name="L2354"></a><tt class="py-lineno">2354</tt> <tt class="py-line"><tt class="py-docstring"> @raise ValueError: if either String input C{null}</tt> </tt>
+<a name="L2355"></a><tt class="py-lineno">2355</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2356"></a><tt class="py-lineno">2356</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt> <tt class="py-keyword">or</tt> <tt class="py-name">t</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L2357"></a><tt class="py-lineno">2357</tt> <tt class="py-line"> <tt class="py-keyword">raise</tt> <tt class="py-name">ValueError</tt><tt class="py-op">(</tt><tt class="py-string">"Strings must not be null"</tt><tt class="py-op">)</tt> </tt>
+<a name="L2358"></a><tt class="py-lineno">2358</tt> <tt class="py-line"> </tt>
+<a name="L2359"></a><tt class="py-lineno">2359</tt> <tt class="py-line"> <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">s</tt><tt class="py-op">)</tt> </tt>
+<a name="L2360"></a><tt class="py-lineno">2360</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">t</tt><tt class="py-op">)</tt> </tt>
+<a name="L2361"></a><tt class="py-lineno">2361</tt> <tt class="py-line"> </tt>
+<a name="L2362"></a><tt class="py-lineno">2362</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">n</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2363"></a><tt class="py-lineno">2363</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">m</tt> </tt>
+<a name="L2364"></a><tt class="py-lineno">2364</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">m</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2365"></a><tt class="py-lineno">2365</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">n</tt> </tt>
+<a name="L2366"></a><tt class="py-lineno">2366</tt> <tt class="py-line"> </tt>
+<a name="L2367"></a><tt class="py-lineno">2367</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">n</tt> <tt class="py-op">></tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> </tt>
+<a name="L2368"></a><tt class="py-lineno">2368</tt> <tt class="py-line"> <tt class="py-name">tmp</tt> <tt class="py-op">=</tt> <tt class="py-name">s</tt> </tt>
+<a name="L2369"></a><tt class="py-lineno">2369</tt> <tt class="py-line"> <tt class="py-name">s</tt> <tt class="py-op">=</tt> <tt class="py-name">t</tt> </tt>
+<a name="L2370"></a><tt class="py-lineno">2370</tt> <tt class="py-line"> <tt class="py-name">t</tt> <tt class="py-op">=</tt> <tt class="py-name">tmp</tt> </tt>
+<a name="L2371"></a><tt class="py-lineno">2371</tt> <tt class="py-line"> <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-name">m</tt><tt class="py-op">;</tt> </tt>
+<a name="L2372"></a><tt class="py-lineno">2372</tt> <tt class="py-line"> <tt class="py-name">m</tt> <tt class="py-op">=</tt> <tt class="py-name">len</tt><tt class="py-op">(</tt><tt class="py-name">t</tt><tt class="py-op">)</tt> </tt>
+<a name="L2373"></a><tt class="py-lineno">2373</tt> <tt class="py-line"> </tt>
+<a name="L2374"></a><tt class="py-lineno">2374</tt> <tt class="py-line"> <tt class="py-name">p</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-name">None</tt><tt class="py-op">]</tt><tt class="py-op">*</tt><tt class="py-op">(</tt><tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2375"></a><tt class="py-lineno">2375</tt> <tt class="py-line"> <tt class="py-name">d</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-name">None</tt><tt class="py-op">]</tt><tt class="py-op">*</tt><tt class="py-op">(</tt><tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
+<a name="L2376"></a><tt class="py-lineno">2376</tt> <tt class="py-line"> </tt>
+<a name="L2377"></a><tt class="py-lineno">2377</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">,</tt> <tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2378"></a><tt class="py-lineno">2378</tt> <tt class="py-line"> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">i</tt> </tt>
+<a name="L2379"></a><tt class="py-lineno">2379</tt> <tt class="py-line"> </tt>
+<a name="L2380"></a><tt class="py-lineno">2380</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">j</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">m</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2381"></a><tt class="py-lineno">2381</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-494" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-494', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2382"></a><tt class="py-lineno">2382</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">j</tt> <tt class="py-op">%</tt> <tt class="py-number">100</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
+<a name="L2383"></a><tt class="py-lineno">2383</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt><tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"DEBUG:"</tt><tt class="py-op">,</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt class="py-name">j</tt><tt class="py-op">/</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">+</tt><tt class="py-number">1.0</tt><tt class="py-op">)</tt><tt class="py-op">*</tt><tt class="py-number">100</tt><tt class="py-op">)</tt><tt class="py-op">,</tt><tt class="py-string">"%\r"</tt><tt class="py-op">,</tt> </tt>
+<a name="L2384"></a><tt class="py-lineno">2384</tt> <tt class="py-line"> <tt class="py-name">t_j</tt> <tt class="py-op">=</tt> <tt class="py-name">t</tt><tt class="py-op">[</tt><tt class="py-name">j</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
+<a name="L2385"></a><tt class="py-lineno">2385</tt> <tt class="py-line"> <tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">j</tt> </tt>
+<a name="L2386"></a><tt class="py-lineno">2386</tt> <tt class="py-line"> </tt>
+<a name="L2387"></a><tt class="py-lineno">2387</tt> <tt class="py-line"> <tt class="py-keyword">for</tt> <tt class="py-name">i</tt> <tt class="py-keyword">in</tt> <tt class="py-name">range</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">n</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+<a name="L2388"></a><tt class="py-lineno">2388</tt> <tt class="py-line"> <tt class="py-name">cost</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> <tt class="py-keyword">if</tt> <tt class="py-name">s</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-name">t_j</tt> <tt class="py-keyword">else</tt> <tt class="py-number">1</tt> </tt>
+<a name="L2389"></a><tt class="py-lineno">2389</tt> <tt class="py-line"> <tt class="py-comment"># minimum of cell to the left+1, to the top+1, diagonally left and up +cost</tt> </tt>
+<a name="L2390"></a><tt class="py-lineno">2390</tt> <tt class="py-line"> <tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-name">min</tt><tt class="py-op">(</tt><tt class="py-name">min</tt><tt class="py-op">(</tt><tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">i</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">+</tt><tt class="py-name">cost</tt><tt class="py-op">)</tt> </tt>
+<a name="L2391"></a><tt class="py-lineno">2391</tt> <tt class="py-line"> </tt>
+<a name="L2392"></a><tt class="py-lineno">2392</tt> <tt class="py-line"> <tt class="py-name">_d</tt> <tt class="py-op">=</tt> <tt class="py-name">p</tt> </tt>
+<a name="L2393"></a><tt class="py-lineno">2393</tt> <tt class="py-line"> <tt class="py-name">p</tt> <tt class="py-op">=</tt> <tt class="py-name">d</tt> </tt>
+<a name="L2394"></a><tt class="py-lineno">2394</tt> <tt class="py-line"> <tt class="py-name">d</tt> <tt class="py-op">=</tt> <tt class="py-name">_d</tt> </tt>
+<a name="L2395"></a><tt class="py-lineno">2395</tt> <tt class="py-line"> </tt>
+<a name="L2396"></a><tt class="py-lineno">2396</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt id="link-495" class="py-name"><a title="src.com.dtmilano.android.viewclient.DEBUG_DISTANCE" class="py-name" href="#" onclick="return doclink('link-495', 'DEBUG_DISTANCE', 'link-22');">DEBUG_DISTANCE</a></tt><tt class="py-op">:</tt> </tt>
+<a name="L2397"></a><tt class="py-lineno">2397</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-op">>></tt> <tt class="py-name">sys</tt><tt class="py-op">.</tt><tt class="py-name">stderr</tt><tt class="py-op">,</tt> <tt class="py-string">"\n"</tt> </tt>
+<a name="L2398"></a><tt class="py-lineno">2398</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">p</tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L2399"></a><tt class="py-lineno">2399</tt> <tt class="py-line"> </tt>
+<a name="ViewClient.levenshteinDistance"></a><div id="ViewClient.levenshteinDistance-def"><a name="L2400"></a><tt class="py-lineno">2400</tt> <a class="py-toggle" href="#" id="ViewClient.levenshteinDistance-toggle" onclick="return toggle('ViewClient.levenshteinDistance');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#levenshteinDistance">levenshteinDistance</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">tree</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.levenshteinDistance-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.levenshteinDistance-expanded"><a name="L2401"></a><tt class="py-lineno">2401</tt> <tt class="py-line"> <tt class="py-docstring">'''</tt> </tt>
+<a name="L2402"></a><tt class="py-lineno">2402</tt> <tt class="py-line"><tt class="py-docstring"> Finds the Levenshtein distance between this tree and the one passed as argument.</tt> </tt>
+<a name="L2403"></a><tt class="py-lineno">2403</tt> <tt class="py-line"><tt class="py-docstring"> '''</tt> </tt>
+<a name="L2404"></a><tt class="py-lineno">2404</tt> <tt class="py-line"> </tt>
+<a name="L2405"></a><tt class="py-lineno">2405</tt> <tt class="py-line"> <tt class="py-name">s1</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-496" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-496', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-497" class="py-name" targets="Method src.com.dtmilano.android.viewclient.View.__microStr__()=src.com.dtmilano.android.viewclient.View-class.html#__microStr__"><a title="src.com.dtmilano.android.viewclient.View.__microStr__" class="py-name" href="#" onclick="return doclink('link-497', '__microStr__', 'link-497');">__microStr__</a></tt><tt class="py-op">,</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">views</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2406"></a><tt class="py-lineno">2406</tt> <tt class="py-line"> <tt class="py-name">s2</tt> <tt class="py-op">=</tt> <tt class="py-string">' '</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-name">map</tt><tt class="py-op">(</tt><tt id="link-498" class="py-name"><a title="src.com.dtmilano.android.viewclient.View" class="py-name" href="#" onclick="return doclink('link-498', 'View', 'link-57');">View</a></tt><tt class="py-op">.</tt><tt id="link-499" class="py-name"><a title="src.com.dtmilano.android.viewclient.View.__microStr__" class="py-name" href="#" onclick="return doclink('link-499', '__microStr__', 'link-497');">__microStr__</a></tt><tt class="py-op">,</tt> <tt class="py-name">tree</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
+<a name="L2407"></a><tt class="py-lineno">2407</tt> <tt class="py-line"> </tt>
+<a name="L2408"></a><tt class="py-lineno">2408</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-500" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-500', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">.</tt><tt id="link-501" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient.__levenshteinDistance" class="py-name" href="#" onclick="return doclink('link-501', '__levenshteinDistance', 'link-487');">__levenshteinDistance</a></tt><tt class="py-op">(</tt><tt class="py-name">s1</tt><tt class="py-op">,</tt> <tt class="py-name">s2</tt><tt class="py-op">)</tt> </tt>
+</div><a name="L2409"></a><tt class="py-lineno">2409</tt> <tt class="py-line"> </tt>
+<a name="L2410"></a><tt class="py-lineno">2410</tt> <tt class="py-line"> <tt class="py-decorator">@</tt><tt class="py-decorator">staticmethod</tt> </tt>
+<a name="ViewClient.excerpt"></a><div id="ViewClient.excerpt-def"><a name="L2411"></a><tt class="py-lineno">2411</tt> <a class="py-toggle" href="#" id="ViewClient.excerpt-toggle" onclick="return toggle('ViewClient.excerpt');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="src.com.dtmilano.android.viewclient.ViewClient-class.html#excerpt">excerpt</a><tt class="py-op">(</tt><tt class="py-param">str</tt><tt class="py-op">,</tt> <tt class="py-param">execute</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="ViewClient.excerpt-collapsed" style="display:none;" pad="++++" indent="++++++++"></div><div id="ViewClient.excerpt-expanded"><a name="L2412"></a><tt class="py-lineno">2412</tt> <tt class="py-line"> <tt class="py-name">code</tt> <tt class="py-op">=</tt> <tt id="link-502" class="py-name" targets="Class src.com.dtmilano.android.viewclient.Excerpt2Code=src.com.dtmilano.android.viewclient.Excerpt2Code-class.html"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code" class="py-name" href="#" onclick="return doclink('link-502', 'Excerpt2Code', 'link-502');">Excerpt2Code</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-503" class="py-name"><a title="src.com.dtmilano.android.viewclient.Excerpt2Code.Parse
+src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient.Parse" class="py-name" href="#" onclick="return doclink('link-503', 'Parse', 'link-287');">Parse</a></tt><tt class="py-op">(</tt><tt class="py-name">str</tt><tt class="py-op">)</tt> </tt>
+<a name="L2413"></a><tt class="py-lineno">2413</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">execute</tt><tt class="py-op">:</tt> </tt>
+<a name="L2414"></a><tt class="py-lineno">2414</tt> <tt class="py-line"> <tt class="py-keyword">exec</tt> <tt class="py-name">code</tt> </tt>
+<a name="L2415"></a><tt class="py-lineno">2415</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L2416"></a><tt class="py-lineno">2416</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">code</tt> </tt>
+</div></div><a name="L2417"></a><tt class="py-lineno">2417</tt> <tt class="py-line"> </tt>
+<a name="L2418"></a><tt class="py-lineno">2418</tt> <tt class="py-line"> </tt>
+<a name="L2419"></a><tt class="py-lineno">2419</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">"__main__"</tt><tt class="py-op">:</tt> </tt>
+<a name="L2420"></a><tt class="py-lineno">2420</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
+<a name="L2421"></a><tt class="py-lineno">2421</tt> <tt class="py-line"> <tt class="py-name">vc</tt> <tt class="py-op">=</tt> <tt id="link-504" class="py-name"><a title="src.com.dtmilano.android.viewclient.ViewClient" class="py-name" href="#" onclick="return doclink('link-504', 'ViewClient', 'link-297');">ViewClient</a></tt><tt class="py-op">(</tt><tt class="py-name">None</tt><tt class="py-op">)</tt> </tt>
+<a name="L2422"></a><tt class="py-lineno">2422</tt> <tt class="py-line"> <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
+<a name="L2423"></a><tt class="py-lineno">2423</tt> <tt class="py-line"> <tt class="py-keyword">print</tt> <tt class="py-string">"%s: Don't expect this to do anything"</tt> <tt class="py-op">%</tt> <tt class="py-name">__file__</tt> </tt>
+<a name="L2424"></a><tt class="py-lineno">2424</tt> <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:57 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.EditText-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.EditText-class.html
new file mode 100755
index 0000000..6db7bf7
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.EditText-class.html
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.EditText</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class EditText
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.EditText-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class EditText</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#EditText">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_src_com_" name="uml_class_diagram_for_src_com_">
+<area shape="rect" id="node1_29" href="src.com.dtmilano.android.viewclient.EditText-class.html#type" title="src.com.dtmilano.android.viewclient.EditText.type" alt="" coords="164,679,264,697"/>
+<area shape="rect" id="node1_30" href="src.com.dtmilano.android.viewclient.EditText-class.html#backspace" title="src.com.dtmilano.android.viewclient.EditText.backspace" alt="" coords="164,697,264,716"/>
+<area shape="rect" id="node1" href="src.com.dtmilano.android.viewclient.EditText-class.html" title="EditText class." alt="" coords="151,646,275,722"/>
+<area shape="rect" id="node2" href="src.com.dtmilano.android.viewclient.TextView-class.html" title="TextView class." alt="" coords="176,582,253,626"/>
+<area shape="rect" id="node3_31" href="src.com.dtmilano.android.viewclient.View-class.html#map" title="The map that contains the attr,value pairs" alt="" coords="17,31,412,49"/>
+<area shape="rect" id="node3_32" href="src.com.dtmilano.android.viewclient.View-class.html#device" title="The MonkeyDevice" alt="" coords="17,49,412,68"/>
+<area shape="rect" id="node3_33" href="src.com.dtmilano.android.viewclient.View-class.html#children" title="The children of this View" alt="" coords="17,68,412,87"/>
+<area shape="rect" id="node3_34" href="src.com.dtmilano.android.viewclient.View-class.html#parent" title="The parent of this View" alt="" coords="17,87,412,105"/>
+<area shape="rect" id="node3_35" href="src.com.dtmilano.android.viewclient.View-class.html#currentFocus" title="The current focus" alt="" coords="17,105,412,124"/>
+<area shape="rect" id="node3_36" href="src.com.dtmilano.android.viewclient.View-class.html#build" title="Build properties" alt="" coords="17,124,412,143"/>
+<area shape="rect" id="node3_37" href="src.com.dtmilano.android.viewclient.View-class.html#useUiAutomator" title="Whether to use UIAutomator or ViewServer" alt="" coords="17,143,412,161"/>
+<area shape="rect" id="node3_38" href="src.com.dtmilano.android.viewclient.View-class.html#idProperty" title="The id property depending on the View attribute format" alt="" coords="17,161,412,180"/>
+<area shape="rect" id="node3_39" href="src.com.dtmilano.android.viewclient.View-class.html#textProperty" title="The text property depending on the View attribute format" alt="" coords="17,180,412,199"/>
+<area shape="rect" id="node3_40" href="src.com.dtmilano.android.viewclient.View-class.html#leftProperty" title="The left property depending on the View attribute format" alt="" coords="17,199,412,217"/>
+<area shape="rect" id="node3_41" href="src.com.dtmilano.android.viewclient.View-class.html#topProperty" title="The top property depending on the View attribute format" alt="" coords="17,217,412,236"/>
+<area shape="rect" id="node3_42" href="src.com.dtmilano.android.viewclient.View-class.html#widthProperty" title="The width property depending on the View attribute format" alt="" coords="17,236,412,255"/>
+<area shape="rect" id="node3_43" href="src.com.dtmilano.android.viewclient.View-class.html#heightProperty" title="The height property depending on the View attribute format" alt="" coords="17,255,412,273"/>
+<area shape="rect" id="node3_44" href="src.com.dtmilano.android.viewclient.View-class.html#factory" title="View factory" alt="" coords="17,276,412,295"/>
+<area shape="rect" id="node3_45" href="src.com.dtmilano.android.viewclient.View-class.html#__init__" title="Constructor" alt="" coords="17,295,412,313"/>
+<area shape="rect" id="node3_46" href="src.com.dtmilano.android.viewclient.View-class.html#__getitem__" title="src.com.dtmilano.android.viewclient.View.__getitem__" alt="" coords="17,313,412,332"/>
+<area shape="rect" id="node3_47" href="src.com.dtmilano.android.viewclient.View-class.html#__getattr__" title="src.com.dtmilano.android.viewclient.View.__getattr__" alt="" coords="17,332,412,351"/>
+<area shape="rect" id="node3_48" href="src.com.dtmilano.android.viewclient.View-class.html#__call__" title="src.com.dtmilano.android.viewclient.View.__call__" alt="" coords="17,351,412,369"/>
+<area shape="rect" id="node3_49" href="src.com.dtmilano.android.viewclient.View-class.html#getClass" title="Gets the View class" alt="" coords="17,369,412,388"/>
+<area shape="rect" id="node3_50" href="src.com.dtmilano.android.viewclient.View-class.html#getId" title="Gets the View Id" alt="" coords="17,388,412,407"/>
+<area shape="rect" id="node3_51" href="src.com.dtmilano.android.viewclient.View-class.html#getContentDescription" title="Gets the content description." alt="" coords="17,407,412,425"/>
+<area shape="rect" id="node3_52" href="src.com.dtmilano.android.viewclient.View-class.html#getParent" title="Gets the parent." alt="" coords="17,425,412,444"/>
+<area shape="rect" id="node3_53" href="src.com.dtmilano.android.viewclient.View-class.html#getText" title="Gets the text attribute." alt="" coords="17,444,412,463"/>
+<area shape="rect" id="node3_54" href="src.com.dtmilano.android.viewclient.View-class.html#getHeight" title="Gets the height." alt="" coords="17,463,412,481"/>
+<area shape="rect" id="node3_55" href="src.com.dtmilano.android.viewclient.View-class.html#getWidth" title="Gets the width." alt="" coords="17,481,412,500"/>
+<area shape="rect" id="node3_56" href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId" title="Gets the unique Id of this View." alt="" coords="17,500,412,519"/>
+<area shape="rect" id="node3_57" href="src.com.dtmilano.android.viewclient.View-class.html#__str__" title="src.com.dtmilano.android.viewclient.View.__str__" alt="" coords="17,537,412,556"/>
+<area shape="rect" id="node3" href="src.com.dtmilano.android.viewclient.View-class.html" title="View class" alt="" coords="5,6,424,562"/>
+</map>
+ <img src="uml_class_diagram_for_src_com_.gif" alt='' usemap="#uml_class_diagram_for_src_com_" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>EditText class.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="type"></a><span class="summary-sig-name">type</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#EditText.type">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="backspace"></a><span class="summary-sig-name">backspace</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#EditText.backspace">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#add">add</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getId">getId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getText">getText</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getX">getX</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getY">getY</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#touch">touch</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#factory">factory</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#build">build</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#children">children</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#currentFocus">currentFocus</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#device">device</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#heightProperty">heightProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#idProperty">idProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#leftProperty">leftProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#map">map</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#parent">parent</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#textProperty">textProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#topProperty">topProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#useUiAutomator">useUiAutomator</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#widthProperty">widthProperty</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Excerpt2Code-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Excerpt2Code-class.html
new file mode 100755
index 0000000..cbc8d46
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Excerpt2Code-class.html
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.Excerpt2Code</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class Excerpt2Code
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class Excerpt2Code</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code">source code</a></span></p>
+<p>Excerpt XML to code</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="StartElement"></a><span class="summary-sig-name">StartElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">attributes</span>)</span><br />
+ Expat start element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.StartElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="EndElement"></a><span class="summary-sig-name">EndElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span><br />
+ Expat end element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.EndElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="CharacterData"></a><span class="summary-sig-name">CharacterData</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">data</span>)</span><br />
+ Expat character data event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.CharacterData">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="Parse"></a><span class="summary-sig-name">Parse</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">excerpt</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Excerpt2Code.Parse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.TextView-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.TextView-class.html
new file mode 100755
index 0000000..c78c739
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.TextView-class.html
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.TextView</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class TextView
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.TextView-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class TextView</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#TextView">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_src_com__2" name="uml_class_diagram_for_src_com__2">
+<area shape="rect" id="node1" href="src.com.dtmilano.android.viewclient.TextView-class.html" title="TextView class." alt="" coords="176,582,253,626"/>
+<area shape="rect" id="node2_27" href="src.com.dtmilano.android.viewclient.View-class.html#map" title="The map that contains the attr,value pairs" alt="" coords="17,31,412,49"/>
+<area shape="rect" id="node2_28" href="src.com.dtmilano.android.viewclient.View-class.html#device" title="The MonkeyDevice" alt="" coords="17,49,412,68"/>
+<area shape="rect" id="node2_29" href="src.com.dtmilano.android.viewclient.View-class.html#children" title="The children of this View" alt="" coords="17,68,412,87"/>
+<area shape="rect" id="node2_30" href="src.com.dtmilano.android.viewclient.View-class.html#parent" title="The parent of this View" alt="" coords="17,87,412,105"/>
+<area shape="rect" id="node2_31" href="src.com.dtmilano.android.viewclient.View-class.html#currentFocus" title="The current focus" alt="" coords="17,105,412,124"/>
+<area shape="rect" id="node2_32" href="src.com.dtmilano.android.viewclient.View-class.html#build" title="Build properties" alt="" coords="17,124,412,143"/>
+<area shape="rect" id="node2_33" href="src.com.dtmilano.android.viewclient.View-class.html#useUiAutomator" title="Whether to use UIAutomator or ViewServer" alt="" coords="17,143,412,161"/>
+<area shape="rect" id="node2_34" href="src.com.dtmilano.android.viewclient.View-class.html#idProperty" title="The id property depending on the View attribute format" alt="" coords="17,161,412,180"/>
+<area shape="rect" id="node2_35" href="src.com.dtmilano.android.viewclient.View-class.html#textProperty" title="The text property depending on the View attribute format" alt="" coords="17,180,412,199"/>
+<area shape="rect" id="node2_36" href="src.com.dtmilano.android.viewclient.View-class.html#leftProperty" title="The left property depending on the View attribute format" alt="" coords="17,199,412,217"/>
+<area shape="rect" id="node2_37" href="src.com.dtmilano.android.viewclient.View-class.html#topProperty" title="The top property depending on the View attribute format" alt="" coords="17,217,412,236"/>
+<area shape="rect" id="node2_38" href="src.com.dtmilano.android.viewclient.View-class.html#widthProperty" title="The width property depending on the View attribute format" alt="" coords="17,236,412,255"/>
+<area shape="rect" id="node2_39" href="src.com.dtmilano.android.viewclient.View-class.html#heightProperty" title="The height property depending on the View attribute format" alt="" coords="17,255,412,273"/>
+<area shape="rect" id="node2_40" href="src.com.dtmilano.android.viewclient.View-class.html#factory" title="View factory" alt="" coords="17,276,412,295"/>
+<area shape="rect" id="node2_41" href="src.com.dtmilano.android.viewclient.View-class.html#__init__" title="Constructor" alt="" coords="17,295,412,313"/>
+<area shape="rect" id="node2_42" href="src.com.dtmilano.android.viewclient.View-class.html#__getitem__" title="src.com.dtmilano.android.viewclient.View.__getitem__" alt="" coords="17,313,412,332"/>
+<area shape="rect" id="node2_43" href="src.com.dtmilano.android.viewclient.View-class.html#__getattr__" title="src.com.dtmilano.android.viewclient.View.__getattr__" alt="" coords="17,332,412,351"/>
+<area shape="rect" id="node2_44" href="src.com.dtmilano.android.viewclient.View-class.html#__call__" title="src.com.dtmilano.android.viewclient.View.__call__" alt="" coords="17,351,412,369"/>
+<area shape="rect" id="node2_45" href="src.com.dtmilano.android.viewclient.View-class.html#getClass" title="Gets the View class" alt="" coords="17,369,412,388"/>
+<area shape="rect" id="node2_46" href="src.com.dtmilano.android.viewclient.View-class.html#getId" title="Gets the View Id" alt="" coords="17,388,412,407"/>
+<area shape="rect" id="node2_47" href="src.com.dtmilano.android.viewclient.View-class.html#getContentDescription" title="Gets the content description." alt="" coords="17,407,412,425"/>
+<area shape="rect" id="node2_48" href="src.com.dtmilano.android.viewclient.View-class.html#getParent" title="Gets the parent." alt="" coords="17,425,412,444"/>
+<area shape="rect" id="node2_49" href="src.com.dtmilano.android.viewclient.View-class.html#getText" title="Gets the text attribute." alt="" coords="17,444,412,463"/>
+<area shape="rect" id="node2_50" href="src.com.dtmilano.android.viewclient.View-class.html#getHeight" title="Gets the height." alt="" coords="17,463,412,481"/>
+<area shape="rect" id="node2_51" href="src.com.dtmilano.android.viewclient.View-class.html#getWidth" title="Gets the width." alt="" coords="17,481,412,500"/>
+<area shape="rect" id="node2_52" href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId" title="Gets the unique Id of this View." alt="" coords="17,500,412,519"/>
+<area shape="rect" id="node2_53" href="src.com.dtmilano.android.viewclient.View-class.html#__str__" title="src.com.dtmilano.android.viewclient.View.__str__" alt="" coords="17,537,412,556"/>
+<area shape="rect" id="node2" href="src.com.dtmilano.android.viewclient.View-class.html" title="View class" alt="" coords="5,6,424,562"/>
+</map>
+ <img src="uml_class_diagram_for_src_com__2.gif" alt='' usemap="#uml_class_diagram_for_src_com__2" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>TextView class.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__call__">__call__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__getattr__">__getattr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__getitem__">__getitem__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__init__">__init__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__microStr__">__microStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__smallStr__">__smallStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__str__">__str__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#__tinyStr__">__tinyStr__</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#add">add</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#allPossibleNamesWithColon">allPossibleNamesWithColon</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#containsPoint">containsPoint</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getCenter">getCenter</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getClass">getClass</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getContentDescription">getContentDescription</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getCoords">getCoords</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getHeight">getHeight</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getId">getId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getParent">getParent</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getPositionAndSize">getPositionAndSize</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getText">getText</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId">getUniqueId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getVisibility">getVisibility</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getWidth">getWidth</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getX">getX</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getXY">getXY</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#getY">getY</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#intersection">intersection</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#isClickable">isClickable</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#touch">touch</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#variableNameFromId">variableNameFromId</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#writeImageToFile">writeImageToFile</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#factory">factory</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code><a href="src.com.dtmilano.android.viewclient.View-class.html">View</a></code></b>:
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#build">build</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#children">children</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#currentFocus">currentFocus</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#device">device</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#heightProperty">heightProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#idProperty">idProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#leftProperty">leftProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#map">map</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#parent">parent</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#textProperty">textProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#topProperty">topProperty</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#useUiAutomator">useUiAutomator</a></code>,
+ <code><a href="src.com.dtmilano.android.viewclient.View-class.html#widthProperty">widthProperty</a></code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html
new file mode 100755
index 0000000..f38f234
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class UiAutomator2AndroidViewClient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class UiAutomator2AndroidViewClient</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient">source code</a></span></p>
+<p>UiAutomator XML to AndroidViewClient</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__init__"></a><span class="summary-sig-name">__init__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">version</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="StartElement"></a><span class="summary-sig-name">StartElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>,
+ <span class="summary-sig-arg">attributes</span>)</span><br />
+ Expat start element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.StartElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="EndElement"></a><span class="summary-sig-name">EndElement</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span><br />
+ Expat end element event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.EndElement">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="CharacterData"></a><span class="summary-sig-name">CharacterData</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">data</span>)</span><br />
+ Expat character data event handler</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.CharacterData">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="Parse"></a><span class="summary-sig-name">Parse</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">uiautomatorxml</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#UiAutomator2AndroidViewClient.Parse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.View-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.View-class.html
new file mode 100755
index 0000000..3d6ec98
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.View-class.html
@@ -0,0 +1,1210 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.View</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class View
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.View-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class View</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View">source code</a></span></p>
+<p>View class</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">map</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">version</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getitem__"></a><span class="summary-sig-name">__getitem__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">key</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__getitem__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getattr__"></a><span class="summary-sig-name">__getattr__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__getattr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__call__"></a><span class="summary-sig-name">__call__</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">*args</span>,
+ <span class="summary-sig-arg">**kwargs</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__call__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getClass" class="summary-sig-name">getClass</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the <a
+ href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getClass">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getId" class="summary-sig-name">getId</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the <a
+ href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> Id</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getContentDescription"></a><span class="summary-sig-name">getContentDescription</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the content description.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getParent"></a><span class="summary-sig-name">getParent</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the parent.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getParent">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getText" class="summary-sig-name">getText</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the text attribute.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getHeight"></a><span class="summary-sig-name">getHeight</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the height.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getHeight">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getWidth"></a><span class="summary-sig-name">getWidth</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the width.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getWidth">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId" class="summary-sig-name">getUniqueId</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the unique Id of this View.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getVisibility"></a><span class="summary-sig-name">getVisibility</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View visibility</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getVisibility">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getX"></a><span class="summary-sig-name">getX</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View X coordinate</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getX">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getY"></a><span class="summary-sig-name">getY</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the View Y coordinate</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getY">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getXY" class="summary-sig-name">getXY</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">debug</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Returns the <i>screen</i> coordinates of this <code>View</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getXY">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getCoords" class="summary-sig-name">getCoords</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the coords of the View</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getCoords">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getPositionAndSize" class="summary-sig-name">getPositionAndSize</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the position and size (X,Y, W, H)</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#getCenter" class="summary-sig-name">getCenter</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the center coords of the View</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainStatusBarDimensionsIfVisible"></a><span class="summary-sig-name">__obtainStatusBarDimensionsIfVisible</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__obtainStatusBarDimensionsIfVisible">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainVxVy"></a><span class="summary-sig-name">__obtainVxVy</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__obtainVxVy">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainVwVh"></a><span class="summary-sig-name">__obtainVwVh</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__obtainVwVh">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainPxPy"></a><span class="summary-sig-name">__obtainPxPy</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">m</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__obtainPxPy">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__dumpWindowsInformation"></a><span class="summary-sig-name">__dumpWindowsInformation</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">debug</span>=<span class="summary-sig-default">False</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__dumpWindowsInformation">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="touch"></a><span class="summary-sig-name">touch</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">type</span>=<span class="summary-sig-default">MonkeyDevice.DOWN_AND_UP</span>)</span><br />
+ Touches the center of this <code>View</code></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.touch">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="allPossibleNamesWithColon"></a><span class="summary-sig-name">allPossibleNamesWithColon</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">name</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.allPossibleNamesWithColon">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="intersection"></a><span class="summary-sig-name">intersection</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">l1</span>,
+ <span class="summary-sig-arg">l2</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.intersection">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="containsPoint"></a><span class="summary-sig-name">containsPoint</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">(x, y)</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.containsPoint">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#add" class="summary-sig-name">add</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">child</span>)</span><br />
+ Adds a child</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.add">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="isClickable"></a><span class="summary-sig-name">isClickable</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.isClickable">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="variableNameFromId"></a><span class="summary-sig-name">variableNameFromId</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.variableNameFromId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.View-class.html#writeImageToFile" class="summary-sig-name">writeImageToFile</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">filename</span>,
+ <span class="summary-sig-arg">format</span>=<span class="summary-sig-default">"PNG"</span>)</span><br />
+ Write the View image to the specified filename in the specified
+ format.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.writeImageToFile">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__smallStr__"></a><span class="summary-sig-name">__smallStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__smallStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__tinyStr__"></a><span class="summary-sig-name">__tinyStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__tinyStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__microStr__"></a><span class="summary-sig-name">__microStr__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__microStr__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__str__"></a><span class="summary-sig-name">__str__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__str__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="factory"></a><span class="summary-sig-name">factory</span>(<span class="summary-sig-arg">attrs</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">version</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>)</span><br />
+ View factory</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.factory">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="map"></a><span class="summary-name">map</span><br />
+ The map that contains the <code>attr</code>,<code>value</code> pairs
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="device"></a><span class="summary-name">device</span><br />
+ The MonkeyDevice
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="children"></a><span class="summary-name">children</span><br />
+ The children of this View
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="parent"></a><span class="summary-name">parent</span><br />
+ The parent of this View
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="currentFocus"></a><span class="summary-name">currentFocus</span><br />
+ The current focus
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="build"></a><span class="summary-name">build</span><br />
+ Build properties
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="useUiAutomator"></a><span class="summary-name">useUiAutomator</span><br />
+ Whether to use UIAutomator or ViewServer
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="idProperty"></a><span class="summary-name">idProperty</span><br />
+ The id property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="textProperty"></a><span class="summary-name">textProperty</span><br />
+ The text property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="leftProperty"></a><span class="summary-name">leftProperty</span><br />
+ The left property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="topProperty"></a><span class="summary-name">topProperty</span><br />
+ The top property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="widthProperty"></a><span class="summary-name">widthProperty</span><br />
+ The width property depending on the View attribute format
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="heightProperty"></a><span class="summary-name">heightProperty</span><br />
+ The height property depending on the View attribute format
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">map</span>,
+ <span class="sig-arg">device</span>,
+ <span class="sig-arg">version</span>=<span class="sig-default">-1</span>,
+ <span class="sig-arg">forceviewserveruse</span>=<span class="sig-default">False</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>map</code></strong> (map) - the map containing the (attribute, value) pairs</li>
+ <li><strong class="pname"><code>device</code></strong> (MonkeyDevice) - the device containing this View</li>
+ <li><strong class="pname"><code>version</code></strong> (int) - the Android SDK version number of the platform where this View
+ belongs. If this is <code>-1</code> then the Android SDK version
+ will be obtained in this constructor.</li>
+ <li><strong class="pname"><code>forceviewserveruse</code></strong> (boolean) - Force the use of <code>ViewServer</code> even if the conditions
+ were given to use <code>UiAutomator</code>.</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getClass"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getClass</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getClass">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the <a href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the <a href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> class or <code>None</code> if not defined</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getId</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the <a href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> Id</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the <a href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a> <code>Id</code> or <code>None</code> if not
+ defined</dd>
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a
+ href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">getUniqueId()</a>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getText"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getText</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the text attribute.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the text attribute or <code>None</code> if not defined</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getUniqueId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getUniqueId</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the unique Id of this View.</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>See Also:</strong>
+ <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs"
+ class="link"
+ onclick="show_private();">ViewClient.__splitAttrs()</a> for a
+ discussion on <b>Unique Ids</b>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getXY"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getXY</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">debug</span>=<span class="sig-default">False</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getXY">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Returns the <i>screen</i> coordinates of this <code>View</code>.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>The <i>screen</i> coordinates of this <code>View</code></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getCoords"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getCoords</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getCoords">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the coords of the View</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>A tuple containing the View's coordinates ((L, T), (R, B))</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getPositionAndSize"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getPositionAndSize</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the position and size (X,Y, W, H)</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>A tuple containing the View's coordinates (X, Y, W, H)</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getCenter"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getCenter</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.getCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the center coords of the View</p>
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Author:</strong>
+ <a href="https://github.com/deanmorin" target="_top">Dean Morin</a>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="add"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">add</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">child</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.add">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Adds a child</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>child</code></strong> (View) - The child to add</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="writeImageToFile"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">writeImageToFile</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">filename</span>,
+ <span class="sig-arg">format</span>=<span class="sig-default">"PNG"</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#View.writeImageToFile">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Write the View image to the specified filename in the specified
+ format.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>filename</code></strong> (str) - Absolute path and optional filename receiving the image. If this
+ points to a directory, then the filename is determined by this
+ View unique ID and format extension.</li>
+ <li><strong class="pname"><code>format</code></strong> (str) - Image format (default format is PNG)</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewClient-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewClient-class.html
new file mode 100755
index 0000000..7e1ab25
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewClient-class.html
@@ -0,0 +1,2462 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.ViewClient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class ViewClient
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.ViewClient-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class ViewClient</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient">source code</a></span></p>
+<p>ViewClient is a <i>ViewServer</i> client.</p>
+ <h1 class="heading">ViewServer backend</h1>
+ <p>If not running the ViewServer is started on the target device or
+ emulator and then the port mapping is created.</p>
+ <h1 class="heading">UiAutomator backend</h1>
+ <p>No service is started.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">device</span>,
+ <span class="summary-sig-arg">serialno</span>,
+ <span class="summary-sig-arg">adb</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">autodump</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">forceviewserveruse</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">localport</span>=<span class="summary-sig-default">VIEW_SERVER_PORT</span>,
+ <span class="summary-sig-arg">remoteport</span>=<span class="summary-sig-default">VIEW_SERVER_PORT</span>,
+ <span class="summary-sig-arg">startviewserver</span>=<span class="summary-sig-default">True</span>,
+ <span class="summary-sig-arg">ignoreuiautomatorkilled</span>=<span class="summary-sig-default">False</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__del__"></a><span class="summary-sig-name">__del__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__del__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#assertServiceResponse" class="summary-sig-name">assertServiceResponse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">response</span>)</span><br />
+ Checks whether the response received from the server is correct or
+ raises and Exception.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.assertServiceResponse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#serviceResponse" class="summary-sig-name">serviceResponse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">response</span>)</span><br />
+ Checks the response received from the <i>ViewServer</i>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.serviceResponse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setViews" class="summary-sig-name">setViews</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">received</span>)</span><br />
+ Sets <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value splitting it into
+ lines.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViews">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setViewsFromUiAutomatorDump" class="summary-sig-name">setViewsFromUiAutomatorDump</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">received</span>)</span><br />
+ Sets <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value parsing the
+ received XML.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViewsFromUiAutomatorDump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__splitAttrs" class="summary-sig-name" onclick="show_private();">__splitAttrs</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">strArgs</span>)</span><br />
+ Splits the <code>View</code> attributes in <code>strArgs</code> and
+ optionally adds the view id to the <code>viewsById</code> list.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__splitAttrs">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__parseTree" class="summary-sig-name" onclick="show_private();">__parseTree</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">receivedLines</span>)</span><br />
+ Parses the View tree contained in <code
+ class="link">receivedLines</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTree">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__parseTreeFromUiAutomatorDump"></a><span class="summary-sig-name">__parseTreeFromUiAutomatorDump</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">receivedXml</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTreeFromUiAutomatorDump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getRoot" class="summary-sig-name">getRoot</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the root node of the <code>View</code> tree</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getRoot">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse" class="summary-sig-name">traverse</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>,
+ <span class="summary-sig-arg">indent</span>=<span class="summary-sig-default">""</span>,
+ <span class="summary-sig-arg">transform</span>=<span class="summary-sig-default">View.__str__</span>,
+ <span class="summary-sig-arg">stream</span>=<span class="summary-sig-default">sys.stdout</span>)</span><br />
+ Traverses the <code>View</code> tree and prints its nodes.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#dump" class="summary-sig-name">dump</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">window</span>=<span class="summary-sig-default">-1</span>,
+ <span class="summary-sig-arg">sleep</span>=<span class="summary-sig-default">1</span>)</span><br />
+ Dumps the window content.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.dump">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#list" class="summary-sig-name">list</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">sleep</span>=<span class="summary-sig-default">1</span>)</span><br />
+ List the windows.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.list">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewById" class="summary-sig-name">findViewById</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">viewId</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>,
+ <span class="summary-sig-arg">viewFilter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the View with the specified viewId.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewById">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewByIdOrRaise" class="summary-sig-name">findViewByIdOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">viewId</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>,
+ <span class="summary-sig-arg">viewFilter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByIdOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewByTag"></a><span class="summary-sig-name">findViewByTag</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tag</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View with the specified tag</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByTag">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewByTagOrRaise"></a><span class="summary-sig-name">findViewByTagOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tag</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View with the specified tag or raise a
+ ViewNotFoundException</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByTagOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTree"></a><span class="summary-sig-name">__findViewWithAttributeInTree</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTree">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTreeOrRaise"></a><span class="summary-sig-name">__findViewWithAttributeInTreeOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTreeOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__findViewWithAttributeInTreeThatMatches"></a><span class="summary-sig-name">__findViewWithAttributeInTreeThatMatches</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">regex</span>,
+ <span class="summary-sig-arg">root</span>,
+ <span class="summary-sig-arg">rlist</span>=<span class="summary-sig-default">[]</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__findViewWithAttributeInTreeThatMatches">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithAttribute"></a><span class="summary-sig-name">findViewWithAttribute</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View with the specified attribute and value</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttribute">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithAttributeOrRaise" class="summary-sig-name">findViewWithAttributeOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">val</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithAttributeThatMatches"></a><span class="summary-sig-name">findViewWithAttributeThatMatches</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">regex</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the list of Views with the specified attribute matching regex</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeThatMatches">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithText"></a><span class="summary-sig-name">findViewWithText</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewWithTextOrRaise" class="summary-sig-name">findViewWithTextOrRaise</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">text</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View or raise a ViewNotFoundException.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithTextOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithContentDescription"></a><span class="summary-sig-name">findViewWithContentDescription</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">contentdescription</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View with the specified content description</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewWithContentDescriptionOrRaise"></a><span class="summary-sig-name">findViewWithContentDescriptionOrRaise</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">contentdescription</span>,
+ <span class="summary-sig-arg">root</span>=<span class="summary-sig-default">"ROOT"</span>)</span><br />
+ Finds the View with the specified content description</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithContentDescriptionOrRaise">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="findViewsContainingPoint"></a><span class="summary-sig-name">findViewsContainingPoint</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">(x, y)</span>,
+ <span class="summary-sig-arg">filter</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Finds the list of Views that contain the point (x, y).</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewsContainingPoint">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getViewIds" class="summary-sig-name">getViewIds</a>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewIds">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById" class="summary-sig-name">getViewsById</a>(<span class="summary-sig-arg">self</span>)</span><br />
+ Returns the Views map.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewsById">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__getFocusedWindowPosition"></a><span class="summary-sig-name">__getFocusedWindowPosition</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__getFocusedWindowPosition">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="getSdkVersion"></a><span class="summary-sig-name">getSdkVersion</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Gets the SDK version.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getSdkVersion">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="isKeyboardShown"></a><span class="summary-sig-name">isKeyboardShown</span>(<span class="summary-sig-arg">self</span>)</span><br />
+ Whether the keyboard is displayed.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.isKeyboardShown">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#writeImageToFile" class="summary-sig-name">writeImageToFile</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">filename</span>,
+ <span class="summary-sig-arg">format</span>=<span class="summary-sig-default">"PNG"</span>)</span><br />
+ Write the View image to the specified filename in the specified
+ format.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.writeImageToFile">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#distance" class="summary-sig-name">distance</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Calculates the distance between this tree and the tree passed as
+ argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.distance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="hammingDistance"></a><span class="summary-sig-name">hammingDistance</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Finds the Hamming distance between this tree and the one passed as
+ argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.hammingDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="levenshteinDistance"></a><span class="summary-sig-name">levenshteinDistance</span>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">tree</span>)</span><br />
+ Finds the Levenshtein distance between this tree and the one passed
+ as argument.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.levenshteinDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== STATIC METHODS ==================== -->
+<a name="section-StaticMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Static Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-StaticMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainAdbPath"></a><span class="summary-sig-name">__obtainAdbPath</span>()</span><br />
+ Obtains the ADB path attempting know locations for different OSs</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__obtainAdbPath">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__mapSerialNo"></a><span class="summary-sig-name">__mapSerialNo</span>(<span class="summary-sig-arg">serialno</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__mapSerialNo">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__obtainDeviceSerialNumber"></a><span class="summary-sig-name">__obtainDeviceSerialNumber</span>(<span class="summary-sig-arg">device</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__obtainDeviceSerialNumber">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="setAlarm"></a><span class="summary-sig-name">setAlarm</span>(<span class="summary-sig-arg">timeout</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.setAlarm">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#connectToDeviceOrExit" class="summary-sig-name">connectToDeviceOrExit</a>(<span class="summary-sig-arg">timeout</span>=<span class="summary-sig-default">60</span>,
+ <span class="summary-sig-arg">verbose</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">ignoresecuredevice</span>=<span class="summary-sig-default">False</span>,
+ <span class="summary-sig-arg">serialno</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Connects to a device which serial number is obtained from the script
+ arguments if available or using the default regex <code>.*</code>.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.connectToDeviceOrExit">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText" class="summary-sig-name">traverseShowClassIdAndText</a>(<span class="summary-sig-arg">view</span>,
+ <span class="summary-sig-arg">extraInfo</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">noextrainfo</span>=<span class="summary-sig-default">None</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId" class="summary-sig-name">traverseShowClassIdTextAndUniqueId</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id, text if available and unique id.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription" class="summary-sig-name">traverseShowClassIdTextAndContentDescription</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id, text if available and unique id.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter" class="summary-sig-name">traverseShowClassIdTextAndCenter</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize" class="summary-sig-name">traverseShowClassIdTextPositionAndSize</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ Shows the View class, id and text if available.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CIT" class="summary-sig-name">TRAVERSE_CIT</a>(<span class="summary-sig-arg">view</span>,
+ <span class="summary-sig-arg">extraInfo</span>=<span class="summary-sig-default">None</span>,
+ <span class="summary-sig-arg">noextrainfo</span>=<span class="summary-sig-default">None</span>)</span><br />
+ An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"
+ class="link">traverseShowClassIdAndText(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITUI" class="summary-sig-name">TRAVERSE_CITUI</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"
+ class="link">traverseShowClassIdTextAndUniqueId(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITCD" class="summary-sig-name">TRAVERSE_CITCD</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"
+ class="link">traverseShowClassIdTextAndContentDescription(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITC" class="summary-sig-name">TRAVERSE_CITC</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"
+ class="link">traverseShowClassIdTextAndCenter(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#TRAVERSE_CITPS" class="summary-sig-name">TRAVERSE_CITPS</a>(<span class="summary-sig-arg">view</span>)</span><br />
+ An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"
+ class="link">traverseShowClassIdTextPositionAndSize(view)</a></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#sleep" class="summary-sig-name">sleep</a>(<span class="summary-sig-arg">secs</span>=<span class="summary-sig-default">1.0</span>)</span><br />
+ Sleeps for the specified number of seconds.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.sleep">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__traverse"></a><span class="summary-sig-name">__traverse</span>(<span class="summary-sig-arg">root</span>,
+ <span class="summary-sig-arg">indent</span>=<span class="summary-sig-default">""</span>,
+ <span class="summary-sig-arg">transform</span>=<span class="summary-sig-default">View.__str__</span>,
+ <span class="summary-sig-arg">stream</span>=<span class="summary-sig-default">sys.stdout</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__traverse">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__pickleable"></a><span class="summary-sig-name">__pickleable</span>(<span class="summary-sig-arg">tree</span>)</span><br />
+ Makes the tree pickleable.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__pickleable">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__hammingDistance" class="summary-sig-name" onclick="show_private();">__hammingDistance</a>(<span class="summary-sig-arg">s1</span>,
+ <span class="summary-sig-arg">s2</span>)</span><br />
+ Finds the Hamming distance between two strings.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__hammingDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr class="private">
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#__levenshteinDistance" class="summary-sig-name" onclick="show_private();">__levenshteinDistance</a>(<span class="summary-sig-arg">s</span>,
+ <span class="summary-sig-arg">t</span>)</span><br />
+ Find the Levenshtein distance between two Strings.</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__levenshteinDistance">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="excerpt"></a><span class="summary-sig-name">excerpt</span>(<span class="summary-sig-arg">str</span>,
+ <span class="summary-sig-arg">execute</span>=<span class="summary-sig-default">False</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.excerpt">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== INSTANCE VARIABLES ==================== -->
+<a name="section-InstanceVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variables</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariables"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="device"></a><span class="summary-name">device</span><br />
+ The <code>MonkeyDevice</code> device instance
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="serialno"></a><span class="summary-name">serialno</span><br />
+ The serial number of the device
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="adb"></a><span class="summary-name">adb</span><br />
+ The adb command
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="root"></a><span class="summary-name">root</span><br />
+ The root node
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="viewsById"></a><span class="summary-name">viewsById</span><br />
+ The map containing all the <a
+ href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a>s indexed by their <a
+ href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">View.getUniqueId()</a>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="display"></a><span class="summary-name">display</span><br />
+ The map containing the device's display properties: width, height and
+ density
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="build"></a><span class="summary-name">build</span><br />
+ The map containing the device's build properties: version.sdk,
+ version.release
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="ro"></a><span class="summary-name">ro</span><br />
+ The map containing the device's ro properties: secure, debuggable
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="forceViewServerUse"></a><span class="summary-name">forceViewServerUse</span><br />
+ Force the use of ViewServer even if the conditions to use UiAutomator
+ are satisfied
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="useUiAutomator"></a><span class="summary-name">useUiAutomator</span><br />
+ If UIAutomator is supported by the device it will be used
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#ignoreUiAutomatorKilled" class="summary-name">ignoreUiAutomatorKilled</a><br />
+ On some devices (i.e.
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a name="windows"></a><span class="summary-name">windows</span><br />
+ The list of windows as obtained by <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#list"
+ class="link">ViewClient.list()</a>
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <a href="src.com.dtmilano.android.viewclient.ViewClient-class.html#views" class="summary-name">views</a><br />
+ The list of Views represented as <code>str</code> obtained after
+ splitting it into lines after being received from the server.
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">device</span>,
+ <span class="sig-arg">serialno</span>,
+ <span class="sig-arg">adb</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">autodump</span>=<span class="sig-default">True</span>,
+ <span class="sig-arg">forceviewserveruse</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">localport</span>=<span class="sig-default">VIEW_SERVER_PORT</span>,
+ <span class="sig-arg">remoteport</span>=<span class="sig-default">VIEW_SERVER_PORT</span>,
+ <span class="sig-arg">startviewserver</span>=<span class="sig-default">True</span>,
+ <span class="sig-arg">ignoreuiautomatorkilled</span>=<span class="sig-default">False</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>device</code></strong> (MonkeyDevice) - The device running the <code>View server</code> to which this
+ client will connect</li>
+ <li><strong class="pname"><code>serialno</code></strong> (str) - the serial number of the device or emulator to connect to</li>
+ <li><strong class="pname"><code>adb</code></strong> (str) - the path of the <code>adb</code> executable or None and
+ <code>ViewClient</code> will try to find it</li>
+ <li><strong class="pname"><code>autodump</code></strong> (boolean) - whether an automatic dump is performed at the end of this
+ constructor</li>
+ <li><strong class="pname"><code>forceviewserveruse</code></strong> (boolean) - Force the use of <code>ViewServer</code> even if the conditions
+ to use <code>UiAutomator</code> are satisfied</li>
+ <li><strong class="pname"><code>localport</code></strong> (int) - the local port used in the redirection</li>
+ <li><strong class="pname"><code>remoteport</code></strong> (int) - the remote port used to start the <code>ViewServer</code> in the
+ device or emulator</li>
+ <li><strong class="pname"><code>startviewserver</code></strong> (boolean) - Whether to start the <b>global</b> ViewServer</li>
+ <li><strong class="pname"><code>ignoreuiautomatorkilled</code></strong> (boolean) - Ignores received <b>Killed</b> message from
+ <code>uiautomator</code></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="connectToDeviceOrExit"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">connectToDeviceOrExit</span>(<span class="sig-arg">timeout</span>=<span class="sig-default">60</span>,
+ <span class="sig-arg">verbose</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">ignoresecuredevice</span>=<span class="sig-default">False</span>,
+ <span class="sig-arg">serialno</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.connectToDeviceOrExit">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Connects to a device which serial number is obtained from the script
+ arguments if available or using the default regex <code>.*</code>.</p>
+ <p>If the connection is not successful the script exits. <code
+ class="link">MonkeyRunner.waitForConnection()</code> returns a
+ MonkeyDevice even if the connection failed. Then, to detect this
+ situation, <code>device.wake()</code> is attempted and if it fails then
+ it is assumed the previous connection failed.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>timeout</code></strong> (int) - timeout for the connection</li>
+ <li><strong class="pname"><code>verbose</code></strong> (bool) - Verbose output</li>
+ <li><strong class="pname"><code>ignoresecuredevice</code></strong> (bool) - Ignores the check for a secure device</li>
+ <li><strong class="pname"><code>serialno</code></strong> (str) - The device or emulator serial number</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the device and serialno used for the connection</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdAndText"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdAndText</span>(<span class="sig-arg">view</span>,
+ <span class="sig-arg">extraInfo</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">noextrainfo</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ <li><strong class="pname"><code>extraInfo</code></strong> (method) - the View method to add extra info</li>
+ <li><strong class="pname"><code>noextrainfo</code></strong> (bool) - Don't add extra info</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndUniqueId"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndUniqueId</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id, text if available and unique id. This
+ function can be used as a transform function to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and unique
+ Id</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndContentDescription"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndContentDescription</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id, text if available and unique id. This
+ function can be used as a transform function to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and the
+ content description</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextAndCenter"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextAndCenter</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverseShowClassIdTextPositionAndSize"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverseShowClassIdTextPositionAndSize</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Shows the View class, id and text if available. This function can be
+ used as a transform function to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverse"
+ class="link">ViewClient.traverse()</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CIT"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CIT</span>(<span class="sig-arg">view</span>,
+ <span class="sig-arg">extraInfo</span>=<span class="sig-default">None</span>,
+ <span class="sig-arg">noextrainfo</span>=<span class="sig-default">None</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdAndText">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdAndText"
+ class="link">traverseShowClassIdAndText(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ <li><strong class="pname"><code>extraInfo</code></strong> (method) - the View method to add extra info</li>
+ <li><strong class="pname"><code>noextrainfo</code></strong> (bool) - Don't add extra info</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITUI"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITUI</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndUniqueId">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndUniqueId"
+ class="link">traverseShowClassIdTextAndUniqueId(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and unique
+ Id</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITCD"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITCD</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndContentDescription">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndContentDescription"
+ class="link">traverseShowClassIdTextAndContentDescription(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available and the
+ content description</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITC"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITC</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextAndCenter">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextAndCenter"
+ class="link">traverseShowClassIdTextAndCenter(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="TRAVERSE_CITPS"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">TRAVERSE_CITPS</span>(<span class="sig-arg">view</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverseShowClassIdTextPositionAndSize">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>An alias for <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#traverseShowClassIdTextPositionAndSize"
+ class="link">traverseShowClassIdTextPositionAndSize(view)</a></p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>view</code></strong> (<i>View</i>) - the View</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the string containing class, id, and text if available</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="sleep"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">sleep</span>(<span class="sig-arg">secs</span>=<span class="sig-default">1.0</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.sleep">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sleeps for the specified number of seconds.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>secs</code></strong> (float) - number of seconds</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="assertServiceResponse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">assertServiceResponse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">response</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.assertServiceResponse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks whether the response received from the server is correct or
+ raises and Exception.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>response</code></strong> (str) - Response received from the server</li>
+ </ul></dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>Exception</strong></code> - If the response received from the server is invalid</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="serviceResponse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">serviceResponse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">response</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.serviceResponse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Checks the response received from the <i>ViewServer</i>.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd><code>True</code> if the response received matches <code
+ class="link">PARCEL_TRUE</code>, <code>False</code> otherwise</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="setViews"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">setViews</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">received</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViews">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sets <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value splitting it into
+ lines.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>received</code></strong> (str) - the string received from the <i>View Server</i></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="setViewsFromUiAutomatorDump"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">setViewsFromUiAutomatorDump</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">received</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.setViewsFromUiAutomatorDump">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Sets <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#views"
+ class="link">self.views</a> to the received value parsing the received
+ XML.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>received</code></strong> (str) - the string received from the <i>UI Automator</i></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__splitAttrs"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__splitAttrs</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">strArgs</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__splitAttrs">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Splits the <code>View</code> attributes in <code>strArgs</code> and
+ optionally adds the view id to the <code>viewsById</code> list.</p>
+ <h1 class="heading">Unique Ids</h1>
+ <p>It is very common to find <code>View</code>s having <b>NO_ID</b> as
+ the Id. This turns very difficult to use <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#findViewById"
+ class="link">self.findViewById()</a>. To help in this situation this
+ method assigns <b>unique Ids</b>.</p>
+ <p>The <b>unique Ids</b> are generated using the pattern
+ <code>id/no_id/<number></code> with <code><number></code>
+ starting at 1.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>strArgs</code></strong> (str) - the string containing the raw list of attributes and values</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>Returns the attributes map.</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__parseTree"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__parseTree</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">receivedLines</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__parseTree">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Parses the View tree contained in <code
+ class="link">receivedLines</code>. The tree is created and the root node
+ assigned to <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#root"
+ class="link">self.root</a>. This method also assigns <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#viewsById"
+ class="link">self.viewsById</a> values using <a
+ href="src.com.dtmilano.android.viewclient.View-class.html#getUniqueId"
+ class="link">View.getUniqueId</a> as the key.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>receivedLines</code></strong> (str) - the string received from <b>View Server</b></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getRoot"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getRoot</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getRoot">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Gets the root node of the <code>View</code> tree</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the root node of the <code>View</code> tree</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="traverse"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">traverse</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default">"ROOT"</span>,
+ <span class="sig-arg">indent</span>=<span class="sig-default">""</span>,
+ <span class="sig-arg">transform</span>=<span class="sig-default">View.__str__</span>,
+ <span class="sig-arg">stream</span>=<span class="sig-default">sys.stdout</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.traverse">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Traverses the <code>View</code> tree and prints its nodes.</p>
+ <p>The nodes are printed converting them to string but other
+ transformations can be specified by providing a method name as the
+ <code>transform</code> parameter.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>root</code></strong> (<a href="src.com.dtmilano.android.viewclient.View-class.html"
+ class="link">View</a>) - the root node from where the traverse starts</li>
+ <li><strong class="pname"><code>indent</code></strong> (str) - the indentation string to use to print the nodes</li>
+ <li><strong class="pname"><code>transform</code></strong> (method) - a method to use to transform the node before is printed</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="dump"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">dump</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">window</span>=<span class="sig-default">-1</span>,
+ <span class="sig-arg">sleep</span>=<span class="sig-default">1</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.dump">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Dumps the window content.</p>
+ <p>Sleep is useful to wait some time before obtaining the new content
+ when something in the window has changed.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>window</code></strong> (int or str) - the window id or name of the window to dump. The <b>name</b> is
+ the package name or the window name (i.e. StatusBar) for system
+ windows. The window id can be provided as <code>int</code> or
+ <code>str</code>. The <code>str</code> should represent and
+ <code>int</code> in either base 10 or 16. Use -1 to dump all
+ windows. This parameter only is used when the backend is
+ <b>ViewServer</b> and it's ignored for <b>UiAutomator</b>.</li>
+ <li><strong class="pname"><code>sleep</code></strong> (int) - sleep in seconds before proceeding to dump the content</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the list of Views as <code>str</code> received from the server
+ after being split into lines</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="list"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">list</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">sleep</span>=<span class="sig-default">1</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.list">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>List the windows.</p>
+ <p>Sleep is useful to wait some time before obtaining the new content
+ when something in the window has changed. This also sets <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#windows"
+ class="link">self.windows</a> as the list of windows.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>sleep</code></strong> (int) - sleep in seconds before proceeding to dump the content</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the list of windows</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewById"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewById</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">viewId</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default">"ROOT"</span>,
+ <span class="sig-arg">viewFilter</span>=<span class="sig-default">None</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewById">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View with the specified viewId.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>viewId</code></strong> (str) - the ID of the view to find</li>
+ <li><strong class="pname"><code>root</code></strong> (str) - the root node of the tree where the View will be searched</li>
+ <li><strong class="pname"><code>viewFilter</code></strong> - a function that will be invoked providing the candidate View as a
+ parameter and depending on the return value (<code>True</code> or
+ <code>False</code>) the View will be selected and returned as the
+ result of <code>findViewById()</code> or ignored. This can be
+ <code>None</code> and no extra filtering is applied.</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the <code>View</code> found or <code>None</code></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewByIdOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewByIdOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">viewId</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default">"ROOT"</span>,
+ <span class="sig-arg">viewFilter</span>=<span class="sig-default">None</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewByIdOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>viewId</code></strong> (str) - the ID of the view to find</li>
+ <li><strong class="pname"><code>root</code></strong> (str) - the root node of the tree where the View will be searched</li>
+ <li><strong class="pname"><code>viewFilter</code></strong> - a function that will be invoked providing the candidate View as a
+ parameter and depending on the return value (<code>True</code> or
+ <code>False</code>) the View will be selected and returned as the
+ result of <code>findViewById()</code> or ignored. This can be
+ <code>None</code> and no extra filtering is applied.</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewWithAttributeOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewWithAttributeOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">attr</span>,
+ <span class="sig-arg">val</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default">"ROOT"</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithAttributeOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="findViewWithTextOrRaise"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">findViewWithTextOrRaise</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">text</span>,
+ <span class="sig-arg">root</span>=<span class="sig-default">"ROOT"</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.findViewWithTextOrRaise">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the View or raise a ViewNotFoundException.</p>
+ <dl class="fields">
+ <dt>Returns:</dt>
+ <dd>the View found</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'><a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html">ViewNotFoundException</a></strong></code> - raise the exception if View not found</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="getViewIds"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getViewIds</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewIds">source code</a></span>
+ </td>
+ </tr></table>
+
+
+ <dl class="fields">
+ </dl>
+<div class="fields"> <p><strong>Deprecated:</strong>
+ Use <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#getViewsById"
+ class="link">getViewsById</a> instead.
+ <p>Returns the Views map.</p>
+ </p>
+</div></td></tr></table>
+</div>
+<a name="getViewsById"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">getViewsById</span>(<span class="sig-arg">self</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.getViewsById">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Returns the Views map. The keys are <code>uniqueIds</code> and the
+ values are <code>View</code>s.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="writeImageToFile"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">writeImageToFile</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">filename</span>,
+ <span class="sig-arg">format</span>=<span class="sig-default">"PNG"</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.writeImageToFile">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Write the View image to the specified filename in the specified
+ format.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>filename</code></strong> (str) - Absolute path and optional filename receiving the image. If this
+ points to a directory, then the filename is determined by the
+ serialno of the device and format extension.</li>
+ <li><strong class="pname"><code>format</code></strong> (str) - Image format (default format is PNG)</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="distance"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">distance</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">tree</span>)</span>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.distance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Calculates the distance between this tree and the tree passed as
+ argument.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>tree</code></strong> (list of Views) - Tree of Views</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the distance</dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__hammingDistance"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__hammingDistance</span>(<span class="sig-arg">s1</span>,
+ <span class="sig-arg">s2</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__hammingDistance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Finds the Hamming distance between two strings.</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>s1</code></strong> - string</li>
+ <li><strong class="pname"><code>s2</code></strong> - string</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>the distance</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>ValueError</strong></code> - if the lenght of the strings differ</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<a name="__levenshteinDistance"></a>
+<div class="private">
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__levenshteinDistance</span>(<span class="sig-arg">s</span>,
+ <span class="sig-arg">t</span>)</span>
+ <br /><em class="fname">Static Method</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewClient.__levenshteinDistance">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Find the Levenshtein distance between two Strings.</p>
+ <p>Python version of Levenshtein distance method implemented in Java at
+ <a
+ href="http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm"
+
+ target="_top">http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm</a>.</p>
+ <p>This is the number of changes needed to change one String into
+ another, where each change is a single character modification (deletion,
+ insertion or substitution).</p>
+ <p>The previous implementation of the Levenshtein distance algorithm was
+ from <a href="http://www.merriampark.com/ld.htm"
+ target="_top">http://www.merriampark.com/ld.htm</a></p>
+ <p>Chas Emerick has written an implementation in Java, which avoids an
+ OutOfMemoryError which can occur when my Java implementation is used with
+ very large strings. This implementation of the Levenshtein distance
+ algorithm is from <a href="http://www.merriampark.com/ldjava.htm"
+ target="_top">http://www.merriampark.com/ldjava.htm</a>:</p>
+<pre class="literalblock">
+ StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance(*, null) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance("","") = 0
+ StringUtils.getLevenshteinDistance("","a") = 1
+ StringUtils.getLevenshteinDistance("aaapppp", "") = 7
+ StringUtils.getLevenshteinDistance("frog", "fog") = 1
+ StringUtils.getLevenshteinDistance("fly", "ant") = 3
+ StringUtils.getLevenshteinDistance("elephant", "hippo") = 7
+ StringUtils.getLevenshteinDistance("hippo", "elephant") = 7
+ StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8
+ StringUtils.getLevenshteinDistance("hello", "hallo") = 1
+</pre>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>s</code></strong> - the first String, must not be null</li>
+ <li><strong class="pname"><code>t</code></strong> - the second String, must not be null</li>
+ </ul></dd>
+ <dt>Returns:</dt>
+ <dd>result distance</dd>
+ <dt>Raises:</dt>
+ <dd><ul class="nomargin-top">
+ <li><code><strong class='fraise'>ValueError</strong></code> - if either String input <code>null</code></li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== INSTANCE VARIABLE DETAILS ==================== -->
+<a name="section-InstanceVariableDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Variable Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceVariableDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="ignoreUiAutomatorKilled"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">ignoreUiAutomatorKilled</h3>
+ <p>On some devices (i.e. Nexus 7 running 4.2.2) uiautomator is killed
+ just after generating the dump file. In many cases the file is already
+ complete so we can ask to ignore the 'Killed' message by setting <code
+ class="link">ignoreuiautomatorkilled</code> to <code>True</code>.</p>
+ <p>Changes in 2.3.21 that uses <code>/dev/tty</code> instead of a file
+ may have turned this variable unnnecessary, however it has been kept for
+ backward compatibility.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<a name="views"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <h3 class="epydoc">views</h3>
+ <p>The list of Views represented as <code>str</code> obtained after
+ splitting it into lines after being received from the server. Done by <a
+ href="src.com.dtmilano.android.viewclient.ViewClient-class.html#setViews"
+ class="link">self.setViews()</a>.</p>
+ <dl class="fields">
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:54 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html
new file mode 100755
index 0000000..6190b81
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.ViewNotFoundException</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class ViewNotFoundException
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class ViewNotFoundException</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException">source code</a></span></p>
+<center>
+<center> <map id="uml_class_diagram_for_src_com__3" name="uml_class_diagram_for_src_com__3">
+<area shape="rect" id="node1_14" href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__" title="x.__init__(...) initializes x; see help(type(x)) for signature" alt="" coords="17,393,195,412"/>
+<area shape="rect" id="node1" href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html" title="ViewNotFoundException is raised when a View is not found." alt="" coords="5,361,206,418"/>
+<area shape="rect" id="node2_15" href="javascript:void(0);" title="exceptions.Exception.__new__" alt="" coords="43,316,169,335"/>
+<area shape="rect" id="node2" href="javascript:void(0);" title="Common base class for all non-exit exceptions." alt="" coords="30,283,181,341"/>
+<area shape="rect" id="node3_16" href="javascript:void(0);" title="exceptions.BaseException.args" alt="" coords="28,31,185,49"/>
+<area shape="rect" id="node3_17" href="javascript:void(0);" title="exceptions.BaseException.message" alt="" coords="28,49,185,68"/>
+<area shape="rect" id="node3_18" href="javascript:void(0);" title="x.__delattr__('name') <==> del x.name" alt="" coords="28,71,185,89"/>
+<area shape="rect" id="node3_19" href="javascript:void(0);" title="x.__getattribute__('name') <==> x.name" alt="" coords="28,89,185,108"/>
+<area shape="rect" id="node3_20" href="javascript:void(0);" title="x[y]" alt="" coords="28,108,185,127"/>
+<area shape="rect" id="node3_21" href="javascript:void(0);" title="x[i:j]" alt="" coords="28,127,185,145"/>
+<area shape="rect" id="node3_22" href="javascript:void(0);" title="helper for pickle" alt="" coords="28,145,185,164"/>
+<area shape="rect" id="node3_23" href="javascript:void(0);" title="repr(x)" alt="" coords="28,164,185,183"/>
+<area shape="rect" id="node3_24" href="javascript:void(0);" title="x.__setattr__('name', value) <==> x.name = value" alt="" coords="28,183,185,201"/>
+<area shape="rect" id="node3_25" href="javascript:void(0);" title="exceptions.BaseException.__setstate__" alt="" coords="28,201,185,220"/>
+<area shape="rect" id="node3_26" href="javascript:void(0);" title="str(x)" alt="" coords="28,220,185,239"/>
+<area shape="rect" id="node3_27" href="javascript:void(0);" title="exceptions.BaseException.__unicode__" alt="" coords="28,239,185,257"/>
+<area shape="rect" id="node3" href="javascript:void(0);" title="Common base class for all exceptions" alt="" coords="16,6,197,263"/>
+</map>
+ <img src="uml_class_diagram_for_src_com__3.gif" alt='' usemap="#uml_class_diagram_for_src_com__3" ismap="ismap" class="graph-without-title" />
+</center>
+</center>
+<hr />
+<p>ViewNotFoundException is raised when a View is not found.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">attr</span>,
+ <span class="summary-sig-arg">value</span>,
+ <span class="summary-sig-arg">root</span>)</span><br />
+ x.__init__(...) initializes x; see help(type(x)) for signature</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.Exception</code></b>:
+ <code>__new__</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.BaseException</code></b>:
+ <code>__delattr__</code>,
+ <code>__getattribute__</code>,
+ <code>__getitem__</code>,
+ <code>__getslice__</code>,
+ <code>__reduce__</code>,
+ <code>__repr__</code>,
+ <code>__setattr__</code>,
+ <code>__setstate__</code>,
+ <code>__str__</code>,
+ <code>__unicode__</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+ <code>__format__</code>,
+ <code>__hash__</code>,
+ <code>__reduce_ex__</code>,
+ <code>__sizeof__</code>,
+ <code>__subclasshook__</code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== PROPERTIES ==================== -->
+<a name="section-Properties"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Properties</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-Properties"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+ <tr>
+ <td colspan="2" class="summary">
+ <p class="indent-wrapped-lines"><b>Inherited from <code>exceptions.BaseException</code></b>:
+ <code>args</code>,
+ <code>message</code>
+ </p>
+ <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+ <code>__class__</code>
+ </p>
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">attr</span>,
+ <span class="sig-arg">value</span>,
+ <span class="sig-arg">root</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#ViewNotFoundException.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>x.__init__(...) initializes x; see help(type(x)) for signature</p>
+ <dl class="fields">
+ <dt>Overrides:
+ object.__init__
+ <dd><em class="note">(inherited documentation)</em></dd>
+ </dt>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:55 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Window-class.html b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Window-class.html
new file mode 100755
index 0000000..62b767c
--- /dev/null
+++ b/AndroidViewClient/doc/src.com.dtmilano.android.viewclient.Window-class.html
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>src.com.dtmilano.android.viewclient.Window</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+ <tr valign="top">
+ <td width="100%">
+ <span class="breadcrumbs">
+ Package src ::
+ Package com ::
+ Package dtmilano ::
+ <a href="src.com.dtmilano.android-module.html">Package android</a> ::
+ <a href="src.com.dtmilano.android.viewclient-module.html">Module viewclient</a> ::
+ Class Window
+ </span>
+ </td>
+ <td>
+ <table cellpadding="0" cellspacing="0">
+ <!-- hide/show private -->
+ <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span></td></tr>
+ <tr><td align="right"><span class="options"
+ >[<a href="frames.html" target="_top">frames</a
+ >] | <a href="src.com.dtmilano.android.viewclient.Window-class.html"
+ target="_top">no frames</a>]</span></td></tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class Window</h1><p class="nomargin-top"><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Window">source code</a></span></p>
+<p>Window class</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Instance Methods</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-InstanceMethods"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a href="src.com.dtmilano.android.viewclient.Window-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+ <span class="summary-sig-arg">num</span>,
+ <span class="summary-sig-arg">winId</span>,
+ <span class="summary-sig-arg">activity</span>,
+ <span class="summary-sig-arg">wvx</span>,
+ <span class="summary-sig-arg">wvy</span>,
+ <span class="summary-sig-arg">wvw</span>,
+ <span class="summary-sig-arg">wvh</span>,
+ <span class="summary-sig-arg">px</span>,
+ <span class="summary-sig-arg">py</span>,
+ <span class="summary-sig-arg">visibility</span>)</span><br />
+ Constructor</td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Window.__init__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+<tr>
+ <td width="15%" align="right" valign="top" class="summary">
+ <span class="summary-type"> </span>
+ </td><td class="summary">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td><span class="summary-sig"><a name="__str__"></a><span class="summary-sig-name">__str__</span>(<span class="summary-sig-arg">self</span>)</span></td>
+ <td align="right" valign="top">
+ <span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Window.__str__">source code</a></span>
+
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+ <td colspan="2" class="table-header">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr valign="top">
+ <td align="left"><span class="table-header">Method Details</span></td>
+ <td align="right" valign="top"
+ ><span class="options">[<a href="#section-MethodDetails"
+ class="privatelink" onclick="toggle_private();"
+ >hide private</a>]</span></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+ cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr valign="top"><td>
+ <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+ <span class="sig-arg">num</span>,
+ <span class="sig-arg">winId</span>,
+ <span class="sig-arg">activity</span>,
+ <span class="sig-arg">wvx</span>,
+ <span class="sig-arg">wvy</span>,
+ <span class="sig-arg">wvw</span>,
+ <span class="sig-arg">wvh</span>,
+ <span class="sig-arg">px</span>,
+ <span class="sig-arg">py</span>,
+ <span class="sig-arg">visibility</span>)</span>
+ <br /><em class="fname">(Constructor)</em>
+ </h3>
+ </td><td align="right" valign="top"
+ ><span class="codelink"><a href="src.com.dtmilano.android.viewclient-pysrc.html#Window.__init__">source code</a></span>
+ </td>
+ </tr></table>
+
+ <p>Constructor</p>
+ <dl class="fields">
+ <dt>Parameters:</dt>
+ <dd><ul class="nomargin-top">
+ <li><strong class="pname"><code>num</code></strong> (int) - Ordering number in Window Manager</li>
+ <li><strong class="pname"><code>winId</code></strong> (str) - the window ID</li>
+ <li><strong class="pname"><code>activity</code></strong> (str) - the activity (or sometimes other component) owning the window</li>
+ <li><strong class="pname"><code>wvx</code></strong> (int) - window's virtual X</li>
+ <li><strong class="pname"><code>wvy</code></strong> (int) - window's virtual Y</li>
+ <li><strong class="pname"><code>wvw</code></strong> (int) - window's virtual width</li>
+ <li><strong class="pname"><code>wvh</code></strong> (int) - window's virtual height</li>
+ <li><strong class="pname"><code>px</code></strong> (int) - parent's X</li>
+ <li><strong class="pname"><code>py</code></strong> (int) - parent's Y</li>
+ <li><strong class="pname"><code>visibility</code></strong> (int) - visibility of the window</li>
+ </ul></dd>
+ </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+ bgcolor="#a0c0ff" cellspacing="0">
+ <tr valign="middle">
+ <!-- Home link -->
+ <th> <a
+ href="src.com.dtmilano.android-module.html">Home</a> </th>
+
+ <!-- Tree link -->
+ <th> <a
+ href="module-tree.html">Trees</a> </th>
+
+ <!-- Index link -->
+ <th> <a
+ href="identifier-index.html">Indices</a> </th>
+
+ <!-- Help link -->
+ <th> <a
+ href="help.html">Help</a> </th>
+
+ <!-- Project homepage -->
+ <th class="navbar" align="right" width="100%">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr><th class="navbar" align="center"
+ ><a class="navbar" target="_top" href="http://dtmilano.com/viewclient">Project Homepage</a></th>
+ </tr></table></th>
+ </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+ <tr>
+ <td align="left" class="footer">
+ Generated by Epydoc 3.0.1 on Fri Aug 9 01:39:55 2013
+ </td>
+ <td align="right" class="footer">
+ <a target="mainFrame" href="http://epydoc.sourceforge.net"
+ >http://epydoc.sourceforge.net</a>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-com.dtmilano.android-module.html b/AndroidViewClient/doc/toc-com.dtmilano.android-module.html
new file mode 100755
index 0000000..a299660
--- /dev/null
+++ b/AndroidViewClient/doc/toc-com.dtmilano.android-module.html
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module android</h1>
+<hr />
+ <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="com.dtmilano.android-module.html#__package__"
+ >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-com.dtmilano.android.adb-module.html b/AndroidViewClient/doc/toc-com.dtmilano.android.adb-module.html
new file mode 100755
index 0000000..56f764c
--- /dev/null
+++ b/AndroidViewClient/doc/toc-com.dtmilano.android.adb-module.html
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>adb</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module adb</h1>
+<hr />
+ <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="com.dtmilano.android.adb-module.html#__package__"
+ >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-com.dtmilano.android.adb.adbclient-module.html b/AndroidViewClient/doc/toc-com.dtmilano.android.adb.adbclient-module.html
new file mode 100755
index 0000000..49718c0
--- /dev/null
+++ b/AndroidViewClient/doc/toc-com.dtmilano.android.adb.adbclient-module.html
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>adbclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module adbclient</h1>
+<hr />
+ <h2 class="toc">Classes</h2>
+ <a target="mainFrame" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html"
+ >AdbClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient.Device-class.html"
+ >Device</a><br /> <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DEBUG"
+ >DEBUG</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DOWN"
+ >DOWN</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP"
+ >DOWN_AND_UP</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#FAIL"
+ >FAIL</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#HOSTNAME"
+ >HOSTNAME</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#OKAY"
+ >OKAY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#PORT"
+ >PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#TIMEOUT"
+ >TIMEOUT</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#UP"
+ >UP</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY"
+ >VERSION_RELEASE_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY"
+ >VERSION_SDK_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#__package__"
+ >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-com.dtmilano.android.viewclient-module.html b/AndroidViewClient/doc/toc-com.dtmilano.android.viewclient-module.html
new file mode 100755
index 0000000..26f7db8
--- /dev/null
+++ b/AndroidViewClient/doc/toc-com.dtmilano.android.viewclient-module.html
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module viewclient</h1>
+<hr />
+ <h2 class="toc">Classes</h2>
+ <a target="mainFrame" href="com.dtmilano.android.viewclient.EditText-class.html"
+ >EditText</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html"
+ >Excerpt2Code</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.TextView-class.html"
+ >TextView</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"
+ >UiAutomator2AndroidViewClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.View-class.html"
+ >View</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.ViewClient-class.html"
+ >ViewClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html"
+ >ViewNotFoundException</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.Window-class.html"
+ >Window</a><br /> <h2 class="toc">Functions</h2>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_nd"
+ >_nd</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_nh"
+ >_nh</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_ns"
+ >_ns</a><br /> </div>
+ <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT"
+ >ADB_DEFAULT_PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG"
+ >DEBUG</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS"
+ >DEBUG_BOUNDS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_CALL"
+ >DEBUG_CALL</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_COORDS"
+ >DEBUG_COORDS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE"
+ >DEBUG_DEVICE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE"
+ >DEBUG_DISTANCE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR"
+ >DEBUG_GETATTR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED"
+ >DEBUG_RECEIVED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR"
+ >DEBUG_STATUSBAR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH"
+ >DEBUG_TOUCH</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_TREE"
+ >DEBUG_TREE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS"
+ >DEBUG_WINDOWS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY"
+ >GET_VISIBILITY_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#GONE"
+ >GONE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY"
+ >HEIGHT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8"
+ >HEIGHT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY"
+ >ID_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR"
+ >ID_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_RE"
+ >ID_RE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#INVISIBLE"
+ >INVISIBLE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#IP_RE"
+ >IP_RE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY"
+ >LAYOUT_TOP_MARGIN_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY"
+ >LEFT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8"
+ >LEFT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#OFFSET"
+ >OFFSET</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"
+ >SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY"
+ >TEXT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10"
+ >TEXT_PROPERTY_API_10</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR"
+ >TEXT_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY"
+ >TOP_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8"
+ >TOP_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES"
+ >USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY"
+ >VERSION_RELEASE_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"
+ >VERSION_SDK_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED"
+ >VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST"
+ >VIEW_SERVER_HOST</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT"
+ >VIEW_SERVER_PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VISIBLE"
+ >VISIBLE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WARNINGS"
+ >WARNINGS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY"
+ >WIDTH_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8"
+ >WIDTH_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WS"
+ >WS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#__package__"
+ >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-everything.html b/AndroidViewClient/doc/toc-everything.html
new file mode 100755
index 0000000..81c8b2a
--- /dev/null
+++ b/AndroidViewClient/doc/toc-everything.html
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Everything</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Everything</h1>
+<hr />
+ <h2 class="toc">All Classes</h2>
+ <a target="mainFrame" href="com.dtmilano.android.adb.adbclient.AdbClient-class.html"
+ >com.dtmilano.android.adb.adbclient.AdbClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient.Device-class.html"
+ >com.dtmilano.android.adb.adbclient.Device</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.EditText-class.html"
+ >com.dtmilano.android.viewclient.EditText</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.Excerpt2Code-class.html"
+ >com.dtmilano.android.viewclient.Excerpt2Code</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.TextView-class.html"
+ >com.dtmilano.android.viewclient.TextView</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"
+ >com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.View-class.html"
+ >com.dtmilano.android.viewclient.View</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.ViewClient-class.html"
+ >com.dtmilano.android.viewclient.ViewClient</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.ViewNotFoundException-class.html"
+ >com.dtmilano.android.viewclient.ViewNotFoundException</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient.Window-class.html"
+ >com.dtmilano.android.viewclient.Window</a><br /> <h2 class="toc">All Functions</h2>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_nd"
+ >com.dtmilano.android.viewclient._nd</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_nh"
+ >com.dtmilano.android.viewclient._nh</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#_ns"
+ >com.dtmilano.android.viewclient._ns</a><br /> </div>
+ <h2 class="toc">All Variables</h2>
+ <a target="mainFrame" href="com.dtmilano.android-module.html#__package__"
+ >com.dtmilano.android.__package__</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb-module.html#__package__"
+ >com.dtmilano.android.adb.__package__</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DEBUG"
+ >com.dtmilano.android.adb.adbclient.DEBUG</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DOWN"
+ >com.dtmilano.android.adb.adbclient.DOWN</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#DOWN_AND_UP"
+ >com.dtmilano.android.adb.adbclient.DOWN_AND_UP</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#FAIL"
+ >com.dtmilano.android.adb.adbclient.FAIL</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#HOSTNAME"
+ >com.dtmilano.android.adb.adbclient.HOSTNAME</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#OKAY"
+ >com.dtmilano.android.adb.adbclient.OKAY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#PORT"
+ >com.dtmilano.android.adb.adbclient.PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#TIMEOUT"
+ >com.dtmilano.android.adb.adbclient.TIMEOUT</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#UP"
+ >com.dtmilano.android.adb.adbclient.UP</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#VERSION_RELEASE_PROPERTY"
+ >com.dtmilano.android.adb.adbclient.VERSION_RELEASE_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#VERSION_SDK_PROPERTY"
+ >com.dtmilano.android.adb.adbclient.VERSION_SDK_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.adb.adbclient-module.html#__package__"
+ >com.dtmilano.android.adb.adbclient.__package__</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT"
+ >com.dtmilano.android.viewclient.ADB_DEFAULT_PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG"
+ >com.dtmilano.android.viewclient.DEBUG</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS"
+ >com.dtmilano.android.viewclient.DEBUG_BOUNDS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_CALL"
+ >com.dtmilano.android.viewclient.DEBUG_CALL</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_COORDS"
+ >com.dtmilano.android.viewclient.DEBUG_COORDS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE"
+ >com.dtmilano.android.viewclient.DEBUG_DEVICE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE"
+ >com.dtmilano.android.viewclient.DEBUG_DISTANCE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR"
+ >com.dtmilano.android.viewclient.DEBUG_GETATTR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED"
+ >com.dtmilano.android.viewclient.DEBUG_RECEIVED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR"
+ >com.dtmilano.android.viewclient.DEBUG_STATUSBAR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH"
+ >com.dtmilano.android.viewclient.DEBUG_TOUCH</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_TREE"
+ >com.dtmilano.android.viewclient.DEBUG_TREE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS"
+ >com.dtmilano.android.viewclient.DEBUG_WINDOWS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY"
+ >com.dtmilano.android.viewclient.GET_VISIBILITY_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#GONE"
+ >com.dtmilano.android.viewclient.GONE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY"
+ >com.dtmilano.android.viewclient.HEIGHT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8"
+ >com.dtmilano.android.viewclient.HEIGHT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY"
+ >com.dtmilano.android.viewclient.ID_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR"
+ >com.dtmilano.android.viewclient.ID_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#ID_RE"
+ >com.dtmilano.android.viewclient.ID_RE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#INVISIBLE"
+ >com.dtmilano.android.viewclient.INVISIBLE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#IP_RE"
+ >com.dtmilano.android.viewclient.IP_RE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY"
+ >com.dtmilano.android.viewclient.LAYOUT_TOP_MARGIN_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY"
+ >com.dtmilano.android.viewclient.LEFT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8"
+ >com.dtmilano.android.viewclient.LEFT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#OFFSET"
+ >com.dtmilano.android.viewclient.OFFSET</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"
+ >com.dtmilano.android.viewclient.SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY"
+ >com.dtmilano.android.viewclient.TEXT_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10"
+ >com.dtmilano.android.viewclient.TEXT_PROPERTY_API_10</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR"
+ >com.dtmilano.android.viewclient.TEXT_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY"
+ >com.dtmilano.android.viewclient.TOP_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8"
+ >com.dtmilano.android.viewclient.TOP_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES"
+ >com.dtmilano.android.viewclient.USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VERSION_RELEASE_PROPERTY"
+ >com.dtmilano.android.viewclient.VERSION_RELEASE_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"
+ >com.dtmilano.android.viewclient.VERSION_SDK_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED"
+ >com.dtmilano.android.viewclient.VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST"
+ >com.dtmilano.android.viewclient.VIEW_SERVER_HOST</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT"
+ >com.dtmilano.android.viewclient.VIEW_SERVER_PORT</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#VISIBLE"
+ >com.dtmilano.android.viewclient.VISIBLE</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WARNINGS"
+ >com.dtmilano.android.viewclient.WARNINGS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY"
+ >com.dtmilano.android.viewclient.WIDTH_PROPERTY</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8"
+ >com.dtmilano.android.viewclient.WIDTH_PROPERTY_API_8</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#WS"
+ >com.dtmilano.android.viewclient.WS</a><br /> <a target="mainFrame" href="com.dtmilano.android.viewclient-module.html#__package__"
+ >com.dtmilano.android.viewclient.__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-src.com.dtmilano.android-module.html b/AndroidViewClient/doc/toc-src.com.dtmilano.android-module.html
new file mode 100755
index 0000000..90e21e5
--- /dev/null
+++ b/AndroidViewClient/doc/toc-src.com.dtmilano.android-module.html
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>android</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module android</h1>
+<hr />
+ <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="src.com.dtmilano.android-module.html#__package__"
+ >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc-src.com.dtmilano.android.viewclient-module.html b/AndroidViewClient/doc/toc-src.com.dtmilano.android.viewclient-module.html
new file mode 100755
index 0000000..84041f9
--- /dev/null
+++ b/AndroidViewClient/doc/toc-src.com.dtmilano.android.viewclient-module.html
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>viewclient</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Module viewclient</h1>
+<hr />
+ <h2 class="toc">Classes</h2>
+ <a target="mainFrame" href="src.com.dtmilano.android.viewclient.EditText-class.html"
+ >EditText</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.Excerpt2Code-class.html"
+ >Excerpt2Code</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.TextView-class.html"
+ >TextView</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.UiAutomator2AndroidViewClient-class.html"
+ >UiAutomator2AndroidViewClient</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.View-class.html"
+ >View</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.ViewClient-class.html"
+ >ViewClient</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.ViewNotFoundException-class.html"
+ >ViewNotFoundException</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient.Window-class.html"
+ >Window</a><br /> <h2 class="toc">Functions</h2>
+ <div class="private">
+ <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#__nd"
+ >__nd</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#__nh"
+ >__nh</a><br /> </div>
+ <div class="private">
+ <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#__ns"
+ >__ns</a><br /> </div>
+ <h2 class="toc">Variables</h2>
+ <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#ADB_DEFAULT_PORT"
+ >ADB_DEFAULT_PORT</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG"
+ >DEBUG</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_BOUNDS"
+ >DEBUG_BOUNDS</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_CALL"
+ >DEBUG_CALL</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_COORDS"
+ >DEBUG_COORDS</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_DEVICE"
+ >DEBUG_DEVICE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_DISTANCE"
+ >DEBUG_DISTANCE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_GETATTR"
+ >DEBUG_GETATTR</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_RECEIVED"
+ >DEBUG_RECEIVED</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_STATUSBAR"
+ >DEBUG_STATUSBAR</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_TOUCH"
+ >DEBUG_TOUCH</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_TREE"
+ >DEBUG_TREE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#DEBUG_WINDOWS"
+ >DEBUG_WINDOWS</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#GET_VISIBILITY_PROPERTY"
+ >GET_VISIBILITY_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#GONE"
+ >GONE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY"
+ >HEIGHT_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#HEIGHT_PROPERTY_API_8"
+ >HEIGHT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#ID_PROPERTY"
+ >ID_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#ID_PROPERTY_UI_AUTOMATOR"
+ >ID_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#ID_RE"
+ >ID_RE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#INVISIBLE"
+ >INVISIBLE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#IP_RE"
+ >IP_RE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#LAYOUT_TOP_MARGIN_PROPERTY"
+ >LAYOUT_TOP_MARGIN_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY"
+ >LEFT_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#LEFT_PROPERTY_API_8"
+ >LEFT_PROPERTY_API_8</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#OFFSET"
+ >OFFSET</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED"
+ >SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY"
+ >TEXT_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_API_10"
+ >TEXT_PROPERTY_API_10</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#TEXT_PROPERTY_UI_AUTOMATOR"
+ >TEXT_PROPERTY_UI_AUTOMATOR</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#TOP_PROPERTY"
+ >TOP_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#TOP_PROPERTY_API_8"
+ >TOP_PROPERTY_API_8</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES"
+ >USE_MONKEYRUNNER_TO_GET_BUILD_PROPERTIES</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#VERSION_SDK_PROPERTY"
+ >VERSION_SDK_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#VIEW_SERVER_HOST"
+ >VIEW_SERVER_HOST</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#VIEW_SERVER_PORT"
+ >VIEW_SERVER_PORT</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#VISIBLE"
+ >VISIBLE</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#WARNINGS"
+ >WARNINGS</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY"
+ >WIDTH_PROPERTY</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#WIDTH_PROPERTY_API_8"
+ >WIDTH_PROPERTY_API_8</a><br /> <a target="mainFrame" href="src.com.dtmilano.android.viewclient-module.html#WS"
+ >WS</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/toc.html b/AndroidViewClient/doc/toc.html
new file mode 100755
index 0000000..6b3941d
--- /dev/null
+++ b/AndroidViewClient/doc/toc.html
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Table of Contents</title>
+ <link rel="stylesheet" href="epydoc.css" type="text/css" />
+ <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+ alink="#204080">
+<h1 class="toc">Table of Contents</h1>
+<hr />
+ <a target="moduleFrame" href="toc-everything.html">Everything</a>
+ <br />
+ <h2 class="toc">Modules</h2>
+ <a target="moduleFrame" href="toc-com.dtmilano.android-module.html"
+ onclick="setFrame('toc-com.dtmilano.android-module.html','com.dtmilano.android-module.html');" >com.dtmilano.android</a><br /> <a target="moduleFrame" href="toc-com.dtmilano.android.adb-module.html"
+ onclick="setFrame('toc-com.dtmilano.android.adb-module.html','com.dtmilano.android.adb-module.html');" >com.dtmilano.android.adb</a><br /> <a target="moduleFrame" href="toc-com.dtmilano.android.adb.adbclient-module.html"
+ onclick="setFrame('toc-com.dtmilano.android.adb.adbclient-module.html','com.dtmilano.android.adb.adbclient-module.html');" >com.dtmilano.android.adb.adbclient</a><br /> <a target="moduleFrame" href="toc-com.dtmilano.android.viewclient-module.html"
+ onclick="setFrame('toc-com.dtmilano.android.viewclient-module.html','com.dtmilano.android.viewclient-module.html');" >com.dtmilano.android.viewclient</a><br /><hr />
+ <span class="options">[<a href="javascript:void(0);" class="privatelink"
+ onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+ <!--
+ // Private objects are initially displayed (because if
+ // javascript is turned off then we want them to be
+ // visible); but by default, we want to hide them. So hide
+ // them unless we have a cookie that says to show them.
+ checkCookie();
+ // -->
+</script>
+</body>
+</html>
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi.gif b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi.gif
new file mode 100755
index 0000000..3af40e2
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_2.gif b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_2.gif
new file mode 100755
index 0000000..03580b7
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_2.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_3.gif b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_3.gif
new file mode 100755
index 0000000..d89cd6a
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_3.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_4.gif b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_4.gif
new file mode 100755
index 0000000..ed22255
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_com_dtmi_4.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_src_com_.gif b/AndroidViewClient/doc/uml_class_diagram_for_src_com_.gif
new file mode 100755
index 0000000..b02f257
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_src_com_.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_src_com__2.gif b/AndroidViewClient/doc/uml_class_diagram_for_src_com__2.gif
new file mode 100755
index 0000000..900a877
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_src_com__2.gif
Binary files differ
diff --git a/AndroidViewClient/doc/uml_class_diagram_for_src_com__3.gif b/AndroidViewClient/doc/uml_class_diagram_for_src_com__3.gif
new file mode 100755
index 0000000..3af537c
--- /dev/null
+++ b/AndroidViewClient/doc/uml_class_diagram_for_src_com__3.gif
Binary files differ
diff --git a/AndroidViewClient/examples/apidemos-app-alert_dialog-list_dialog-command_three.py b/AndroidViewClient/examples/apidemos-app-alert_dialog-list_dialog-command_three.py
new file mode 100755
index 0000000..0053d86
--- /dev/null
+++ b/AndroidViewClient/examples/apidemos-app-alert_dialog-list_dialog-command_three.py
@@ -0,0 +1,61 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Sep 5, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient, View
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+#09-06 01:01:34.964: I/ActivityManager(873): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.android.apis/.ApiDemos bnds=[784,346][880,442]} from pid 991
+componentName = 'com.example.android.apis/.ApiDemos'
+device.startActivity(component=componentName, flags=FLAG_ACTIVITY_NEW_TASK)
+
+ViewClient.sleep(3)
+vc = ViewClient(device=device, serialno=serialno)
+app = vc.findViewWithText('App')
+if app:
+ app.touch()
+ ViewClient.sleep(3)
+ # windows changed, request a new dump
+ vc.dump()
+ ad = vc.findViewWithText('Alert Dialogs')
+ if ad:
+ ad.touch()
+ ViewClient.sleep(3)
+ # windows changed, request a new dump
+ vc.dump()
+ ld = vc.findViewWithText('List dialog')
+ if ld:
+ ld.touch()
+ ViewClient.sleep(3)
+ # windows changed, request a new dump
+ vc.dump()
+ c3 = vc.findViewWithText('Command three')
+ if c3:
+ c3.touch()
+ ViewClient.sleep(10)
+ device.press('KEYCODE_BACK')
+ else:
+ print >> sys.stderr, "Cannot find 'Command three'"
+ else:
+ print >> sys.stderr, "Cannot find 'List dialog'"
+ else:
+ print >> sys.stderr, "Cannot find 'Alert Dialogs'"
+else:
+ print >> sys.stderr, "Cannot find 'App'"
+
diff --git a/AndroidViewClient/examples/apidemos-preference-advanced_preferences.py b/AndroidViewClient/examples/apidemos-preference-advanced_preferences.py
new file mode 100755
index 0000000..be33c8e
--- /dev/null
+++ b/AndroidViewClient/examples/apidemos-preference-advanced_preferences.py
@@ -0,0 +1,47 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Sep 18, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+import com.dtmilano.android.viewclient as viewclient
+if viewclient.__version__ < '1.0':
+ print >> sys.stderr, "%s: This script requires viewclient 1.0 or greater." % os.path.basename(sys.argv[0])
+ sys.exit(1)
+
+device, serialno = viewclient.ViewClient.connectToDeviceOrExit()
+
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+#09-06 01:01:34.964: I/ActivityManager(873): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.android.apis/.ApiDemos bnds=[784,346][880,442]} from pid 991
+componentName = 'com.example.android.apis/.ApiDemos'
+device.startActivity(component=componentName, flags=FLAG_ACTIVITY_NEW_TASK)
+
+viewclient.ViewClient.sleep(3)
+vc = viewclient.ViewClient(device=device, serialno=serialno)
+vc.findViewWithTextOrRaise('Preference').touch()
+vc.dump()
+vc.findViewWithTextOrRaise(re.compile('.*Advanced preferences')).touch()
+vc.dump()
+myPreference = vc.findViewWithTextOrRaise('My preference')
+if vc.getSdkVersion() >= 16:
+ _id = 'id/no_id/22'
+else:
+ _id = 'id/mypreference_widget'
+value0 = vc.findViewByIdOrRaise(_id).getText()
+for i in range(10):
+ myPreference.touch()
+vc.dump()
+value1 = vc.findViewByIdOrRaise(_id).getText()
+print "My preference started with value %s and is now %s" % (value0, value1)
diff --git a/AndroidViewClient/examples/browser-open-url.py b/AndroidViewClient/examples/browser-open-url.py
new file mode 100755
index 0000000..6ff4ca7
--- /dev/null
+++ b/AndroidViewClient/examples/browser-open-url.py
@@ -0,0 +1,48 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Mar 13, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+import string
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+USE_BROWSER = True
+# Starting: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.browser/.BrowserActivity }
+if USE_BROWSER:
+ package = 'com.android.browser'
+ activity = '.BrowserActivity'
+else:
+ package = 'com.android.chrome'
+ activity = 'com.google.android.apps.chrome.Main'
+component = package + "/" + activity
+uri = 'http://dtmilano.blogspot.com'
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+device.startActivity(component=component, uri=uri)
+ViewClient.sleep(5)
+
+vc = ViewClient(device, serialno)
+if vc.getSdkVersion() >= 16:
+ if USE_BROWSER:
+ url = vc.findViewByIdOrRaise("id/no_id/12").getText()
+ else:
+ url = vc.findViewWithContentDescription("Search or type url").getText()
+else:
+ url = vc.findViewByIdOrRaise("id/url").getText()
+if string.find(uri, url) != -1:
+ print "%s successfully loaded" % uri
+else:
+ print "%s was not loaded, url=%s" % (uri, url)
diff --git a/AndroidViewClient/examples/browser-view-page-source.py b/AndroidViewClient/examples/browser-view-page-source.py
new file mode 100755
index 0000000..26a0d2e
--- /dev/null
+++ b/AndroidViewClient/examples/browser-view-page-source.py
@@ -0,0 +1,63 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Oct 12, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+
+VPS = "javascript:alert(document.getElementsByTagName('html')[0].innerHTML);"
+USE_BROWSER = True
+if USE_BROWSER:
+ package = 'com.android.browser'
+ activity = '.BrowserActivity'
+ _id = 'id/no_id/12'
+else:
+ package = 'com.android.chrome'
+ activity = 'com.google.android.apps.chrome.Main'
+ _id = 'id/no_id/28'
+component = package + "/" + activity
+uri = 'http://dtmilano.blogspot.com'
+
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+device.startActivity(component=component, uri=uri)
+ViewClient.sleep(5)
+
+vc = ViewClient(device=device, serialno=serialno)
+sdkVersion = vc.getSdkVersion()
+
+if sdkVersion > 10:
+ device.drag((240, 180), (240, 420), 1, 20)
+else:
+ for i in range(10):
+ device.press('KEYCODE_DPAD_UP')
+ ViewClient.sleep(1)
+
+vc.findViewByIdOrRaise(_id if sdkVersion >= 16 else 'id/url' if sdkVersion > 10 else 'id/title').touch()
+ViewClient.sleep(1)
+
+device.press('KEYCODE_DEL')
+device.type(VPS)
+ViewClient.sleep(1)
+device.press('KEYCODE_ENTER')
+ViewClient.sleep(3)
+
+vc.dump()
+print vc.findViewByIdOrRaise('id/no_id/11' if sdkVersion >= 16 else 'id/message').getText().replace('\\n', "\n")
+
+device.press('KEYCODE_BACK' if sdkVersion > 10 else 'KEYCODE_ENTER')
diff --git a/AndroidViewClient/examples/check-import.py b/AndroidViewClient/examples/check-import.py
new file mode 100755
index 0000000..66ad2ca
--- /dev/null
+++ b/AndroidViewClient/examples/check-import.py
@@ -0,0 +1,40 @@
+#! /usr/bin/env python
+'''
+Created on Aug 29, 2012
+
+@author: diego
+'''
+
+import re
+import sys
+import os
+
+debug = False
+if '--debug' in sys.argv or '-X' in sys.argv:
+ debug = True
+
+try:
+ if os.environ.has_key('ANDROID_VIEW_CLIENT_HOME'):
+ avcd = os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src')
+ if os.path.isdir(avcd):
+ sys.path.append(avcd)
+ else:
+ print >>sys.stderr, "WARNING: '%s' is not a directory and is pointed by ANDROID_VIEW_CLIENT_HOME environment variable" % avcd
+except:
+ pass
+
+if debug:
+ print >>sys.stderr, "sys.path=", sys.path
+for d in sys.path:
+ if d in [ '__classpath__', '__pyclasspath__/']:
+ continue
+ if not os.path.exists(d):
+ if re.search('/Lib$', d):
+ if not os.path.exists(re.sub('/Lib$', '', d)):
+ print >>sys.stderr, "WARNING: '%s' is in sys.path but doesn't exist" % d
+import com
+import com.dtmilano
+import com.dtmilano.android
+import com.dtmilano.android.viewclient
+from com.dtmilano.android.viewclient import ViewClient, View
+print "OK"
diff --git a/AndroidViewClient/examples/click-button-by-text.py b/AndroidViewClient/examples/click-button-by-text.py
new file mode 100755
index 0000000..8dc8768
--- /dev/null
+++ b/AndroidViewClient/examples/click-button-by-text.py
@@ -0,0 +1,32 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on May 5, 2012
+
+@author: diego
+'''
+
+import sys
+import os
+import time
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+vc = ViewClient(*ViewClient.connectToDeviceOrExit())
+
+for bt in [ 'One', 'Two', 'Three', 'Four', 'Five' ]:
+ b = vc.findViewWithText(bt)
+ if b:
+ (x, y) = b.getXY()
+ print >>sys.stderr, "clicking b%s @ (%d,%d) ..." % (bt, x, y)
+ b.touch()
+ else:
+ print >>sys.stderr, "b%s not found" % bt
+ time.sleep(7)
+
+print >>sys.stderr, "bye"
diff --git a/AndroidViewClient/examples/click-no-id-button.py b/AndroidViewClient/examples/click-no-id-button.py
new file mode 100755
index 0000000..b4190b0
--- /dev/null
+++ b/AndroidViewClient/examples/click-no-id-button.py
@@ -0,0 +1,26 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Aug 7, 2012
+
+@author: diego
+'''
+
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+
+vc = ViewClient(*ViewClient.connectToDeviceOrExit())
+
+for i in range(1, 9):
+ view = vc.findViewById("id/no_id/%d" % i)
+ if view:
+ print view.__tinyStr__()
+ view.touch()
diff --git a/AndroidViewClient/examples/development-settings-show-running-processes.py b/AndroidViewClient/examples/development-settings-show-running-processes.py
new file mode 100755
index 0000000..fc2b1d9
--- /dev/null
+++ b/AndroidViewClient/examples/development-settings-show-running-processes.py
@@ -0,0 +1,48 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 3, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+# 01-04 18:23:42.000: I/ActivityManager(4288): Displayed com.android.development/.DevelopmentSettings: +379ms
+package = 'com.android.development'
+activity = '.DevelopmentSettings'
+component = package + "/" + activity
+device, serialno = ViewClient.connectToDeviceOrExit()
+device.startActivity(component=component)
+ViewClient.sleep(5)
+
+vc = ViewClient(device, serialno)
+
+showCpu = vc.findViewWithTextOrRaise("Show CPU usage")
+showLoad = vc.findViewWithTextOrRaise("Show running processes")
+alwaysFinish = vc.findViewWithTextOrRaise("Immediately destroy activities")
+
+if not showLoad.isChecked():
+ print "touching @", showLoad.getCenter()
+ showLoad.touch()
+
+if not alwaysFinish.isChecked():
+ print "touching @", alwaysFinish.getCenter()
+ alwaysFinish.touch()
+
+if not showCpu.isChecked():
+ # WARNING: Show CPU usage is de-activated as soon as it's activated, that's why it seems it
+ # is never set
+ print "touching @", showCpu.getCenter()
+ showCpu.touch()
diff --git a/AndroidViewClient/examples/dump-all-windows-lib.py b/AndroidViewClient/examples/dump-all-windows-lib.py
new file mode 100755
index 0000000..87c2779
--- /dev/null
+++ b/AndroidViewClient/examples/dump-all-windows-lib.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+#! /usr/bin/env shebang monkeyrunner -plugin $ANDROID_VIEW_CLIENT_HOME/bin/androidviewclient-$ANDROID_VIEW_CLIENT_VERSION.jar @!
+#
+# Linux:
+#! /usr/local/bin/shebang monkeyrunner -plugin $AVC_HOME/bin/androidviewclient-$AVC_VERSION.jar @!
+#
+# Other:
+#! /path/to/monkeyrunner -plugin /path/to/androidviewclient/bin/androidviewclient-2.3.14.jar
+#
+# No shebang:
+# c:>path\to\monkeyrunner -plugin \path\to\androidviewclient-2.3.13.jar dump-all-windows-lib.py
+
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Apr 30, 2013
+
+@author: diego
+'''
+
+from com.dtmilano.android.viewclient import ViewClient
+
+kwargs2 = {'autodump': False, 'forceviewserveruse': True}
+vc = ViewClient(*ViewClient.connectToDeviceOrExit(), **kwargs2)
+windows = vc.list()
+for wId in windows.keys():
+ print ">>> window=", wId, windows[wId]
+ vc.dump(window=wId)
+ vc.traverse(transform=ViewClient.TRAVERSE_CIT, indent=" ")
diff --git a/AndroidViewClient/examples/dump-all-windows.py b/AndroidViewClient/examples/dump-all-windows.py
new file mode 100755
index 0000000..a7ff5b7
--- /dev/null
+++ b/AndroidViewClient/examples/dump-all-windows.py
@@ -0,0 +1,27 @@
+#! /usr/bin/env python
+
+'''
+Copyright (C) 2014 Diego Torres Milano
+Created on Apr 24, 2014
+
+@author: diego
+'''
+
+import sys
+import os
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+kwargs1 = {'verbose': True, 'ignoresecuredevice': True}
+kwargs2 = {'startviewserver': True, 'forceviewserveruse': True, 'autodump': False, 'ignoreuiautomatorkilled': True}
+vc = ViewClient(*ViewClient.connectToDeviceOrExit(**kwargs1), **kwargs2)
+windows = vc.list()
+for wId in windows.keys():
+ print ">>> window=", wId, windows[wId]
+ vc.dump(window=wId)
+ vc.traverse(transform=ViewClient.TRAVERSE_CITCD, indent=" ")
diff --git a/AndroidViewClient/examples/dump-simple-lib.py b/AndroidViewClient/examples/dump-simple-lib.py
new file mode 100755
index 0000000..66eef29
--- /dev/null
+++ b/AndroidViewClient/examples/dump-simple-lib.py
@@ -0,0 +1,21 @@
+#! /usr/bin/env shebang monkeyrunner -plugin $ANDROID_VIEW_CLIENT_HOME/bin/androidviewclient-$ANDROID_VIEW_CLIENT_VERSION.jar @!
+#
+# Linux:
+#! /usr/local/bin/shebang monkeyrunner -plugin $AVC_HOME/bin/androidviewclient-$AVC_VERSION.jar @!
+#
+# Other:
+#! /path/to/monkeyrunner -plugin /path/to/androidviewclient/bin/androidviewclient-2.3.14.jar
+#
+# No shebang:
+# c:>path\to\monkeyrunner -plugin \path\to\androidviewclient-2.3.13.jar dump-simple-lib.py
+
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Apr 30, 2013
+
+@author: diego
+'''
+
+from com.dtmilano.android.viewclient import ViewClient
+
+ViewClient(*ViewClient.connectToDeviceOrExit()).traverse(transform=ViewClient.TRAVERSE_CIT)
diff --git a/AndroidViewClient/examples/dump-simple.py b/AndroidViewClient/examples/dump-simple.py
new file mode 100755
index 0000000..d25d0be
--- /dev/null
+++ b/AndroidViewClient/examples/dump-simple.py
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Apr 30, 2013
+
+@author: diego
+'''
+
+
+import sys
+import os
+
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+ViewClient(*ViewClient.connectToDeviceOrExit(verbose=True)).traverse(transform=ViewClient.TRAVERSE_CIT)
diff --git a/AndroidViewClient/examples/dump.py b/AndroidViewClient/examples/dump.py
new file mode 100755
index 0000000..481c9e2
--- /dev/null
+++ b/AndroidViewClient/examples/dump.py
@@ -0,0 +1,9 @@
+#! /usr/bin/env python
+
+print '''
+Notice:
+-------
+'dump.py' was moved to the 'tools' directory and renamed 'dump'.
+A simpler example is now in 'dump-simple.py'.
+
+'''
diff --git a/AndroidViewClient/examples/email-send.py b/AndroidViewClient/examples/email-send.py
new file mode 100755
index 0000000..6b97572
--- /dev/null
+++ b/AndroidViewClient/examples/email-send.py
@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Oct 1, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient, TextView, EditText
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+vc = ViewClient(device=device, serialno=serialno)
+#send = vc.findViewWithTextOrRaise('Send')
+send = vc.findViewByIdOrRaise('id/send')
+#to = EditText(vc.findViewByIdOrRaise('id/to'))
+to = vc.findViewByIdOrRaise('id/to')
+subject = vc.findViewByIdOrRaise('id/subject')
+subject.touch()
+subject.type('AVCSample')
+ViewClient.sleep(10)
+to.touch()
+#to.type('androidviewclient@gmail.com')
+device.type('androidviewclient@gmail.com')
+ViewClient.sleep(10)
+send.touch()
diff --git a/AndroidViewClient/examples/envsetup.sh b/AndroidViewClient/examples/envsetup.sh
new file mode 100755
index 0000000..99ce3c4
--- /dev/null
+++ b/AndroidViewClient/examples/envsetup.sh
@@ -0,0 +1,20 @@
+:
+
+export ANDROID_HOME=/Users/diego/opt/android-sdk
+export ANDROID_VIEW_CLIENT_HOME=/Users/diego/AndroidViewClient/AndroidViewClient
+# setting PYTHONPATH also works
+#export PYTHONPATH=$PYTHONPATH:/Users/diego/AndroidViewClient/AndroidViewClient
+
+
+add_to_path ()
+{
+ if [[ "$PATH" =~ (^|:)"${1}"(:|$) ]]
+ then
+ return 0
+ fi
+ export PATH=${1}:$PATH
+}
+
+
+add_to_path $ANDROID_HOME/tools
+add_to_path $ANDROID_HOME/platform-tools
diff --git a/AndroidViewClient/examples/gallery-select-album.py b/AndroidViewClient/examples/gallery-select-album.py
new file mode 100755
index 0000000..720dfd3
--- /dev/null
+++ b/AndroidViewClient/examples/gallery-select-album.py
@@ -0,0 +1,47 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 3, 2012
+
+@author: diego
+'''
+
+
+import sys
+import os
+import re
+import time
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import *
+
+package = 'com.android.gallery'
+activity = 'com.android.camera.GalleryPicker'
+component = package + "/" + activity
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+device.startActivity(component=component)
+time.sleep(3)
+vc = ViewClient(device, serialno)
+if vc.build[VERSION_SDK_PROPERTY] != 15:
+ print 'This script is intended to run on API-15'
+ sys.exit(1)
+ALL_PICTURES = 'All pictures'
+vc.findViewWithTextOrRaise(re.compile('%s \(\d+\)' % ALL_PICTURES)).touch()
+vc.dump()
+vc.findViewWithTextOrRaise(ALL_PICTURES)
+print "'%s' found" % ALL_PICTURES
diff --git a/AndroidViewClient/examples/list.py b/AndroidViewClient/examples/list.py
new file mode 100755
index 0000000..2e89bf9
--- /dev/null
+++ b/AndroidViewClient/examples/list.py
@@ -0,0 +1,67 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Apr 23, 2013
+
+@author: diego
+'''
+
+
+import sys
+import os
+import getopt
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+HELP = 'help'
+VERBOSE = 'verbose'
+IGNORE_SECURE_DEVICE = 'ignore-secure-device'
+FORCE_VIEW_SERVER_USE = 'force-view-server-use'
+DO_NOT_START_VIEW_SERVER = 'do-not-start-view-server'
+# -u,-s,-p,-v eaten by monkeyrunner
+SHORT_OPTS = 'HVIFS'
+LONG_OPTS = [HELP, VERBOSE, IGNORE_SECURE_DEVICE, FORCE_VIEW_SERVER_USE, DO_NOT_START_VIEW_SERVER]
+
+def usage(exitVal=1):
+ print >> sys.stderr, 'usage: list.py [-H|--%s] [-V|--%s] [-I|--%s] [-F|--%s] [-S|--%s] [serialno]' % \
+ tuple(LONG_OPTS)
+ sys.exit(exitVal)
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], SHORT_OPTS, LONG_OPTS)
+except getopt.GetoptError, e:
+ print >>sys.stderr, 'ERROR:', str(e)
+ usage()
+
+kwargs1 = {VERBOSE: False, 'ignoresecuredevice': False}
+# We force viewserver use by default
+kwargs2 = {'forceviewserveruse': True, 'startviewserver': True, 'autodump': False}
+for o, a in opts:
+ o = o.strip('-')
+ if o in ['H', HELP]:
+ usage(0)
+ elif o in ['V', VERBOSE]:
+ kwargs1[VERBOSE] = True
+ elif o in ['I', IGNORE_SECURE_DEVICE]:
+ kwargs1['ignoresecuredevice'] = True
+ elif o in ['F', FORCE_VIEW_SERVER_USE]:
+ kwargs2['forceviewserveruse'] = True
+ elif o in ['S', DO_NOT_START_VIEW_SERVER]:
+ kwargs2['startviewserver'] = False
+
+print ViewClient(*ViewClient.connectToDeviceOrExit(**kwargs1), **kwargs2).list()
diff --git a/AndroidViewClient/examples/monkeyrunner-issue-36544-workaround.py b/AndroidViewClient/examples/monkeyrunner-issue-36544-workaround.py
new file mode 100755
index 0000000..3742a73
--- /dev/null
+++ b/AndroidViewClient/examples/monkeyrunner-issue-36544-workaround.py
@@ -0,0 +1,93 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Sep 8, 2012
+
+@author: diego
+
+@see: http://code.google.com/p/android/issues/detail?id=36544
+'''
+
+
+import re
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+from com.dtmilano.android.viewclient import ViewClient, View
+
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+# We are not using Settings as the bug describes because there's no WiFi dialog in emulator
+#componentName = 'com.android.settings/.Settings'
+componentName = 'com.dtmilano.android.sampleui/.MainActivity'
+device.startActivity(component=componentName, flags=FLAG_ACTIVITY_NEW_TASK)
+ViewClient.sleep(3)
+
+# Set it to True or False to decide if AndroidViewClient or plain monkeyrunner is used
+USE_AVC = True
+
+if USE_AVC:
+ # AndroidViewClient
+ vc = ViewClient(device=device, serialno=serialno)
+ showDialogButton = vc.findViewById('id/show_dialog_button')
+ if showDialogButton:
+ showDialogButton.touch()
+ vc.dump()
+ vc.findViewById('id/0x123456').type('Donald')
+ ok = vc.findViewWithText('OK')
+ if ok:
+ # 09-08 20:17:47.860: D/MonkeyStub(2033): translateCommand: tap 265 518
+ ok.touch()
+ vc.dump()
+ hello = vc.findViewById('id/hello')
+ if hello:
+ if hello.getText() == "Hello Donald":
+ print "OK"
+ else:
+ print "FAIL"
+ else:
+ print >> sys.stderr, "'hello' not found"
+ else:
+ print >> sys.stderr, "'Show Dialog' button not found"
+else:
+ # MonkeyRunner
+ from com.android.monkeyrunner.easy import EasyMonkeyDevice
+ from com.android.monkeyrunner.easy import By
+ easyDevice = EasyMonkeyDevice(device)
+ showDialogButton = By.id('id/show_dialog_button')
+ if showDialogButton:
+ easyDevice.touch(showDialogButton, MonkeyDevice.DOWN_AND_UP)
+ ViewClient.sleep(3)
+ editText = By.id('id/0x123456')
+ print editText
+ easyDevice.type(editText, 'Donald')
+ ViewClient.sleep(3)
+ ok = By.id('id/button1')
+ if ok:
+ # 09-08 20:16:41.119: D/MonkeyStub(1992): translateCommand: tap 348 268
+ easyDevice.touch(ok, MonkeyDevice.DOWN_AND_UP)
+ hello = By.id('id/hello')
+ if hello:
+ if easyDevice.getText(hello) == "Hello Donald":
+ print "OK"
+ else:
+ print "FAIL"
+ else:
+ print >> sys.stderr, "'hello' not found"
+
diff --git a/AndroidViewClient/examples/sample-ui-dialog_activity-button.py b/AndroidViewClient/examples/sample-ui-dialog_activity-button.py
new file mode 100755
index 0000000..65b757b
--- /dev/null
+++ b/AndroidViewClient/examples/sample-ui-dialog_activity-button.py
@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Aug 31, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+from com.dtmilano.android.viewclient import ViewClient, View
+
+
+vc = ViewClient(*ViewClient.connectToDeviceOrExit())
+
+button = vc.findViewWithTextOrRaise('Show Dialog')
+print "button: ", button.getClass(), button.getId(), button.getCoords()
+
diff --git a/AndroidViewClient/examples/sample-ui-toggle-buttons.py b/AndroidViewClient/examples/sample-ui-toggle-buttons.py
new file mode 100755
index 0000000..1889bff
--- /dev/null
+++ b/AndroidViewClient/examples/sample-ui-toggle-buttons.py
@@ -0,0 +1,42 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Aug 31, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+from com.dtmilano.android.viewclient import ViewClient, ViewNotFoundException
+
+vc = ViewClient(*ViewClient.connectToDeviceOrExit())
+if vc.useUiAutomator:
+ print "ViewClient: using UiAutomator backend"
+
+# Find the 3 toggle buttons, because the first 2 change their text if they are selected
+# we use a regex to find them.
+# Once found, we touch them changing their state
+for t in [re.compile('Button 1 .*'), re.compile('Button 2 .*'), 'Button with ID']:
+ try:
+ vc.findViewWithTextOrRaise(t).touch()
+ except ViewNotFoundException:
+ print >>sys.stderr, "Couldn't find button with text=", t
+
diff --git a/AndroidViewClient/examples/screenshot-monkeyrunner.py b/AndroidViewClient/examples/screenshot-monkeyrunner.py
new file mode 100755
index 0000000..53907e8
--- /dev/null
+++ b/AndroidViewClient/examples/screenshot-monkeyrunner.py
@@ -0,0 +1,20 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Set 5, 2013
+
+@author: diego
+'''
+
+
+import sys
+import os
+
+
+if len(sys.argv) < 2:
+ print >> sys.stderr, "usage: %s filename.png" % sys.argv[0]
+ sys.exit(1)
+
+filename = sys.argv.pop(1)
+device = MonkeyRunner.waitForConnection()
+device.takeSnapshot().writeToFile(filename, 'PNG')
diff --git a/AndroidViewClient/examples/screenshot.py b/AndroidViewClient/examples/screenshot.py
new file mode 100755
index 0000000..5656379
--- /dev/null
+++ b/AndroidViewClient/examples/screenshot.py
@@ -0,0 +1,20 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Aug 31, 2013
+
+@author: diego
+'''
+
+
+import sys
+import os
+
+from com.dtmilano.android.viewclient import ViewClient
+
+if len(sys.argv) < 2:
+ sys.exit("usage: %s filename.png [serialno]" % sys.argv[0])
+
+filename = sys.argv.pop(1)
+device, serialno = ViewClient.connectToDeviceOrExit(verbose=False)
+device.takeSnapshot().save(filename, 'PNG')
diff --git a/AndroidViewClient/examples/settings-display.py b/AndroidViewClient/examples/settings-display.py
new file mode 100755
index 0000000..6e2d23f
--- /dev/null
+++ b/AndroidViewClient/examples/settings-display.py
@@ -0,0 +1,46 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Aug 15, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient, View
+
+
+START_ACTIVITY = True
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+
+package='com.android.settings'
+activity='.Settings'
+component=package + "/" + activity
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+if START_ACTIVITY:
+ device.startActivity(component=component, flags=FLAG_ACTIVITY_NEW_TASK)
+ ViewClient.sleep(3)
+
+vc = ViewClient(device, serialno)
+
+# this may help you find the attributes for specific Views
+#vc.traverse(vc.getRoot())
+text = 'Display'
+view = vc.findViewWithText(text)
+if view:
+ print view.__smallStr__()
+ print view.getCoords()
+ print view.getX(), ',', view.getY()
+else:
+ print "View with text='%s' was not found" % text
diff --git a/AndroidViewClient/examples/settings-sound-phone_ringtone.py b/AndroidViewClient/examples/settings-sound-phone_ringtone.py
new file mode 100755
index 0000000..e7af9fe
--- /dev/null
+++ b/AndroidViewClient/examples/settings-sound-phone_ringtone.py
@@ -0,0 +1,73 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Sep 8, 2012
+
+@author: diego
+
+@see: http://code.google.com/p/android/issues/detail?id=36544
+'''
+
+
+import re
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+from com.dtmilano.android.viewclient import ViewClient, View
+
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+DEBUG = True
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+# We are not using Settings as the bug describes because there's no WiFi dialog in emulator
+componentName = 'com.android.settings/.Settings'
+device.startActivity(component=componentName, flags=FLAG_ACTIVITY_NEW_TASK)
+ViewClient.sleep(3)
+
+vc = ViewClient(device=device, serialno=serialno)
+if DEBUG: vc.traverse(transform=ViewClient.TRAVERSE_CIT)
+sound = vc.findViewWithText('Sound')
+if sound:
+ sound.touch()
+ vc.dump()
+ phoneRingtone = vc.findViewWithText('Phone ringtone')
+ if phoneRingtone:
+ phoneRingtone.touch()
+ vc.dump()
+ vespa = vc.findViewWithText('Vespa')
+ if vespa:
+ vespa.touch()
+ ViewClient.sleep(1)
+ ok = vc.findViewById('id/button1')
+ if ok:
+ ok.touch()
+ vc.dump()
+ vespa = vc.findViewWithText('Vespa')
+ # If for some reason the dialog is still there we will have Vespa and OK
+ ok = vc.findViewById('id/button1')
+ if vespa and not ok:
+ print "OK"
+ else:
+ print "FAIL to set ringtone Vespa"
+ sys.exit(1)
+ else:
+ print >> sys.stderr, "'OK' not found"
+ else:
+ print >> sys.stderr, "'Phone ringtone' not found"
+else:
+ print >> sys.stderr, "'Sound' not found"
diff --git a/AndroidViewClient/examples/settings.py b/AndroidViewClient/examples/settings.py
new file mode 100755
index 0000000..c477c4c
--- /dev/null
+++ b/AndroidViewClient/examples/settings.py
@@ -0,0 +1,65 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 1, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+package='com.android.settings'
+activity='.Settings'
+component=package + "/" + activity
+device, serialno = ViewClient.connectToDeviceOrExit()
+
+if True:
+ device.startActivity(component=component)
+ ViewClient.sleep(3)
+ device.press('KEYCODE_DPAD_DOWN') # extra VMT setting WARNING!
+ ViewClient.sleep(1)
+ device.press('KEYCODE_DPAD_CENTER', MonkeyDevice.DOWN_AND_UP)
+ device.press('KEYCODE_DPAD_DOWN', MonkeyDevice.DOWN_AND_UP)
+ #device.press('KEYCODE_DPAD_DOWN', MonkeyDevice.DOWN_AND_UP)
+ #device.press('KEYCODE_DPAD_DOWN', MonkeyDevice.DOWN_AND_UP)
+ #device.press('KEYCODE_DPAD_CENTER', "DOWN_AND_UP")
+ #device.press('KEYCODE_DPAD_CENTER', "DOWN_AND_UP")
+
+vc = ViewClient(device, serialno)
+regex = "id/checkbox.*"
+p = re.compile(regex)
+found = False
+for id in vc.getViewIds():
+ #print id
+ m = p.match(id)
+ if m:
+ found = True
+ attrs = vc.findViewById(id)
+ if attrs['isSelected()'] == 'true':
+ print "Wi-Fi is",
+ if attrs['isChecked()'] != 'true':
+ print "not",
+ print "set"
+
+if not found:
+ print "No Views found that match " + regex
diff --git a/AndroidViewClient/examples/temperature-converter-get-conversion.py b/AndroidViewClient/examples/temperature-converter-get-conversion.py
new file mode 100755
index 0000000..31e6ac7
--- /dev/null
+++ b/AndroidViewClient/examples/temperature-converter-get-conversion.py
@@ -0,0 +1,89 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 3, 2012
+
+This example starts the TemperatureConverter activity then type '123' into the 'Celsius' field.
+Then a ViewClient is created to obtain the view dump and the current values of the views with
+id/celsius and id/fahrenheit are obtained and the conversion printed to stdout.
+Finally, the fields are obtained by using their tags and again, conversion printed to stdout.
+
+If --localViewServer is passed in the command line then LocalViewServer provided by
+TemperatureConverter is used. This is very useful when the device is secure and ViewServer
+cannot be started.
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+import time
+
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+localViewServer = False
+if len(sys.argv) > 1 and sys.argv[1] == '--localViewServer':
+ localViewServer = True
+ sys.argv.pop(1)
+
+device, serialno = ViewClient.connectToDeviceOrExit(ignoresecuredevice=localViewServer)
+
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+package = 'com.example.i2at.tc'
+activity = '.TemperatureConverterActivity'
+componentName = package + "/" + activity
+
+device.startActivity(component=componentName, flags=FLAG_ACTIVITY_NEW_TASK)
+time.sleep(5)
+
+
+device.type("123")
+time.sleep(3)
+
+vc = ViewClient(device, serialno, startviewserver=(not localViewServer))
+
+if vc.build['ro.build.version.sdk'] >= 16:
+ # obtain the views by contentDescription
+ celsius = vc.findViewWithContentDescriptionOrRaise("celsius")
+ fahrenheit = vc.findViewWithContentDescriptionOrRaise("fahrenheit")
+else:
+ # obtain the views by id
+ celsius = vc.findViewByIdOrRaise("id/celsius")
+ fahrenheit = vc.findViewByIdOrRaise("id/fahrenheit")
+
+ct = celsius.getText()
+if ct:
+ c = float(ct)
+else:
+ print >> sys.stderr, "Celsius is empty"
+ sys.exit(1)
+ft = fahrenheit.getText()
+if ft:
+ f = float(ft)
+else:
+ print >> sys.stderr, "Fahrenheit is empty"
+ sys.exit(1)
+print "by id: %.2f C => %.2f F" % (c, f)
+
+# obtain the views by tag
+#celsius = vc.findViewByTagOrRaise("celsius")
+#fahrenheit = vc.findViewByTagOrRaise("fahrenheit")
+#
+#c = float(celsius.getText())
+#f = float(fahrenheit.getText())
+#print "by tag: %.2f C => %.2f F" % (c, f)
diff --git a/AndroidViewClient/examples/test-connect-to-device.py b/AndroidViewClient/examples/test-connect-to-device.py
new file mode 100755
index 0000000..b6dec73
--- /dev/null
+++ b/AndroidViewClient/examples/test-connect-to-device.py
@@ -0,0 +1,30 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Oct 15, 2012
+
+@author: diego
+'''
+
+
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+ViewClient.connectToDeviceOrExit(verbose=True)
diff --git a/AndroidViewClient/examples/trashcan-fullscreenactivity-touches.py b/AndroidViewClient/examples/trashcan-fullscreenactivity-touches.py
new file mode 100755
index 0000000..d3130c4
--- /dev/null
+++ b/AndroidViewClient/examples/trashcan-fullscreenactivity-touches.py
@@ -0,0 +1,44 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Mar 13, 2012
+
+@author: diego
+'''
+
+
+import re
+import sys
+import os
+import string
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+package = 'com.example.trashcan'
+activity = '.FullScreenActivity'
+component = package + "/" + activity
+
+device, serialno = ViewClient.connectToDeviceOrExit()
+#device.startActivity(component=component)
+#ViewClient.sleep(3)
+
+vc = ViewClient(device, serialno)
+button = vc.findViewWithTextOrRaise('Button')
+button.touch()
+toggle = vc.findViewWithTextOrRaise(re.compile('(ON)|(OFF)'))
+toggle.touch()
diff --git a/AndroidViewClient/examples/viewserveractivity-new-activity.py b/AndroidViewClient/examples/viewserveractivity-new-activity.py
new file mode 100755
index 0000000..652be48
--- /dev/null
+++ b/AndroidViewClient/examples/viewserveractivity-new-activity.py
@@ -0,0 +1,32 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 3, 2012
+
+@author: diego
+'''
+
+
+import sys
+import os
+
+# This must be imported before MonkeyRunner and MonkeyDevice,
+# otherwise the import fails.
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient
+
+device, serialno = ViewClient.connectToDeviceOrExit(ignoresecuredevice=True)
+vc = ViewClient(device=device, serialno=serialno, startviewserver=False)
+vc.findViewWithTextOrRaise("New activity").touch()
diff --git a/AndroidViewClient/examples/write-image-to-file.py b/AndroidViewClient/examples/write-image-to-file.py
new file mode 100755
index 0000000..f60a54d
--- /dev/null
+++ b/AndroidViewClient/examples/write-image-to-file.py
@@ -0,0 +1,36 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2013 Diego Torres Milano
+Created on 2014-03-10 by Culebra v4.10.1
+
+ __ __ __ __
+ / \ / \ / \ / \
+____________________/ __\/ __\/ __\/ __\_____________________________
+___________________/ /__/ /__/ /__/ /________________________________
+ | / \ / \ / \ / \ \___
+ |/ \_/ \_/ \_/ \ o \
+ \_____/--<
+@author: Diego Torres Milano
+@author: Jennifer E. Swofford (ascii art snake)
+'''
+
+
+import re
+import sys
+import os
+
+
+from com.dtmilano.android.viewclient import ViewClient
+
+if len(sys.argv) < 2:
+ sys.exit("usage: %s /path/to/filename.png [serialno]" % sys.argv[0])
+
+filename = sys.argv.pop(1)
+kwargs1 = {'verbose': False, 'ignoresecuredevice': False}
+device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
+kwargs2 = {'startviewserver': True, 'forceviewserveruse': False, 'autodump': False, 'ignoreuiautomatorkilled': True}
+vc = ViewClient(device, serialno, **kwargs2)
+vc.dump(window='-1')
+
+vc.findViewWithContentDescriptionOrRaise('''Home screen 3''').writeImageToFile(filename, 'PNG')
diff --git a/AndroidViewClient/project.properties b/AndroidViewClient/project.properties
new file mode 100755
index 0000000..05ec66d
--- /dev/null
+++ b/AndroidViewClient/project.properties
@@ -0,0 +1,6 @@
+# Culebra
+avc.jarname=androidviewclient
+avc.doc.jarname=${avc.jarname}-doc
+gdrive=${user.home}/Google Drive//Android/AndroidViewClient/
+gdrive.bin.dest.dir=${gdrive}/bin/
+gdrive.doc.dest.dir=${gdrive}/doc/
diff --git a/AndroidViewClient/publish b/AndroidViewClient/publish
new file mode 100755
index 0000000..a494d9d
--- /dev/null
+++ b/AndroidViewClient/publish
@@ -0,0 +1,7 @@
+#! /bin/bash
+
+eval $(grep version setup.py | sed 's/,$//')
+tag="v$version"
+git tag "$tag"
+git push --tags
+python setup.py bdist_egg register upload
diff --git a/AndroidViewClient/setup.py b/AndroidViewClient/setup.py
new file mode 100755
index 0000000..50f0c7d
--- /dev/null
+++ b/AndroidViewClient/setup.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+
+from setuptools import setup, find_packages
+
+setup(name='androidviewclient',
+ version='11.5.9',
+ description='''AndroidViewClient is a 100% pure python library and tools
+ that simplifies test script creation providing higher level
+ operations and the ability of obtaining the tree of Views present at
+ any given moment on the device or emulator screen.
+ ''',
+ license='Apache',
+ keywords='android uiautomator viewclient monkeyrunner test automation',
+ author='Diego Torres Milano',
+ author_email='dtmilano@gmail.com',
+ url='https://github.com/dtmilano/AndroidViewClient/',
+ packages=find_packages('src'),
+ package_dir={'':'src'},
+ package_data={'':['*.png']},
+ include_package_data=True,
+ scripts=['tools/culebra', 'tools/dump'],
+ classifiers=['Development Status :: 5 - Production/Stable',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Apache Software License'],
+ install_requires=['setuptools', 'requests'],
+ )
diff --git a/AndroidViewClient/src/com/__init__.py b/AndroidViewClient/src/com/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/com/__init__.py
diff --git a/AndroidViewClient/src/com/dtmilano/__init__.py b/AndroidViewClient/src/com/dtmilano/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/__init__.py
diff --git a/AndroidViewClient/src/com/dtmilano/android/__init__.py b/AndroidViewClient/src/com/dtmilano/android/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/__init__.py
diff --git a/AndroidViewClient/src/com/dtmilano/android/adb/__init__.py b/AndroidViewClient/src/com/dtmilano/android/adb/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/adb/__init__.py
diff --git a/AndroidViewClient/src/com/dtmilano/android/adb/adbclient.py b/AndroidViewClient/src/com/dtmilano/android/adb/adbclient.py
new file mode 100755
index 0000000..2d5f2ed
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/adb/adbclient.py
@@ -0,0 +1,1171 @@
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Dec 1, 2012
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+import threading
+
+__version__ = '11.5.9'
+
+import sys
+import warnings
+
+if sys.executable:
+ if 'monkeyrunner' in sys.executable:
+ warnings.warn(
+ '''
+
+ You should use a 'python' interpreter, not 'monkeyrunner' for this module
+
+ ''', RuntimeWarning)
+import string
+import datetime
+import struct
+import cStringIO as StringIO
+import socket
+import time
+import re
+import signal
+import os
+import types
+import platform
+
+from com.dtmilano.android.window import Window
+from com.dtmilano.android.common import _nd, _nh, _ns, obtainPxPy, obtainVxVy, \
+ obtainVwVh, profileStart, profileEnd
+from com.dtmilano.android.adb.androidkeymap import KEY_MAP
+
+DEBUG = False
+DEBUG_SHELL = DEBUG and False
+DEBUG_TOUCH = DEBUG and False
+DEBUG_LOG = DEBUG and False
+DEBUG_WINDOWS = DEBUG and False
+DEBUG_COORDS = DEBUG and False
+DEBUG_IMAGE_ROTATION = DEBUG and False
+
+PIL_AVAILABLE = False
+PROFILE = False
+
+try:
+ HOSTNAME = os.environ['ANDROID_ADB_SERVER_HOST']
+except:
+ HOSTNAME = 'localhost'
+
+try:
+ PORT = int(os.environ['ANDROID_ADB_SERVER_PORT'])
+except KeyError:
+ PORT = 5037
+
+OKAY = 'OKAY'
+FAIL = 'FAIL'
+
+UP = 0
+DOWN = 1
+DOWN_AND_UP = 2
+
+TIMEOUT = 15
+
+WIFI_SERVICE = 'wifi'
+
+# some device properties
+VERSION_SDK_PROPERTY = 'ro.build.version.sdk'
+VERSION_RELEASE_PROPERTY = 'ro.build.version.release'
+
+
+class Device:
+ @staticmethod
+ def factory(_str):
+ if DEBUG:
+ print >> sys.stderr, "Device.factory(", _str, ")"
+ print >> sys.stderr, " _str=", repr(_str)
+ print >> sys.stderr, " _str=", _str.replace(' ', '_')
+ values = _str.split(None, 2)
+ if DEBUG:
+ print >> sys.stderr, "values=", values
+ return Device(*values)
+
+ def __init__(self, serialno, status, qualifiers=None):
+ self.serialno = serialno
+ self.status = status
+ self.qualifiers = qualifiers
+
+ def __str__(self):
+ return "<<<" + self.serialno + ", " + self.status + ", %s>>>" % self.qualifiers
+
+
+class WifiManager:
+ '''
+ Simulates Android WifiManager.
+
+ @see: http://developer.android.com/reference/android/net/wifi/WifiManager.html
+ '''
+
+ WIFI_STATE_DISABLING = 0
+ WIFI_STATE_DISABLED = 1
+ WIFI_STATE_ENABLING = 2
+ WIFI_STATE_ENABLED = 3
+ WIFI_STATE_UNKNOWN = 4
+
+ WIFI_IS_ENABLED_RE = re.compile('Wi-Fi is enabled')
+ WIFI_IS_DISABLED_RE = re.compile('Wi-Fi is disabled')
+
+ def __init__(self, device):
+ self.device = device
+
+ def getWifiState(self):
+ '''
+ Gets the Wi-Fi enabled state.
+
+ @return: One of WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, WIFI_STATE_ENABLING, WIFI_STATE_UNKNOWN
+ '''
+
+ result = self.device.shell('dumpsys wifi')
+ if result:
+ state = result.splitlines()[0]
+ if self.WIFI_IS_ENABLED_RE.match(state):
+ return self.WIFI_STATE_ENABLED
+ elif self.WIFI_IS_DISABLED_RE.match(state):
+ return self.WIFI_STATE_DISABLED
+ print >> sys.stderr, "UNKNOWN WIFI STATE:", state
+ return self.WIFI_STATE_UNKNOWN
+
+
+class AdbClient:
+ def __init__(self, serialno=None, hostname=HOSTNAME, port=PORT, settransport=True, reconnect=True,
+ ignoreversioncheck=False, timeout=TIMEOUT):
+ self.Log = AdbClient.__Log(self)
+
+ self.serialno = serialno
+ self.hostname = hostname
+ self.port = port
+ self.timeout = timeout
+
+ self.reconnect = reconnect
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+
+ self.checkVersion(ignoreversioncheck)
+
+ self.build = {}
+ ''' Build properties '''
+
+ self.__displayInfo = None
+ ''' Cached display info. Reset it to C{None} to force refetching display info '''
+
+ self.display = {}
+ ''' The map containing the device's physical display properties: width, height and density '''
+
+ self.isTransportSet = False
+ if settransport and serialno != None:
+ self.__setTransport()
+ self.build[VERSION_SDK_PROPERTY] = int(self.__getProp(VERSION_SDK_PROPERTY))
+ self.initDisplayProperties()
+
+ @staticmethod
+ def alarmHandler(signum, frame):
+ if signum == signal.SIGALRM:
+ raise IOError("Socket timeout")
+ raise RuntimeError("Signal received: %d" % signum)
+
+ @staticmethod
+ def setAlarm(timeout):
+ osName = platform.system()
+ if osName.startswith('Windows'): # alarm is not implemented in Windows
+ return
+ if DEBUG:
+ print >> sys.stderr, "setAlarm(%d)" % timeout
+ if threading.current_thread().getName() == 'MainThread':
+ signal.signal(signal.SIGALRM, AdbClient.alarmHandler)
+ signal.alarm(timeout)
+
+ def setSerialno(self, serialno):
+ if self.isTransportSet:
+ raise ValueError("Transport is already set, serialno cannot be set once this is done.")
+ self.serialno = serialno
+ self.__setTransport()
+ self.build[VERSION_SDK_PROPERTY] = int(self.__getProp(VERSION_SDK_PROPERTY))
+
+ def setReconnect(self, val):
+ self.reconnect = val
+
+ @staticmethod
+ def connect(hostname, port, timeout=TIMEOUT):
+ if DEBUG:
+ print >> sys.stderr, "AdbClient.connect(%s, %s, %s)" % (hostname, port, timeout)
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ # SO_LINGER: Idea proposed by kysersozelee (#173)
+ l_onoff = 1
+ l_linger = 0
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
+ struct.pack('ii', l_onoff, l_linger))
+ s.settimeout(timeout)
+ try:
+ s.connect((hostname, port))
+ except socket.error, ex:
+ raise RuntimeError("ERROR: Connecting to %s:%d: %s.\nIs adb running on your computer?" % (s, port, ex))
+ return s
+
+ def close(self):
+ if DEBUG:
+ print >> sys.stderr, "Closing socket...", self.socket
+ if self.socket:
+ self.socket.close()
+
+ def __del__(self):
+ try:
+ self.close()
+ except:
+ pass
+
+ def __send(self, msg, checkok=True, reconnect=False):
+ if DEBUG:
+ print >> sys.stderr, "__send(%s, checkok=%s, reconnect=%s)" % (msg, checkok, reconnect)
+ if not re.search('^host:', msg):
+ if not self.isTransportSet:
+ self.__setTransport()
+ else:
+ self.checkConnected()
+ b = bytearray(msg, 'utf-8')
+ self.socket.send('%04X%s' % (len(b), b))
+ if checkok:
+ self.__checkOk()
+ if reconnect:
+ if DEBUG:
+ print >> sys.stderr, " __send: reconnecting"
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+ self.__setTransport()
+
+ def __receive(self, nob=None):
+ if DEBUG:
+ print >> sys.stderr, "__receive()"
+ self.checkConnected()
+ if nob is None:
+ nob = int(self.socket.recv(4), 16)
+ if DEBUG:
+ print >> sys.stderr, " __receive: receiving", nob, "bytes"
+ recv = bytearray()
+ nr = 0
+ while nr < nob:
+ chunk = self.socket.recv(min((nob - nr), 4096))
+ l = len(chunk)
+ if DEBUG:
+ print >> sys.stderr, "l=", l, "nr=", nr
+ recv.extend(chunk)
+ nr += l
+ if DEBUG:
+ print >> sys.stderr, " __receive: returning len=", len(recv)
+ return str(recv)
+
+ def __checkOk(self):
+ if DEBUG:
+ print >> sys.stderr, "__checkOk()"
+ self.checkConnected()
+ self.setAlarm(TIMEOUT)
+ recv = self.socket.recv(4)
+ if DEBUG:
+ print >> sys.stderr, " __checkOk: recv=", repr(recv)
+ try:
+ if recv != OKAY:
+ error = self.socket.recv(1024)
+ if error.startswith('0049'):
+ raise RuntimeError(
+ "ERROR: This computer is unauthorized. Please check the confirmation dialog on your device.")
+ else:
+ raise RuntimeError("ERROR: %s %s" % (repr(recv), error))
+ finally:
+ self.setAlarm(0)
+ if DEBUG:
+ print >> sys.stderr, " __checkOk: returning True"
+ return True
+
+ def checkConnected(self):
+ if DEBUG:
+ print >> sys.stderr, "checkConnected()"
+ if not self.socket:
+ raise RuntimeError("ERROR: Not connected")
+ if DEBUG:
+ print >> sys.stderr, " checkConnected: returning True"
+ return True
+
+ def checkVersion(self, ignoreversioncheck=False, reconnect=True):
+ if DEBUG:
+ print >> sys.stderr, "checkVersion(reconnect=%s) ignoreversioncheck=%s" % (reconnect, ignoreversioncheck)
+ self.__send('host:version', reconnect=False)
+ # HACK: MSG_WAITALL not available on windows
+ # version = self.socket.recv(8, socket.MSG_WAITALL)
+ version = self.__readExactly(self.socket, 8)
+
+ VALID_ADB_VERSIONS = ["00040024", "00040023", "00040020", "0004001f"]
+
+ if not (version in VALID_ADB_VERSIONS) and not ignoreversioncheck:
+ raise RuntimeError(
+ "ERROR: Incorrect ADB server version %s (expecting one of %s)" % (version, VALID_ADB_VERSIONS))
+ if reconnect:
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+
+ def __setTransport(self):
+ if DEBUG:
+ print >> sys.stderr, "__setTransport()"
+ if not self.serialno:
+ raise ValueError("serialno not set, empty or None")
+ self.checkConnected()
+ serialnoRE = re.compile(self.serialno)
+ found = False
+ devices = self.getDevices()
+ if len(devices) == 0:
+ raise RuntimeError("ERROR: There are no connected devices")
+ for device in devices:
+ if serialnoRE.match(device.serialno):
+ found = True
+ break
+ if not found:
+ raise RuntimeError("ERROR: couldn't find device that matches '%s' in %s" % (self.serialno, devices))
+ self.serialno = device.serialno
+ msg = 'host:transport:%s' % self.serialno
+ if DEBUG:
+ print >> sys.stderr, " __setTransport: msg=", msg
+ self.__send(msg, reconnect=False)
+ self.isTransportSet = True
+
+ def __checkTransport(self):
+ if not self.isTransportSet:
+ raise RuntimeError("ERROR: Transport is not set")
+
+ def __readExactly(self, sock, size):
+ if DEBUG:
+ print >> sys.stderr, "__readExactly(socket=%s, size=%d)" % (socket, size)
+ _buffer = ''
+ while len(_buffer) < size:
+ data = sock.recv(size - len(_buffer))
+ if not data:
+ break
+ _buffer += data
+ return _buffer
+
+ def getDevices(self):
+ if DEBUG:
+ print >> sys.stderr, "getDevices()"
+ self.__send('host:devices-l', checkok=False)
+ try:
+ self.__checkOk()
+ except RuntimeError, ex:
+ print >> sys.stderr, "**ERROR:", ex
+ return None
+ devices = []
+ for line in self.__receive().splitlines():
+ devices.append(Device.factory(line))
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+ return devices
+
+ def shell(self, cmd=None):
+ if DEBUG_SHELL:
+ print >> sys.stderr, "shell(cmd=%s)" % cmd
+ self.__checkTransport()
+ if cmd:
+ self.__send('shell:%s' % cmd, checkok=True, reconnect=False)
+ out = ''
+ while True:
+ _str = None
+ try:
+ _str = self.socket.recv(4096)
+ except Exception, ex:
+ print >> sys.stderr, "ERROR:", ex
+ if not _str:
+ break
+ out += _str
+ if self.reconnect:
+ if DEBUG:
+ print >> sys.stderr, "Reconnecting..."
+ self.close()
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+ self.__setTransport()
+ return out
+ else:
+ self.__send('shell:')
+ # sin = self.socket.makefile("rw")
+ # sout = self.socket.makefile("r")
+ # return (sin, sin)
+ sout = adbClient.socket.makefile("r")
+ return sout
+
+ def getRestrictedScreen(self):
+ ''' Gets C{mRestrictedScreen} values from dumpsys. This is a method to obtain display dimensions '''
+
+ rsRE = re.compile('\s*mRestrictedScreen=\((?P<x>\d+),(?P<y>\d+)\) (?P<w>\d+)x(?P<h>\d+)')
+ for line in self.shell('dumpsys window').splitlines():
+ m = rsRE.match(line)
+ if m:
+ return m.groups()
+ raise RuntimeError("Couldn't find mRestrictedScreen in 'dumpsys window'")
+
+ def getDisplayInfo(self):
+ self.__checkTransport()
+ displayInfo = self.getLogicalDisplayInfo()
+ if displayInfo:
+ return displayInfo
+ displayInfo = self.getPhysicalDisplayInfo()
+ if displayInfo:
+ return displayInfo
+ raise RuntimeError("Couldn't find display info in 'wm size', 'dumpsys display' or 'dumpsys window'")
+
+ def getLogicalDisplayInfo(self):
+ '''
+ Gets C{mDefaultViewport} and then C{deviceWidth} and C{deviceHeight} values from dumpsys.
+ This is a method to obtain display logical dimensions and density
+ '''
+
+ self.__checkTransport()
+ logicalDisplayRE = re.compile(
+ '.*DisplayViewport{valid=true, .*orientation=(?P<orientation>\d+), .*deviceWidth=(?P<width>\d+), deviceHeight=(?P<height>\d+).*')
+ for line in self.shell('dumpsys display').splitlines():
+ m = logicalDisplayRE.search(line, 0)
+ if m:
+ self.__displayInfo = {}
+ for prop in ['width', 'height', 'orientation']:
+ self.__displayInfo[prop] = int(m.group(prop))
+ for prop in ['density']:
+ d = self.__getDisplayDensity(None, strip=True, invokeGetPhysicalDisplayIfNotFound=True)
+ if d:
+ self.__displayInfo[prop] = d
+ else:
+ # No available density information
+ self.__displayInfo[prop] = -1.0
+ return self.__displayInfo
+ return None
+
+ def getPhysicalDisplayInfo(self):
+ ''' Gets C{mPhysicalDisplayInfo} values from dumpsys. This is a method to obtain display dimensions and density'''
+
+ self.__checkTransport()
+ phyDispRE = re.compile('Physical size: (?P<width>)x(?P<height>).*Physical density: (?P<density>)', re.MULTILINE)
+ m = phyDispRE.search(self.shell('wm size; wm density'))
+ if m:
+ displayInfo = {}
+ for prop in ['width', 'height']:
+ displayInfo[prop] = int(m.group(prop))
+ for prop in ['density']:
+ displayInfo[prop] = float(m.group(prop))
+ return displayInfo
+
+ phyDispRE = re.compile(
+ '.*PhysicalDisplayInfo{(?P<width>\d+) x (?P<height>\d+), .*, density (?P<density>[\d.]+).*')
+ for line in self.shell('dumpsys display').splitlines():
+ m = phyDispRE.search(line, 0)
+ if m:
+ displayInfo = {}
+ for prop in ['width', 'height']:
+ displayInfo[prop] = int(m.group(prop))
+ for prop in ['density']:
+ # In mPhysicalDisplayInfo density is already a factor, no need to calculate
+ displayInfo[prop] = float(m.group(prop))
+ return displayInfo
+
+ # This could also be mSystem or mOverscanScreen
+ phyDispRE = re.compile('\s*mUnrestrictedScreen=\((?P<x>\d+),(?P<y>\d+)\) (?P<width>\d+)x(?P<height>\d+)')
+ # This is known to work on older versions (i.e. API 10) where mrestrictedScreen is not available
+ dispWHRE = re.compile('\s*DisplayWidth=(?P<width>\d+) *DisplayHeight=(?P<height>\d+)')
+ for line in self.shell('dumpsys window').splitlines():
+ m = phyDispRE.search(line, 0)
+ if not m:
+ m = dispWHRE.search(line, 0)
+ if m:
+ displayInfo = {}
+ for prop in ['width', 'height']:
+ displayInfo[prop] = int(m.group(prop))
+ for prop in ['density']:
+ d = self.__getDisplayDensity(None, strip=True, invokeGetPhysicalDisplayIfNotFound=False)
+ if d:
+ displayInfo[prop] = d
+ else:
+ # No available density information
+ displayInfo[prop] = -1.0
+ return displayInfo
+
+ def __getProp(self, key, strip=True):
+ if DEBUG:
+ print >> sys.stderr, "__getProp(%s, %s)" % (key, strip)
+ prop = self.shell('getprop %s' % key)
+ if strip:
+ prop = prop.rstrip('\r\n')
+ if DEBUG:
+ print >> sys.stderr, " __getProp: returning '%s'" % prop
+ return prop
+
+ def __getDisplayWidth(self, key, strip=True):
+ if self.__displayInfo and 'width' in self.__displayInfo:
+ return self.__displayInfo['width']
+ return self.getDisplayInfo()['width']
+
+ def __getDisplayHeight(self, key, strip=True):
+ if self.__displayInfo and 'height' in self.__displayInfo:
+ return self.__displayInfo['height']
+ return self.getDisplayInfo()['height']
+
+ def __getDisplayOrientation(self, key, strip=True):
+ if self.__displayInfo and 'orientation' in self.__displayInfo:
+ return self.__displayInfo['orientation']
+ displayInfo = self.getDisplayInfo()
+ if 'orientation' in displayInfo:
+ return displayInfo['orientation']
+ # Fallback method to obtain the orientation
+ # See https://github.com/dtmilano/AndroidViewClient/issues/128
+ surfaceOrientationRE = re.compile('SurfaceOrientation:\s+(\d+)')
+ output = self.shell('dumpsys input')
+ m = surfaceOrientationRE.search(output)
+ if m:
+ return int(m.group(1))
+ # We couldn't obtain the orientation
+ return -1
+
+ def __getDisplayDensity(self, key, strip=True, invokeGetPhysicalDisplayIfNotFound=True):
+ if self.__displayInfo and 'density' in self.__displayInfo: # and self.__displayInfo['density'] != -1: # FIXME: need more testing
+ return self.__displayInfo['density']
+ BASE_DPI = 160.0
+ d = self.getProperty('ro.sf.lcd_density', strip)
+ if d:
+ return float(d) / BASE_DPI
+ d = self.getProperty('qemu.sf.lcd_density', strip)
+ if d:
+ return float(d) / BASE_DPI
+ if invokeGetPhysicalDisplayIfNotFound:
+ return self.getPhysicalDisplayInfo()['density']
+ return -1.0
+
+ def getSystemProperty(self, key, strip=True):
+ self.__checkTransport()
+ return self.getProperty(key, strip)
+
+ def getProperty(self, key, strip=True):
+ ''' Gets the property value for key '''
+
+ self.__checkTransport()
+ import collections
+ MAP_PROPS = collections.OrderedDict([
+ (re.compile('display.width'), self.__getDisplayWidth),
+ (re.compile('display.height'), self.__getDisplayHeight),
+ (re.compile('display.density'), self.__getDisplayDensity),
+ (re.compile('display.orientation'), self.__getDisplayOrientation),
+ (re.compile('.*'), self.__getProp),
+ ])
+ '''Maps properties key values (as regexps) to instance methods to obtain its values.'''
+
+ for kre in MAP_PROPS.keys():
+ if kre.match(key):
+ return MAP_PROPS[kre](key=key, strip=strip)
+ raise ValueError("key='%s' does not match any map entry")
+
+ def getSdkVersion(self):
+ '''
+ Gets the SDK version.
+ '''
+
+ self.__checkTransport()
+ return self.build[VERSION_SDK_PROPERTY]
+
+ def press(self, name, eventType=DOWN_AND_UP):
+ self.__checkTransport()
+ if isinstance(name, unicode):
+ name = name.decode('ascii', errors='replace')
+ cmd = 'input keyevent %s' % name
+ if DEBUG:
+ print >> sys.stderr, "press(%s)" % cmd
+ self.shell(cmd)
+
+ def longPress(self, name, duration=0.5, dev='/dev/input/event0'):
+ self.__checkTransport()
+ # WORKAROUND:
+ # Using 'input keyevent --longpress POWER' does not work correctly in
+ # KitKat (API 19), it sends a short instead of a long press.
+ # This uses the events instead, but it may vary from device to device.
+ # The events sent are device dependent and may not work on other devices.
+ # If this does not work on your device please do:
+ # $ adb shell getevent -l
+ # and post the output to https://github.com/dtmilano/AndroidViewClient/issues
+ # specifying the device and API level.
+ if name[0:4] == 'KEY_':
+ name = name[4:]
+ if name in KEY_MAP:
+ self.shell('sendevent %s 1 %d 1' % (dev, KEY_MAP[name]))
+ self.shell('sendevent %s 0 0 0' % dev)
+ time.sleep(duration)
+ self.shell('sendevent %s 1 %d 0' % (dev, KEY_MAP[name]))
+ self.shell('sendevent %s 0 0 0' % dev)
+ return
+
+ version = self.getSdkVersion()
+ if version >= 19:
+ cmd = 'input keyevent --longpress %s' % name
+ if DEBUG:
+ print >> sys.stderr, "longPress(%s)" % cmd
+ self.shell(cmd)
+ else:
+ raise RuntimeError("longpress: not supported for API < 19 (version=%d)" % version)
+
+ def startActivity(self, component=None, flags=None, uri=None):
+ self.__checkTransport()
+ cmd = 'am start'
+ if component:
+ cmd += ' -n %s' % component
+ if flags:
+ cmd += ' -f %s' % flags
+ if uri:
+ cmd += ' %s' % uri
+ if DEBUG:
+ print >> sys.stderr, "Starting activity: %s" % cmd
+ out = self.shell(cmd)
+ if re.search(r"(Error type)|(Error: )|(Cannot find 'App')", out, re.IGNORECASE | re.MULTILINE):
+ raise RuntimeError(out)
+
+ def takeSnapshot(self, reconnect=False):
+ '''
+ Takes a snapshot of the device and return it as a PIL Image.
+ '''
+
+ if PROFILE:
+ profileStart()
+
+ global PIL_AVAILABLE
+ if not PIL_AVAILABLE:
+ try:
+ global Image
+ from PIL import Image
+ PIL_AVAILABLE = True
+ except:
+ raise Exception("You have to install PIL to use takeSnapshot()")
+
+ USE_ADB_FRAMEBUFFER_METHOD = (self.getSdkVersion() < 14 or self.getSdkVersion() >= 23)
+ if USE_ADB_FRAMEBUFFER_METHOD:
+ self.__checkTransport()
+
+ self.__send('framebuffer:', checkok=True, reconnect=False)
+ # case 1: // version
+ # return 12; // bpp, size, width, height, 4*(length, offset)
+ received = self.__receive(1 * 4 + 12 * 4)
+ (version, bpp, size, width, height, roffset, rlen, boffset, blen, goffset, glen, aoffset,
+ alen) = struct.unpack(
+ '<' + 'L' * 13, received)
+ if DEBUG:
+ print >> sys.stderr, " takeSnapshot:", (
+ version, bpp, size, width, height, roffset, rlen, boffset, blen, goffset, glen, aoffset, alen)
+ offsets = {roffset: 'R', goffset: 'G', boffset: 'B'}
+ if bpp == 32:
+ if alen != 0:
+ offsets[aoffset] = 'A'
+ else:
+ warnings.warn('''framebuffer is specified as 32bpp but alpha length is 0''')
+ argMode = ''.join([offsets[o] for o in sorted(offsets)])
+ if DEBUG:
+ print >> sys.stderr, " takeSnapshot:", (
+ version, bpp, size, width, height, roffset, rlen, boffset, blen, goffset, blen, aoffset, alen,
+ argMode)
+ if argMode == 'BGRA':
+ argMode = 'RGBA'
+ if bpp == 16:
+ mode = 'RGB'
+ argMode += ';16'
+ else:
+ mode = argMode
+ self.__send('\0', checkok=False, reconnect=False)
+ if DEBUG:
+ print >> sys.stderr, " takeSnapshot: reading %d bytes" % (size)
+ received = self.__receive(size)
+ if reconnect:
+ self.socket = AdbClient.connect(self.hostname, self.port, self.timeout)
+ self.__setTransport()
+ if DEBUG:
+ print >> sys.stderr, " takeSnapshot: Image.frombuffer(%s, %s, %s, %s, %s, %s, %s)" % (
+ mode, (width, height), 'data', 'raw', argMode, 0, 1)
+ image = Image.frombuffer(mode, (width, height), received, 'raw', argMode, 0, 1)
+ else:
+ # ALTERNATIVE_METHOD: screencap
+ received = self.shell('/system/bin/screencap -p').replace("\r\n", "\n")
+ stream = StringIO.StringIO(received)
+ try:
+ image = Image.open(stream)
+ except IOError, ex:
+ print >> sys.stderr, ex
+ print repr(stream)
+ sys.exit(1)
+
+ # Just in case let's get the real image size
+ (w, h) = image.size
+ if w == self.display['height'] and h == self.display['width']:
+ # FIXME: We are not catching the 180 degrees rotation here
+ if 'orientation' in self.display:
+ r = (0, 90, 180, -90)[self.display['orientation']]
+ else:
+ r = 90
+ image = image.rotate(r, expand=1).resize((h, w))
+
+ if PROFILE:
+ profileEnd()
+ return image
+
+ def __transformPointByOrientation(self, (x, y), orientationOrig, orientationDest):
+ if orientationOrig != orientationDest:
+ if orientationDest == 1:
+ _x = x
+ x = self.display['width'] - y
+ y = _x
+ elif orientationDest == 3:
+ _x = x
+ x = y
+ y = self.display['height'] - _x
+ return (x, y)
+
+ def touch(self, x, y, orientation=-1, eventType=DOWN_AND_UP):
+ if DEBUG_TOUCH:
+ print >> sys.stderr, "touch(x=", x, ", y=", y, ", orientation=", orientation, ", eventType=", eventType, ")"
+ self.__checkTransport()
+ if orientation == -1:
+ orientation = self.display['orientation']
+ self.shell(
+ 'input tap %d %d' % self.__transformPointByOrientation((x, y), orientation, self.display['orientation']))
+
+ def touchDip(self, x, y, orientation=-1, eventType=DOWN_AND_UP):
+ if DEBUG_TOUCH:
+ print >> sys.stderr, "touchDip(x=", x, ", y=", y, ", orientation=", orientation, ", eventType=", eventType, ")"
+ self.__checkTransport()
+ if orientation == -1:
+ orientation = self.display['orientation']
+ x = x * self.display['density']
+ y = y * self.display['density']
+ self.touch(x, y, orientation, eventType)
+
+ def longTouch(self, x, y, duration=2000, orientation=-1):
+ '''
+ Long touches at (x, y)
+
+ @param duration: duration in ms
+ @param orientation: the orientation (-1: undefined)
+
+ This workaround was suggested by U{HaMi<http://stackoverflow.com/users/2571957/hami>}
+ '''
+
+ self.__checkTransport()
+ self.drag((x, y), (x, y), duration, orientation)
+
+ def drag(self, (x0, y0), (x1, y1), duration, steps=1, orientation=-1):
+ '''
+ Sends drag event n PX (actually it's using C{input swipe} command.
+
+ @param (x0, y0): starting point in PX
+ @param (x1, y1): ending point in PX
+ @param duration: duration of the event in ms
+ @param steps: number of steps (currently ignored by @{input swipe})
+ @param orientation: the orientation (-1: undefined)
+ '''
+
+ self.__checkTransport()
+ if orientation == -1:
+ orientation = self.display['orientation']
+ (x0, y0) = self.__transformPointByOrientation((x0, y0), orientation, self.display['orientation'])
+ (x1, y1) = self.__transformPointByOrientation((x1, y1), orientation, self.display['orientation'])
+
+ version = self.getSdkVersion()
+ if version <= 15:
+ raise RuntimeError('drag: API <= 15 not supported (version=%d)' % version)
+ elif version <= 17:
+ self.shell('input swipe %d %d %d %d' % (x0, y0, x1, y1))
+ else:
+ self.shell('input touchscreen swipe %d %d %d %d %d' % (x0, y0, x1, y1, duration))
+
+ def dragDip(self, (x0, y0), (x1, y1), duration, steps=1, orientation=-1):
+ '''
+ Sends drag event in DIP (actually it's using C{input swipe} command.
+
+ @param (x0, y0): starting point in DIP
+ @param (x1, y1): ending point in DIP
+ @param duration: duration of the event in ms
+ @param steps: number of steps (currently ignored by @{input swipe}
+ '''
+
+ self.__checkTransport()
+ if orientation == -1:
+ orientation = self.display['orientation']
+ density = self.display['density'] if self.display['density'] > 0 else 1
+ x0 = x0 * density
+ y0 = y0 * density
+ x1 = x1 * density
+ y1 = y1 * density
+ self.drag((x0, y0), (x1, y1), duration, steps, orientation)
+
+ def type(self, text):
+ self.__checkTransport()
+ if type(text) is str:
+ escaped = text.replace('%s', '\\%s')
+ encoded = escaped.replace(' ', '%s')
+ else:
+ encoded = str(text);
+ #FIXME find out which characters can be dangerous,
+ # for exmaple not worst idea to escape "
+ self.shell(u'input text "%s"' % encoded)
+
+ def wake(self):
+ self.__checkTransport()
+ if not self.isScreenOn():
+ self.shell('input keyevent POWER')
+
+ def isLocked(self):
+ '''
+ Checks if the device screen is locked.
+
+ @return True if the device screen is locked
+ '''
+
+ self.__checkTransport()
+ lockScreenRE = re.compile('mShowingLockscreen=(true|false)')
+ m = lockScreenRE.search(self.shell('dumpsys window policy'))
+ if m:
+ return (m.group(1) == 'true')
+ raise RuntimeError("Couldn't determine screen lock state")
+
+ def isScreenOn(self):
+ '''
+ Checks if the screen is ON.
+
+ @return True if the device screen is ON
+ '''
+
+ self.__checkTransport()
+ screenOnRE = re.compile('mScreenOnFully=(true|false)')
+ m = screenOnRE.search(self.shell('dumpsys window policy'))
+ if m:
+ return (m.group(1) == 'true')
+ raise RuntimeError("Couldn't determine screen ON state")
+
+ def unlock(self):
+ '''
+ Unlocks the screen of the device.
+ '''
+
+ self.__checkTransport()
+ self.shell('input keyevent MENU')
+ self.shell('input keyevent BACK')
+
+ @staticmethod
+ def percentSame(image1, image2):
+ '''
+ Returns the percent of pixels that are equal
+
+ @author: catshoes
+ '''
+
+ # If the images differ in size, return 0% same.
+ size_x1, size_y1 = image1.size
+ size_x2, size_y2 = image2.size
+ if (size_x1 != size_x2 or
+ size_y1 != size_y2):
+ return 0
+
+ # Images are the same size
+ # Return the percent of pixels that are equal.
+ numPixelsSame = 0
+ numPixelsTotal = size_x1 * size_y1
+ image1Pixels = image1.load()
+ image2Pixels = image2.load()
+
+ # Loop over all pixels, comparing pixel in image1 to image2
+ for x in range(size_x1):
+ for y in range(size_y1):
+ if (image1Pixels[x, y] == image2Pixels[x, y]):
+ numPixelsSame += 1
+
+ return numPixelsSame / float(numPixelsTotal)
+
+ @staticmethod
+ def sameAs(image1, image2, percent=1.0):
+ '''
+ Compares 2 images
+
+ @author: catshoes
+ '''
+
+ return (AdbClient.percentSame(image1, image2) >= percent)
+
+ @staticmethod
+ def imageInScreen(screen, image):
+ '''
+ Checks if image is on the screen
+
+ :param screen: the screen image
+ :param image: the partial image to look for
+ :return: True or False
+
+ @author: Perry Tsai <ripple0129@gmail.com>
+ '''
+
+ # To make sure image smaller than screen.
+ size_x1, size_y1 = screen.size
+ size_x2, size_y2 = image.size
+ if size_x1 <= size_x2 or size_y1 <= size_y2:
+ return 0
+
+ # Load pixels.
+ screenPixels = screen.load()
+ imagePixels = image.load()
+
+ # Loop over all pixels, if pixel image[0,0] same as pixel screen[x,y] do crop and compare
+ for x in range(size_x1 - size_x2):
+ for y in range(size_y1 - size_y2):
+ if imagePixels[0, 0] == screenPixels[x, y]:
+ croppedScreen = screen.crop((x, y, x + size_x2, y + size_y2))
+ size_x3, size_y3 = croppedScreen.size
+ croppedPixels = croppedScreen.load()
+ for x in range(size_x3):
+ for y in range(size_y3):
+ if imagePixels[x, y] == croppedPixels[x, y]:
+ return True
+
+
+ def isKeyboardShown(self):
+ '''
+ Whether the keyboard is displayed.
+ '''
+
+ self.__checkTransport()
+ dim = self.shell('dumpsys input_method')
+ if dim:
+ # FIXME: API >= 15 ?
+ return "mInputShown=true" in dim
+ return False
+
+ def initDisplayProperties(self):
+ self.__checkTransport()
+ self.__displayInfo = None
+ self.display['width'] = self.getProperty('display.width')
+ self.display['height'] = self.getProperty('display.height')
+ self.display['density'] = self.getProperty('display.density')
+ self.display['orientation'] = self.getProperty('display.orientation')
+
+ def log(self, tag, message, priority='D', verbose=False):
+ if DEBUG_LOG:
+ print >> sys.stderr, "log(tag=%s, message=%s, priority=%s, verbose=%s)" % (tag, message, priority, verbose)
+ self.__checkTransport()
+ message = self.substituteDeviceTemplate(message)
+ if verbose or priority == 'V':
+ print >> sys.stderr, tag + ':', message
+ self.shell('log -p %c -t "%s" %s' % (priority, tag, message))
+
+ class __Log():
+ '''
+ Log class to simulate C{android.util.Log}
+ '''
+
+ def __init__(self, adbClient):
+ self.adbClient = adbClient
+
+ def __getattr__(self, attr):
+ '''
+ Returns the corresponding log method or @C{AttributeError}.
+ '''
+
+ if attr in ['v', 'd', 'i', 'w', 'e']:
+ return lambda tag, message, verbose: self.adbClient.log(tag, message, priority=attr.upper(),
+ verbose=verbose)
+ raise AttributeError(self.__class__.__name__ + ' has no attribute "%s"' % attr)
+
+ def getSystemService(self, name):
+ if name == WIFI_SERVICE:
+ return WifiManager(self)
+
+ def getWindows(self):
+ self.__checkTransport()
+ windows = {}
+ dww = self.shell('dumpsys window windows')
+ if DEBUG_WINDOWS: print >> sys.stderr, dww
+ lines = dww.splitlines()
+ widRE = re.compile('^ *Window #%s Window{%s (u\d+ )?%s?.*}:' %
+ (_nd('num'), _nh('winId'), _ns('activity', greedy=True)))
+ currentFocusRE = re.compile('^ mCurrentFocus=Window{%s .*' % _nh('winId'))
+ viewVisibilityRE = re.compile(' mViewVisibility=0x%s ' % _nh('visibility'))
+ # This is for 4.0.4 API-15
+ containingFrameRE = re.compile('^ *mContainingFrame=\[%s,%s\]\[%s,%s\] mParentFrame=\[%s,%s\]\[%s,%s\]' %
+ (_nd('cx'), _nd('cy'), _nd('cw'), _nd('ch'), _nd('px'), _nd('py'), _nd('pw'),
+ _nd('ph')))
+ contentFrameRE = re.compile('^ *mContentFrame=\[%s,%s\]\[%s,%s\] mVisibleFrame=\[%s,%s\]\[%s,%s\]' %
+ (_nd('x'), _nd('y'), _nd('w'), _nd('h'), _nd('vx'), _nd('vy'), _nd('vx1'),
+ _nd('vy1')))
+ # This is for 4.1 API-16
+ framesRE = re.compile('^ *Frames: containing=\[%s,%s\]\[%s,%s\] parent=\[%s,%s\]\[%s,%s\]' %
+ (_nd('cx'), _nd('cy'), _nd('cw'), _nd('ch'), _nd('px'), _nd('py'), _nd('pw'), _nd('ph')))
+ contentRE = re.compile('^ *content=\[%s,%s\]\[%s,%s\] visible=\[%s,%s\]\[%s,%s\]' %
+ (_nd('x'), _nd('y'), _nd('w'), _nd('h'), _nd('vx'), _nd('vy'), _nd('vx1'), _nd('vy1')))
+ policyVisibilityRE = re.compile('mPolicyVisibility=%s ' % _ns('policyVisibility', greedy=True))
+
+ currentFocus = None
+
+ for l in range(len(lines)):
+ m = widRE.search(lines[l])
+ if m:
+ num = int(m.group('num'))
+ winId = m.group('winId')
+ activity = m.group('activity')
+ wvx = 0
+ wvy = 0
+ wvw = 0
+ wvh = 0
+ px = 0
+ py = 0
+ visibility = -1
+ policyVisibility = 0x0
+
+ for l2 in range(l + 1, len(lines)):
+ m = widRE.search(lines[l2])
+ if m:
+ l += (l2 - 1)
+ break
+ m = viewVisibilityRE.search(lines[l2])
+ if m:
+ visibility = int(m.group('visibility'))
+ if DEBUG_COORDS: print >> sys.stderr, "getWindows: visibility=", visibility
+ if self.build[VERSION_SDK_PROPERTY] >= 17:
+ wvx, wvy = (0, 0)
+ wvw, wvh = (0, 0)
+ if self.build[VERSION_SDK_PROPERTY] >= 16:
+ m = framesRE.search(lines[l2])
+ if m:
+ px, py = obtainPxPy(m)
+ m = contentRE.search(lines[l2 + 1])
+ if m:
+ # FIXME: the information provided by 'dumpsys window windows' in 4.2.1 (API 16)
+ # when there's a system dialog may not be correct and causes the View coordinates
+ # be offset by this amount, see
+ # https://github.com/dtmilano/AndroidViewClient/issues/29
+ wvx, wvy = obtainVxVy(m)
+ wvw, wvh = obtainVwVh(m)
+ elif self.build[VERSION_SDK_PROPERTY] == 15:
+ m = containingFrameRE.search(lines[l2])
+ if m:
+ px, py = obtainPxPy(m)
+ m = contentFrameRE.search(lines[l2 + 1])
+ if m:
+ wvx, wvy = obtainVxVy(m)
+ wvw, wvh = obtainVwVh(m)
+ elif self.build[VERSION_SDK_PROPERTY] == 10:
+ m = containingFrameRE.search(lines[l2])
+ if m:
+ px, py = obtainPxPy(m)
+ m = contentFrameRE.search(lines[l2 + 1])
+ if m:
+ wvx, wvy = obtainVxVy(m)
+ wvw, wvh = obtainVwVh(m)
+ else:
+ warnings.warn("Unsupported Android version %d" % self.build[VERSION_SDK_PROPERTY])
+
+ # print >> sys.stderr, "Searching policyVisibility in", lines[l2]
+ m = policyVisibilityRE.search(lines[l2])
+ if m:
+ policyVisibility = 0x0 if m.group('policyVisibility') == 'true' else 0x8
+
+ windows[winId] = Window(num, winId, activity, wvx, wvy, wvw, wvh, px, py, visibility + policyVisibility)
+ else:
+ m = currentFocusRE.search(lines[l])
+ if m:
+ currentFocus = m.group('winId')
+
+ if currentFocus in windows and windows[currentFocus].visibility == 0:
+ if DEBUG_COORDS:
+ print >> sys.stderr, "getWindows: focus=", currentFocus
+ print >> sys.stderr, "getWindows:", windows[currentFocus]
+ windows[currentFocus].focused = True
+
+ return windows
+
+ def getFocusedWindow(self):
+ '''
+ Gets the focused window.
+
+ @return: The focused L{Window}.
+ '''
+
+ for window in self.getWindows().values():
+ if window.focused:
+ return window
+ return None
+
+ def getFocusedWindowName(self):
+ '''
+ Gets the focused window name.
+
+ This is much like monkeyRunner's C{HierarchyView.getWindowName()}
+
+ @return: The focused window name
+ '''
+
+ window = self.getFocusedWindow()
+ if window:
+ return window.activity
+ return None
+
+ def getTopActivityNameAndPid(self):
+ dat = self.shell('dumpsys activity top')
+ lines = dat.splitlines()
+ activityRE = re.compile('\s*ACTIVITY ([A-Za-z0-9_.]+)/([A-Za-z0-9_.]+) \w+ pid=(\d+)')
+ m = activityRE.search(lines[1])
+ if m:
+ return (m.group(1), m.group(2), m.group(3))
+ else:
+ warnings.warn("NO MATCH:" + lines[1])
+ return None
+
+ def getTopActivityName(self):
+ tanp = self.getTopActivityNameAndPid()
+ if tanp:
+ return tanp[0] + '/' + tanp[1]
+ else:
+ return None
+
+ def substituteDeviceTemplate(self, template):
+ serialno = self.serialno.replace('.', '_').replace(':', '-')
+ focusedWindowName = self.getFocusedWindowName().replace('/', '-').replace('.', '_')
+ timestamp = datetime.datetime.now().isoformat()
+ osName = platform.system()
+ if osName.startswith('Windows'): # ':' not supported in filenames
+ timestamp.replace(':', '_')
+ _map = {
+ 'serialno': serialno,
+ 'focusedwindowname': focusedWindowName,
+ 'timestamp': timestamp
+ }
+ return string.Template(template).substitute(_map)
+
+
+if __name__ == '__main__':
+ adbClient = AdbClient(os.environ['ANDROID_SERIAL'])
+ INTERACTIVE = False
+ if INTERACTIVE:
+ sout = adbClient.shell()
+ prompt = re.compile(".+@android:(.*) [$#] \r\r\n")
+ while True:
+ try:
+ cmd = raw_input('adb $ ')
+ except EOFError:
+ break
+ if cmd == 'exit':
+ break
+ adbClient.socket.__send(cmd + "\r\n")
+ sout.readline(4096) # eat first line, which is the command
+ while True:
+ line = sout.readline(4096)
+ if prompt.match(line):
+ break
+ print line,
+ if not line:
+ break
+
+ print "\nBye"
+ else:
+ print 'date:', adbClient.shell('date')
diff --git a/AndroidViewClient/src/com/dtmilano/android/adb/androidkeymap.py b/AndroidViewClient/src/com/dtmilano/android/adb/androidkeymap.py
new file mode 100755
index 0000000..bdededc
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/adb/androidkeymap.py
@@ -0,0 +1,241 @@
+'''
+Created on Jun 13, 2014
+
+@author: diego
+'''
+
+KEY_MAP = dict()
+KEY_MAP["ESCAPE"]=1
+KEY_MAP["1"]=2
+KEY_MAP["2"]=3
+KEY_MAP["3"]=4
+KEY_MAP["4"]=5
+KEY_MAP["5"]=6
+KEY_MAP["6"]=7
+KEY_MAP["7"]=8
+KEY_MAP["8"]=9
+KEY_MAP["9"]=10
+KEY_MAP["0"]=11
+KEY_MAP["MINUS"]=12
+KEY_MAP["EQUALS"]=13
+KEY_MAP["DEL"]=14
+KEY_MAP["TAB"]=15
+KEY_MAP["Q"]=16
+KEY_MAP["W"]=17
+KEY_MAP["E"]=18
+KEY_MAP["R"]=19
+KEY_MAP["T"]=20
+KEY_MAP["Y"]=21
+KEY_MAP["U"]=22
+KEY_MAP["I"]=23
+KEY_MAP["O"]=24
+KEY_MAP["P"]=25
+KEY_MAP["LEFT_BRACKET"]=26
+KEY_MAP["RIGHT_BRACKET"]=27
+KEY_MAP["ENTER"]=28
+KEY_MAP["CTRL_LEFT"]=29
+KEY_MAP["A"]=30
+KEY_MAP["S"]=31
+KEY_MAP["D"]=32
+KEY_MAP["F"]=33
+KEY_MAP["G"]=34
+KEY_MAP["H"]=35
+KEY_MAP["J"]=36
+KEY_MAP["K"]=37
+KEY_MAP["L"]=38
+KEY_MAP["SEMICOLON"]=39
+KEY_MAP["APOSTROPHE"]=40
+KEY_MAP["GRAVE"]=41
+KEY_MAP["SHIFT_LEFT"]=42
+KEY_MAP["BACKSLASH"]=43
+KEY_MAP["Z"]=44
+KEY_MAP["X"]=45
+KEY_MAP["C"]=46
+KEY_MAP["V"]=47
+KEY_MAP["B"]=48
+KEY_MAP["N"]=49
+KEY_MAP["M"]=50
+KEY_MAP["COMMA"]=51
+KEY_MAP["PERIOD"]=52
+KEY_MAP["SLASH"]=53
+KEY_MAP["SHIFT_RIGHT"]=54
+KEY_MAP["NUMPAD_MULTIPLY"]=55
+KEY_MAP["ALT_LEFT"]=56
+KEY_MAP["SPACE"]=57
+KEY_MAP["CAPS_LOCK"]=58
+KEY_MAP["F1"]=59
+KEY_MAP["F2"]=60
+KEY_MAP["F3"]=61
+KEY_MAP["F4"]=62
+KEY_MAP["F5"]=63
+KEY_MAP["F6"]=64
+KEY_MAP["F7"]=65
+KEY_MAP["F8"]=66
+KEY_MAP["F9"]=67
+KEY_MAP["F10"]=68
+KEY_MAP["NUM_LOCK"]=69
+KEY_MAP["SCROLL_LOCK"]=70
+KEY_MAP["NUMPAD_7"]=71
+KEY_MAP["NUMPAD_8"]=72
+KEY_MAP["NUMPAD_9"]=73
+KEY_MAP["NUMPAD_SUBTRACT"]=74
+KEY_MAP["NUMPAD_4"]=75
+KEY_MAP["NUMPAD_5"]=76
+KEY_MAP["NUMPAD_6"]=77
+KEY_MAP["NUMPAD_ADD"]=78
+KEY_MAP["NUMPAD_1"]=79
+KEY_MAP["NUMPAD_2"]=80
+KEY_MAP["NUMPAD_3"]=81
+KEY_MAP["NUMPAD_0"]=82
+KEY_MAP["NUMPAD_DOT"]=83
+KEY_MAP["ZENKAKU_HANKAKU"]=85
+KEY_MAP["BACKSLASH"]=86
+KEY_MAP["F11"]=87
+KEY_MAP["F12"]=88
+KEY_MAP["RO"]=89
+KEY_MAP["HENKAN"]=92
+KEY_MAP["KATAKANA_HIRAGANA"]=93
+KEY_MAP["MUHENKAN"]=94
+KEY_MAP["NUMPAD_COMMA"]=95
+KEY_MAP["NUMPAD_ENTER"]=96
+KEY_MAP["CTRL_RIGHT"]=97
+KEY_MAP["NUMPAD_DIVIDE"]=98
+KEY_MAP["SYSRQ"]=99
+KEY_MAP["ALT_RIGHT"]=100
+KEY_MAP["MOVE_HOME"]=102
+KEY_MAP["DPAD_UP"]=103
+KEY_MAP["PAGE_UP"]=104
+KEY_MAP["DPAD_LEFT"]=105
+KEY_MAP["DPAD_RIGHT"]=106
+KEY_MAP["MOVE_END"]=107
+KEY_MAP["DPAD_DOWN"]=108
+KEY_MAP["PAGE_DOWN"]=109
+KEY_MAP["INSERT"]=110
+KEY_MAP["FORWARD_DEL"]=111
+KEY_MAP["VOLUME_MUTE"]=113
+KEY_MAP["VOLUME_DOWN"]=114
+KEY_MAP["VOLUME_UP"]=115
+KEY_MAP["POWER"]=116
+KEY_MAP["NUMPAD_EQUALS"]=117
+KEY_MAP["BREAK"]=119
+KEY_MAP["NUMPAD_COMMA"]=121
+KEY_MAP["KANA"]=122
+KEY_MAP["EISU"]=123
+KEY_MAP["YEN"]=124
+KEY_MAP["META_LEFT"]=125
+KEY_MAP["META_RIGHT"]=126
+KEY_MAP["MENU"]=127
+KEY_MAP["MEDIA_STOP"]=128
+KEY_MAP["MENU"]=139
+KEY_MAP["CALCULATOR"]=140
+#KEY_MAP["POWER"]=142
+#KEY_MAP["POWER"]=143
+KEY_MAP["EXPLORER"]=150
+#KEY_MAP["POWER"]=152
+KEY_MAP["ENVELOPE"]=155
+KEY_MAP["BOOKMARK"]=156
+KEY_MAP["BACK"]=158
+KEY_MAP["FORWARD"]=159
+KEY_MAP["MEDIA_CLOSE"]=160
+KEY_MAP["MEDIA_EJECT"]=161
+KEY_MAP["MEDIA_EJECT"]=162
+KEY_MAP["MEDIA_NEXT"]=163
+KEY_MAP["MEDIA_PLAY_PAUSE"]=164
+KEY_MAP["MEDIA_PREVIOUS"]=165
+KEY_MAP["MEDIA_STOP"]=166
+KEY_MAP["MEDIA_RECORD"]=167
+KEY_MAP["MEDIA_REWIND"]=168
+KEY_MAP["CALL"]=169
+KEY_MAP["MUSIC"]=171
+KEY_MAP["HOME"]=172
+KEY_MAP["PAGE_UP"]=177
+KEY_MAP["PAGE_DOWN"]=178
+KEY_MAP["NUMPAD_LEFT_PAREN"]=179
+KEY_MAP["NUMPAD_RIGHT_PAREN"]=180
+KEY_MAP["MEDIA_PLAY"]=200
+KEY_MAP["MEDIA_PAUSE"]=201
+KEY_MAP["MEDIA_PLAY"]=207
+KEY_MAP["MEDIA_FAST_FORWARD"]=208
+KEY_MAP["CAMERA"]=212
+KEY_MAP["MUSIC"]=213
+KEY_MAP["ENVELOPE"]=215
+KEY_MAP["SEARCH"]=217
+KEY_MAP["BRIGHTNESS_DOWN"]=224
+KEY_MAP["BRIGHTNESS_UP"]=225
+KEY_MAP["HEADSETHOOK"]=226
+KEY_MAP["BUTTON_1"]=256
+KEY_MAP["BUTTON_2"]=257
+KEY_MAP["BUTTON_3"]=258
+KEY_MAP["BUTTON_4"]=259
+KEY_MAP["BUTTON_5"]=260
+KEY_MAP["BUTTON_6"]=261
+KEY_MAP["BUTTON_7"]=262
+KEY_MAP["BUTTON_8"]=263
+KEY_MAP["BUTTON_9"]=264
+KEY_MAP["BUTTON_10"]=265
+KEY_MAP["BUTTON_11"]=266
+KEY_MAP["BUTTON_12"]=267
+KEY_MAP["BUTTON_13"]=268
+KEY_MAP["BUTTON_14"]=269
+KEY_MAP["BUTTON_15"]=270
+KEY_MAP["BUTTON_16"]=271
+KEY_MAP["BUTTON_1"]=288
+KEY_MAP["BUTTON_2"]=289
+KEY_MAP["BUTTON_3"]=290
+KEY_MAP["BUTTON_4"]=291
+KEY_MAP["BUTTON_5"]=292
+KEY_MAP["BUTTON_6"]=293
+KEY_MAP["BUTTON_7"]=294
+KEY_MAP["BUTTON_8"]=295
+KEY_MAP["BUTTON_9"]=296
+KEY_MAP["BUTTON_10"]=297
+KEY_MAP["BUTTON_11"]=298
+KEY_MAP["BUTTON_12"]=299
+KEY_MAP["BUTTON_13"]=300
+KEY_MAP["BUTTON_14"]=301
+KEY_MAP["BUTTON_15"]=302
+KEY_MAP["BUTTON_16"]=303
+KEY_MAP["BUTTON_A"]=304
+KEY_MAP["BUTTON_B"]=305
+KEY_MAP["BUTTON_C"]=306
+KEY_MAP["BUTTON_X"]=307
+KEY_MAP["BUTTON_Y"]=308
+KEY_MAP["BUTTON_Z"]=309
+KEY_MAP["BUTTON_L1"]=310
+KEY_MAP["BUTTON_R1"]=311
+KEY_MAP["BUTTON_L2"]=312
+KEY_MAP["BUTTON_R2"]=313
+KEY_MAP["BUTTON_SELECT"]=314
+KEY_MAP["BUTTON_START"]=315
+KEY_MAP["BUTTON_MODE"]=316
+KEY_MAP["BUTTON_THUMBL"]=317
+KEY_MAP["BUTTON_THUMBR"]=318
+KEY_MAP["DPAD_CENTER"]=353
+KEY_MAP["GUIDE"]=362
+KEY_MAP["DVR"]=366
+KEY_MAP["TV"]=377
+KEY_MAP["CALENDAR"]=397
+KEY_MAP["CHANNEL_UP"]=402
+KEY_MAP["CHANNEL_DOWN"]=403
+KEY_MAP["CONTACTS"]=429
+KEY_MAP["FUNCTION"]=464
+KEY_MAP["ESCAPE"]=465
+KEY_MAP["F1"]=466
+KEY_MAP["F2"]=467
+KEY_MAP["F3"]=468
+KEY_MAP["F4"]=469
+KEY_MAP["F5"]=470
+KEY_MAP["F6"]=471
+KEY_MAP["F7"]=472
+KEY_MAP["F8"]=473
+KEY_MAP["F9"]=474
+KEY_MAP["F10"]=475
+KEY_MAP["F11"]=476
+KEY_MAP["F12"]=477
+KEY_MAP["1"]=478
+KEY_MAP["2"]=479
+KEY_MAP["D"]=480
+KEY_MAP["E"]=481
+KEY_MAP["F"]=482
+KEY_MAP["S"]=483
+KEY_MAP["B"]=484
\ No newline at end of file
diff --git a/AndroidViewClient/src/com/dtmilano/android/common.py b/AndroidViewClient/src/com/dtmilano/android/common.py
new file mode 100755
index 0000000..25a9b41
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/common.py
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Jan 5, 2015
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+import platform
+import os
+
+
+def _nd(name):
+ '''
+ @return: Returns a named decimal regex
+ '''
+ return '(?P<%s>\d+)' % name
+
+
+def _nh(name):
+ '''
+ @return: Returns a named hex regex
+ '''
+ return '(?P<%s>[0-9a-f]+)' % name
+
+
+def _ns(name, greedy=False):
+ '''
+ NOTICE: this is using a non-greedy (or minimal) regex
+
+ @type name: str
+ @param name: the name used to tag the expression
+ @type greedy: bool
+ @param greedy: Whether the regex is greedy or not
+
+ @return: Returns a named string regex (only non-whitespace characters allowed)
+ '''
+ return '(?P<%s>\S+%s)' % (name, '' if greedy else '?')
+
+
+def obtainPxPy(m):
+ px = int(m.group('px'))
+ py = int(m.group('py'))
+ return (px, py)
+
+
+def obtainVxVy(m):
+ wvx = int(m.group('vx'))
+ wvy = int(m.group('vy'))
+ return wvx, wvy
+
+
+def obtainVwVh(m):
+ (wvx, wvy) = obtainVxVy(m)
+ wvx1 = int(m.group('vx1'))
+ wvy1 = int(m.group('vy1'))
+ return (wvx1 - wvx, wvy1 - wvy)
+
+
+def obtainAdbPath():
+ '''
+ Obtains the ADB path attempting know locations for different OSs
+ '''
+
+ FORCE_FAIL = False
+ ''' Sometimes, you want it to fail to check the error messages '''
+ osName = platform.system()
+ isWindows = False
+ adb = 'adb'
+
+ if (osName.startswith('Windows')) or (osName.startswith('Java')):
+ envOSName = os.getenv('os') # this should work as it has been set since xp.
+ if envOSName.startswith('Windows'):
+ adb = 'adb.exe'
+ isWindows = True
+
+ ANDROID_HOME = os.environ['ANDROID_HOME'] if os.environ.has_key('ANDROID_HOME') else '/opt/android-sdk'
+ HOME = os.environ['HOME'] if os.environ.has_key('HOME') else ''
+
+ possibleChoices = [os.path.join(ANDROID_HOME, 'platform-tools', adb),
+ os.path.join(HOME, "android", 'platform-tools', adb),
+ os.path.join(HOME, "android-sdk", 'platform-tools', adb),
+ ]
+
+ if osName.startswith('Windows'):
+ possibleChoices.append(os.path.join("""C:\Program Files\Android\android-sdk\platform-tools""", adb))
+ possibleChoices.append(os.path.join("""C:\Program Files (x86)\Android\android-sdk\platform-tools""", adb))
+ elif osName.startswith('Linux'):
+ possibleChoices.append(os.path.join("opt", "android-sdk-linux", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "opt", "android-sdk-linux", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "android-sdk-linux", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, 'Android', 'Sdk', 'platform-tools', adb))
+ elif osName.startswith('Mac'):
+ possibleChoices.append(os.path.join(HOME, "Library", "Android", "sdk", 'platform-tools', adb))
+ possibleChoices.append(os.path.join("opt", "android-sdk-mac_x86", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "opt", "android-sdk-mac", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "android-sdk-mac", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "opt", "android-sdk-mac_x86", 'platform-tools', adb))
+ possibleChoices.append(os.path.join(HOME, "android-sdk-mac_x86", 'platform-tools', adb))
+ else:
+ # Unsupported OS
+ pass
+
+ possibleChoices.append(adb)
+
+ checkedFiles = []
+
+ for exeFile in possibleChoices:
+ checkedFiles.append(exeFile)
+ if not FORCE_FAIL and os.access(exeFile, os.X_OK):
+ return exeFile
+
+ for path in os.environ["PATH"].split(os.pathsep):
+ exeFile = os.path.join(path, adb)
+ checkedFiles.append(exeFile)
+ if not FORCE_FAIL and exeFile is not None and os.access(exeFile, os.X_OK if not isWindows else os.F_OK):
+ return exeFile
+
+ if not os.environ.has_key('ANDROID_HOME'):
+ helpMsg = 'Did you forget to set ANDROID_HOME in the environment?'
+ else:
+ helpMsg = ''
+
+ raise Exception('''adb="%s" is not executable. %s
+
+These files we unsuccessfully checked to find a suitable '%s' executable:
+ %s
+ ''' % (adb, helpMsg, adb, "\n ".join(checkedFiles)))
+
+
+def profileStart():
+ import cProfile
+ global profile
+ profile = cProfile.Profile()
+ profile.enable()
+
+
+def profileEnd():
+ profile.disable()
+ import StringIO, pstats
+ import sys
+ s = StringIO.StringIO()
+ ps = pstats.Stats(profile, stream=s).sort_stats('cumulative')
+ ps.print_stats()
+ print >> sys.stderr, '.' * 60
+ print >> sys.stderr, "STATS:\n", s.getvalue()
+ print >> sys.stderr, '.' * 60
diff --git a/AndroidViewClient/src/com/dtmilano/android/concertina.py b/AndroidViewClient/src/com/dtmilano/android/concertina.py
new file mode 100755
index 0000000..53a3646
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/concertina.py
@@ -0,0 +1,248 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Jul 6, 2015
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+
+'''
+import random
+import subprocess
+import platform
+import sys
+import time
+
+__author__ = 'diego'
+__version__ = '11.5.9'
+
+DEBUG = True
+
+class Concertina:
+ osName = platform.system()
+ ''' The OS name. We sometimes need specific behavior. '''
+ isLinux = (osName == 'Linux')
+ isDarwin = (osName == 'Darwin')
+
+ PHRASES = [
+ "Chicken Wings grow on trees",
+ "Carrot sticks help the mind think",
+ "Farts cause neurological damage",
+ "Jennifer Lopez is a Man (only on Tuesday)",
+ "That... Is what she said",
+ "Make me a sandwich",
+ "King Kongs brother was a Rabbit... Hmmm",
+ "Tuesday, thats when it will all begin",
+ "Rulers, do they rule the world?",
+ "Can a pen write without writing it down.",
+ "The iPod is a gigantic hummer",
+ "A calculator can save the world. Just press \"On\"",
+ "Cell phones... Do they have cells in them?",
+ "A battery can produce random flashes and generate helium. Doubtful",
+ "A flash drive produces no flash what so ever",
+ "A card can be a type of a pickle, if its a pickle card",
+ "just a minute",
+ "wait for me",
+ "it was silent",
+ "chaos reigned",
+ "be on time",
+ "get away from me",
+ "Hold that thought",
+ "settle down",
+ "by the light of the street lamp",
+ "slippers soaked from the heavy dew",
+ "haunted by the oddly familiar musid",
+ "The 'poke' button on facebook is awesome...\nBut I think there should be a 'stab' button...",
+#
+# Was riding a horse yesterday and fell off. I almost got killed! THANK GOODNESS
+# the Walmart greeter saw what happened and came over and unplugged it.
+#
+# Ayone who says "nothing is impossible" has obviously never tried to staple jello to a tree.
+#
+# Text someone and tell them "Hey, I lost my phone, can you call it?" and see how many people call it
+#
+# Bottles of bleach: $15.00. One rope, 3 rolls of duct tape, and a shovel: $35.00. 3 boxes of trash bags: $10.00. The look on the cashier's face: Priceless!
+#
+# Don't you hate it when you're texting and laying on your back and your phone decides to be a ninja, slips through your fingers, and attacks your face!
+#
+# Robin Hood was a thief, Mario gets high off of Mushrooms, Snow White lived with 7 men, Sleeping Beauty always slept in, and our parents wonder why WE are bad!
+#
+# In my will, I'm giving $50 to anyone who wears a Grim Reaper costume to my funeral and doesn't say a word
+#
+# "You know you're too drunk to drive when you swerve to miss a tree, and then realize it was just your air freshener hanging from the rear view mirror."
+#
+# Dares you to go outside, throw a rock at your car and yell "like a good neighbor statefarm is there!"
+#
+# My doctor asked if any members of my family suffered from insanity, I replied, no, we all seem to enjoy it
+#
+# Pshhhh I did not fall... The floor looked at me funny so I used my mad ninja skills to attack
+#
+# My new word for the day is FOCUS, when someone irritates you tell them 2 FOCUS (F*** Off Cuz Ur Stupid)
+#
+# Just remember, everything happens for a reason. So when I smack you upside the head, remember... I had a reason!
+#
+# Have you ever started laughing for no reason, then started laughing even harder because you were laughing for no reason? I Love those moments.
+#
+# Today I went on thesaurus.com and searched "ninjas". The computer told me "ninjas cannot be found" Well played, ninjas, well played
+#
+# What the voices in my head tell me to do would get me arrested in all 50 states and 26 countries
+#
+# Stalking is such a strong word ~ I prefer to think of it more as 'intense research' on one individual ~ By the way, your missing sock is under your bed, with me
+#
+# I think my guardian angel is bipolar
+#
+# WARNING: I have officially been left unsupervised. I take no responsibility for what may happen in the next few hours.
+#
+# I didn't trip, I... I was... uh... just... uh... checking the gravity!
+# Yeah! Just so you know, it's all good, it still works.
+#
+# I dare someone to kidnap me as soon as my meds wear off..they'll pay me to leave!
+#
+# I wonder if its bad when I'm talking to myself and I'm not even listening
+#
+# I'm going out to look for myself, if you see me before i return, please tell myself to call me so i know where i am.
+#
+# I know what your doing,I'm watching u do this, if your wondering what your doing i would know,wanna know what your doing? you reading my status you stalker!
+#
+# This year I'm using big words to sound smart... Sorry, I meant utilizing gargantuan idioms to simulate intelligence.
+#
+# Y'know those signs you see in towns that say, "Drive careful, we love our children". DUH, you're not gonna see a sign that says, "GUN IT, WE'LL MAKE MORE!"
+#
+# No officer, I did not hit her, I simply Fist Pumped her face!
+#
+# I like throwing Skittles at people and shouting TASTE THE RAINBOW!! but it's more fun to throw tacos at people yelling ' THINK OUTSIDE THE BUN!!
+#
+# I love to stand in line at ATM machines, and when people put in their PIN, I yell GOT IT then run away
+#
+# Like a weird neighbor, stalkers are there!
+#
+# Some people were dropped as a baby
+# . YOU were clearly thrown at a wall. Then feed a bottle of wacko-o juice!
+#
+# Do you ever find yourself really bored so you go on Facebook
+# yet you find that there is nothing to do except refresh the page until something new pops up?
+#
+# OK think of a number. Add 12 to the number. Subtract 2. Divide that number by 5. Add 20. Did you get 12? Neither did I.
+# I just wanted to see if you would do it!
+#
+# im going to get a job at walmart as a greeter
+# and my words of welcome will be "Welcome to freaking walmart! Get ur sh*t and get the hell out!!"
+#
+# Brunette:When I grow up, I'LL GO TO MARS.
+# Blondie:When I grow up I'LL GO TO THE SUN.
+# Brunette:But you will burn!
+# Blondie:Don't be stupid, I'll go at night
+#
+# If somebody throws skittles at me and yells "TASTE THE RAINBOW",
+# I'm gonna throw a 2 liter bottle of Dr.Pepper and yell "TRUST ME I'M THE DOCTOR
+#
+# a few days ago I very sternly told the voices in my head to stop talking to me.
+# Now they are sending me txt mgs say that they r sorry and want to get back2gethr
+#
+# things to do at Walmart: hide behind teddy bears and make evil laughing noises when little kids come by
+#
+# Ever feel like beating someone with a baseball bat to the point of almost unconsciousness, then setting them on fire? No? Just me?
+#
+# I'm not crazy.. don't you judge me! Your just jealous cause i get texts from the flying gummy bears and you don't!
+#
+# i saw a flying cow yesterday. it was purple and i named him Phillip...i wish the dancing unicorn had seen him but she was too busy laughing at Steve the snake
+#
+# i was sitting there when i got attacked by the purple hedgehogs, neon dragons, and glow-in-the-dark leprechauns that kid-napped the unicorn and strawberry king
+#
+# I have decided to stop pretending and just be that ninja with the magical penguins and dinosaurs and unicorns that everyone KNOWS I am.
+#
+# Have you ever tried walking into Walmart and yelling red robin! and seeing how many people say YUM red robin, red robin, come on just say yum!
+#
+# Things to do at Walmart #365: bring or take a tent, set it up in a camping supplies corner, and camp out for the weekend until they kick you out!
+#
+# After watching CSI, Cold case, Law & Order, and all those other educational shows, I'm 99% sure I can make sure nobody notices you missing. Just saying...
+#
+# I like to call it doing the world a favor. Homicide is just the technical term
+#
+# i think there's something wrong with my guardian angel.
+# her wings are black and she's sitting with the devil and laughing hysterically at everything and everyone
+#
+# I got a special care pkg. in the mail. It had duct tape, a meat tenderizer,
+# a hole punch and a note saying " don't get caught"! (sigh) I love my friends!
+#
+# I find myself meeting people who give me the honor of thinking up new words... Dipshidiot! (dip-shid-iot)
+#
+# backwards this read you making am i why exactly is that, never? you to nice been ever I have when since (now read it backwards)
+#
+# What happens in an exam : Tik tok , Mind block , Pen stop , Eye pop , Full shock , Jaw drop , Time up , No Luck
+#
+# O I dare you to walk up to any officer and say:
+# I didnt do it I didnt kill her, the assassination wasnt part of the plan.' Then run fast! I bet they'll chase u
+#
+# I'm bored & in need of some adventure. I say we get drunk, get stupid, get a stick, go poke something with teeth and see if we can outrun it.
+#
+# Why do people always think my friends and I are high? WE'RE NOT ON DRUGS! We're just crazy, and loud, and random, and scooby doo (but that's a different story)
+#
+# Smile people will wonder what your up to.But grin like crazy and they will want to know what the hell you just did
+#
+# Isn't it funny how everyone thinks they are the normal one in their family?
+#
+# For Sale! One used alarm clock. damn thing rings when I am trying to sleep.
+#
+# im on my way to Walmart to take the "try me" stickers off the noise making toys and stick them on condom boxes.
+
+ ]
+
+ EMAILS = [
+ "user@example.com",
+ "user@gmail.com",
+ "user@yahoo.com",
+ "user@outlook.com",
+ "user@mail.com",
+ "user@outlook.co.uk",
+ ]
+
+ PASSWORDS = [
+ "123456",
+ "password",
+ "12345678",
+ "qwerty",
+ "abc123",
+ ]
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def getRandomText():
+ return random.choice(Concertina.PHRASES)
+
+ @staticmethod
+ def sayRandomText():
+ text = Concertina.getRandomText()
+ if Concertina.isLinux:
+ if DEBUG:
+ print >> sys.stderr, 'Saying "%s" using festival' % text
+ pipe = subprocess.Popen(['/usr/bin/festival'])
+ pipe.communicate('(SayText "%s")' % text)
+ pipe.terminate()
+ elif Concertina.isDarwin:
+ if DEBUG:
+ print >> sys.stderr, 'Saying "%s"' % text
+ #subprocess.check_call(['/usr/bin/say', 'OK Google'])
+ #time.sleep(2)
+ subprocess.check_call(['/usr/bin/say', text])
+
+ @staticmethod
+ def getRandomEmail():
+ return random.choice(Concertina.EMAILS)
+
+ @staticmethod
+ def getRandomPassword():
+ return random.choice(Concertina.PASSWORDS)
diff --git a/AndroidViewClient/src/com/dtmilano/android/controlpanel.py b/AndroidViewClient/src/com/dtmilano/android/controlpanel.py
new file mode 100755
index 0000000..2d1533e
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/controlpanel.py
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+'''
+ Copyright (C) 2012-2014 Diego Torres Milano
+ Created on oct 30, 2014
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ @author: Diego Torres Milano
+ @author: Ahmed Kasem
+ '''
+
+__version__ = '11.5.9'
+
+import sys, os
+import Tkinter, tkFileDialog, ttk
+
+from com.dtmilano.android.culebron import Operation, Unit, Color
+
+class Key:
+ GOOGLE_NOW='KEYCODE_ASSIST'
+ PERIOD='KEYCODE_PERIOD'
+ GO='KEYCODE_ENTER'
+
+class Layout:
+ BUTTON_WIDTH=13
+ BUTTONS_NUMBER=9
+
+class ControlPanel(Tkinter.Toplevel):
+
+ def __init__(self, culebron, printOperation, **kwargs):
+ self.culebron = culebron
+ self.printOperation = printOperation
+ self.parent = culebron.window
+ self.childWindow = Tkinter.Toplevel(self.parent)
+ self.notebook = ttk.Notebook(self.childWindow)
+ self.notebook.pack(fill=Tkinter.BOTH, padx=2, pady=3)
+ self.keycodeTab = ttk.Frame(self.notebook)
+ self.keyboardTab = ttk.Frame(self.notebook)
+ self.notebook.add(self.keycodeTab, text='KEYCODE')
+ self.notebook.add(self.keyboardTab, text='KEYBOARD')
+ self.childWindow.title('Control Panel')
+ self.childWindow.resizable(width=Tkinter.FALSE, height=Tkinter.FALSE)
+ self.childWindow.printOperation = printOperation
+ self.childWindow.grid()
+ self.childWindow.column = self.childWindow.row = 0
+ self.createKeycodeTab()
+ self.createKeyboardTab()
+
+ def createKeycodeTab(self):
+ ''' KEYCODE '''
+ self.keycodeList = [
+ 'KEYCODE_HOME', 'KEYCODE_DPAD_UP', 'KEYCODE_BACK', 'KEYCODE_SEARCH', 'KEYCODE_CHANNEL_UP', 'KEYCODE_TV',
+ 'KEYCODE_MUSIC', 'KEYCODE_EXPLORER', 'KEYCODE_CAMERA', 'KEYCODE_POWER', 'KEYCODE_DPAD_LEFT','KEYCODE_DPAD_DOWN',
+ 'KEYCODE_DPAD_RIGHT', 'KEYCODE_PAGE_UP', 'KEYCODE_CHANNEL_DOWN', 'KEYCODE_VOLUME_UP', 'KEYCODE_MEDIA_PLAY',
+ 'KEYCODE_CONTACTS', 'KEYCODE_ZOOM_IN', 'SNAPSHOPT', 'KEYCODE_MENU', 'KEYCODE_DPAD_CENTER', 'KEYCODE_ENTER',
+ 'KEYCODE_PAGE_DOWN', 'KEYCODE_BRIGHTNESS_DOWN', 'KEYCODE_VOLUME_DOWN', 'KEYCODE_MEDIA_PAUSE', 'KEYCODE_BOOKMARK',
+ 'KEYCODE_ZOOM_OUT', 'REFRESH', 'KEYCODE_APP_SWITCH', 'KEYCODE_GOOGLE_NOW', 'KEYCODE_CALL', 'KEYCODE_ESCAPE',
+ 'KEYCODE_BRIGHTNESS_UP', 'KEYCODE_VOLUME_MUTE', 'KEYCODE_MEDIA_STOP', 'KEYCODE_CALCULATOR', 'KEYCODE_SETTINGS', 'QUIT'
+ ]
+ for keycode in self.keycodeList:
+ self.keycode = ControlPanelButton(self.keycodeTab, self.culebron, self.printOperation, value=keycode, text=keycode[8:],
+ width=Layout.BUTTON_WIDTH, bg=Color.DARK_GRAY, fg=Color.LIGHT_GRAY,
+ highlightbackground=Color.DARK_GRAY)
+
+ if keycode == 'REFRESH':
+ self.keycode.configure(fg=Color.BLUE, bg=Color.DARK_GRAY, text=keycode, command=self.keycode.refreshScreen)
+ self.keycode.grid(column=self.childWindow.column, row=self.childWindow.row)
+ elif keycode == 'SNAPSHOPT':
+ self.keycode.configure(fg=Color.BLUE, bg=Color.DARK_GRAY, text=keycode, command=self.keycode.takeSnapshot)
+ self.keycode.grid(column=self.childWindow.column, row=self.childWindow.row)
+ elif keycode == 'QUIT':
+ self.keycode.configure(fg=Color.BLUE, bg=Color.DARK_GRAY, text=keycode, command=self.childWindow.destroy)
+ self.keycode.grid(column=self.childWindow.column, row=self.childWindow.row)
+ else:
+ self.keycode.configure(command=self.keycode.command)
+ self.keycode.grid(column=self.childWindow.column, row=self.childWindow.row)
+ self.tabLayout()
+
+ def createKeyboardTab(self):
+ ''' KEYBOARD '''
+ self.keyboardList = [
+ 'KEYCODE_1', 'KEYCODE_2', 'KEYCODE_3', 'KEYCODE_4', 'KEYCODE_5', 'KEYCODE_6', 'KEYCODE_7', 'KEYCODE_8', 'KEYCODE_9', 'KEYCODE_0',
+ 'KEYCODE_Q', 'KEYCODE_W', 'KEYCODE_E', 'KEYCODE_R', 'KEYCODE_T', 'KEYCODE_Y', 'KEYCODE_U', 'KEYCODE_I', 'KEYCODE_O', 'KEYCODE_P',
+ 'KEYCODE_A', 'KEYCODE_S', 'KEYCODE_D', 'KEYCODE_F', 'KEYCODE_G', 'KEYCODE_H', 'KEYCODE_J', 'KEYCODE_K', 'KEYCODE_L',
+ 'KEYCODE_DEL', 'KEYCODE_Z', 'KEYCODE_X', 'KEYCODE_C', 'KEYCODE_V', 'KEYCODE_B', 'KEYCODE_N', 'KEYCODE_M',
+ 'KEYCODE_.', 'KEYCODE_SPACE', 'KEYCODE_GO'
+ ]
+
+ for keyboard in self.keyboardList:
+ self.keyboard = ControlPanelButton(self.keyboardTab, self.culebron, self.printOperation, value=keyboard, text=keyboard[8:],
+ width=Layout.BUTTON_WIDTH, bg=Color.DARK_GRAY, fg=Color.LIGHT_GRAY,
+ highlightbackground=Color.DARK_GRAY)
+
+ self.keyboard.configure(command=self.keyboard.command)
+ self.keyboard.grid(column=self.childWindow.column, row=self.childWindow.row)
+ self.tabLayout()
+
+ def tabLayout(self):
+ ''' For all tabs, specify the number of buttons in a row '''
+ self.childWindow.column += 1
+ if self.childWindow.column > Layout.BUTTONS_NUMBER:
+ self.childWindow.column = 0
+ self.childWindow.row += 1
+
+
+class ControlPanelButton(Tkinter.Button):
+
+ def __init__(self, parent, culebron, printOperation, value=None, **kwargs):
+ Tkinter.Button.__init__(self, parent, kwargs)
+ self.culebron = culebron
+ self.printOperation = printOperation
+ self.value = value
+ self.device = culebron.device
+
+ def command(self):
+ key = self.value
+ if key == 'KEYCODE_GOOGLE_NOW':
+ self.device.press(Key.GOOGLE_NOW)
+ self.printOperation(None, Operation.PRESS, Key.GOOGLE_NOW)
+ elif key == 'KEYCODE_.':
+ self.device.press(Key.PERIOD)
+ self.printOperation(None, Operation.PRESS, Key.PERIOD)
+ elif key == 'KEYCODE_GO':
+ self.device.press(Key.GO)
+ self.printOperation(None, Operation.PRESS, Key.GO)
+ else:
+ self.device.press(key)
+ self.printOperation(None, Operation.PRESS, key)
+
+ def refreshScreen(self):
+ self.culebron.refresh()
+
+ def takeSnapshot(self):
+ # No need to retake snapshot as it is already shown
+ self.culebron.saveSnapshot()
diff --git a/AndroidViewClient/src/com/dtmilano/android/culebron.py b/AndroidViewClient/src/com/dtmilano/android/culebron.py
new file mode 100755
index 0000000..b7548b3
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/culebron.py
@@ -0,0 +1,2146 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on oct 6, 2014
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+
+'''
+import StringIO
+import random
+import time
+import re
+from com.dtmilano.android.common import profileStart
+from com.dtmilano.android.common import profileEnd
+from com.dtmilano.android.concertina import Concertina
+
+__version__ = '11.5.9'
+
+import sys
+import threading
+import warnings
+import copy
+import string
+import os
+import platform
+from pkg_resources import Requirement, resource_filename
+
+try:
+ import PIL
+ from PIL import Image, ImageTk
+
+ PIL_AVAILABLE = True
+except:
+ PIL_AVAILABLE = False
+
+try:
+ import Tkinter
+ import tkSimpleDialog
+ import tkFileDialog
+ import tkFont
+ import ScrolledText
+ import ttk
+ from Tkconstants import DISABLED, NORMAL
+
+ TKINTER_AVAILABLE = True
+except:
+ TKINTER_AVAILABLE = False
+
+from ast import literal_eval as make_tuple
+
+CHECK_KEYBOARD_SHOWN = False
+PROFILE = False
+
+DEBUG = False
+DEBUG_MOVE = DEBUG and False
+DEBUG_TOUCH = DEBUG and False
+DEBUG_POINT = DEBUG and False
+DEBUG_KEY = DEBUG and False
+DEBUG_ISCCOF = DEBUG and False
+DEBUG_FIND_VIEW = DEBUG and False
+DEBUG_CONTEXT_MENU = DEBUG and False
+DEBUG_CONCERTINA = DEBUG and False
+DEBUG_UI_AUTOMATOR_HELPER = DEBUG and False
+
+
+class Color:
+ GOLD = '#d19615'
+ GREEN = '#15d137'
+ BLUE = '#1551d1'
+ MAGENTA = '#d115af'
+ DARK_GRAY = '#222222'
+ LIGHT_GRAY = '#dddddd'
+
+
+class Unit:
+ PX = 'PX'
+ DIP = 'DIP'
+
+
+class Operation:
+ ASSIGN = 'assign'
+ CHANGE_LANGUAGE = 'change_language'
+ DEFAULT = 'default'
+ DRAG = 'drag'
+ DUMP = 'dump'
+ FLING_BACKWARD = 'fling_backward'
+ FLING_FORWARD = 'fling_forward'
+ FLING_TO_BEGINNING = 'fling_to_beginning'
+ FLING_TO_END = 'fling_to_end'
+ TEST = 'test'
+ TEST_TEXT = 'test_text'
+ TOUCH_VIEW = 'touch_view'
+ TOUCH_VIEW_UI_AUTOMATOR_HELPER = 'touch_view_ui_automator_helper'
+ TOUCH_POINT = 'touch_point'
+ LONG_TOUCH_POINT = 'long_touch_point'
+ LONG_TOUCH_VIEW = 'long_touch_view'
+ LONG_TOUCH_VIEW_UI_AUTOMATOR_HELPER = 'long_touch_view_ui_automator_helper'
+ OPEN_NOTIFICATION = 'open_notification'
+ OPEN_QUICK_SETTINGS = 'open_quick_settings'
+ TYPE = 'type'
+ PRESS = 'press'
+ PRESS_BACK = 'press_back'
+ PRESS_BACK_UI_AUTOMATOR_HELPER = 'press_back_ui_automator_helper'
+ PRESS_HOME = 'press_home'
+ PRESS_HOME_UI_AUTOMATOR_HELPER = 'press_home_ui_automator_helper'
+ PRESS_RECENT_APPS = 'press_recent_apps'
+ PRESS_RECENT_APPS_UI_AUTOMATOR_HELPER = 'press_recent_apps_ui_automator_helper'
+ SET_TEXT = 'set_text'
+ SNAPSHOT = 'snapshot'
+ START_ACTIVITY = 'start_activity'
+ SLEEP = 'sleep'
+ SWIPE_UI_AUTOMATOR_HELPER = 'swipe_ui_automator_helper'
+ TRAVERSE = 'traverse'
+ VIEW_SNAPSHOT = 'view_snapshot'
+ WAKE = 'wake'
+
+ COMMAND_NAME_OPERATION_MAP = {'flingBackward': FLING_BACKWARD, 'flingForward': FLING_FORWARD,
+ 'flingToBeginning': FLING_TO_BEGINNING, 'flingToEnd': FLING_TO_END,
+ 'openNotification': OPEN_NOTIFICATION, 'openQuickSettings': OPEN_QUICK_SETTINGS,
+ }
+
+ @staticmethod
+ def fromCommandName(commandName):
+ return Operation.COMMAND_NAME_OPERATION_MAP[commandName]
+
+ @staticmethod
+ def toCommandName(operation):
+ return next((cmd for cmd, op in Operation.COMMAND_NAME_OPERATION_MAP.items() if op == operation), None)
+
+
+class Culebron:
+ APPLICATION_NAME = "Culebra"
+
+ UPPERCASE_CHARS = string.uppercase[:26]
+
+ KEYSYM_TO_KEYCODE_MAP = {
+ 'Home': 'HOME',
+ 'BackSpace': 'BACK',
+ 'Left': 'DPAD_LEFT',
+ 'Right': 'DPAD_RIGHT',
+ 'Up': 'DPAD_UP',
+ 'Down': 'DPAD_DOWN',
+ }
+
+ KEYSYM_CULEBRON_COMMANDS = {
+ 'F1': None,
+ 'F5': None
+ }
+
+ canvas = None
+ imageId = None
+ vignetteId = None
+ areTargetsMarked = False
+ isDragDialogShowed = False
+ isGrabbingTouch = False
+ isGeneratingTestCondition = False
+ isTouchingPoint = False
+ isLongTouchingPoint = False
+ isLongTouchingView = False
+ onTouchListener = None
+ snapshotDir = '/tmp'
+ snapshotFormat = 'PNG'
+ deviceArt = None
+ dropShadow = False
+ screenGlare = False
+ osName = platform.system()
+ ''' The OS name. We sometimes need specific behavior. '''
+ isDarwin = (osName == 'Darwin')
+ ''' Is it Mac OSX? '''
+
+ @staticmethod
+ def checkSupportedSdkVersion(sdkVersion):
+ if sdkVersion <= 10:
+ raise Exception('''culebra GUI requires Android API > 10 to work''')
+
+ @staticmethod
+ def checkDependencies():
+ if not PIL_AVAILABLE:
+ raise Exception('''PIL or Pillow is needed for GUI mode
+
+On Ubuntu install
+
+ $ sudo apt-get install python-imaging python-imaging-tk
+
+On OSX install
+
+ $ brew install homebrew/python/pillow
+
+or, preferred since El Capitan
+
+ $ sudo easy_install pip
+ $ sudo pip install pillow
+
+''')
+ if not TKINTER_AVAILABLE:
+ raise Exception('''Tkinter is needed for GUI mode
+
+This is usually installed by python package. Check your distribution details.
+''')
+
+ def __init__(self, vc, device, serialno, printOperation, scale=1, concertina=False):
+ '''
+ Culebron constructor.
+
+ @param vc: The ViewClient used by this Culebron instance. Can be C{None} if no back-end is used.
+ @type vc: ViewClient
+ @param device: The device
+ @type device: L{AdbClient}
+ @param serialno: The device's serial number
+ @type serialno: str
+ @param printOperation: the method invoked to print operations to the script
+ @type printOperation: method
+ @param scale: the scale of the device screen used to show it on the window
+ @type scale: float
+ @:param concertina: bool
+ @:type concertina: enable concertina mode (see documentation)
+ '''
+
+ self.vc = vc
+ self.printOperation = printOperation
+ self.device = device
+ self.sdkVersion = device.getSdkVersion()
+ self.serialno = serialno
+ self.scale = scale
+ self.concertina = concertina
+ self.window = Tkinter.Tk()
+ try:
+ f = resource_filename(Requirement.parse("androidviewclient"),
+ "share/pixmaps/culebra.png")
+ icon = ImageTk.PhotoImage(file=f)
+ except:
+ icon = None
+ if icon:
+ self.window.tk.call('wm', 'iconphoto', self.window._w, icon)
+ self.mainMenu = MainMenu(self)
+ self.window.config(menu=self.mainMenu)
+ self.mainFrame = Tkinter.Frame(self.window)
+ self.placeholder = Tkinter.Frame(self.mainFrame, width=400, height=400, background=Color.LIGHT_GRAY)
+ self.placeholder.grid(row=1, column=1, rowspan=4)
+ self.sideFrame = Tkinter.Frame(self.window)
+ self.viewTree = ViewTree(self.sideFrame)
+ self.viewDetails = ViewDetails(self.sideFrame)
+ self.mainFrame.grid(row=1, column=1, columnspan=1, rowspan=4, sticky=Tkinter.N + Tkinter.S)
+ self.isSideFrameShown = False
+ self.isViewTreeShown = False
+ self.isViewDetailsShown = False
+ self.statusBar = StatusBar(self.window)
+ self.statusBar.grid(row=5, column=1, columnspan=2)
+ self.statusBar.set("Always press F1 for help")
+ self.window.update_idletasks()
+ self.markedTargetIds = {}
+ self.isTouchingPoint = self.vc is None
+ self.coordinatesUnit = Unit.DIP
+ self.isLongTouchingPoint = False
+ self.isLongTouchingView = False
+ self.permanentlyDisableEvents = False
+ self.unscaledScreenshot = None
+ self.image = None
+ self.screenshot = None
+ if DEBUG:
+ try:
+ self.printGridInfo()
+ except:
+ pass
+
+ def printGridInfo(self):
+ print >> sys.stderr, "window:", repr(self.window)
+ print >> sys.stderr, "main:", repr(self.mainFrame)
+ print >> sys.stderr, "main:", self.mainFrame.grid_info()
+ print >> sys.stderr, "side:", repr(self.sideFrame)
+ print >> sys.stderr, "side:", self.sideFrame.grid_info()
+ print >> sys.stderr, "tree:", repr(self.viewTree)
+ print >> sys.stderr, "tree:", self.viewTree.grid_info()
+ print >> sys.stderr, "details:", repr(self.viewDetails)
+ print >> sys.stderr, "details:", self.viewDetails.grid_info()
+
+ def takeScreenshotAndShowItOnWindow(self):
+ '''
+ Takes the current screenshot and shows it on the main window.
+ It also:
+ - sizes the window
+ - create the canvas
+ - set the focus
+ - enable the events
+ - create widgets
+ - finds the targets (as explained in L{findTargets})
+ - hides the vignette (that could have been showed before)
+ '''
+
+ if PROFILE:
+ print >> sys.stderr, "PROFILING: takeScreenshotAndShowItOnWindow()"
+ profileStart()
+
+ if DEBUG:
+ print >> sys.stderr, "takeScreenshotAndShowItOnWindow()"
+ if self.vc and self.vc.uiAutomatorHelper:
+ received = self.vc.uiAutomatorHelper.takeScreenshot()
+ stream = StringIO.StringIO(received)
+ self.unscaledScreenshot = Image.open(stream)
+ else:
+ self.unscaledScreenshot = self.device.takeSnapshot(reconnect=True)
+ self.image = self.unscaledScreenshot
+ (width, height) = self.image.size
+ if self.scale != 1:
+ scaledWidth = int(width * self.scale)
+ scaledHeight = int(height * self.scale)
+ self.image = self.image.resize((scaledWidth, scaledHeight), PIL.Image.ANTIALIAS)
+ (width, height) = self.image.size
+ if self.isDarwin and 14 < self.sdkVersion < 23:
+ stream = StringIO.StringIO()
+ self.image.save(stream, 'GIF')
+ import base64
+ gif = base64.b64encode(stream.getvalue())
+ stream.close()
+ if self.canvas is None:
+ if DEBUG:
+ print >> sys.stderr, "Creating canvas", width, 'x', height
+ self.placeholder.grid_forget()
+ self.canvas = Tkinter.Canvas(self.mainFrame, width=width, height=height)
+ self.canvas.focus_set()
+ self.enableEvents()
+ self.createMessageArea(width, height)
+ self.createVignette(width, height)
+ if self.isDarwin and self.scale != 1 and 14 < self.sdkVersion < 23:
+ # Extremely weird Tkinter bug, I guess
+ # If the image was rotated and then resized if ImageTk.PhotoImage(self.image)
+ # is used as usual then the result is a completely transparent image and only
+ # the "Please wait..." is seen.
+ # Converting it to GIF seems to solve the problem
+ self.screenshot = Tkinter.PhotoImage(data=gif)
+ else:
+ self.screenshot = ImageTk.PhotoImage(self.image)
+ if self.imageId is not None:
+ self.canvas.delete(self.imageId)
+ self.imageId = self.canvas.create_image(0, 0, anchor=Tkinter.NW, image=self.screenshot)
+ if DEBUG:
+ try:
+ print >> sys.stderr, "Grid info", self.canvas.grid_info()
+ except:
+ print >> sys.stderr, "Exception getting grid info"
+ gridInfo = None
+ try:
+ gridInfo = self.canvas.grid_info()
+ except:
+ if DEBUG:
+ print >> sys.stderr, "Adding canvas to grid (1,1)"
+ self.canvas.grid(row=1, column=1, rowspan=4)
+ if not gridInfo:
+ self.canvas.grid(row=1, column=1, rowspan=4)
+ self.findTargets()
+ self.hideVignette()
+ if DEBUG:
+ try:
+ self.printGridInfo()
+ except:
+ pass
+ if PROFILE:
+ profileEnd()
+
+ def createMessageArea(self, width, height):
+ self.__message = Tkinter.Label(self.window, text='', background=Color.GOLD, font=('Helvetica', 16),
+ anchor=Tkinter.W)
+ self.__message.configure(width=width)
+ self.__messageAreaId = self.canvas.create_window(0, 0, anchor=Tkinter.NW, window=self.__message)
+ self.canvas.itemconfig(self.__messageAreaId, state='hidden')
+ self.isMessageAreaVisible = False
+
+ def showMessageArea(self):
+ if self.__messageAreaId:
+ self.canvas.itemconfig(self.__messageAreaId, state='normal')
+ self.isMessageAreaVisible = True
+ self.canvas.update_idletasks()
+
+ def hideMessageArea(self):
+ if self.__messageAreaId and self.isMessageAreaVisible:
+ self.canvas.itemconfig(self.__messageAreaId, state='hidden')
+ self.isMessageAreaVisible = False
+ self.canvas.update_idletasks()
+
+ def toggleMessageArea(self):
+ if self.isMessageAreaVisible:
+ self.hideMessageArea()
+ else:
+ self.showMessageArea()
+
+ def message(self, text, background=None):
+ self.__message.config(text=text)
+ if background:
+ self.__message.config(background=background)
+ self.showMessageArea()
+
+ def toast(self, text, background=None, timeout=5):
+ if DEBUG:
+ print >> sys.stderr, "toast(", text, ",", background, ")"
+ self.message(text, background)
+ if text:
+ t = threading.Timer(timeout, self.hideMessageArea)
+ t.start()
+ else:
+ self.hideMessageArea()
+
+ def createVignette(self, width, height):
+ if DEBUG:
+ print >> sys.stderr, "createVignette(%d, %d)" % (width, height)
+ self.vignetteId = self.canvas.create_rectangle(0, 0, width, height, fill=Color.MAGENTA,
+ stipple='gray50')
+ font = tkFont.Font(family='Helvetica', size=int(144 * self.scale))
+ msg = "Please\nwait..."
+ self.waitMessageShadowId = self.canvas.create_text(width / 2 + 2, height / 2 + 2, text=msg,
+ fill=Color.DARK_GRAY, font=font)
+ self.waitMessageId = self.canvas.create_text(width / 2, height / 2, text=msg,
+ fill=Color.LIGHT_GRAY, font=font)
+ self.canvas.update_idletasks()
+
+ def showVignette(self):
+ if DEBUG:
+ print >> sys.stderr, "showVignette()"
+ if self.canvas is None:
+ return
+ if self.vignetteId:
+ if DEBUG:
+ print >> sys.stderr, " showing vignette"
+ # disable events while we are processing one
+ self.disableEvents()
+ self.canvas.lift(self.vignetteId)
+ self.canvas.lift(self.waitMessageShadowId)
+ self.canvas.lift(self.waitMessageId)
+ self.canvas.update_idletasks()
+
+ def hideVignette(self):
+ if DEBUG:
+ print >> sys.stderr, "hideVignette()"
+ if self.canvas is None:
+ return
+ if self.vignetteId:
+ if DEBUG:
+ print >> sys.stderr, " hiding vignette"
+ self.canvas.lift(self.imageId)
+ self.canvas.update_idletasks()
+ self.enableEvents()
+
+ def deleteVignette(self):
+ if self.canvas is not None:
+ self.canvas.delete(self.vignetteId)
+ self.vignetteId = None
+ self.canvas.delete(self.waitMessageShadowId)
+ self.waitMessageShadowId = None
+ self.canvas.delete(self.waitMessageId)
+ self.waitMessageId = None
+
+ def showPopupMenu(self, event):
+ (scaledX, scaledY) = (event.x / self.scale, event.y / self.scale)
+ v = self.findViewContainingPointInTargets(scaledX, scaledY)
+ ContextMenu(self, view=v).showPopupMenu(event)
+
+ def showHelp(self):
+ d = HelpDialog(self)
+ self.window.wait_window(d)
+
+ def showSideFrame(self):
+ if not self.isSideFrameShown:
+ self.sideFrame.grid(row=1, column=2, rowspan=4, sticky=Tkinter.N + Tkinter.S)
+ self.isSideFrameSown = True
+ if DEBUG:
+ self.printGridInfo()
+
+ def hideSideFrame(self):
+ self.sideFrame.grid_forget()
+ self.isSideFrameShown = False
+ if DEBUG:
+ self.printGridInfo()
+
+ def showViewTree(self):
+ self.showSideFrame()
+ self.viewTree.grid(row=1, column=1, rowspan=3, sticky=Tkinter.N + Tkinter.S)
+ self.isViewTreeShown = True
+ if DEBUG:
+ self.printGridInfo()
+
+ def hideViewTree(self):
+ self.unmarkTargets()
+ self.viewTree.grid_forget()
+ self.isViewTreeShown = False
+ if not self.isViewDetailsShown:
+ self.hideSideFrame()
+ if DEBUG:
+ self.printGridInfo()
+
+ def showViewDetails(self):
+ self.showSideFrame()
+ row = 4
+ # if self.viewTree.grid_info() != {}:
+ # row += 1
+ self.viewDetails.grid(row=row, column=1, rowspan=1, sticky=Tkinter.S)
+ self.isViewDetailsShown = True
+ if DEBUG:
+ self.printGridInfo()
+
+ def hideViewDetails(self):
+ self.viewDetails.grid_forget()
+ self.isViewDetailsShown = False
+ if not self.isViewTreeShown:
+ self.hideSideFrame()
+ if DEBUG:
+ self.printGridInfo()
+
+ def viewTreeItemClicked(self, event):
+ if DEBUG:
+ print >> sys.stderr, "viewTreeitemClicked:", event.__dict__
+ self.unmarkTargets()
+ vuid = self.viewTree.viewTree.identify_row(event.y)
+ if vuid:
+ view = self.vc.viewsById[vuid]
+ if view:
+ coords = view.getCoords()
+ if view.isTarget():
+ self.markTarget(coords[0][0], coords[0][1], coords[1][0], coords[1][1])
+ self.viewDetails.set(view)
+
+ def populateViewTree(self, view):
+ '''
+ Populates the View tree.
+ '''
+
+ vuid = view.getUniqueId()
+ text = view.__smallStr__()
+ if view.getParent() is None:
+ self.viewTree.insert('', Tkinter.END, vuid, text=text)
+ else:
+ self.viewTree.insert(view.getParent().getUniqueId(), Tkinter.END, vuid, text=text, tags=('ttk'))
+ self.viewTree.set(vuid, 'T', '*' if view.isTarget() else ' ')
+ self.viewTree.tag_bind('ttk', '<1>', self.viewTreeItemClicked)
+
+ def findTargets(self):
+ '''
+ Finds the target Views (i.e. for touches).
+ '''
+
+ if DEBUG:
+ print >> sys.stderr, "findTargets()"
+ LISTVIEW_CLASS = 'android.widget.ListView'
+ ''' The ListView class name '''
+ self.targets = []
+ ''' The list of target coordinates (x1, y1, x2, y2) '''
+ self.targetViews = []
+ ''' The list of target Views '''
+ if CHECK_KEYBOARD_SHOWN:
+ if self.device.isKeyboardShown():
+ print >> sys.stderr, "#### keyboard is show but handling it is not implemented yet ####"
+ # FIXME: still no windows in uiautomator
+ window = -1
+ else:
+ window = -1
+ else:
+ window = -1
+ if self.vc:
+ dump = self.vc.dump(window=window, sleep=0.1)
+ self.printOperation(None, Operation.DUMP, window, dump)
+ else:
+ dump = []
+ # the root element cannot be deleted from Treeview once added.
+ # We have no option but to recreate it
+ self.viewTree = ViewTree(self.sideFrame)
+ for v in dump:
+ if DEBUG:
+ print >> sys.stderr, " findTargets: analyzing", v.getClass(), v.getId()
+ if v.getClass() == LISTVIEW_CLASS:
+ # We may want to touch ListView elements, not just the ListView
+ continue
+ parent = v.getParent()
+ if (parent and parent.getClass() == LISTVIEW_CLASS and self.isClickableCheckableOrFocusable(parent)) \
+ or self.isClickableCheckableOrFocusable(v):
+ # If this is a touchable ListView, let's add its children instead
+ # or add it if it's touchable, focusable, whatever
+ ((x1, y1), (x2, y2)) = v.getCoords()
+ if DEBUG:
+ print >> sys.stderr, "appending target", ((x1, y1, x2, y2))
+ v.setTarget(True)
+ self.targets.append((x1, y1, x2, y2))
+ self.targetViews.append(v)
+ target = True
+ else:
+ target = False
+
+ if self.vc:
+ self.vc.traverse(transform=self.populateViewTree)
+
+ def getViewContainingPointAndGenerateTestCondition(self, x, y):
+ if DEBUG:
+ print >> sys.stderr, 'getViewContainingPointAndGenerateTestCondition(%d, %d)' % (x, y)
+ self.finishGeneratingTestCondition()
+ vlist = self.vc.findViewsContainingPoint((x, y))
+ vlist.reverse()
+ for v in vlist:
+ text = v.getText()
+ if text:
+ self.toast(u'Asserting view with text=%s' % text, timeout=5)
+ # FIXME: only getText() is invoked by the generated assert(), a parameter
+ # should be used to provide different alternatives to printOperation()
+ self.printOperation(v, Operation.TEST, text)
+ break
+
+ def findViewContainingPointInTargets(self, x, y):
+ if self.vc:
+ vlist = self.vc.findViewsContainingPoint((x, y))
+ if DEBUG_FIND_VIEW:
+ print >> sys.stderr, "Views found:"
+ for v in vlist:
+ print >> sys.stderr, " ", v.__smallStr__()
+ vlist.reverse()
+ for v in vlist:
+ if DEBUG:
+ print >> sys.stderr, "checking if", v, "is in", self.targetViews
+ if v in self.targetViews:
+ if DEBUG_TOUCH:
+ print >> sys.stderr
+ print >> sys.stderr, "I guess you are trying to touch:", v
+ print >> sys.stderr
+ return v
+
+ return None
+
+ def getViewContainingPointAndTouch(self, x, y):
+ if DEBUG:
+ print >> sys.stderr, 'getViewContainingPointAndTouch(%d, %d)' % (x, y)
+ if self.areEventsDisabled:
+ if DEBUG:
+ print >> sys.stderr, "Ignoring event"
+ self.canvas.update_idletasks()
+ return
+
+ self.showVignette()
+ if DEBUG_POINT:
+ print >> sys.stderr, "getViewsContainingPointAndTouch(x=%s, y=%s)" % (x, y)
+ print >> sys.stderr, "self.vc=", self.vc
+ v = self.findViewContainingPointInTargets(x, y)
+
+ if v is None:
+ self.hideVignette()
+ msg = "There are no explicitly touchable or clickable views here! Touching with [x,y]"
+ self.toast(msg)
+ # A partial hack which temporarily toggles touch point
+ self.toggleTouchPoint()
+ self.touchPoint(x, y)
+ self.toggleTouchPoint()
+ else:
+ if self.vc.uiAutomatorHelper:
+ # These operations are only available through uiAutomatorHelper
+ if v == self.vc.navBack:
+ self.pressBack()
+ return
+ elif v == self.vc.navHome:
+ self.pressHome()
+ return
+ elif v == self.vc.navRecentApps:
+ self.pressRecentApps()
+ return
+
+ clazz = v.getClass()
+ if clazz == 'android.widget.EditText':
+ title = "EditText"
+ kwargs = {}
+ if DEBUG:
+ print >> sys.stderr, v
+ if v.isPassword():
+ title = "Password"
+ kwargs = {'show': '*'}
+ text = tkSimpleDialog.askstring(title, "Enter text to type into this field", **kwargs)
+ self.canvas.focus_set()
+ if text:
+ self.vc.setText(v, text)
+ self.printOperation(v, Operation.SET_TEXT, text)
+ else:
+ self.hideVignette()
+ return
+ else:
+ candidates = [v]
+
+ def findBestCandidate(view):
+ isccf = Culebron.isClickableCheckableOrFocusable(view)
+ cd = view.getContentDescription()
+ text = view.getText()
+ if (cd or text) and not isccf:
+ # because isccf==False this view was not added to the list of targets
+ # (i.e. Settings)
+ candidates.insert(0, view)
+ return None
+
+ if not (v.getText() or v.getContentDescription()) and v.getChildren():
+ self.vc.traverse(root=v, transform=findBestCandidate, stream=None)
+ if len(candidates) > 2:
+ warnings.warn("We are in trouble, we have more than one candidate to touch", stacklevel=0)
+ candidate = candidates[0]
+ self.touchView(candidate, v if candidate != v else None)
+
+ self.printOperation(None, Operation.SLEEP, Operation.DEFAULT)
+ self.vc.sleep(5)
+ self.takeScreenshotAndShowItOnWindow()
+
+ def pressBack(self):
+ self.showVignette()
+ self.vc.pressBack()
+ if self.vc.uiAutomatorHelper:
+ self.printOperation(None, Operation.PRESS_BACK_UI_AUTOMATOR_HELPER)
+ else:
+ self.printOperation(None, Operation.PRESS_BACK)
+ self.takeScreenshotAndShowItOnWindow()
+
+ def pressHome(self):
+ self.showVignette()
+ self.vc.pressHome()
+ if self.vc.uiAutomatorHelper:
+ self.printOperation(None, Operation.PRESS_HOME_UI_AUTOMATOR_HELPER)
+ else:
+ self.printOperation(None, Operation.PRESS_HOME)
+ self.takeScreenshotAndShowItOnWindow()
+
+ def pressRecentApps(self):
+ self.showVignette()
+ self.vc.pressRecentApps()
+ if self.vc.uiAutomatorHelper:
+ self.printOperation(None, Operation.PRESS_RECENT_APPS_UI_AUTOMATOR_HELPER)
+ else:
+ self.printOperation(None, Operation.PRESS_RECENT_APPS)
+ self.vc.sleep(1)
+ self.takeScreenshotAndShowItOnWindow()
+
+ def setText(self, v, text):
+ if DEBUG:
+ print >> sys.stderr, "setText(%s, '%s')" % (v.__tinyStr__(), text)
+ # This is deleting the existing text, which should be asked in the dialog, but I would have to implement
+ # the dialog myself
+ v.setText(text)
+ # This is not deleting the text, so appending if there's something
+ # v.type(text)
+ self.printOperation(v, Operation.TYPE, text)
+
+ def touchView(self, v, root=None):
+ v.touch()
+ if v.uiAutomatorHelper:
+ self.printOperation(v, Operation.TOUCH_VIEW_UI_AUTOMATOR_HELPER, v.obtainSelectorForView())
+ else:
+ # we pass root=v as an argument so the corresponding findView*() searches in this
+ # subtree instead of the full tree
+ self.printOperation(v, Operation.TOUCH_VIEW, root)
+
+ def touchPoint(self, x, y):
+ '''
+ Touches a point in the device screen.
+ The generated operation will use the units specified in L{coordinatesUnit} and the
+ orientation in L{vc.display['orientation']}.
+ '''
+
+ if DEBUG:
+ print >> sys.stderr, 'touchPoint(%d, %d)' % (x, y)
+ print >> sys.stderr, 'touchPoint:', type(x), type(y)
+ if self.areEventsDisabled:
+ if DEBUG:
+ print >> sys.stderr, "Ignoring event"
+ self.canvas.update_idletasks()
+ return
+ if DEBUG:
+ print >> sys.stderr, "Is touching point:", self.isTouchingPoint
+ if self.isTouchingPoint:
+ self.showVignette()
+ self.vc.touch(x, y)
+ if self.coordinatesUnit == Unit.DIP:
+ x = round(x / self.device.display['density'], 2)
+ y = round(y / self.device.display['density'], 2)
+ self.printOperation(None, Operation.TOUCH_POINT, x, y, self.coordinatesUnit,
+ self.device.display['orientation'])
+ self.printOperation(None, Operation.SLEEP, Operation.DEFAULT)
+ # FIXME: can we reduce this sleep? (was 5)
+ time.sleep(1)
+ self.isTouchingPoint = self.vc is None
+ self.takeScreenshotAndShowItOnWindow()
+ # self.hideVignette()
+ self.statusBar.clear()
+ return
+
+ def longTouchPoint(self, x, y):
+ '''
+ Long-touches a point in the device screen.
+ The generated operation will use the units specified in L{coordinatesUnit} and the
+ orientation in L{vc.display['orientation']}.
+ '''
+
+ if DEBUG:
+ print >> sys.stderr, 'longTouchPoint(%d, %d)' % (x, y)
+ if self.areEventsDisabled:
+ if DEBUG:
+ print >> sys.stderr, "Ignoring event"
+ self.canvas.update_idletasks()
+ return
+ if DEBUG:
+ print >> sys.stderr, "Is long touching point:", self.isLongTouchingPoint
+ if self.isLongTouchingPoint:
+ self.showVignette()
+ self.vc.longTouch(x, y)
+ if self.coordinatesUnit == Unit.DIP:
+ x = round(x / self.device.display['density'], 2)
+ y = round(y / self.device.display['density'], 2)
+ self.printOperation(None, Operation.LONG_TOUCH_POINT, x, y, 2000, self.coordinatesUnit,
+ self.device.display['orientation'])
+ self.printOperation(None, Operation.SLEEP, 5)
+ time.sleep(5)
+ self.isLongTouchingPoint = False
+ self.takeScreenshotAndShowItOnWindow()
+ # self.hideVignette()
+ self.statusBar.clear()
+ return
+
+ def longTouchView(self, v, root=None):
+ v.longTouch()
+ if v.uiAutomatorHelper:
+ self.printOperation(v, Operation.LONG_TOUCH_VIEW_UI_AUTOMATOR_HELPER, v.obtainSelectorForView())
+ else:
+ # we pass root=v as an argument so the corresponding findView*() searches in this
+ # subtree instead of the full tree
+ self.printOperation(v, Operation.LONG_TOUCH_VIEW, root)
+ self.isLongTouchingView = False
+
+ def onButton1Pressed(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onButton1Pressed((", event.x, ", ", event.y, "))"
+ (scaledX, scaledY) = (event.x / self.scale, event.y / self.scale)
+ if DEBUG:
+ print >> sys.stderr, " onButton1Pressed: scaled: (", scaledX, ", ", scaledY, ")"
+ print >> sys.stderr, " onButton1Pressed: is grabbing:", self.isGrabbingTouch
+
+ if self.isGrabbingTouch:
+ self.onTouchListener((scaledX, scaledY))
+ self.isGrabbingTouch = False
+ elif self.isDragDialogShowed:
+ self.toast("No touch events allowed while setting drag parameters", background=Color.GOLD)
+ return
+ elif self.isTouchingPoint:
+ self.touchPoint(scaledX, scaledY)
+ elif self.isLongTouchingPoint:
+ self.longTouchPoint(scaledX, scaledY)
+ elif self.isLongTouchingView:
+ self.getViewContainingPointAndLongTouch(scaledX, scaledY)
+ elif self.isGeneratingTestCondition:
+ self.getViewContainingPointAndGenerateTestCondition(scaledX, scaledY)
+ else:
+ if self.vc:
+ self.getViewContainingPointAndTouch(scaledX, scaledY)
+ else:
+ # If we don't have Views, there no other option than touching points
+ self.touchPoint(scaledX, scaledY)
+
+ def onCtrlButton1Pressed(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlButton1Pressed((", event.x, ", ", event.y, "))"
+ (scaledX, scaledY) = (event.x / self.scale, event.y / self.scale)
+ l = self.vc.findViewsContainingPoint((scaledX, scaledY))
+ if l and len(l) > 0:
+ self.saveViewSnapshot(l[-1])
+ else:
+ msg = "There are no views here!"
+ self.toast(msg)
+ return
+
+ def onButton2Pressed(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onButton2Pressed((", event.x, ", ", event.y, "))"
+ osName = platform.system()
+ if osName == 'Darwin':
+ self.showPopupMenu(event)
+
+ def onButton3Pressed(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onButton3Pressed((", event.x, ", ", event.y, "))"
+ self.showPopupMenu(event)
+
+ def command(self, keycode):
+ '''
+ Presses a key.
+ Generates the actual key press on the device and prints the line in the script.
+ '''
+
+ self.device.press(keycode)
+ self.printOperation(None, Operation.PRESS, keycode)
+
+ def onKeyPressed(self, event):
+ if DEBUG_KEY:
+ print >> sys.stderr, "onKeyPressed(", repr(event), ")"
+ print >> sys.stderr, " event", type(event.char), len(event.char), repr(
+ event.char), event.keysym, event.keycode, event.type
+ print >> sys.stderr, " events disabled:", self.areEventsDisabled
+ if self.areEventsDisabled:
+ if DEBUG_KEY:
+ print >> sys.stderr, "ignoring event"
+ self.canvas.update_idletasks()
+ return
+
+ char = event.char
+ keysym = event.keysym
+
+ if len(char) == 0 and not (
+ keysym in Culebron.KEYSYM_TO_KEYCODE_MAP or keysym in Culebron.KEYSYM_CULEBRON_COMMANDS):
+ if DEBUG_KEY:
+ print >> sys.stderr, "returning because len(char) == 0"
+ return
+
+ ###
+ ### internal commands: no output to generated script
+ ###
+ try:
+ handler = getattr(self, 'onCtrl%s' % self.UPPERCASE_CHARS[ord(char) - 1])
+ except:
+ handler = None
+ if handler:
+ return handler(event)
+ elif keysym == 'F1':
+ self.showHelp()
+ return
+ elif keysym == 'F5':
+ self.refresh()
+ return
+ elif keysym == 'F8':
+ self.printGridInfo()
+ return
+ elif keysym == 'Alt_L':
+ return
+ elif keysym == 'Control_L':
+ return
+ elif keysym == 'Escape':
+ # we cannot send Escape to the device, but I think it's fine
+ self.cancelOperation()
+ return
+
+ ### empty char (modifier) ###
+ # here does not process events like Home where char is ''
+ # if char == '':
+ # return
+
+ ###
+ ### target actions
+ ###
+ self.showVignette()
+
+ if keysym in Culebron.KEYSYM_TO_KEYCODE_MAP:
+ if DEBUG_KEY:
+ print >> sys.stderr, "Pressing", Culebron.KEYSYM_TO_KEYCODE_MAP[keysym]
+ self.command(Culebron.KEYSYM_TO_KEYCODE_MAP[keysym])
+ elif char == '\r':
+ self.command('ENTER')
+ elif char == '':
+ # do nothing
+ pass
+ else:
+ self.command(char.decode('ascii', errors='replace'))
+ # commented out (profile)
+ # time.sleep(1)
+ self.takeScreenshotAndShowItOnWindow()
+
+ def wake(self):
+ self.refresh()
+ self.printOperation(None, Operation.WAKE)
+
+ def refresh(self):
+ self.showVignette()
+ self.device.wake()
+ display = copy.copy(self.device.display)
+ self.device.initDisplayProperties()
+ changed = False
+ for prop in display:
+ if display[prop] != self.device.display[prop]:
+ changed = True
+ break
+ if changed:
+ self.window.geometry('%dx%d' % (self.device.display['width'] * self.scale,
+ self.device.display['height'] * self.scale + int(
+ self.statusBar.winfo_height())))
+ self.deleteVignette()
+ self.canvas.destroy()
+ self.canvas = None
+ self.window.update_idletasks()
+ self.takeScreenshotAndShowItOnWindow()
+
+ def cancelOperation(self):
+ '''
+ Cancels the ongoing operation if any.
+ '''
+ if self.isLongTouchingPoint:
+ self.toggleLongTouchPoint()
+ elif self.isTouchingPoint:
+ self.toggleTouchPoint()
+ elif self.isGeneratingTestCondition:
+ self.toggleGenerateTestCondition()
+
+ def printStartActivityAtTop(self):
+ self.printOperation(None, Operation.START_ACTIVITY, self.device.getTopActivityName())
+
+ def onCtrlA(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlA(", event, ")"
+ self.printStartActivityAtTop()
+
+ def showDragDialog(self):
+ d = DragDialog(self)
+ self.window.wait_window(d)
+ self.setDragDialogShowed(False)
+
+ def onCtrlD(self, event):
+ self.showDragDialog()
+
+ def onCtrlF(self, event):
+ self.saveSnapshot()
+
+ def saveSnapshot(self):
+ '''
+ Saves the current shanpshot to the specified file.
+ Current snapshot is the image being displayed on the main window.
+ '''
+
+ filename = self.snapshotDir + os.sep + '${serialno}-${focusedwindowname}-${timestamp}' + '.' + self.snapshotFormat.lower()
+ # We have the snapshot already taken, no need to retake
+ d = FileDialog(self, self.device.substituteDeviceTemplate(filename))
+ saveAsFilename = d.askSaveAsFilename()
+ if saveAsFilename:
+ _format = os.path.splitext(saveAsFilename)[1][1:].upper()
+ self.printOperation(None, Operation.SNAPSHOT, filename, _format, self.deviceArt, self.dropShadow,
+ self.screenGlare)
+ # FIXME: we should add deviceArt, dropShadow and screenGlare to the saved image
+ # self.unscaledScreenshot.save(saveAsFilename, _format, self.deviceArt, self.dropShadow, self.screenGlare)
+ self.unscaledScreenshot.save(saveAsFilename, _format)
+
+ def saveViewSnapshot(self, view):
+ '''
+ Saves the View snapshot.
+ '''
+
+ if not view:
+ raise ValueError("view must be provided to take snapshot")
+ filename = self.snapshotDir + os.sep + '${serialno}-' + view.variableNameFromId() + '-${timestamp}' + '.' + self.snapshotFormat.lower()
+ d = FileDialog(self, self.device.substituteDeviceTemplate(filename))
+ saveAsFilename = d.askSaveAsFilename()
+ if saveAsFilename:
+ _format = os.path.splitext(saveAsFilename)[1][1:].upper()
+ self.printOperation(view, Operation.VIEW_SNAPSHOT, filename, _format)
+ view.writeImageToFile(saveAsFilename, _format)
+
+ def toggleTouchPointDip(self):
+ '''
+ Toggles the touch point operation using L{Unit.DIP}.
+ This invokes L{toggleTouchPoint}.
+ '''
+
+ self.coordinatesUnit = Unit.DIP
+ self.toggleTouchPoint()
+
+ def onCtrlI(self, event):
+ self.toggleTouchPointDip()
+
+ def toggleLongTouchPoint(self):
+ '''
+ Toggles the long touch point operation.
+ '''
+ if not self.isLongTouchingPoint:
+ msg = 'Long touching point'
+ self.toast(msg, background=Color.GREEN)
+ self.statusBar.set(msg)
+ self.isLongTouchingPoint = True
+ # FIXME: There should be 2 methods DIP & PX
+ self.coordinatesUnit = Unit.PX
+ else:
+ self.toast(None)
+ self.statusBar.clear()
+ self.isLongTouchingPoint = False
+
+ def toggleLongTouchView(self):
+ '''
+ Toggles the long touch View operation.
+ :return:
+ '''
+ if not self.isLongTouchingView:
+ msg = 'Long touching View'
+ self.toast(msg, background=Color.GREEN)
+ self.statusBar.set(msg)
+ self.isLongTouchingView = True
+ else:
+ self.toast(None)
+ self.statusBar.clear()
+ self.isLongTouchingView = False
+
+ def onCtrlL(self, event):
+ self.toggleLongTouchPoint()
+
+ def toggleTouchPoint(self):
+ '''
+ Toggles the touch point operation using the units specified in L{coordinatesUnit}.
+
+ When there are L{View}s (obtained from the back-end) we have to determine if the
+ intention when something is touched on the window if we want to touch the L{View}
+ or the point.
+
+ If there's no back-end, we don't allow L{self.isTouchingPoint} to be disabled so we will
+ never be attempting to touch L{View}s.
+ '''
+
+ if not self.isTouchingPoint:
+ msg = 'Touching point (units=%s)' % self.coordinatesUnit
+ self.toast(msg, background=Color.GREEN)
+ self.statusBar.set(msg)
+ self.isTouchingPoint = True
+ else:
+ self.toast(None)
+ self.statusBar.clear()
+ self.isTouchingPoint = self.vc is None
+
+ def toggleTouchPointPx(self):
+ self.coordinatesUnit = Unit.PX
+ self.toggleTouchPoint()
+
+ def onCtrlP(self, event):
+ self.toggleTouchPointPx()
+
+ def onCtrlQ(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlQ(%s)" % event
+ self.quit()
+
+ def quit(self):
+ if self.vc.uiAutomatorHelper:
+ if DEBUG or True:
+ print >> sys.stderr, "Quitting UiAutomatorHelper..."
+ self.vc.uiAutomatorHelper.quit()
+ self.window.destroy()
+
+ def showSleepDialog(self):
+ seconds = tkSimpleDialog.askfloat('Sleep Interval', 'Value in seconds:', initialvalue=1, minvalue=0,
+ parent=self.window)
+ if seconds is not None:
+ self.printOperation(None, Operation.SLEEP, seconds)
+ self.canvas.focus_set()
+
+ def onCtrlS(self, event):
+ self.showSleepDialog()
+
+ def startGeneratingTestCondition(self):
+ self.message('Generating test condition...', background=Color.GREEN)
+ self.isGeneratingTestCondition = True
+
+ def finishGeneratingTestCondition(self):
+ self.isGeneratingTestCondition = False
+ self.hideMessageArea()
+
+ def toggleGenerateTestCondition(self):
+ '''
+ Toggles generating test condition
+ '''
+
+ if self.vc is None:
+ self.toast('Test conditions can be generated when a back-end is defined')
+ return
+ if self.isGeneratingTestCondition:
+ self.finishGeneratingTestCondition()
+ else:
+ self.startGeneratingTestCondition()
+
+ def onCtrlT(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlT()"
+ if self.vc is None:
+ self.toast('Test conditions can be generated when a back-end is defined')
+ return
+ # FIXME: This is only valid if we are generating a test case
+ self.toggleGenerateTestCondition()
+
+ def onCtrlU(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlU()"
+
+ def onCtrlV(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlV()"
+ self.printOperation(None, Operation.TRAVERSE)
+
+ def toggleTargetZones(self):
+ self.toggleTargets()
+ self.canvas.update_idletasks()
+
+ def onCtrlZ(self, event):
+ if DEBUG:
+ print >> sys.stderr, "onCtrlZ()"
+ self.toggleTargetZones()
+
+ def showControlPanel(self):
+ from com.dtmilano.android.controlpanel import ControlPanel
+
+ self.controlPanel = ControlPanel(self, self.printOperation)
+
+ def onCtrlK(self, event):
+ self.showControlPanel()
+
+ def drag(self, start, end, duration, steps, units=Unit.DIP):
+ self.showVignette()
+ # the operation on this current device is always done in PX
+ # so let's do it before any conversion takes place
+ self.device.drag(start, end, duration, steps)
+ if units == Unit.DIP:
+ x0 = round(start[0] / self.device.display['density'], 2)
+ y0 = round(start[1] / self.device.display['density'], 2)
+ x1 = round(end[0] / self.device.display['density'], 2)
+ y1 = round(end[1] / self.device.display['density'], 2)
+ start = (x0, y0)
+ end = (x1, y1)
+ if self.vc.uiAutomatorHelper:
+ self.printOperation(None, Operation.SWIPE_UI_AUTOMATOR_HELPER, x0, y0, x1, y1, steps, units,
+ self.device.display['orientation'])
+ else:
+ self.printOperation(None, Operation.DRAG, start, end, duration, steps, units,
+ self.device.display['orientation'])
+ self.printOperation(None, Operation.SLEEP, 1)
+ time.sleep(1)
+ self.takeScreenshotAndShowItOnWindow()
+
+
+ def enableEvents(self):
+ if self.permanentlyDisableEvents:
+ return
+ self.canvas.update_idletasks()
+ self.canvas.bind("<Button-1>", self.onButton1Pressed)
+ self.canvas.bind("<Control-Button-1>", self.onCtrlButton1Pressed)
+ self.canvas.bind("<Button-2>", self.onButton2Pressed)
+ self.canvas.bind("<Button-3>", self.onButton3Pressed)
+ self.canvas.bind("<BackSpace>", self.onKeyPressed)
+ # self.canvas.bind("<Control-Key-S>", self.onCtrlS)
+ self.canvas.bind("<Key>", self.onKeyPressed)
+ self.areEventsDisabled = False
+
+
+ def disableEvents(self, permanently=False):
+ self.permanentlyDisableEvents = permanently
+ if self.canvas is not None:
+ self.canvas.update_idletasks()
+ self.areEventsDisabled = True
+ self.canvas.unbind("<Button-1>")
+ self.canvas.unbind("<Control-Button-1>")
+ self.canvas.unbind("<Button-2>")
+ self.canvas.unbind("<Button-3>")
+ self.canvas.unbind("<BackSpace>")
+ # self.canvas.unbind("<Control-Key-S>")
+ self.canvas.unbind("<Key>")
+
+
+ def toggleTargets(self):
+ if DEBUG:
+ print >> sys.stderr, "toggletargets: aretargetsmarked=", self.areTargetsMarked
+ if not self.areTargetsMarked:
+ self.markTargets()
+ else:
+ self.unmarkTargets()
+
+
+ def markTargets(self):
+ if DEBUG:
+ print >> sys.stderr, "marktargets: aretargetsmarked=", self.areTargetsMarked
+ print >> sys.stderr, " marktargets: targets=", self.targets
+ colors = ["#ff00ff", "#ffff00", "#00ffff"]
+
+ self.markedTargetIds = {}
+ c = 0
+ for (x1, y1, x2, y2) in self.targets:
+ if DEBUG:
+ print "adding rectangle:", x1, y1, x2, y2
+ self.markTarget(x1, y1, x2, y2, colors[c % len(colors)])
+ c += 1
+ self.areTargetsMarked = True
+
+
+ def markTarget(self, x1, y1, x2, y2, color='#ff00ff'):
+ '''
+ @return the id of the rectangle added
+ '''
+
+ # self.areTargetsMarked = True
+ _id = self.canvas.create_rectangle(x1 * self.scale, y1 * self.scale, x2 * self.scale, y2 * self.scale,
+ fill=color,
+ stipple="gray25")
+ self.markedTargetIds[_id] = (x1, y1, x2, y2)
+ return _id
+
+
+ def unmarkTarget(self, _id):
+ self.canvas.delete(_id)
+
+
+ def unmarkTargets(self):
+ if not self.areTargetsMarked:
+ return
+ for _id in self.markedTargetIds:
+ self.unmarkTarget(_id)
+ self.markedTargetIds = {}
+ self.areTargetsMarked = False
+
+
+ def setDragDialogShowed(self, showed):
+ self.isDragDialogShowed = showed
+ if showed:
+ pass
+ else:
+ self.isGrabbingTouch = False
+
+
+ def drawTouchedPoint(self, x, y):
+ if DEBUG:
+ print >> sys.stderr, "drawTouchedPoint(", x, ",", y, ")"
+ size = 50
+ return self.canvas.create_oval((x - size) * self.scale, (y - size) * self.scale, (x + size) * self.scale,
+ (y + size) * self.scale, fill=Color.MAGENTA)
+
+
+ def drawDragLine(self, x0, y0, x1, y1):
+ if DEBUG:
+ print >> sys.stderr, "drawDragLine(", x0, ",", y0, ",", x1, ",", y1, ")"
+ width = 15
+ return self.canvas.create_line(x0 * self.scale, y0 * self.scale, x1 * self.scale, y1 * self.scale, width=width,
+ fill=Color.MAGENTA, arrow="last", arrowshape=(50, 50, 30), dash=(50, 25))
+
+
+ def executeCommandAndRefresh(self, command):
+ self.showVignette()
+ if DEBUG:
+ print >> sys.stderr, 'DEBUG: command=', command, command.__name__
+ print >> sys.stderr, 'DEBUG: command=', command.__self__, command.__self__.view
+ try:
+ view = command.__self__.view
+ except AttributeError:
+ view = None
+ # FIXME: If we are not dumping the Views and assigning to variables (i.e -u was used on command line) then
+ # when we try to do an operation on the View via its variable name it's going to fail when the saved script
+ # is executed
+ self.printOperation(view, Operation.fromCommandName(command.__name__))
+ command()
+ self.printOperation(None, Operation.SLEEP, Operation.DEFAULT)
+ self.vc.sleep(5)
+ # FIXME: perhaps refresh() should be invoked here just in case size or orientation changed
+ self.takeScreenshotAndShowItOnWindow()
+
+
+ def changeLanguage(self):
+ code = tkSimpleDialog.askstring("Change language", "Enter the language code")
+ self.vc.uiDevice.changeLanguage(code)
+ self.printOperation(None, Operation.CHANGE_LANGUAGE, code)
+ self.refresh()
+
+
+ def setOnTouchListener(self, listener):
+ self.onTouchListener = listener
+
+
+ def setGrab(self, state):
+ if DEBUG:
+ print >> sys.stderr, "Culebron.setGrab(%s)" % state
+ if state and not self.onTouchListener:
+ warnings.warn('Starting to grab but no onTouchListener')
+ self.isGrabbingTouch = state
+ if state:
+ self.toast('Grabbing drag points...', background=Color.GREEN)
+ else:
+ self.hideMessageArea()
+
+
+ @staticmethod
+ def isClickableCheckableOrFocusable(v):
+ if DEBUG_ISCCOF:
+ print >> sys.stderr, "isClickableCheckableOrFocusable(", v.__tinyStr__(), ")"
+ try:
+ if not v.isEnabled():
+ # if not enabled, then it cannot be a target
+ return False
+ except AttributeError:
+ pass
+ try:
+ return v.isClickable()
+ except AttributeError:
+ pass
+ try:
+ return v.isCheckable()
+ except AttributeError:
+ pass
+ try:
+ return v.isFocusable()
+ except AttributeError:
+ pass
+ return False
+
+
+ def mainloop(self):
+ self.window.title("%s v%s" % (Culebron.APPLICATION_NAME, __version__))
+ self.window.resizable(width=Tkinter.FALSE, height=Tkinter.FALSE)
+ self.window.lift()
+ if self.concertina:
+ self.concertinaLoop()
+ else:
+ self.window.mainloop()
+
+
+ def concertinaLoop(self):
+ random.seed()
+ self.disableEvents(permanently=True)
+ self.concertinaLoopCallback(dontinteract=True)
+ self.window.mainloop()
+
+
+ def concertinaLoopCallback(self, dontinteract=False):
+ if not dontinteract:
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: should select one of these targets:"
+ for v in self.targetViews:
+ print >> sys.stderr, " ", unicode(v.__tinyStr__())
+ rand = random.random()
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: random=%f" % rand
+ if rand > 0.85:
+ # Send key events
+ k = random.choice(['ENTER', 'BACK', 'HOME', 'MENU'])
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: key=" + k
+ # DEBUG ONLY!
+ # print >> sys.stderr, "Not sending key event"
+ self.command(k)
+ else:
+ # Act on views
+ _len = len(self.targetViews)
+ if _len > 0:
+ i = random.randrange(len(self.targetViews))
+ target = self.targetViews[i]
+ z = self.targets[i]
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: selected", unicode(target.__smallStr__())
+ print >> sys.stderr, "CONCERTINA: selected", z
+ _id = self.markTarget(*z)
+ self.window.update_idletasks()
+ time.sleep(1)
+ self.unmarkTarget(_id)
+ self.window.update_idletasks()
+ clazz = target.getClass()
+ parent = target.getParent()
+ if parent:
+ parentClass = parent.getClass()
+ else:
+ parentClass = None
+ isScrollable = target.isScrollable()
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: is scrollable: ", isScrollable
+ if parent:
+ print >> sys.stderr, "CONCERTINA: is scrollable parent: ", parent.isScrollable()
+ # cond = (isScrollable or parent.isScrollable() or parentClass == 'android.widget.ScrollView')
+ # DEBUG ONLY!
+ # print >> sys.stderr, "CONCERTINA: check:", cond
+ # if not cond:
+ # self.window.after(500, self.concertinaLoopCallback)
+ # return
+ if clazz == 'android.widget.EditText':
+ id = target.getId()
+ txt = target.getText()
+ if target.isPassword() or re.search('password', id, re.IGNORECASE) or re.search('password', txt,
+ re.IGNORECASE):
+ text = Concertina.getRandomPassword()
+ elif re.search('email', id, re.IGNORECASE) or re.search('email', txt, re.IGNORECASE):
+ text = Concertina.getRandomEmail()
+ else:
+ text = Concertina.getRandomText()
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "Entering text: ", text
+ if not text:
+ raise RuntimeError('text is None')
+ self.setText(target, text)
+ elif target.getContentDescription() in ['Voice Search', 'Tap to speak']:
+ Concertina.sayRandomText()
+ time.sleep(5)
+ elif random.choice(['SCROLL', 'TOUCH']) == 'SCROLL' and (
+ isScrollable or parent.isScrollable() or parentClass == 'android.widget.ScrollView'):
+ # NOTE: The order here is important because some EditText are inside ScrollView's and we want to
+ # capture the case of other ScrollViews
+ if isScrollable:
+ ((l, t), (r, b)) = target.getBounds()
+ else:
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: using parent bounds because it's scrollable"
+ ((l, t), (r, b)) = parent.getBounds()
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: bounds=", ((l, t), (r, b))
+ if random.choice(['VERTICAL', 'HORIZONTAL']) == 'VERTICAL':
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, 'CONCERTINA: VERTICAL'
+ sp = (l + (r - l) / 2, t + 50)
+ ep = (l + (r - l) / 2, b - 50)
+ else:
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, 'CONCERTINA: HORIZONTAL'
+ sp = (l + 50, t + (b - t) / 2)
+ ep = (r - 50, t + (b - t) / 2)
+ if random.choice(['FORWARD', 'REVERSE']) == 'REVERSE':
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, 'CONCERTINA: REVERSE'
+ temp = sp
+ sp = ep
+ ep = temp
+ else:
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, 'CONCERTINA: FORWARD'
+ d = 500
+ s = 20
+ _id = self.canvas.create_rectangle(l * self.scale, t * self.scale, r * self.scale,
+ b * self.scale,
+ fill="#00ffff", stipple="gray12")
+ self.window.update_idletasks()
+ units = Unit.PX
+ self.drawTouchedPoint(sp[0], sp[1])
+ self.window.update_idletasks()
+ self.drawDragLine(sp[0], sp[1], ep[0], ep[1])
+ self.window.update_idletasks()
+ time.sleep(5)
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: dragging %s %s %s %s %s" % (sp, ep, d, s, units)
+ self.drag(sp, ep, d, s, units)
+ else:
+ self.touchView(target)
+ self.printOperation(None, Operation.SLEEP, Operation.DEFAULT)
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: waiting 5 secs"
+ time.sleep(5)
+ if DEBUG_CONCERTINA:
+ print >> sys.stderr, "CONCERTINA: taking screenshot"
+ self.takeScreenshotAndShowItOnWindow()
+ else:
+ print >> sys.stderr, "CONCERTINA: No target views"
+ self.window.after(5000, self.concertinaLoopCallback)
+
+
+ def getViewContainingPointAndLongTouch(self, x, y):
+ # FIXME: this method is almost exactly as getViewContainingPointAndTouch()
+ if DEBUG:
+ print >> sys.stderr, 'getViewContainingPointAndLongTouch(%d, %d)' % (x, y)
+ if self.areEventsDisabled:
+ if DEBUG:
+ print >> sys.stderr, "Ignoring event"
+ self.canvas.update_idletasks()
+ return
+
+ self.showVignette()
+ if DEBUG_POINT:
+ print >> sys.stderr, "getViewsContainingPointAndLongTouch(x=%s, y=%s)" % (x, y)
+ print >> sys.stderr, "self.vc=", self.vc
+ v = self.findViewContainingPointInTargets(x, y)
+
+ if v is None:
+ # FIXME: We can touch by DIP by default if no Views were found
+ self.hideVignette()
+ msg = "There are no touchable or clickable views here!"
+ self.toast(msg)
+ return
+
+ clazz = v.getClass()
+ candidates = [v]
+
+ def findBestCandidate(view):
+ isccf = Culebron.isClickableCheckableOrFocusable(view)
+ cd = view.getContentDescription()
+ text = view.getText()
+ if (cd or text) and not isccf:
+ # because isccf==False this view was not added to the list of targets
+ # (i.e. Settings)
+ candidates.insert(0, view)
+ return None
+
+ if not (v.getText() or v.getContentDescription()) and v.getChildren():
+ self.vc.traverse(root=v, transform=findBestCandidate, stream=None)
+ if len(candidates) > 2:
+ warnings.warn("We are in trouble, we have more than one candidate to touch", stacklevel=0)
+ candidate = candidates[0]
+ self.longTouchView(candidate, v if candidate != v else None)
+
+ self.printOperation(None, Operation.SLEEP, Operation.DEFAULT)
+ self.vc.sleep(5)
+ self.takeScreenshotAndShowItOnWindow()
+
+
+if TKINTER_AVAILABLE:
+ class MainMenu(Tkinter.Menu):
+ def __init__(self, culebron):
+ Tkinter.Menu.__init__(self, culebron.window)
+ self.culebron = culebron
+
+ self.fileMenu = Tkinter.Menu(self, tearoff=False)
+ self.fileMenu.add_command(label="Quit", underline=0, accelerator='Command-Q', command=self.culebron.quit)
+ self.add_cascade(label="File", underline=0, menu=self.fileMenu)
+
+ self.viewMenu = Tkinter.Menu(self, tearoff=False)
+ self.showViewTree = Tkinter.BooleanVar()
+ self.showViewTree.set(False)
+ state = NORMAL if culebron.vc else DISABLED
+ self.viewMenu.add_checkbutton(label="Tree", underline=0, accelerator='Command-T', onvalue=True,
+ offvalue=False, variable=self.showViewTree, state=state,
+ command=self.onshowViewTreeChanged)
+ self.showViewDetails = Tkinter.BooleanVar()
+ self.showViewDetails.set(False)
+ state = NORMAL if culebron.vc else DISABLED
+ self.viewMenu.add_checkbutton(label="View details", underline=0, accelerator='Command-V', onvalue=True,
+ offvalue=False, variable=self.showViewDetails, state=state,
+ command=self.onShowViewDetailsChanged)
+ self.add_cascade(label="View", underline=0, menu=self.viewMenu)
+
+ self.uiDeviceMenu = Tkinter.Menu(self, tearoff=False)
+ state = NORMAL if culebron.vc else DISABLED
+ self.uiDeviceMenu.add_command(label="Open Notification", underline=6, state=state,
+ command=lambda: culebron.executeCommandAndRefresh(
+ self.culebron.vc.uiDevice.openNotification))
+ state = NORMAL if culebron.vc else DISABLED
+ self.uiDeviceMenu.add_command(label="Open Quick settings", underline=6, state=state,
+ command=lambda: culebron.executeCommandAndRefresh(
+ command=self.culebron.vc.uiDevice.openQuickSettings))
+ state = NORMAL if culebron.vc else DISABLED
+ self.uiDeviceMenu.add_command(label="Change Language", underline=7, state=state,
+ command=self.culebron.changeLanguage)
+ self.add_cascade(label="UiDevice", menu=self.uiDeviceMenu)
+
+ self.helpMenu = Tkinter.Menu(self, tearoff=False)
+ self.helpMenu.add_command(label="Keyboard shortcuts", underline=0, accelerator='Command-K',
+ command=self.culebron.showHelp)
+ self.add_cascade(label="Help", underline=0, menu=self.helpMenu)
+
+ def callback(self):
+ pass
+
+ def onshowViewTreeChanged(self):
+ if self.showViewTree.get() == 1:
+ self.culebron.showViewTree()
+ else:
+ self.culebron.hideViewTree()
+
+ def onShowViewDetailsChanged(self):
+ if self.showViewDetails.get() == 1:
+ self.culebron.showViewDetails()
+ else:
+ self.culebron.hideViewDetails()
+
+
+ class ViewTree(Tkinter.Frame):
+ def __init__(self, parent):
+ Tkinter.Frame.__init__(self, parent)
+ self.viewTree = ttk.Treeview(self, columns=['T'], height=35)
+ self.viewTree.column(0, width=20)
+ self.viewTree.heading('#0', None, text='View', anchor=Tkinter.W)
+ self.viewTree.heading(0, None, text='T', anchor=Tkinter.W)
+ self.scrollbar = ttk.Scrollbar(self, orient=Tkinter.HORIZONTAL, command=self.__xscroll)
+ self.viewTree.grid(row=1, rowspan=1, column=1, sticky=Tkinter.N + Tkinter.S)
+ self.scrollbar.grid(row=2, rowspan=1, column=1, sticky=Tkinter.E + Tkinter.W)
+ self.viewTree.configure(xscrollcommand=self.scrollbar.set)
+
+ def __xscroll(self, *args):
+ if DEBUG:
+ print >> sys.stderr, "__xscroll:", args
+ self.viewTree.xview(*args)
+
+ def insert(self, parent, index, iid=None, **kw):
+ """Creates a new item and return the item identifier of the newly
+ created item.
+
+ parent is the item ID of the parent item, or the empty string
+ to create a new top-level item. index is an integer, or the value
+ end, specifying where in the list of parent's children to insert
+ the new item. If index is less than or equal to zero, the new node
+ is inserted at the beginning, if index is greater than or equal to
+ the current number of children, it is inserted at the end. If iid
+ is specified, it is used as the item identifier, iid must not
+ already exist in the tree. Otherwise, a new unique identifier
+ is generated."""
+
+ return self.viewTree.insert(parent, index, iid, **kw)
+
+ def set(self, item, column=None, value=None):
+ """With one argument, returns a dictionary of column/value pairs
+ for the specified item. With two arguments, returns the current
+ value of the specified column. With three arguments, sets the
+ value of given column in given item to the specified value."""
+
+ return self.viewTree.set(item, column, value)
+
+ def tag_bind(self, tagname, sequence=None, callback=None):
+ if DEBUG:
+ print >> sys.stderr, 'ViewTree.tag_bind(', tagname, ',', sequence, ',', callback, ')'
+ return self.viewTree.tag_bind(tagname, sequence, callback)
+
+
+ class ViewDetails(Tkinter.Frame):
+ VIEW_DETAILS = "View Details:\n"
+
+ def __init__(self, parent):
+ Tkinter.Frame.__init__(self, parent)
+ self.label = Tkinter.Label(self, bd=1, width=30, wraplength=200, justify=Tkinter.LEFT, anchor=Tkinter.NW)
+ self.label.configure(text=self.VIEW_DETAILS)
+ self.label.configure(bg="white")
+ self.label.grid(row=3, column=1, rowspan=1)
+
+ def set(self, view):
+ self.label.configure(text=self.VIEW_DETAILS + view.__str__())
+
+
+ class StatusBar(Tkinter.Frame):
+
+ def __init__(self, parent):
+ Tkinter.Frame.__init__(self, parent)
+ self.label = Tkinter.Label(self, bd=1, relief=Tkinter.SUNKEN, anchor=Tkinter.W)
+ self.label.grid(row=1, column=1, columnspan=2, sticky=Tkinter.E + Tkinter.W)
+
+ def set(self, fmt, *args):
+ self.label.config(text=fmt % args)
+ self.label.update_idletasks()
+
+ def clear(self):
+ self.label.config(text="")
+ self.label.update_idletasks()
+
+
+ class LabeledEntry():
+ def __init__(self, parent, text, validate, validatecmd):
+ self.f = Tkinter.Frame(parent)
+ Tkinter.Label(self.f, text=text, anchor="w", padx=8).grid(row=1, column=1, sticky=Tkinter.E)
+ self.entry = Tkinter.Entry(self.f, validate=validate, validatecommand=validatecmd)
+ self.entry.grid(row=1, column=2, padx=5, sticky=Tkinter.E)
+
+ def grid(self, **kwargs):
+ self.f.grid(kwargs)
+
+ def get(self):
+ return self.entry.get()
+
+ def set(self, text):
+ self.entry.delete(0, Tkinter.END)
+ self.entry.insert(0, text)
+
+
+ class LabeledEntryWithButton(LabeledEntry):
+ def __init__(self, parent, text, buttonText, command, validate, validatecmd):
+ LabeledEntry.__init__(self, parent, text, validate, validatecmd)
+ self.button = Tkinter.Button(self.f, text=buttonText, command=command)
+ self.button.grid(row=1, column=3)
+
+
+ class DragDialog(Tkinter.Toplevel):
+
+ DEFAULT_DURATION = 1000
+ DEFAULT_STEPS = 20
+
+ spX = None
+ spY = None
+ epX = None
+ epY = None
+ spId = None
+ epId = None
+
+ def __init__(self, culebron):
+ self.culebron = culebron
+ self.parent = culebron.window
+ Tkinter.Toplevel.__init__(self, self.parent)
+ self.transient(self.parent)
+ self.culebron.setDragDialogShowed(True)
+ self.title("Drag: selecting parameters")
+
+ # valid percent substitutions (from the Tk entry man page)
+ # %d = Type of action (1=insert, 0=delete, -1 for others)
+ # %i = index of char string to be inserted/deleted, or -1
+ # %P = value of the entry if the edit is allowed
+ # %s = value of entry prior to editing
+ # %S = the text string being inserted or deleted, if any
+ # %v = the type of validation that is currently set
+ # %V = the type of validation that triggered the callback
+ # (key, focusin, focusout, forced)
+ # %W = the tk name of the widget
+ self.validate = (self.parent.register(self.onValidate), '%P')
+ self.sp = LabeledEntryWithButton(self, "Start point", "Grab", command=self.onGrabSp, validate="focusout",
+ validatecmd=self.validate)
+ self.sp.grid(row=1, column=1, columnspan=3, pady=5)
+
+ self.ep = LabeledEntryWithButton(self, "End point", "Grab", command=self.onGrabEp, validate="focusout",
+ validatecmd=self.validate)
+ self.ep.grid(row=2, column=1, columnspan=3, pady=5)
+
+ l = Tkinter.Label(self, text="Units")
+ l.grid(row=3, column=1, sticky=Tkinter.E)
+
+ self.units = Tkinter.StringVar()
+ self.units.set(Unit.DIP)
+ col = 2
+ for u in dir(Unit):
+ if u.startswith('_'):
+ continue
+ rb = Tkinter.Radiobutton(self, text=u, variable=self.units, value=u)
+ rb.grid(row=3, column=col, padx=20, sticky=Tkinter.E)
+ col += 1
+
+ self.d = LabeledEntry(self, "Duration", validate="focusout", validatecmd=self.validate)
+ self.d.set(DragDialog.DEFAULT_DURATION)
+ self.d.grid(row=4, column=1, columnspan=3, pady=5)
+
+ self.s = LabeledEntry(self, "Steps", validate="focusout", validatecmd=self.validate)
+ self.s.set(DragDialog.DEFAULT_STEPS)
+ self.s.grid(row=5, column=1, columnspan=2, pady=5)
+
+ self.buttonBox()
+
+ def buttonBox(self):
+ # add standard button box. override if you don't want the
+ # standard buttons
+
+ box = Tkinter.Frame(self)
+
+ self.ok = Tkinter.Button(box, text="OK", width=10, command=self.onOk, default=Tkinter.ACTIVE,
+ state=Tkinter.DISABLED)
+ self.ok.grid(row=6, column=1, sticky=Tkinter.E, padx=5, pady=5)
+ w = Tkinter.Button(box, text="Cancel", width=10, command=self.onCancel)
+ w.grid(row=6, column=2, sticky=Tkinter.E, padx=5, pady=5)
+
+ self.bind("<Return>", self.onOk)
+ self.bind("<Escape>", self.onCancel)
+
+ box.grid(row=6, column=1, columnspan=3)
+
+ def onValidate(self, value):
+ if self.sp.get() and self.ep.get() and self.d.get() and self.s.get():
+ self.ok.configure(state=Tkinter.NORMAL)
+ else:
+ self.ok.configure(state=Tkinter.DISABLED)
+
+ def onOk(self, event=None):
+ if DEBUG:
+ print >> sys.stderr, "onOK()"
+ print >> sys.stderr, "values are:",
+ print >> sys.stderr, self.sp.get(),
+ print >> sys.stderr, self.ep.get(),
+ print >> sys.stderr, self.d.get(),
+ print >> sys.stderr, self.s.get(),
+ print >> sys.stderr, self.units.get()
+
+ sp = make_tuple(self.sp.get())
+ ep = make_tuple(self.ep.get())
+ d = int(self.d.get())
+ s = int(self.s.get())
+ self.cleanUp()
+ # put focus back to the parent window's canvas
+ self.culebron.canvas.focus_set()
+ self.destroy()
+ self.culebron.drag(sp, ep, d, s, self.units.get())
+
+ def onCancel(self, event=None):
+ self.culebron.setGrab(False)
+ self.cleanUp()
+ # put focus back to the parent window's canvas
+ self.culebron.canvas.focus_set()
+ self.destroy()
+
+ def onGrabSp(self):
+ '''
+ Grab starting point
+ '''
+
+ self.sp.entry.focus_get()
+ self.onGrab(self.sp)
+
+ def onGrabEp(self):
+ '''
+ Grab ending point
+ '''
+
+ self.ep.entry.focus_get()
+ self.onGrab(self.ep)
+
+ def onGrab(self, entry):
+ '''
+ Generic grab method.
+
+ @param entry: the entry being grabbed
+ @type entry: Tkinter.Entry
+ '''
+
+ self.culebron.setOnTouchListener(self.onTouchListener)
+ self.__grabbing = entry
+ self.culebron.setGrab(True)
+
+ def onTouchListener(self, point):
+ '''
+ Listens for touch events and draws the corresponding shapes on the Culebron canvas.
+ If the starting point is being grabbed it draws the touching point via
+ C{Culebron.drawTouchedPoint()} and if the end point is being grabbed it draws
+ using C{Culebron.drawDragLine()}.
+
+ @param point: the point touched
+ @type point: tuple
+ '''
+
+ x = point[0]
+ y = point[1]
+ value = "(%d,%d)" % (x, y)
+ self.__grabbing.set(value)
+ self.onValidate(value)
+ self.culebron.setGrab(False)
+ if self.__grabbing == self.sp:
+ self.__cleanUpSpId()
+ self.__cleanUpEpId()
+ self.spX = x
+ self.spY = y
+ elif self.__grabbing == self.ep:
+ self.__cleanUpEpId()
+ self.epX = x
+ self.epY = y
+ if self.spX and self.spY and not self.spId:
+ self.spId = self.culebron.drawTouchedPoint(self.spX, self.spY)
+ if self.spX and self.spY and self.epX and self.epY and not self.epId:
+ self.epId = self.culebron.drawDragLine(self.spX, self.spY, self.epX, self.epY)
+ self.__grabbing = None
+ self.culebron.setOnTouchListener(None)
+
+ def __cleanUpSpId(self):
+ if self.spId:
+ self.culebron.canvas.delete(self.spId)
+ self.spId = None
+
+ def __cleanUpEpId(self):
+ if self.epId:
+ self.culebron.canvas.delete(self.epId)
+ self.epId = None
+
+ def cleanUp(self):
+ self.__cleanUpSpId()
+ self.__cleanUpEpId()
+
+
+ class ContextMenu(Tkinter.Menu):
+ # FIXME: should get rid of the nested classes, otherwise it's not possible to create a parent class
+ # SubMenu for UiScrollableSubMenu
+ '''
+ The context menu (popup).
+ '''
+
+ PADDING = ' '
+ ''' Padding used to separate menu entries from border '''
+
+ class Separator():
+ SEPARATOR = 'SEPARATOR'
+
+ def __init__(self):
+ self.description = self.SEPARATOR
+
+ class Command():
+ def __init__(self, description, underline, shortcut, event, command):
+ self.description = description
+ self.underline = underline
+ self.shortcut = shortcut
+ self.event = event
+ self.command = command
+
+ class UiScrollableSubMenu(Tkinter.Menu):
+ def __init__(self, menu, description, view, culebron):
+ # Tkninter.Menu is not extending object, so we can't do this:
+ # super(ContextMenu, self).__init__(culebron.window, tearoff=False)
+ Tkinter.Menu.__init__(self, menu, tearoff=False)
+ self.description = description
+ self.add_command(label='Fling backward',
+ command=lambda: culebron.executeCommandAndRefresh(view.uiScrollable.flingBackward))
+ self.add_command(label='Fling forward',
+ command=lambda: culebron.executeCommandAndRefresh(view.uiScrollable.flingForward))
+ self.add_command(label='Fling to beginning',
+ command=lambda: culebron.executeCommandAndRefresh(view.uiScrollable.flingToBeginning))
+ self.add_command(label='Fling to end',
+ command=lambda: culebron.executeCommandAndRefresh(view.uiScrollable.flingToEnd))
+
+ def __init__(self, culebron, view):
+ # Tkninter.Menu is not extending object, so we can't do this:
+ # super(ContextMenu, self).__init__(culebron.window, tearoff=False)
+ Tkinter.Menu.__init__(self, culebron.window, tearoff=False)
+ if DEBUG_CONTEXT_MENU:
+ print >> sys.stderr, "Creating ContextMenu for", view.__smallStr__() if view else "No View"
+ self.view = view
+ items = []
+
+ if self.view:
+ _saveViewSnapshotForSelectedView = lambda: culebron.saveViewSnapshot(self.view)
+ items.append(ContextMenu.Command('Take view snapshot and save to file', 5, 'Ctrl+W', '<Control-W>',
+ _saveViewSnapshotForSelectedView))
+ if self.view.uiScrollable:
+ items.append(ContextMenu.UiScrollableSubMenu(self, 'UiScrollable', view, culebron))
+ else:
+ parent = self.view.parent
+ while parent:
+ if parent.uiScrollable:
+ # WARNING:
+ # A bit dangerous, but may work
+ # If we click ona ListView then the View pased to this ContextMenu is the child,
+ # perhaps we want to scroll the parent
+ items.append(ContextMenu.UiScrollableSubMenu(self, 'UiScrollable', parent, culebron))
+ break
+ parent = parent.parent
+ items.append(ContextMenu.Separator())
+
+ items.append(ContextMenu.Command('Drag dialog', 0, 'Ctrl+D', '<Control-D>', culebron.showDragDialog))
+ items.append(ContextMenu.Command('Take snapshot and save to file', 26, 'Ctrl+F', '<Control-F>',
+ culebron.saveSnapshot))
+ items.append(ContextMenu.Command('Control Panel', 0, 'Ctrl+K', '<Control-K>', culebron.showControlPanel))
+ items.append(ContextMenu.Command('Long touch point using PX', 0, 'Ctrl+L', '<Control-L>',
+ culebron.toggleLongTouchPoint))
+ items.append(ContextMenu.Command('Long touch View', 0, None, None,
+ culebron.toggleLongTouchView))
+ items.append(
+ ContextMenu.Command('Touch using DIP', 13, 'Ctrl+I', '<Control-I>', culebron.toggleTouchPointDip))
+ items.append(
+ ContextMenu.Command('Touch using PX', 12, 'Ctrl+P', '<Control-P>', culebron.toggleTouchPointPx))
+ items.append(ContextMenu.Command('Generates a Sleep() on output script', 12, 'Ctrl+S', '<Control-S>',
+ culebron.showSleepDialog))
+ if culebron.vc is not None:
+ items.append(ContextMenu.Command('Toggle generating Test Condition', 18, 'Ctrl+T', '<Control-T>',
+ culebron.toggleGenerateTestCondition))
+ items.append(ContextMenu.Command('Touch Zones', 6, 'Ctrl+Z', '<Control-Z>', culebron.toggleTargetZones))
+ items.append(ContextMenu.Command('Generates a startActivity()', 17, 'Ctrl+A', '<Control-A>',
+ culebron.printStartActivityAtTop))
+ items.append(ContextMenu.Command('Refresh', 0, 'F5', '<F5>', culebron.refresh))
+ items.append(ContextMenu.Command('Wake up', 0, None, None, culebron.wake))
+ items.append(ContextMenu.Separator())
+ items.append(ContextMenu.Command('Quit', 0, 'Ctrl+Q', '<Control-Q>', culebron.quit))
+
+ for item in items:
+ self.addItem(item)
+
+ def addItem(self, item):
+ if isinstance(item, ContextMenu.Separator):
+ self.addSeparator()
+ elif isinstance(item, ContextMenu.Command):
+ self.addCommand(item)
+ elif isinstance(item, ContextMenu.UiScrollableSubMenu):
+ self.addSubMenu(item)
+ else:
+ raise RuntimeError("Unsupported item=" + str(item))
+
+ def addSeparator(self):
+ self.add_separator()
+
+ def addCommand(self, item):
+ self.add_command(label=self.PADDING + item.description, underline=item.underline + len(self.PADDING),
+ command=item.command, accelerator=item.shortcut)
+ # if item.event:
+ # # These bindings remain even after the menu has been dismissed, so it seems not a good idea
+ # #self.bind_all(item.event, item.command)
+ # pass
+
+ def addSubMenu(self, item):
+ self.add_cascade(label=self.PADDING + item.description, menu=item)
+
+ def showPopupMenu(self, event):
+ try:
+ self.tk_popup(event.x_root, event.y_root)
+ finally:
+ # make sure to release the grab (Tk 8.0a1 only)
+ # self.grab_release()
+ pass
+
+
+ class HelpDialog(Tkinter.Toplevel):
+
+ def __init__(self, culebron):
+ self.culebron = culebron
+ self.parent = culebron.window
+ Tkinter.Toplevel.__init__(self, self.parent)
+ # self.transient(self.parent)
+ self.title("%s: help" % Culebron.APPLICATION_NAME)
+
+ self.text = ScrolledText.ScrolledText(self, width=60, height=40)
+ self.text.insert(Tkinter.INSERT, '''
+ Special keys
+ ------------
+
+ F1: Help
+ F5: Refresh
+
+ Mouse Buttons
+ -------------
+ <1>: Touch the underlying View
+
+ Commands
+ --------
+ Ctrl-A: Generates startActivity() call on output script
+ Ctrl-D: Drag dialog
+ Ctrl-F: Take snapshot and save to file
+ Ctrl-K: Control Panel
+ Ctrl-L: Long touch point using PX
+ Ctrl-I: Touch using DIP
+ Ctrl-P: Touch using PX
+ Ctrl-Q: Quit
+ Ctrl-S: Generates a sleep() on output script
+ Ctrl-T: Toggle generating test condition
+ Ctrl-V: Verifies the content of the screen dump
+ Ctrl-Z: Touch zones
+ ''')
+ self.text.grid(row=1, column=1)
+
+ self.buttonBox()
+
+ def buttonBox(self):
+ # add standard button box. override if you don't want the
+ # standard buttons
+
+ box = Tkinter.Frame(self)
+
+ w = Tkinter.Button(box, text="Dismiss", width=10, command=self.onDismiss, default=Tkinter.ACTIVE)
+ w.grid(row=1, column=1, padx=5, pady=5)
+
+ self.bind("<Return>", self.onDismiss)
+ self.bind("<Escape>", self.onDismiss)
+
+ box.grid(row=1, column=1)
+
+ def onDismiss(self, event=None):
+ # put focus back to the parent window's canvas
+ self.culebron.canvas.focus_set()
+ self.destroy()
+
+
+ class FileDialog():
+ def __init__(self, culebron, filename):
+ self.parent = culebron.window
+ self.filename = filename
+ self.basename = os.path.basename(self.filename)
+ self.dirname = os.path.dirname(self.filename)
+ self.ext = os.path.splitext(self.filename)[1]
+ self.fileTypes = [('images', self.ext)]
+
+ def askSaveAsFilename(self):
+ return tkFileDialog.asksaveasfilename(parent=self.parent, filetypes=self.fileTypes,
+ defaultextension=self.ext, initialdir=self.dirname,
+ initialfile=self.basename)
diff --git a/AndroidViewClient/src/com/dtmilano/android/robotframework/__init__.py b/AndroidViewClient/src/com/dtmilano/android/robotframework/__init__.py
new file mode 100755
index 0000000..d9b1a4e
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/robotframework/__init__.py
@@ -0,0 +1 @@
+__author__ = 'diego'
diff --git a/AndroidViewClient/src/com/dtmilano/android/robotframework/viewclientwrapper.py b/AndroidViewClient/src/com/dtmilano/android/robotframework/viewclientwrapper.py
new file mode 100755
index 0000000..2fb11a2
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/robotframework/viewclientwrapper.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Nov 10, 2015
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+
+__version__ = '11.5.9'
+__author__ = 'diego'
+
+import sys
+from com.dtmilano.android.viewclient import ViewClient
+
+
+"""A library to integrate *AndroidViewClient/culebra* tests with Robotframework.
+
+To import this wrapper you have to use::
+
+**Settings**
+...
+Library com.dtmilano.android.robotframework.viewclientwrapper.ViewClientWrapper serialno=<your-device>
+
+
+This documentation is created using reStructuredText__.
+
+__ http://docutils.sourceforge.net
+"""
+
+DEBUG = False
+ROBOT_LIBRARY_DOC_FORMAT = 'reST'
+
+class ViewClientWrapper:
+ def __init__(self, serialno):
+ device, serialno = ViewClient.connectToDeviceOrExit(serialno=serialno)
+ self.vc = ViewClient(device, serialno)
+ self.device = device
+ if DEBUG:
+ print >> sys.stderr, "ViewClientWrapper: connected to", device, serialno
+
+ def dump(self):
+ """Dumps window hierarchy."""
+ return self.vc.dump()
+
+ def touch(self, x, y):
+ """Touches a point.
+
+ :param x: x
+ :param y: y
+ :return:
+ """
+ return self.vc.touch(x, y)
+
+ @staticmethod
+ def long_touch_view(view):
+ """Long-touches the view."""
+ return view.longTouch()
+
+ @staticmethod
+ def touch_view(view):
+ """Touches the View"""
+ return view.touch()
+
+ @staticmethod
+ def get_view_position_and_size(view):
+ """ Gets the View position and size
+ :param view: the View
+ :return: the position and size
+ """
+ return view.getPositionAndSize()
+
+ def find_view_with_text(self, text):
+ return self.vc.findViewWithText(text)
+
+ def find_view_by_id(self, id):
+ return self.vc.findViewById(id)
+
+ def start_activity(self, component):
+ """Starts Activity."""
+ return self.vc.device.startActivity(component)
+
+ def get_top_activity_name(self):
+ return self.device.getTopActivityName()
+
+ def force_stop_package(self, package):
+ self.device.shell('am force-stop %s' % package)
+
+ def get_windows(self):
+ return self.device.getWindows()
+
+ def is_keyboard_show(self):
+ return self.device.isKeyboardShown()
+
diff --git a/AndroidViewClient/src/com/dtmilano/android/uiautomator/__init__.py b/AndroidViewClient/src/com/dtmilano/android/uiautomator/__init__.py
new file mode 100755
index 0000000..d9b1a4e
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/uiautomator/__init__.py
@@ -0,0 +1 @@
+__author__ = 'diego'
diff --git a/AndroidViewClient/src/com/dtmilano/android/uiautomator/uiautomatorhelper.py b/AndroidViewClient/src/com/dtmilano/android/uiautomator/uiautomatorhelper.py
new file mode 100755
index 0000000..87ab95f
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/uiautomator/uiautomatorhelper.py
@@ -0,0 +1,305 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Feb 2, 2015
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+
+__version__ = '11.5.9'
+
+import os
+import subprocess
+import sys
+import platform
+import threading
+import re
+import json
+try:
+ import requests
+ REQUESTS_AVAILABLE = True
+except:
+ REQUESTS_AVAILABLE = False
+import time
+from com.dtmilano.android.adb.adbclient import AdbClient
+from com.dtmilano.android.common import obtainAdbPath
+
+__author__ = 'diego'
+
+
+DEBUG = False
+
+lock = threading.Lock()
+
+class RunTestsThread(threading.Thread):
+ """
+ Runs the instrumentation for the specified package in a new thread.
+ """
+ def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None, adbClient=None, testClass=None, testRunner=None):
+ threading.Thread.__init__(self, group=group, target=target, name=name, verbose=verbose)
+ self.adbClient = adbClient
+ self.testClass = testClass
+ self.testRunner = testRunner
+ self.pkg = re.sub('\.test$', '', self.testClass)
+
+ def run(self):
+ if DEBUG:
+ print >> sys.stderr, "RunTestsThread: Acquiring lock"
+ lock.acquire()
+ if DEBUG:
+ print >> sys.stderr, "RunTestsThread: Lock acquired"
+ self.forceStop()
+ time.sleep(3)
+ if DEBUG:
+ print >> sys.stderr, "Starting test..."
+ print >> sys.stderr, "RunTestsThread: Releasing lock"
+ lock.release()
+ out = self.adbClient.shell('am instrument -w ' + self.testClass + '/' + self.testRunner + '; echo "ERROR: $?"')
+ if DEBUG:
+ print >> sys.stderr, "\nFinished test."
+ errmsg = out.splitlines()[-1]
+ m = re.match('ERROR: (\d+)', errmsg)
+ if m:
+ exitval = int(m.group(1))
+ if exitval != 0:
+ raise RuntimeError('Cannot start test on device: ' + out)
+ else:
+ raise RuntimeError('Unknown message')
+
+ def forceStop(self):
+ if DEBUG:
+ print >> sys.stderr, "Cleaning up before start. Stopping '%s'" % self.pkg
+ self.adbClient.shell('am force-stop ' + self.pkg)
+
+
+class UiAutomatorHelper:
+ PACKAGE = 'com.dtmilano.android.culebratester'
+ TEST_CLASS = PACKAGE + '.test'
+ TEST_RUNNER = 'com.dtmilano.android.uiautomatorhelper.UiAutomatorHelperTestRunner'
+
+ def __init__(self, adbclient, adb=None, localport=9999, remoteport=9999, hostname='localhost'):
+ if not REQUESTS_AVAILABLE:
+ raise Exception('''Python Requests is needed for UiAutomatorHelper to work.
+
+On Ubuntu install
+
+ $ sudo apt-get install python-requests
+
+On OSX install
+
+ $ easy_install requests
+''')
+
+ self.adbClient = adbclient
+ ''' The adb client (a.k.a. device) '''
+ instrumentation = self.adbClient.shell('pm list instrumentation %s' % self.PACKAGE)
+ if not re.match('instrumentation:%s/%s \(target=%s\)' % (self.TEST_CLASS, self.TEST_RUNNER, self.PACKAGE), instrumentation):
+ raise RuntimeError('The target device does not contain the instrumentation for %s' % self.PACKAGE)
+ self.adb = self.__whichAdb(adb)
+ ''' The adb command '''
+ self.osName = platform.system()
+ ''' The OS name. We sometimes need specific behavior. '''
+ self.isDarwin = (self.osName == 'Darwin')
+ ''' Is it Mac OSX? '''
+ self.hostname = hostname
+ ''' The hostname we are connecting to. '''
+ if hostname in ['localhost', '127.0.0.1']:
+ self.__redirectPort(localport, remoteport)
+ self.__runTests()
+ self.baseUrl = 'http://%s:%d' % (hostname, localport)
+ try:
+ self.session = self.__connectSession()
+ except RuntimeError, ex:
+ self.thread.forceStop()
+ raise ex
+
+
+ def __connectSession(self):
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: Acquiring lock"
+ lock.acquire()
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: Lock acquired"
+ print >> sys.stderr, "UiAutomatorHelper: Connecting session"
+ session = requests.Session()
+ if not session:
+ raise RuntimeError("Cannot create session")
+ tries = 10
+ while tries > 0:
+ time.sleep(0.5)
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: Attempting to connect to", self.baseUrl, '(tries=%s)' % tries
+ try:
+ response = session.head(self.baseUrl)
+ if response.status_code == 200:
+ break
+ except requests.exceptions.ConnectionError, ex:
+ tries -= 1
+ lock.release()
+ if tries == 0:
+ raise RuntimeError("Cannot connect to " + self.baseUrl)
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: HEAD", response
+ print >> sys.stderr, "UiAutomatorHelper: Releasing lock"
+ #lock.release()
+ return session
+
+ def __whichAdb(self, adb):
+ if adb:
+ if not os.access(adb, os.X_OK):
+ raise Exception('adb="%s" is not executable' % adb)
+ else:
+ # Using adbclient we don't need adb executable yet (maybe it's needed if we want to
+ # start adb if not running) or to redirect ports
+ adb = obtainAdbPath()
+
+ return adb
+
+ def __redirectPort(self, localport, remoteport):
+ self.localPort = localport
+ self.remotePort = remoteport
+ subprocess.check_call([self.adb, '-s', self.adbClient.serialno, 'forward', 'tcp:%d' % self.localPort,
+ 'tcp:%d' % self.remotePort])
+
+ def __runTests(self):
+ if DEBUG:
+ print >> sys.stderr, "__runTests: start"
+ # We need a new AdbClient instance with timeout=None (means, no timeout) for the long running test service
+ newAdbClient = AdbClient(self.adbClient.serialno, self.adbClient.hostname, self.adbClient.port, timeout=None)
+ self.thread = RunTestsThread(adbClient=newAdbClient, testClass=self.TEST_CLASS, testRunner=self.TEST_RUNNER)
+ if DEBUG:
+ print >> sys.stderr, "__runTests: starting thread"
+ self.thread.start()
+ if DEBUG:
+ print >> sys.stderr, "__runTests: end"
+
+
+ def __httpCommand(self, url, params=None, method='GET'):
+ if method == 'GET':
+ if params:
+ response = self.session.get(self.baseUrl + url, params=params)
+ else:
+ response = self.session.get(self.baseUrl + url)
+ elif method == 'PUT':
+ response = self.session.put(self.baseUrl + url, params=params)
+ else:
+ raise RuntimeError("method not supported: " + method)
+ return response.content
+
+ #
+ # Device
+ #
+ def getDisplayRealSize(self):
+ return self.__httpCommand('/Device/getDisplayRealSize')
+
+ #
+ # UiAutomatorHelper internal commands
+ #
+ def quit(self):
+ try:
+ self.__httpCommand('/UiAutomatorHelper/quit')
+ except:
+ pass
+ self.session.close()
+
+ #
+ # UiDevice
+ #
+ def click(self, **kwargs):
+ params = kwargs
+ if not ((params.has_key('x') and params.has_key('y')) or params.has_key('oid')):
+ raise RuntimeError('click: (x, y) or oid must have a value')
+ if params.has_key('oid'):
+ return self.__httpCommand('/UiObject2/%d/click' % params['oid'])
+ else:
+ return self.__httpCommand('/UiDevice/click', params)
+
+ def dumpWindowHierarchy(self):
+ dump = self.__httpCommand('/UiDevice/dumpWindowHierarchy').decode(encoding='UTF-8', errors='replace')
+ if DEBUG:
+ print >> sys.stderr, "DUMP: ", dump
+ return dump
+
+ def findObject(self, **kwargs):
+ params = kwargs
+ if not (params.has_key('resourceId') or params.has_key('bySelector')):
+ raise RuntimeError('findObject: resourceId or bySelector must have a value')
+ response = self.__httpCommand('/UiDevice/findObject', params)
+ # { "status": "OK", "oid": 1, "className": "android.view.View"}
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: findObject: response=", response
+ r = json.loads(response)
+ if r[u'status'] == 'OK':
+ if DEBUG:
+ print >> sys.stderr, "UiAutomatorHelper: findObject: returning", int(r[u'oid'])
+ return UiObject(self, int(r[u'oid']))
+ raise RuntimeError("Error: " + response)
+
+ def longClick(self, **kwargs):
+ params = kwargs
+ if not ((params.has_key('x') and params.has_key('y')) or params.has_key('oid')):
+ raise RuntimeError('longClick: (x, y) or oid must have a value')
+ if params.has_key('oid'):
+ return self.__httpCommand('/UiObject2/%d/longClick' % params['oid'])
+ else:
+ return self.__httpCommand('/UiDevice/longClick', params)
+
+ def pressBack(self):
+ return self.__httpCommand('/UiDevice/pressBack')
+
+ def pressHome(self):
+ return self.__httpCommand('/UiDevice/pressHome')
+
+ def pressKeyCode(self, keyCode, metaState=0):
+ params = {'keyCode': keyCode, 'metaState': metaState}
+ return self.__httpCommand('/UiDevice/pressKeyCode', params)
+
+ def pressRecentApps(self):
+ return self.__httpCommand('/UiDevice/pressRecentApps')
+
+ def swipe(self, startX=-1, startY=-1, endX=-1, endY=-1, steps=10, segments=[], segmentSteps=5):
+ if startX != -1 and startY != -1:
+ params = {'startX': startX, 'startY': startY, 'endX': endX, 'endY': endY, 'steps': steps}
+ elif segments:
+ params = {'segments': ','.join(str(p) for p in segments), "segmentSteps": segmentSteps}
+ else:
+ raise RuntimeError("Cannot determine method invocation from provided parameters. startX and startY or segments must be provided.")
+ return self.__httpCommand('/UiDevice/swipe', params)
+
+ def takeScreenshot(self, scale=1.0, quality=90):
+ params = {'scale': scale, 'quality': quality}
+ return self.__httpCommand('/UiDevice/takeScreenshot', params)
+
+ #
+ # UiObject
+ #
+ def setText(self, uiObject, text):
+ params = {'text': text}
+ return self.__httpCommand('/UiObject/0x%x/setText' % (uiObject.oid), params)
+
+
+class UiObject:
+ def __init__(self, uiAutomatorHelper, oid):
+ self.uiAutomatorHelper = uiAutomatorHelper
+ self.oid = oid
+
+ def click(self):
+ self.uiAutomatorHelper.click(oid=self.oid)
+
+ def longClick(self):
+ self.uiAutomatorHelper.longClick(oid=self.oid)
+
+ def setText(self, text):
+ self.uiAutomatorHelper.setText(uiObject=self, text=text)
diff --git a/AndroidViewClient/src/com/dtmilano/android/viewclient.py b/AndroidViewClient/src/com/dtmilano/android/viewclient.py
new file mode 100755
index 0000000..820a8b2
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/viewclient.py
@@ -0,0 +1,4544 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Feb 2, 2012
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+
+__version__ = '11.5.9'
+
+import sys
+import warnings
+if sys.executable:
+ if 'monkeyrunner' in sys.executable:
+ warnings.warn(
+ '''
+
+ You should use a 'python' interpreter, not 'monkeyrunner' for this module
+
+ ''', RuntimeWarning)
+import subprocess
+import re
+import socket
+import os
+import types
+import time
+import signal
+import copy
+import pickle
+import platform
+import xml.parsers.expat
+import unittest
+import StringIO
+from com.dtmilano.android.common import _nd, _nh, _ns, obtainPxPy, obtainVxVy,\
+ obtainVwVh, obtainAdbPath
+from com.dtmilano.android.window import Window
+from com.dtmilano.android.adb import adbclient
+from com.dtmilano.android.uiautomator.uiautomatorhelper import UiAutomatorHelper
+
+DEBUG = False
+DEBUG_DEVICE = DEBUG and False
+DEBUG_RECEIVED = DEBUG and False
+DEBUG_TREE = DEBUG and False
+DEBUG_GETATTR = DEBUG and False
+DEBUG_CALL = DEBUG and False
+DEBUG_COORDS = DEBUG and False
+DEBUG_TOUCH = DEBUG and False
+DEBUG_STATUSBAR = DEBUG and False
+DEBUG_WINDOWS = DEBUG and False
+DEBUG_BOUNDS = DEBUG and False
+DEBUG_DISTANCE = DEBUG and False
+DEBUG_MULTI = DEBUG and False
+DEBUG_VIEW = DEBUG and False
+DEBUG_VIEW_FACTORY = DEBUG and False
+DEBUG_CHANGE_LANGUAGE = DEBUG and False
+DEBUG_UI_AUTOMATOR_HELPER = DEBUG and False
+DEBUG_NAV_BUTTONS = DEBUG and False
+
+WARNINGS = False
+
+VIEW_SERVER_HOST = 'localhost'
+VIEW_SERVER_PORT = 4939
+
+ADB_DEFAULT_PORT = 5555
+
+OFFSET = 25
+''' This assumes the smallest touchable view on the screen is approximately 50px x 50px
+ and touches it at M{(x+OFFSET, y+OFFSET)} '''
+
+USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES = True
+''' Use C{AdbClient} to obtain the needed properties. If this is
+ C{False} then C{adb shell getprop} is used '''
+
+USE_PHYSICAL_DISPLAY_INFO = True
+''' Use C{dumpsys display} to obtain display properties. If this is
+ C{False} then C{USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES} is used '''
+
+SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED = False
+''' Skips some classes related with the Action Bar and the PhoneWindow$DecorView in the
+ coordinates calculation
+ @see: L{View.getXY()} '''
+
+VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED = False
+''' Under some conditions the touch event should be longer [t(DOWN) << t(UP)]. C{True} enables a
+ workaround to delay the events.'''
+
+# some device properties
+VERSION_SDK_PROPERTY = 'ro.build.version.sdk'
+VERSION_RELEASE_PROPERTY = 'ro.build.version.release'
+
+# some constants for the attributes
+ID_PROPERTY = 'mID'
+ID_PROPERTY_UI_AUTOMATOR = 'uniqueId'
+TEXT_PROPERTY = 'text:mText'
+TEXT_PROPERTY_API_10 = 'mText'
+TEXT_PROPERTY_UI_AUTOMATOR = 'text'
+WS = u"\xfe" # the whitespace replacement char for TEXT_PROPERTY
+TAG_PROPERTY = 'getTag()'
+LEFT_PROPERTY = 'layout:mLeft'
+LEFT_PROPERTY_API_8 = 'mLeft'
+TOP_PROPERTY = 'layout:mTop'
+TOP_PROPERTY_API_8 = 'mTop'
+WIDTH_PROPERTY = 'layout:getWidth()'
+WIDTH_PROPERTY_API_8 = 'getWidth()'
+HEIGHT_PROPERTY = 'layout:getHeight()'
+HEIGHT_PROPERTY_API_8 = 'getHeight()'
+GET_VISIBILITY_PROPERTY = 'getVisibility()'
+LAYOUT_TOP_MARGIN_PROPERTY = 'layout:layout_topMargin'
+IS_FOCUSED_PROPERTY_UI_AUTOMATOR = 'focused'
+IS_FOCUSED_PROPERTY = 'focus:isFocused()'
+
+# visibility
+VISIBLE = 0x0
+INVISIBLE = 0x4
+GONE = 0x8
+
+RegexType = type(re.compile(''))
+IP_RE = re.compile('^(\d{1,3}\.){3}\d{1,3}$')
+ID_RE = re.compile('id/([^/]*)(/(\d+))?')
+
+
+class ViewNotFoundException(Exception):
+ '''
+ ViewNotFoundException is raised when a View is not found.
+ '''
+
+ def __init__(self, attr, value, root):
+ if isinstance(value, RegexType):
+ msg = "Couldn't find View with %s that matches '%s' in tree with root=%s" % (attr, value.pattern, root)
+ else:
+ msg = "Couldn't find View with %s='%s' in tree with root=%s" % (attr, value, root)
+ super(Exception, self).__init__(msg)
+
+class View:
+ '''
+ View class
+ '''
+
+ @staticmethod
+ def factory(arg1, arg2, version=-1, forceviewserveruse=False, windowId=None, uiAutomatorHelper=None):
+ '''
+ View factory
+
+ @type arg1: ClassType or dict
+ @type arg2: View instance or AdbClient
+ '''
+
+ if DEBUG_VIEW_FACTORY:
+ print >> sys.stderr, "View.factory(%s, %s, %s, %s, %s, %s)" % (arg1, arg2, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ if type(arg1) == types.ClassType:
+ cls = arg1
+ attrs = None
+ else:
+ cls = None
+ attrs = arg1
+ if isinstance(arg2, View):
+ view = arg2
+ device = None
+ else:
+ device = arg2
+ view = None
+
+ if attrs and attrs.has_key('class'):
+ clazz = attrs['class']
+ if DEBUG_VIEW_FACTORY:
+ print >> sys.stderr, " View.factory: creating View with specific class: %s" % clazz
+ if clazz == 'android.widget.TextView':
+ return TextView(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ elif clazz == 'android.widget.EditText':
+ return EditText(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ elif clazz == 'android.widget.ListView':
+ return ListView(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ else:
+ return View(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ elif cls:
+ if view:
+ return cls.__copy(view)
+ else:
+ return cls(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+ elif view:
+ return copy.copy(view)
+ else:
+ if DEBUG_VIEW_FACTORY:
+ print >> sys.stderr, " View.factory: creating generic View"
+ return View(attrs, device, version, forceviewserveruse, windowId, uiAutomatorHelper)
+
+ @classmethod
+ def __copy(cls, view):
+ '''
+ Copy constructor
+ '''
+
+ return cls(view.map, view.device, view.version, view.forceviewserveruse, view.windowId, view.uiAutomatorHelper)
+
+ def __init__(self, _map, device, version=-1, forceviewserveruse=False, windowId=None, uiAutomatorHelper=None):
+ '''
+ Constructor
+
+ @type _map: map
+ @param _map: the map containing the (attribute, value) pairs
+ @type device: AdbClient
+ @param device: the device containing this View
+ @type version: int
+ @param version: the Android SDK version number of the platform where this View belongs. If
+ this is C{-1} then the Android SDK version will be obtained in this
+ constructor.
+ @type forceviewserveruse: boolean
+ @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions were given
+ to use C{UiAutomator}.
+ @type uiAutomatorHelper: UiAutomatorHelper
+ @:param uiAutomatorHelper: The UiAutomatorHelper if available
+ '''
+
+ if DEBUG_VIEW:
+ print >> sys.stderr, "View.__init__(%s, %s, %s, %s)" % ("map" if _map is not None else None, device, version, forceviewserveruse)
+ if _map:
+ print >> sys.stderr, " map:", type(_map)
+ for attr, val in _map.iteritems():
+ if len(val) > 50:
+ val = val[:50] + "..."
+ print >> sys.stderr, " %s=%s" % (attr, val)
+ self.map = _map
+ ''' The map that contains the C{attr},C{value} pairs '''
+ self.device = device
+ ''' The AdbClient '''
+ self.children = []
+ ''' The children of this View '''
+ self.parent = None
+ ''' The parent of this View '''
+ self.windows = {}
+ self.currentFocus = None
+ ''' The current focus '''
+ self.windowId = windowId
+ ''' The window this view resides '''
+ self.build = {}
+ ''' Build properties '''
+ self.version = version
+ ''' API version number '''
+ self.forceviewserveruse = forceviewserveruse
+ ''' Force ViewServer use '''
+ self.uiScrollable = None
+ ''' If this is a scrollable View this keeps the L{UiScrollable} object '''
+ self.target = False
+ ''' Is this a touch target zone '''
+ self.uiAutomatorHelper = uiAutomatorHelper
+ ''' The UiAutomatorHelper '''
+
+ if version != -1:
+ self.build[VERSION_SDK_PROPERTY] = version
+ else:
+ try:
+ if USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES:
+ self.build[VERSION_SDK_PROPERTY] = int(device.getProperty(VERSION_SDK_PROPERTY))
+ else:
+ self.build[VERSION_SDK_PROPERTY] = int(device.shell('getprop ' + VERSION_SDK_PROPERTY)[:-2])
+ except:
+ self.build[VERSION_SDK_PROPERTY] = -1
+
+ version = self.build[VERSION_SDK_PROPERTY]
+ self.useUiAutomator = (version >= 16) and not forceviewserveruse
+ ''' Whether to use UIAutomator or ViewServer '''
+ self.idProperty = None
+ ''' The id property depending on the View attribute format '''
+ self.textProperty = None
+ ''' The text property depending on the View attribute format '''
+ self.tagProperty = None
+ ''' The tag property depending on the View attribute format '''
+ self.leftProperty = None
+ ''' The left property depending on the View attribute format '''
+ self.topProperty = None
+ ''' The top property depending on the View attribute format '''
+ self.widthProperty = None
+ ''' The width property depending on the View attribute format '''
+ self.heightProperty = None
+ ''' The height property depending on the View attribute format '''
+ self.isFocusedProperty = None
+ ''' The focused property depending on the View attribute format '''
+
+ if version >= 16 and self.useUiAutomator:
+ self.idProperty = ID_PROPERTY_UI_AUTOMATOR
+ self.textProperty = TEXT_PROPERTY_UI_AUTOMATOR
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY_UI_AUTOMATOR
+ elif version > 10 and (version < 16 or self.useUiAutomator):
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+ elif version == 10:
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY_API_10
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+ elif version >= 7 and version < 10:
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY_API_10
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY_API_8
+ self.topProperty = TOP_PROPERTY_API_8
+ self.widthProperty = WIDTH_PROPERTY_API_8
+ self.heightProperty = HEIGHT_PROPERTY_API_8
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+ elif version > 0 and version < 7:
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY_API_10
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+ elif version == -1:
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+ else:
+ self.idProperty = ID_PROPERTY
+ self.textProperty = TEXT_PROPERTY
+ self.tagProperty = TAG_PROPERTY
+ self.leftProperty = LEFT_PROPERTY
+ self.topProperty = TOP_PROPERTY
+ self.widthProperty = WIDTH_PROPERTY
+ self.heightProperty = HEIGHT_PROPERTY
+ self.isFocusedProperty = IS_FOCUSED_PROPERTY
+
+ try:
+ if self.isScrollable():
+ self.uiScrollable = UiScrollable(self)
+ except AttributeError:
+ pass
+
+ def __getitem__(self, key):
+ return self.map[key]
+
+ def __getattr__(self, name):
+ if DEBUG_GETATTR:
+ print >>sys.stderr, "__getattr__(%s) version: %d" % (name, self.build[VERSION_SDK_PROPERTY])
+
+ # NOTE:
+ # I should try to see if 'name' is a defined method
+ # but it seems that if I call locals() here an infinite loop is entered
+
+ if self.map.has_key(name):
+ r = self.map[name]
+ elif self.map.has_key(name + '()'):
+ # the method names are stored in the map with their trailing '()'
+ r = self.map[name + '()']
+ elif name.count("_") > 0:
+ mangledList = self.allPossibleNamesWithColon(name)
+ mangledName = self.intersection(mangledList, self.map.keys())
+ if len(mangledName) > 0 and self.map.has_key(mangledName[0]):
+ r = self.map[mangledName[0]]
+ else:
+ # Default behavior
+ raise AttributeError, name
+ elif name.startswith('is'):
+ # try removing 'is' prefix
+ if DEBUG_GETATTR:
+ print >> sys.stderr, " __getattr__: trying without 'is' prefix"
+ suffix = name[2:].lower()
+ if self.map.has_key(suffix):
+ r = self.map[suffix]
+ else:
+ # Default behavior
+ raise AttributeError, name
+ elif name.startswith('get'):
+ # try removing 'get' prefix
+ if DEBUG_GETATTR:
+ print >> sys.stderr, " __getattr__: trying without 'get' prefix"
+ suffix = name[3:].lower()
+ if self.map.has_key(suffix):
+ r = self.map[suffix]
+ else:
+ # Default behavior
+ raise AttributeError, name
+ elif name == 'getResourceId':
+ if DEBUG_GETATTR:
+ print >> sys.stderr, " __getattr__: getResourceId"
+ if self.map.has_key('resource-id'):
+ r = self.map['resource-id']
+ else:
+ # Default behavior
+ raise AttributeError, name
+ else:
+ # Default behavior
+ raise AttributeError, name
+
+
+ # if the method name starts with 'is' let's assume its return value is boolean
+# if name[:2] == 'is':
+# r = True if r == 'true' else False
+ if r == 'true':
+ r = True
+ elif r == 'false':
+ r = False
+
+ # this should not cached in some way
+ def innerMethod():
+ if DEBUG_GETATTR:
+ print >>sys.stderr, "innerMethod: %s returning %s" % (innerMethod.__name__, r)
+ return r
+
+ innerMethod.__name__ = name
+
+ # this should work, but then there's problems with the arguments of innerMethod
+ # even if innerMethod(self) is added
+ #setattr(View, innerMethod.__name__, innerMethod)
+ #setattr(self, innerMethod.__name__, innerMethod)
+
+ return innerMethod
+
+ def __call__(self, *args, **kwargs):
+ if DEBUG_CALL:
+ print >>sys.stderr, "__call__(%s)" % (args if args else None)
+
+ def getClass(self):
+ '''
+ Gets the L{View} class
+
+ @return: the L{View} class or C{None} if not defined
+ '''
+
+ try:
+ return self.map['class']
+ except:
+ return None
+
+ def getId(self):
+ '''
+ Gets the L{View} Id
+
+ @return: the L{View} C{Id} or C{None} if not defined
+ @see: L{getUniqueId()}
+ '''
+
+ try:
+ return self.map['resource-id']
+ except:
+ pass
+
+ try:
+ return self.map[self.idProperty]
+ except:
+ return None
+
+ def getContentDescription(self):
+ '''
+ Gets the content description.
+ '''
+
+ try:
+ return self.map['content-desc']
+ except:
+ return None
+
+ def getTag(self):
+ '''
+ Gets the tag.
+ '''
+
+ try:
+ return self.map[self.tagProperty]
+ except:
+ return None
+
+ def getParent(self):
+ '''
+ Gets the parent.
+ '''
+
+ return self.parent
+
+ def getChildren(self):
+ '''
+ Gets the children of this L{View}.
+ '''
+
+ return self.children
+
+ def getText(self):
+ '''
+ Gets the text attribute.
+
+ @return: the text attribute or C{None} if not defined
+ '''
+
+ try:
+ return self.map[self.textProperty]
+ except Exception:
+ return None
+
+ def getHeight(self):
+ '''
+ Gets the height.
+ '''
+
+ if self.useUiAutomator:
+ return self.map['bounds'][1][1] - self.map['bounds'][0][1]
+ else:
+ try:
+ return int(self.map[self.heightProperty])
+ except:
+ return 0
+
+ def getWidth(self):
+ '''
+ Gets the width.
+ '''
+
+ if self.useUiAutomator:
+ return self.map['bounds'][1][0] - self.map['bounds'][0][0]
+ else:
+ try:
+ return int(self.map[self.widthProperty])
+ except:
+ return 0
+
+ def getUniqueId(self):
+ '''
+ Gets the unique Id of this View.
+
+ @see: L{ViewClient.__splitAttrs()} for a discussion on B{Unique Ids}
+ '''
+
+ try:
+ return self.map['uniqueId']
+ except:
+ return None
+
+ def getVisibility(self):
+ '''
+ Gets the View visibility
+ '''
+
+ try:
+ if self.map[GET_VISIBILITY_PROPERTY] == 'VISIBLE':
+ return VISIBLE
+ elif self.map[GET_VISIBILITY_PROPERTY] == 'INVISIBLE':
+ return INVISIBLE
+ elif self.map[GET_VISIBILITY_PROPERTY] == 'GONE':
+ return GONE
+ else:
+ return -2
+ except:
+ return -1
+
+ def getX(self):
+ '''
+ Gets the View X coordinate
+ '''
+
+ return self.getXY()[0]
+
+ def __getX(self):
+ '''
+ Gets the View X coordinate
+ '''
+
+ if DEBUG_COORDS:
+ print >>sys.stderr, "getX(%s %s ## %s)" % (self.getClass(), self.getId(), self.getUniqueId())
+ x = 0
+
+ if self.useUiAutomator:
+ x = self.map['bounds'][0][0]
+ else:
+ try:
+ if GET_VISIBILITY_PROPERTY in self.map and self.map[GET_VISIBILITY_PROPERTY] == 'VISIBLE':
+ _x = int(self.map[self.leftProperty])
+ if DEBUG_COORDS: print >>sys.stderr, " getX: VISIBLE adding %d" % _x
+ x += _x
+ except:
+ warnings.warn("View %s has no '%s' property" % (self.getId(), self.leftProperty))
+
+ if DEBUG_COORDS: print >>sys.stderr, " getX: returning %d" % (x)
+ return x
+
+ def getY(self):
+ '''
+ Gets the View Y coordinate
+ '''
+
+ return self.getXY()[1]
+
+ def __getY(self):
+ '''
+ Gets the View Y coordinate
+ '''
+
+ if DEBUG_COORDS:
+ print >>sys.stderr, "getY(%s %s ## %s)" % (self.getClass(), self.getId(), self.getUniqueId())
+ y = 0
+
+ if self.useUiAutomator:
+ y = self.map['bounds'][0][1]
+ else:
+ try:
+ if GET_VISIBILITY_PROPERTY in self.map and self.map[GET_VISIBILITY_PROPERTY] == 'VISIBLE':
+ _y = int(self.map[self.topProperty])
+ if DEBUG_COORDS: print >>sys.stderr, " getY: VISIBLE adding %d" % _y
+ y += _y
+ except:
+ warnings.warn("View %s has no '%s' property" % (self.getId(), self.topProperty))
+
+ if DEBUG_COORDS: print >>sys.stderr, " getY: returning %d" % (y)
+ return y
+
+ def getXY(self, debug=False):
+ '''
+ Returns the I{screen} coordinates of this C{View}.
+
+ WARNING: Don't call self.getX() or self.getY() inside this method
+ or it will enter an infinite loop
+
+ @return: The I{screen} coordinates of this C{View}
+ '''
+
+ if DEBUG_COORDS or debug:
+ try:
+ _id = self.getId()
+ except:
+ _id = "NO_ID"
+ print >> sys.stderr, "getXY(%s %s ## %s)" % (self.getClass(), _id, self.getUniqueId())
+
+ x = self.__getX()
+ y = self.__getY()
+ if self.useUiAutomator:
+ return (x, y)
+
+ parent = self.parent
+ if DEBUG_COORDS: print >> sys.stderr, " getXY: x=%s y=%s parent=%s" % (x, y, parent.getUniqueId() if parent else "None")
+ hx = 0
+ ''' Hierarchy accumulated X '''
+ hy = 0
+ ''' Hierarchy accumulated Y '''
+
+ if DEBUG_COORDS: print >> sys.stderr, " getXY: not using UiAutomator, calculating parent coordinates"
+ while parent != None:
+ if DEBUG_COORDS: print >> sys.stderr, " getXY: parent: %s %s <<<<" % (parent.getClass(), parent.getId())
+ if SKIP_CERTAIN_CLASSES_IN_GET_XY_ENABLED:
+ if parent.getClass() in [ 'com.android.internal.widget.ActionBarView',
+ 'com.android.internal.widget.ActionBarContextView',
+ 'com.android.internal.view.menu.ActionMenuView',
+ 'com.android.internal.policy.impl.PhoneWindow$DecorView' ]:
+ if DEBUG_COORDS: print >> sys.stderr, " getXY: skipping %s %s (%d,%d)" % (parent.getClass(), parent.getId(), parent.__getX(), parent.__getY())
+ parent = parent.parent
+ continue
+ if DEBUG_COORDS: print >> sys.stderr, " getXY: parent=%s x=%d hx=%d y=%d hy=%d" % (parent.getId(), x, hx, y, hy)
+ hx += parent.__getX()
+ hy += parent.__getY()
+ parent = parent.parent
+
+ (wvx, wvy) = self.__dumpWindowsInformation(debug=debug)
+ if DEBUG_COORDS or debug:
+ print >>sys.stderr, " getXY: wv=(%d, %d) (windows information)" % (wvx, wvy)
+ try:
+ if self.windowId:
+ fw = self.windows[self.windowId]
+ else:
+ fw = self.windows[self.currentFocus]
+ if DEBUG_STATUSBAR:
+ print >> sys.stderr, " getXY: focused window=", fw
+ print >> sys.stderr, " getXY: deciding whether to consider statusbar offset because current focused windows is at", (fw.wvx, fw.wvy), "parent", (fw.px, fw.py)
+ except KeyError:
+ fw = None
+ (sbw, sbh) = self.__obtainStatusBarDimensionsIfVisible()
+ if DEBUG_COORDS or debug:
+ print >>sys.stderr, " getXY: sb=(%d, %d) (statusbar dimensions)" % (sbw, sbh)
+ statusBarOffset = 0
+ pwx = 0
+ pwy = 0
+
+ if fw:
+ if DEBUG_COORDS:
+ print >>sys.stderr, " getXY: focused window=", fw, "sb=", (sbw, sbh)
+ if fw.wvy <= sbh: # it's very unlikely that fw.wvy < sbh, that is a window over the statusbar
+ if DEBUG_STATUSBAR: print >>sys.stderr, " getXY: yes, considering offset=", sbh
+ statusBarOffset = sbh
+ else:
+ if DEBUG_STATUSBAR: print >>sys.stderr, " getXY: no, ignoring statusbar offset fw.wvy=", fw.wvy, ">", sbh
+
+ if fw.py == fw.wvy:
+ if DEBUG_STATUSBAR: print >>sys.stderr, " getXY: but wait, fw.py == fw.wvy so we are adjusting by ", (fw.px, fw.py)
+ pwx = fw.px
+ pwy = fw.py
+ else:
+ if DEBUG_STATUSBAR: print >>sys.stderr, " getXY: fw.py=%d <= fw.wvy=%d, no adjustment" % (fw.py, fw.wvy)
+
+ if DEBUG_COORDS or DEBUG_STATUSBAR or debug:
+ print >>sys.stderr, " getXY: returning (%d, %d) ***" % (x+hx+wvx+pwx, y+hy+wvy-statusBarOffset+pwy)
+ print >>sys.stderr, " x=%d+%d+%d+%d" % (x,hx,wvx,pwx)
+ print >>sys.stderr, " y=%d+%d+%d-%d+%d" % (y,hy,wvy,statusBarOffset,pwy)
+ return (x+hx+wvx+pwx, y+hy+wvy-statusBarOffset+pwy)
+
+ def getCoords(self):
+ '''
+ Gets the coords of the View
+
+ @return: A tuple containing the View's coordinates ((L, T), (R, B))
+ '''
+
+ if DEBUG_COORDS:
+ print >>sys.stderr, "getCoords(%s %s ## %s)" % (self.getClass(), self.getId(), self.getUniqueId())
+
+ (x, y) = self.getXY();
+ w = self.getWidth()
+ h = self.getHeight()
+ return ((x, y), (x+w, y+h))
+
+ def getPositionAndSize(self):
+ '''
+ Gets the position and size (X,Y, W, H)
+
+ @return: A tuple containing the View's coordinates (X, Y, W, H)
+ '''
+
+ (x, y) = self.getXY();
+ w = self.getWidth()
+ h = self.getHeight()
+ return (x, y, w, h)
+
+ def getBounds(self):
+ '''
+ Gets the View bounds
+ '''
+
+ if 'bounds' in self.map:
+ return self.map['bounds']
+ else:
+ return self.getCoords()
+
+ def getCenter(self):
+ '''
+ Gets the center coords of the View
+
+ @author: U{Dean Morin <https://github.com/deanmorin>}
+ '''
+
+ (left, top), (right, bottom) = self.getCoords()
+ x = left + (right - left) / 2
+ y = top + (bottom - top) / 2
+ return (x, y)
+
+ def __obtainStatusBarDimensionsIfVisible(self):
+ sbw = 0
+ sbh = 0
+ for winId in self.windows:
+ w = self.windows[winId]
+ if DEBUG_COORDS: print >> sys.stderr, " __obtainStatusBarDimensionsIfVisible: w=", w, " w.activity=", w.activity, "%%%"
+ if w.activity == 'StatusBar':
+ if w.wvy == 0 and w.visibility == 0:
+ if DEBUG_COORDS: print >> sys.stderr, " __obtainStatusBarDimensionsIfVisible: statusBar=", (w.wvw, w.wvh)
+ sbw = w.wvw
+ sbh = w.wvh
+ break
+
+ return (sbw, sbh)
+
+ def __obtainVxVy(self, m):
+ return obtainVxVy(m)
+
+ def __obtainVwVh(self, m):
+ return obtainVwVh(m)
+
+ def __obtainPxPy(self, m):
+ return obtainPxPy(m)
+
+ def __dumpWindowsInformation(self, debug=False):
+ self.windows = {}
+ self.currentFocus = None
+ dww = self.device.shell('dumpsys window windows')
+ if DEBUG_WINDOWS or debug: print >> sys.stderr, dww
+ lines = dww.splitlines()
+ widRE = re.compile('^ *Window #%s Window\{%s (u\d+ )?%s?.*\}:' %
+ (_nd('num'), _nh('winId'), _ns('activity', greedy=True)))
+ currentFocusRE = re.compile('^ mCurrentFocus=Window\{%s .*' % _nh('winId'))
+ viewVisibilityRE = re.compile(' mViewVisibility=0x%s ' % _nh('visibility'))
+ # This is for 4.0.4 API-15
+ containingFrameRE = re.compile('^ *mContainingFrame=\[%s,%s\]\[%s,%s\] mParentFrame=\[%s,%s\]\[%s,%s\]' %
+ (_nd('cx'), _nd('cy'), _nd('cw'), _nd('ch'), _nd('px'), _nd('py'), _nd('pw'), _nd('ph')))
+ contentFrameRE = re.compile('^ *mContentFrame=\[%s,%s\]\[%s,%s\] mVisibleFrame=\[%s,%s\]\[%s,%s\]' %
+ (_nd('x'), _nd('y'), _nd('w'), _nd('h'), _nd('vx'), _nd('vy'), _nd('vx1'), _nd('vy1')))
+ # This is for 4.1 API-16
+ framesRE = re.compile('^ *Frames: containing=\[%s,%s\]\[%s,%s\] parent=\[%s,%s\]\[%s,%s\]' %
+ (_nd('cx'), _nd('cy'), _nd('cw'), _nd('ch'), _nd('px'), _nd('py'), _nd('pw'), _nd('ph')))
+ contentRE = re.compile('^ *content=\[%s,%s\]\[%s,%s\] visible=\[%s,%s\]\[%s,%s\]' %
+ (_nd('x'), _nd('y'), _nd('w'), _nd('h'), _nd('vx'), _nd('vy'), _nd('vx1'), _nd('vy1')))
+ policyVisibilityRE = re.compile('mPolicyVisibility=%s ' % _ns('policyVisibility', greedy=True))
+
+ for l in range(len(lines)):
+ m = widRE.search(lines[l])
+ if m:
+ num = int(m.group('num'))
+ winId = m.group('winId')
+ activity = m.group('activity')
+ wvx = 0
+ wvy = 0
+ wvw = 0
+ wvh = 0
+ px = 0
+ py = 0
+ visibility = -1
+ policyVisibility = 0x0
+
+ for l2 in range(l+1, len(lines)):
+ m = widRE.search(lines[l2])
+ if m:
+ l += (l2-1)
+ break
+ m = viewVisibilityRE.search(lines[l2])
+ if m:
+ visibility = int(m.group('visibility'))
+ if DEBUG_COORDS: print >> sys.stderr, "__dumpWindowsInformation: visibility=", visibility
+ if self.build[VERSION_SDK_PROPERTY] >= 17:
+ m = framesRE.search(lines[l2])
+ if m:
+ px, py = obtainPxPy(m)
+ m = contentRE.search(lines[l2+2])
+ if m:
+ wvx, wvy = obtainVxVy(m)
+ wvw, wvh = obtainVwVh(m)
+ elif self.build[VERSION_SDK_PROPERTY] >= 16:
+ m = framesRE.search(lines[l2])
+ if m:
+ px, py = self.__obtainPxPy(m)
+ m = contentRE.search(lines[l2+1])
+ if m:
+ # FIXME: the information provided by 'dumpsys window windows' in 4.2.1 (API 16)
+ # when there's a system dialog may not be correct and causes the View coordinates
+ # be offset by this amount, see
+ # https://github.com/dtmilano/AndroidViewClient/issues/29
+ wvx, wvy = self.__obtainVxVy(m)
+ wvw, wvh = self.__obtainVwVh(m)
+ elif self.build[VERSION_SDK_PROPERTY] == 15:
+ m = containingFrameRE.search(lines[l2])
+ if m:
+ px, py = self.__obtainPxPy(m)
+ m = contentFrameRE.search(lines[l2+1])
+ if m:
+ wvx, wvy = self.__obtainVxVy(m)
+ wvw, wvh = self.__obtainVwVh(m)
+ elif self.build[VERSION_SDK_PROPERTY] == 10:
+ m = containingFrameRE.search(lines[l2])
+ if m:
+ px, py = self.__obtainPxPy(m)
+ m = contentFrameRE.search(lines[l2+1])
+ if m:
+ wvx, wvy = self.__obtainVxVy(m)
+ wvw, wvh = self.__obtainVwVh(m)
+ else:
+ warnings.warn("Unsupported Android version %d" % self.build[VERSION_SDK_PROPERTY])
+
+ #print >> sys.stderr, "Searching policyVisibility in", lines[l2]
+ m = policyVisibilityRE.search(lines[l2])
+ if m:
+ policyVisibility = 0x0 if m.group('policyVisibility') == 'true' else 0x8
+
+ self.windows[winId] = Window(num, winId, activity, wvx, wvy, wvw, wvh, px, py, visibility + policyVisibility)
+ else:
+ m = currentFocusRE.search(lines[l])
+ if m:
+ self.currentFocus = m.group('winId')
+
+ if self.windowId and self.windowId in self.windows and self.windows[self.windowId].visibility == 0:
+ w = self.windows[self.windowId]
+ return (w.wvx, w.wvy)
+ elif self.currentFocus in self.windows and self.windows[self.currentFocus].visibility == 0:
+ if DEBUG_COORDS or debug:
+ print >> sys.stderr, "__dumpWindowsInformation: focus=", self.currentFocus
+ print >> sys.stderr, "__dumpWindowsInformation:", self.windows[self.currentFocus]
+ w = self.windows[self.currentFocus]
+ return (w.wvx, w.wvy)
+ else:
+ if DEBUG_COORDS: print >> sys.stderr, "__dumpWindowsInformation: (0,0)"
+ return (0,0)
+
+ def touch(self, eventType=adbclient.DOWN_AND_UP, deltaX=0, deltaY=0):
+ '''
+ Touches the center of this C{View}. The touch can be displaced from the center by
+ using C{deltaX} and C{deltaY} values.
+
+ @param eventType: The event type
+ @type eventType: L{adbclient.DOWN}, L{adbclient.UP} or L{adbclient.DOWN_AND_UP}
+ @param deltaX: Displacement from center (X axis)
+ @type deltaX: int
+ @param deltaY: Displacement from center (Y axis)
+ @type deltaY: int
+ '''
+
+ (x, y) = self.getCenter()
+ if deltaX:
+ x += deltaX
+ if deltaY:
+ y += deltaY
+ if DEBUG_TOUCH:
+ print >>sys.stderr, "should touch @ (%d, %d)" % (x, y)
+ if VIEW_CLIENT_TOUCH_WORKAROUND_ENABLED and eventType == adbclient.DOWN_AND_UP:
+ if WARNINGS:
+ print >> sys.stderr, "ViewClient: touch workaround enabled"
+ self.device.touch(x, y, eventType=adbclient.DOWN)
+ time.sleep(50/1000.0)
+ self.device.touch(x+10, y+10, eventType=adbclient.UP)
+ else:
+ if self.uiAutomatorHelper:
+ selector = self.obtainSelectorForView()
+ if selector:
+ try:
+ oid = self.uiAutomatorHelper.findObject(bySelector=selector)
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "oid=", oid
+ print >> sys.stderr, "ignoring click delta to click View as UiObject"
+ oid.click();
+ except RuntimeError as e:
+ print >> sys.stderr, e.message
+ print >> sys.stderr, "UiObject click failed, using co-ordinates"
+ self.uiAutomatorHelper.click(x=x, y=y)
+ else:
+ # FIXME:
+ # The View has no CD, TEXT or ID so we cannot use it in a selector to findObject()
+ # We should try content description, text, and perhaps other properties before surrendering.
+ # For now, tet's fall back to click(x, y)
+ self.uiAutomatorHelper.click(x=x, y=y)
+ else:
+ self.device.touch(x, y, eventType=eventType)
+
+ def escapeSelectorChars(self, selector):
+ return selector.replace('@', '\\@').replace(',', '\\,')
+
+ def obtainSelectorForView(self):
+ selector = ''
+ if self.getContentDescription():
+ selector += 'desc@' + self.escapeSelectorChars(self.getContentDescription())
+ if self.getText():
+ if selector:
+ selector += ','
+ selector += 'text@' + self.escapeSelectorChars(self.getText())
+ if self.getId():
+ if selector:
+ selector += ','
+ selector += 'res@' + self.escapeSelectorChars(self.getId())
+ return selector
+
+ def longTouch(self, duration=2000):
+ '''
+ Long touches this C{View}
+
+ @param duration: duration in ms
+ '''
+
+ (x, y) = self.getCenter()
+ if self.uiAutomatorHelper:
+ self.uiAutomatorHelper.swipe(startX=x, startY=y, endX=x, endY=y, steps=200)
+ else:
+ # FIXME: get orientation
+ self.device.longTouch(x, y, duration, orientation=-1)
+
+ def allPossibleNamesWithColon(self, name):
+ l = []
+ for _ in range(name.count("_")):
+ name = name.replace("_", ":", 1)
+ l.append(name)
+ return l
+
+ def intersection(self, l1, l2):
+ return list(set(l1) & set(l2))
+
+ def containsPoint(self, (x, y)):
+ (X, Y, W, H) = self.getPositionAndSize()
+ return (((x >= X) and (x <= (X+W)) and ((y >= Y) and (y <= (Y+H)))))
+
+ def add(self, child):
+ '''
+ Adds a child
+
+ @type child: View
+ @param child: The child to add
+ '''
+ child.parent = self
+ self.children.append(child)
+
+ def isClickable(self):
+ return self.__getattr__('isClickable')()
+
+
+ def isFocused(self):
+ '''
+ Gets the focused value
+
+ @return: the focused value. If the property cannot be found returns C{False}
+ '''
+
+ try:
+ return True if self.map[self.isFocusedProperty].lower() == 'true' else False
+ except Exception:
+ return False
+
+ def variableNameFromId(self):
+ _id = self.getId()
+ if _id:
+ var = _id.replace('.', '_').replace(':', '___').replace('/', '_')
+ else:
+ _id = self.getUniqueId()
+ m = ID_RE.match(_id)
+ if m:
+ var = m.group(1)
+ if m.group(3):
+ var += m.group(3)
+ if re.match('^\d', var):
+ var = 'id_' + var
+ return var
+
+ def setTarget(self, target):
+ self.target = target
+
+ def isTarget(self):
+ return self.target
+
+ def writeImageToFile(self, filename, _format="PNG"):
+ '''
+ Write the View image to the specified filename in the specified format.
+
+ @type filename: str
+ @param filename: Absolute path and optional filename receiving the image. If this points to
+ a directory, then the filename is determined by this View unique ID and
+ format extension.
+ @type _format: str
+ @param _format: Image format (default format is PNG)
+ '''
+
+ filename = self.device.substituteDeviceTemplate(filename)
+ if not os.path.isabs(filename):
+ raise ValueError("writeImageToFile expects an absolute path (fielname='%s')" % filename)
+ if os.path.isdir(filename):
+ filename = os.path.join(filename, self.variableNameFromId() + '.' + _format.lower())
+ if DEBUG:
+ print >> sys.stderr, "writeImageToFile: saving image to '%s' in %s format" % (filename, _format)
+ #self.device.takeSnapshot().getSubImage(self.getPositionAndSize()).writeToFile(filename, _format)
+ # crop:
+ # im.crop(box) ⇒ image
+ # Returns a copy of a rectangular region from the current image.
+ # The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate.
+ ((l, t), (r, b)) = self.getCoords()
+ box = (l, t, r, b)
+ if DEBUG:
+ print >> sys.stderr, "writeImageToFile: cropping", box, " reconnect=", self.device.reconnect
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Taking screenshot using UiAutomatorHelper"
+ received = self.uiAutomatorHelper.takeScreenshot()
+ stream = StringIO.StringIO(received)
+ try:
+ from PIL import Image
+ image = Image.open(stream)
+ except ImportError as ex:
+ # FIXME: this method should be global
+ self.pilNotInstalledWarning()
+ sys.exit(1)
+ except IOError, ex:
+ print >> sys.stderr, ex
+ print repr(stream)
+ sys.exit(1)
+ else:
+ image = self.device.takeSnapshot(reconnect=self.device.reconnect)
+ image.crop(box).save(filename, _format)
+
+ def __smallStr__(self):
+ __str = unicode("View[", 'utf-8', 'replace')
+ if "class" in self.map:
+ __str += " class=" + self.map['class']
+ __str += " id=%s" % self.getId()
+ __str += " ] parent="
+ if self.parent and "class" in self.parent.map:
+ __str += "%s" % self.parent.map["class"]
+ else:
+ __str += "None"
+
+ return __str
+
+ def __tinyStr__(self):
+ __str = unicode("View[", 'utf-8', 'replace')
+ if "class" in self.map:
+ __str += " class=" + re.sub('.*\.', '', self.map['class'])
+ __str += " id=%s" % self.getId()
+ __str += " ]"
+
+ return __str
+
+ def __microStr__(self):
+ __str = unicode('', 'utf-8', 'replace')
+ if "class" in self.map:
+ __str += re.sub('.*\.', '', self.map['class'])
+ _id = self.getId().replace('id/no_id/', '-')
+ __str += _id
+ ((L, T), (R, B)) = self.getCoords()
+ __str += '@%04d%04d%04d%04d' % (L, T, R, B)
+ __str += ''
+
+ return __str
+
+
+ def __str__(self):
+ __str = unicode("View[", 'utf-8', 'replace')
+ if "class" in self.map:
+ __str += " class=" + self.map["class"].__str__() + " "
+ for a in self.map:
+ __str += a + "="
+ # decode() works only on python's 8-bit strings
+ if isinstance(self.map[a], unicode):
+ __str += self.map[a]
+ else:
+ __str += unicode(str(self.map[a]), 'utf-8', errors='replace')
+ __str += " "
+ __str += "] parent="
+ if self.parent:
+ if "class" in self.parent.map:
+ __str += "%s" % self.parent.map["class"]
+ else:
+ __str += self.parent.getId().__str__()
+ else:
+ __str += "None"
+
+ return __str
+
+class TextView(View):
+ '''
+ TextView class.
+ '''
+
+ pass
+
+class EditText(TextView):
+ '''
+ EditText class.
+ '''
+
+ def type(self, text, alreadyTouched=False):
+ if not text:
+ return
+ if not alreadyTouched:
+ self.touch()
+ time.sleep(0.5)
+ self.device.type(text)
+ time.sleep(0.5)
+
+ def setText(self, text):
+ """
+ This function makes sure that any previously entered text is deleted before
+ setting the value of the field.
+ """
+ if self.text() == text:
+ return
+ self.touch()
+ guardrail = 0
+ maxSize = len(self.text()) + 1
+ while maxSize > guardrail:
+ guardrail += 1
+ self.device.press('KEYCODE_DEL', adbclient.DOWN_AND_UP)
+ self.device.press('KEYCODE_FORWARD_DEL', adbclient.DOWN_AND_UP)
+ self.type(text, alreadyTouched=True)
+
+ def backspace(self):
+ self.touch()
+ time.sleep(1)
+ self.device.press('KEYCODE_DEL', adbclient.DOWN_AND_UP)
+
+class UiDevice():
+ '''
+ Provides access to state information about the device. You can also use this class to simulate
+ user actions on the device, such as pressing the d-pad or pressing the Home and Menu buttons.
+ '''
+
+ def __init__(self, vc):
+ self.vc = vc
+ self.device = self.vc.device
+
+ def openNotification(self):
+ '''
+ Opens the notification shade.
+ '''
+
+ # the tablet has a different Notification/Quick Settings bar depending on x
+ w13 = self.device.display['width'] / 3
+ s = (w13, 0)
+ e = (w13, self.device.display['height']/2)
+ self.device.drag(s, e, 500, 20, -1)
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+
+ def openQuickSettings(self):
+ '''
+ Opens the Quick Settings shade.
+ '''
+
+ # the tablet has a different Notification/Quick Settings bar depending on x
+ w23 = 2 * self.device.display['width'] / 3
+ s = (w23, 0)
+ e = (w23, self.device.display['height']/2)
+ self.device.drag(s, e, 500, 20, -1)
+ self.vc.sleep(1)
+ if self.vc.getSdkVersion() >= 20:
+ self.device.drag(s, e, 500, 20, -1)
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+
+ def openQuickSettingsSettings(self):
+ '''
+ Opens the Quick Settings shade and then tries to open Settings from there.
+ '''
+
+ STATUS_BAR_SETTINGS_SETTINGS_BUTTON = [
+ u"Settings", u"Cài đặt", u"Instellingen", u"Կարգավորումներ", u"设置", u"Nastavitve", u"සැකසීම්", u"Ayarlar",
+ u"Setelan", u"Настройки", u"تنظیمات", u"Mga Setting", u"Тохиргоо", u"Configuració", u"Setări", u"Налады",
+ u"Einstellungen", u"პარამეტრები", u"सेटिङहरू", u"Կարգավորումներ", u"Nustatymai", u"Beállítások", u"設定",
+ u"सेटिंग", u"Настройки", u"Inställningar", u"設定", u"ການຕັ້ງຄ່າ", u"Configurações", u"Tetapan", u"설정",
+ u"ការកំណត់", u"Ajustes", u"הגדרות", u"Ustawienia", u"Nastavení", u"Ρυθμίσεις", u"Тохиргоо", u"Ayarlar",
+ u"Indstillinger", u"Налаштування", u"Mipangilio", u"Izilungiselelo", u"設定", u"Nastavenia", u"Paramètres",
+ u"ቅንብሮች", u"การตั้งค่า", u"Seaded", u"Iestatījumi", u"Innstillinger", u"Подешавања", u"الإعدادات", u"සැකසීම්",
+ u"Definições", u"Configuración", u"პარამეტრები", u"Postavke", u"Ayarlar", u"Impostazioni", u"Asetukset",
+ u"Instellings", u"Seaded", u"ការកំណត់", u"सेटिङहरू", u"Tetapan"
+ ]
+
+ self.openQuickSettings()
+
+ # this works on API >= 20
+ found = False
+ for s in STATUS_BAR_SETTINGS_SETTINGS_BUTTON:
+ if DEBUG:
+ print >> sys.stderr, u"finding view with cd=", type(s)
+ view = self.vc.findViewWithContentDescription(u'''{0}'''.format(s))
+ if view:
+ found = True
+ view.touch()
+ break
+
+ if not found:
+ # for previous APIs, let's find the text
+ for s in STATUS_BAR_SETTINGS_SETTINGS_BUTTON:
+ if DEBUG:
+ print >> sys.stderr, "s=", type(s)
+ try:
+ print >> sys.stderr, "finding view with text=", u'''{0}'''.format(s)
+ except:
+ pass
+ view = self.vc.findViewWithText(s)
+ if view:
+ found = True
+ view.touch()
+ break
+
+ if not found:
+ raise ViewNotFoundException("content-description", "'Settings' or text 'Settings'", "ROOT")
+
+ self.vc.sleep(1)
+ self.vc.dump(window=-1)
+
+ def changeLanguage(self, languageTo):
+ LANGUAGE_SETTINGS = {
+ "en": u"Language & input",
+ "af": u"Taal en invoer",
+ "am": u"ቋንቋ እና ግቤት",
+ "ar": u"اللغة والإدخال",
+ "az": u"Dil və daxiletmə",
+ "az-rAZ": u"Dil və daxiletmə",
+ "be": u"Мова і ўвод",
+ "bg": u"Език и въвеждане",
+ "ca": u"Idioma i introducció de text",
+ "cs": u"Jazyk a zadávání",
+ "da": u"Sprog og input",
+ "de": u"Sprache & Eingabe",
+ "el": u"Γλώσσα και εισαγωγή",
+ "en-rGB": u"Language & input",
+ "en-rIN": u"Language & input",
+ "es": u"Idioma e introducción de texto",
+ "es-rUS": u"Teclado e idioma",
+ "et": u"Keeled ja sisestamine",
+ "et-rEE": u"Keeled ja sisestamine",
+ "fa": u"زبان و ورود اطلاعات",
+ "fi": u"Kieli ja syöttötapa",
+ "fr": u"Langue et saisie",
+ "fr-rCA": u"Langue et saisie",
+ "hi": u"भाषा और अक्षर",
+ "hr": u"Jezik i ulaz",
+ "hu": u"Nyelv és bevitel",
+ "hy": u"Լեզվի & ներմուծում",
+ "hy-rAM": u"Լեզու և ներմուծում",
+ "in": u"Bahasa & masukan",
+ "it": u"Lingua e immissione",
+ "iw": u"שפה וקלט",
+ "ja": u"言語と入力",
+ "ka": u"ენისა და შეყვანის პარამეტრები",
+ "ka-rGE": u"ენისა და შეყვანის პარამეტრები",
+ "km": u"ភាសា & ការបញ្ចូល",
+ "km-rKH": u"ភាសា & ការបញ្ចូល",
+ "ko": u"언어 및 키보드",
+ "lo": u"ພາສາ & ການປ້ອນຂໍ້ມູນ",
+ "lo-rLA": u"ພາສາ & ການປ້ອນຂໍ້ມູນ",
+ "lt": u"Kalba ir įvestis",
+ "lv": u"Valodas ievade",
+ "mn": u"Хэл & оруулах",
+ "mn-rMN": u"Хэл & оруулах",
+ "ms": u"Bahasa & input",
+ "ms-rMY": u"Bahasa & input",
+ "nb": u"Språk og inndata",
+ "ne": u"भाषा र इनपुट",
+ "ne-rNP": u"भाषा र इनपुट",
+ "nl": u"Taal en invoer",
+ "pl": u"Język, klawiatura, głos",
+ "pt": u"Idioma e entrada",
+ "pt-rPT": u"Idioma e entrada",
+ "ro": u"Limbă și introducere de text",
+ "ru": u"Язык и ввод",
+ "si": u"භාෂාව සහ ආදානය",
+ "si-rLK": u"භාෂාව සහ ආදානය",
+ "sk": u"Jazyk & vstup",
+ "sl": u"Jezik in vnos",
+ "sr": u"Језик и унос",
+ "sv": u"Språk och inmatning",
+ "sw": u"Lugha, Kibodi na Sauti",
+ "th": u"ภาษาและการป้อนข้อมูล",
+ "tl": u"Wika at input",
+ "tr": u"Dil ve giriş",
+ "uk": u"Мова та введення",
+ "vi": u"Ngôn ngữ & phương thức nhập",
+ "zh-rCN": u"语言和输入法",
+ "zh-rHK": u"語言與輸入裝置",
+ "zh-rTW": u"語言與輸入設定",
+ "zu": u"Ulimi & ukufakwa",
+ }
+
+ PHONE_LANGUAGE = {
+ "en": u"Language",
+ "af": u"Taal",
+ "am": u"ቋንቋ",
+ "ar": u"اللغة",
+ "az": u"Dil",
+ "az-rAZ": u"Dil",
+ "be": u"Мова",
+ "bg": u"Език",
+ "ca": u"Idioma",
+ "cs": u"Jazyk",
+ "da": u"Sprog",
+ "de": u"Sprache",
+ "el": u"Γλώσσα",
+ "en-rGB": u"Language",
+ "en-rIN": u"Language",
+ "es": u"Idioma",
+ "es-rUS": u"Idioma",
+ "et": u"Keel",
+ "et-rEE": u"Keel",
+ "fa": u"زبان",
+ "fi": u"Kieli",
+ "fr": u"Langue",
+ "fr-rCA": u"Langue",
+ "hi": u"भाषा",
+ "hr": u"Jezik",
+ "hu": u"Nyelv",
+ "hy": u"Lեզուն",
+ "hy-rAM": u"Lեզուն",
+ "in": u"Bahasa",
+ "it": u"Lingua",
+ "iw": u"שפה",
+ "ja": u"言語",
+ "ka": u"ენა",
+ "ka-rGE": u"ენა",
+ "km": u"ភាសា",
+ "km-rKH": u"ភាសា",
+ "ko": u"언어",
+ "lo": u"ພາສາ",
+ "lo-rLA": u"ພາສາ",
+ "lt": u"Kalba",
+ "lv": u"Valoda",
+ "mn": u"Хэл",
+ "mn-rMN": u"Хэл",
+ "ms": u"Bahasa",
+ "ms-rMY": u"Bahasa",
+ "nb": u"Språk",
+ "ne": u"भाषा",
+ "nl": u"Taal",
+ "pl": u"Język",
+ "pt": u"Idioma",
+ "pt-rPT": u"Idioma",
+ "ro": u"Limba",
+ "ru": u"Язык",
+ "si": u"භාෂාව",
+ "si-rLK": u"භාෂාව",
+ "sk": u"Jazyk",
+ "sl": u"Jezik",
+ "sr": u"Језик",
+ "sv": u"Språk",
+ "sw": u"Lugha",
+ "th": u"ภาษา",
+ "tl": u"Wika",
+ "tr": u"Dil",
+ "uk": u"Мова",
+ "vi": u"Ngôn ngữ",
+ "zh-rCN": u"语言",
+ "zh-rHK": u"語言",
+ "zh-rTW": u"語言",
+ "zu": u"Ulimi",
+ }
+
+ LANGUAGES = {
+ "en": u"English (United States)",
+ "es-rUS": u"Español (Estados Unidos)",
+ "af": u"Afrikaans", # Afrikaans
+ "af-rNA": u"Afrikaans (Namibië)", # Afrikaans (Namibia)
+ "af-rZA": u"Afrikaans (Suid-Afrika)", # Afrikaans (South Africa)
+ "agq": u"Aghem", # Aghem
+ "agq-rCM": u"Aghem (Kàmàlûŋ)", # Aghem (Cameroon)
+ "ak": u"Akan", # Akan
+ "ak-rGH": u"Akan (Gaana)", # Akan (Ghana)
+ "am": u"አማርኛ", # Amharic
+ "am-rET": u"አማርኛ (ኢትዮጵያ)", # Amharic (Ethiopia)
+ "ar": u"العربية", # Arabic
+ "ar_001": u"العربية (العالم)", # Arabic (World)
+ "ar-rAE": u"العربية (الإمارات العربية المتحدة)", # Arabic (United Arab Emirates)
+ "ar-rBH": u"العربية (البحرين)", # Arabic (Bahrain)
+ "ar-rDJ": u"العربية (جيبوتي)", # Arabic (Djibouti)
+ "ar-rDZ": u"العربية (الجزائر)", # Arabic (Algeria)
+ "ar-rEG": u"العربية (مصر)", # Arabic (Egypt)
+ "ar-rEH": u"العربية (الصحراء الغربية)", # Arabic (Western Sahara)
+ "ar-rER": u"العربية (أريتريا)", # Arabic (Eritrea)
+ "ar-rIL": u"العربية (إسرائيل)", # Arabic (Israel)
+ "ar-rIQ": u"العربية (العراق)", # Arabic (Iraq)
+ "ar-rJO": u"العربية (الأردن)", # Arabic (Jordan)
+ "ar-rKM": u"العربية (جزر القمر)", # Arabic (Comoros)
+ "ar-rKW": u"العربية (الكويت)", # Arabic (Kuwait)
+ "ar-rLB": u"العربية (لبنان)", # Arabic (Lebanon)
+ "ar-rLY": u"العربية (ليبيا)", # Arabic (Libya)
+ "ar-rMA": u"العربية (المغرب)", # Arabic (Morocco)
+ "ar-rMR": u"العربية (موريتانيا)", # Arabic (Mauritania)
+ "ar-rOM": u"العربية (عُمان)", # Arabic (Oman)
+ "ar-rPS": u"العربية (فلسطين)", # Arabic (Palestine)
+ "ar-rQA": u"العربية (قطر)", # Arabic (Qatar)
+ "ar-rSA": u"العربية (المملكة العربية السعودية)", # Arabic (Saudi Arabia)
+ "ar-rSD": u"العربية (السودان)", # Arabic (Sudan)
+ "ar-rSO": u"العربية (الصومال)", # Arabic (Somalia)
+ "ar-rSY": u"العربية (سوريا)", # Arabic (Syria)
+ "ar-rTD": u"العربية (تشاد)", # Arabic (Chad)
+ "ar-rTN": u"العربية (تونس)", # Arabic (Tunisia)
+ "ar-rYE": u"العربية (اليمن)", # Arabic (Yemen)
+ "as": u"অসমীয়া", # Assamese
+ "as-rIN": u"অসমীয়া (ভাৰত)", # Assamese (India)
+ "asa": u"Kipare", # Asu
+ "asa-rTZ": u"Kipare (Tadhania)", # Asu (Tanzania)
+ "az": u"Azərbaycanca", # Azerbaijani
+ "az-rCYRL": u"Азәрбајҹан (CYRL)", # Azerbaijani (CYRL)
+ "az-rCYRL_AZ": u"Азәрбајҹан (Азәрбајҹан,AZ)", # Azerbaijani (Azerbaijan,AZ)
+ "az-rLATN": u"Azərbaycanca (LATN)", # Azerbaijani (LATN)
+ "az-rLATN_AZ": u"Azərbaycanca (Azərbaycan,AZ)", # Azerbaijani (Azerbaijan,AZ)
+ "bas": u"Ɓàsàa", # Basaa
+ "bas-rCM": u"Ɓàsàa (Kàmɛ̀rûn)", # Basaa (Cameroon)
+ "be": u"беларуская", # Belarusian
+ "be-rBY": u"беларуская (Беларусь)", # Belarusian (Belarus)
+ "bem": u"Ichibemba", # Bemba
+ "bem-rZM": u"Ichibemba (Zambia)", # Bemba (Zambia)
+ "bez": u"Hibena", # Bena
+ "bez-rTZ": u"Hibena (Hutanzania)", # Bena (Tanzania)
+ "bg": u"български", # Bulgarian
+ "bg-rBG": u"български (България)", # Bulgarian (Bulgaria)
+ "bm": u"Bamanakan", # Bambara
+ "bm-rML": u"Bamanakan (Mali)", # Bambara (Mali)
+ "bn": u"বাংলা", # Bengali
+ "bn-rBD": u"বাংলা (বাংলাদেশ)", # Bengali (Bangladesh)
+ "bn-rIN": u"বাংলা (ভারত)", # Bengali (India)
+ "bo": u"པོད་སྐད་", # Tibetan
+ "bo-rCN": u"པོད་སྐད་ (རྒྱ་ནག)", # Tibetan (China)
+ "bo-rIN": u"པོད་སྐད་ (རྒྱ་གར་)", # Tibetan (India)
+ "br": u"Brezhoneg", # Breton
+ "br-rFR": u"Brezhoneg (Frañs)", # Breton (France)
+ "brx": u"बड़ो", # Bodo
+ "brx-rIN": u"बड़ो (भारत)", # Bodo (India)
+ "bs": u"Bosanski", # Bosnian
+ "bs-rCYRL": u"босански (CYRL)", # Bosnian (CYRL)
+ "bs-rCYRL_BA": u"босански (Босна и Херцеговина,BA)", # Bosnian (Bosnia and Herzegovina,BA)
+ "bs-rLATN": u"Bosanski (LATN)", # Bosnian (LATN)
+ "bs-rLATN_BA": u"Bosanski (Bosna i Hercegovina,BA)", # Bosnian (Bosnia and Herzegovina,BA)
+ "ca": u"Català", # Catalan
+ "ca-rAD": u"Català (Andorra)", # Catalan (Andorra)
+ "ca-rES": u"Català (Espanya)", # Catalan (Spain)
+ "cgg": u"Rukiga", # Chiga
+ "cgg-rUG": u"Rukiga (Uganda)", # Chiga (Uganda)
+ "chr": u"ᏣᎳᎩ", # Cherokee
+ "chr-rUS": u"ᏣᎳᎩ (ᎠᎹᏰᏟ)", # Cherokee (United States)
+ "cs": u"čeština", # Czech
+ "cs-rCZ": u"čeština (Česká republika)", # Czech (Czech Republic)
+ "cy": u"Cymraeg", # Welsh
+ "cy-rGB": u"Cymraeg (y Deyrnas Unedig)", # Welsh (United Kingdom)
+ "da": u"Dansk", # Danish
+ "da-rDK": u"Dansk (Danmark)", # Danish (Denmark)
+ "dav": u"Kitaita", # Taita
+ "dav-rKE": u"Kitaita (Kenya)", # Taita (Kenya)
+ "de": u"Deutsch", # German
+ "de-rAT": u"Deutsch (Österreich)", # German (Austria)
+ "de-rBE": u"Deutsch (Belgien)", # German (Belgium)
+ "de-rCH": u"Deutsch (Schweiz)", # German (Switzerland)
+ "de-rDE": u"Deutsch (Deutschland)", # German (Germany)
+ "de-rLI": u"Deutsch (Liechtenstein)", # German (Liechtenstein)
+ "de-rLU": u"Deutsch (Luxemburg)", # German (Luxembourg)
+ "dje": u"Zarmaciine", # Zarma
+ "dje-rNE": u"Zarmaciine (Nižer)", # Zarma (Niger)
+ "dua": u"Duálá", # Duala
+ "dua-rCM": u"Duálá (Cameroun)", # Duala (Cameroon)
+ "dyo": u"Joola", # Jola-Fonyi
+ "dyo-rSN": u"Joola (Senegal)", # Jola-Fonyi (Senegal)
+ "dz": u"རྫོང་ཁ", # Dzongkha
+ "dz-rBT": u"རྫོང་ཁ (འབྲུག)", # Dzongkha (Bhutan)
+ "ebu": u"Kĩembu", # Embu
+ "ebu-rKE": u"Kĩembu (Kenya)", # Embu (Kenya)
+ "ee": u"Eʋegbe", # Ewe
+ "ee-rGH": u"Eʋegbe (Ghana nutome)", # Ewe (Ghana)
+ "ee-rTG": u"Eʋegbe (Togo nutome)", # Ewe (Togo)
+ "el": u"Ελληνικά", # Greek
+ "el-rCY": u"Ελληνικά (Κύπρος)", # Greek (Cyprus)
+ "el-rGR": u"Ελληνικά (Ελλάδα)", # Greek (Greece)
+ "en": u"English", # English
+ "en_150": u"English (Europe)", # English (Europe)
+ "en-rAG": u"English (Antigua and Barbuda)", # English (Antigua and Barbuda)
+ "en-rAS": u"English (American Samoa)", # English (American Samoa)
+ "en-rAU": u"English (Australia)", # English (Australia)
+ "en-rBB": u"English (Barbados)", # English (Barbados)
+ "en-rBE": u"English (Belgium)", # English (Belgium)
+ "en-rBM": u"English (Bermuda)", # English (Bermuda)
+ "en-rBS": u"English (Bahamas)", # English (Bahamas)
+ "en-rBW": u"English (Botswana)", # English (Botswana)
+ "en-rBZ": u"English (Belize)", # English (Belize)
+ "en-rCA": u"English (Canada)", # English (Canada)
+ "en-rCM": u"English (Cameroon)", # English (Cameroon)
+ "en-rDM": u"English (Dominica)", # English (Dominica)
+ "en-rFJ": u"English (Fiji)", # English (Fiji)
+ "en-rFM": u"English (Micronesia)", # English (Micronesia)
+ "en-rGB": u"English (United Kingdom)", # English (United Kingdom)
+ "en-rGD": u"English (Grenada)", # English (Grenada)
+ "en-rGG": u"English (Guernsey)", # English (Guernsey)
+ "en-rGH": u"English (Ghana)", # English (Ghana)
+ "en-rGI": u"English (Gibraltar)", # English (Gibraltar)
+ "en-rGM": u"English (Gambia)", # English (Gambia)
+ "en-rGU": u"English (Guam)", # English (Guam)
+ "en-rGY": u"English (Guyana)", # English (Guyana)
+ "en-rHK": u"English (Hong Kong)", # English (Hong Kong)
+ "en-rIE": u"English (Ireland)", # English (Ireland)
+ "en-rIM": u"English (Isle of Man)", # English (Isle of Man)
+ "en-rIN": u"English (India)", # English (India)
+ "en-rJE": u"English (Jersey)", # English (Jersey)
+ "en-rJM": u"English (Jamaica)", # English (Jamaica)
+ "en-rKE": u"English (Kenya)", # English (Kenya)
+ "en-rKI": u"English (Kiribati)", # English (Kiribati)
+ "en-rKN": u"English (Saint Kitts and Nevis)", # English (Saint Kitts and Nevis)
+ "en-rKY": u"English (Cayman Islands)", # English (Cayman Islands)
+ "en-rLC": u"English (Saint Lucia)", # English (Saint Lucia)
+ "en-rLR": u"English (Liberia)", # English (Liberia)
+ "en-rLS": u"English (Lesotho)", # English (Lesotho)
+ "en-rMG": u"English (Madagascar)", # English (Madagascar)
+ "en-rMH": u"English (Marshall Islands)", # English (Marshall Islands)
+ "en-rMP": u"English (Northern Mariana Islands)", # English (Northern Mariana Islands)
+ "en-rMT": u"English (Malta)", # English (Malta)
+ "en-rMU": u"English (Mauritius)", # English (Mauritius)
+ "en-rMW": u"English (Malawi)", # English (Malawi)
+ "en-rNA": u"English (Namibia)", # English (Namibia)
+ "en-rNG": u"English (Nigeria)", # English (Nigeria)
+ "en-rNZ": u"English (New Zealand)", # English (New Zealand)
+ "en-rPG": u"English (Papua New Guinea)", # English (Papua New Guinea)
+ "en-rPH": u"English (Philippines)", # English (Philippines)
+ "en-rPK": u"English (Pakistan)", # English (Pakistan)
+ "en-rPR": u"English (Puerto Rico)", # English (Puerto Rico)
+ "en-rPW": u"English (Palau)", # English (Palau)
+ "en-rSB": u"English (Solomon Islands)", # English (Solomon Islands)
+ "en-rSC": u"English (Seychelles)", # English (Seychelles)
+ "en-rSG": u"English (Singapore)", # English (Singapore)
+ "en-rSL": u"English (Sierra Leone)", # English (Sierra Leone)
+ "en-rSS": u"English (South Sudan)", # English (South Sudan)
+ "en-rSZ": u"English (Swaziland)", # English (Swaziland)
+ "en-rTC": u"English (Turks and Caicos Islands)", # English (Turks and Caicos Islands)
+ "en-rTO": u"English (Tonga)", # English (Tonga)
+ "en-rTT": u"English (Trinidad and Tobago)", # English (Trinidad and Tobago)
+ "en-rTZ": u"English (Tanzania)", # English (Tanzania)
+ "en-rUG": u"English (Uganda)", # English (Uganda)
+ "en-rUM": u"English (U.S. Outlying Islands)", # English (U.S. Outlying Islands)
+ "en-rUS": u"English (United States)", # English (United States)
+ "en-rUS_POSIX": u"English (United States,Computer)", # English (United States,Computer)
+ "en-rVC": u"English (Saint Vincent and the Grenadines)", # English (Saint Vincent and the Grenadines)
+ "en-rVG": u"English (British Virgin Islands)", # English (British Virgin Islands)
+ "en-rVI": u"English (U.S. Virgin Islands)", # English (U.S. Virgin Islands)
+ "en-rVU": u"English (Vanuatu)", # English (Vanuatu)
+ "en-rWS": u"English (Samoa)", # English (Samoa)
+ "en-rZA": u"English (South Africa)", # English (South Africa)
+ "en-rZM": u"English (Zambia)", # English (Zambia)
+ "en-rZW": u"English (Zimbabwe)", # English (Zimbabwe)
+ "eo": u"Esperanto", # Esperanto
+ "es": u"Español", # Spanish
+ "es_419": u"Español (Latinoamérica)", # Spanish (Latin America)
+ "es-rAR": u"Español (Argentina)", # Spanish (Argentina)
+ "es-rBO": u"Español (Bolivia)", # Spanish (Bolivia)
+ "es-rCL": u"Español (Chile)", # Spanish (Chile)
+ "es-rCO": u"Español (Colombia)", # Spanish (Colombia)
+ "es-rCR": u"Español (Costa Rica)", # Spanish (Costa Rica)
+ "es-rCU": u"Español (Cuba)", # Spanish (Cuba)
+ "es-rDO": u"Español (República Dominicana)", # Spanish (Dominican Republic)
+ "es-rEA": u"Español (Ceuta y Melilla)", # Spanish (Ceuta and Melilla)
+ "es-rEC": u"Español (Ecuador)", # Spanish (Ecuador)
+ "es-rES": u"Español (España)", # Spanish (Spain)
+ "es-rGQ": u"Español (Guinea Ecuatorial)", # Spanish (Equatorial Guinea)
+ "es-rGT": u"Español (Guatemala)", # Spanish (Guatemala)
+ "es-rHN": u"Español (Honduras)", # Spanish (Honduras)
+ "es-rIC": u"Español (Islas Canarias)", # Spanish (Canary Islands)
+ "es-rMX": u"Español (México)", # Spanish (Mexico)
+ "es-rNI": u"Español (Nicaragua)", # Spanish (Nicaragua)
+ "es-rPA": u"Español (Panamá)", # Spanish (Panama)
+ "es-rPE": u"Español (Perú)", # Spanish (Peru)
+ "es-rPH": u"Español (Filipinas)", # Spanish (Philippines)
+ "es-rPR": u"Español (Puerto Rico)", # Spanish (Puerto Rico)
+ "es-rPY": u"Español (Paraguay)", # Spanish (Paraguay)
+ "es-rSV": u"Español (El Salvador)", # Spanish (El Salvador)
+ "es-rUS": u"Español (Estados Unidos)", # Spanish (United States)
+ "es-rUY": u"Español (Uruguay)", # Spanish (Uruguay)
+ "es-rVE": u"Español (Venezuela)", # Spanish (Venezuela)
+ "et": u"Eesti", # Estonian
+ "et-rEE": u"Eesti (Eesti)", # Estonian (Estonia)
+ "eu": u"Euskara", # Basque
+ "eu-rES": u"Euskara (Espainia)", # Basque (Spain)
+ "ewo": u"Ewondo", # Ewondo
+ "ewo-rCM": u"Ewondo (Kamərún)", # Ewondo (Cameroon)
+ "fa": u"فارسی", # Persian
+ "fa-rAF": u"دری (افغانستان)", # Persian (Afghanistan)
+ "fa-rIR": u"فارسی (ایران)", # Persian (Iran)
+ "ff": u"Pulaar", # Fulah
+ "ff-rSN": u"Pulaar (Senegaal)", # Fulah (Senegal)
+ "fi": u"Suomi", # Finnish
+ "fi-rFI": u"Suomi (Suomi)", # Finnish (Finland)
+ "fil": u"Filipino", # Filipino
+ "fil-rPH": u"Filipino (Pilipinas)", # Filipino (Philippines)
+ "fo": u"Føroyskt", # Faroese
+ "fo-rFO": u"Føroyskt (Føroyar)", # Faroese (Faroe Islands)
+ "fr": u"Français", # French
+ "fr-rBE": u"Français (Belgique)", # French (Belgium)
+ "fr-rBF": u"Français (Burkina Faso)", # French (Burkina Faso)
+ "fr-rBI": u"Français (Burundi)", # French (Burundi)
+ "fr-rBJ": u"Français (Bénin)", # French (Benin)
+ "fr-rBL": u"Français (Saint-Barthélémy)", # French (Saint Barthélemy)
+ "fr-rCA": u"Français (Canada)", # French (Canada)
+ "fr-rCD": u"Français (République démocratique du Congo)", # French (Congo [DRC])
+ "fr-rCF": u"Français (République centrafricaine)", # French (Central African Republic)
+ "fr-rCG": u"Français (Congo-Brazzaville)", # French (Congo [Republic])
+ "fr-rCH": u"Français (Suisse)", # French (Switzerland)
+ "fr-rCI": u"Français (Côte d’Ivoire)", # French (Côte d’Ivoire)
+ "fr-rCM": u"Français (Cameroun)", # French (Cameroon)
+ "fr-rDJ": u"Français (Djibouti)", # French (Djibouti)
+ "fr-rDZ": u"Français (Algérie)", # French (Algeria)
+ "fr-rFR": u"Français (France)", # French (France)
+ "fr-rGA": u"Français (Gabon)", # French (Gabon)
+ "fr-rGF": u"Français (Guyane française)", # French (French Guiana)
+ "fr-rGN": u"Français (Guinée)", # French (Guinea)
+ "fr-rGP": u"Français (Guadeloupe)", # French (Guadeloupe)
+ "fr-rGQ": u"Français (Guinée équatoriale)", # French (Equatorial Guinea)
+ "fr-rHT": u"Français (Haïti)", # French (Haiti)
+ "fr-rKM": u"Français (Comores)", # French (Comoros)
+ "fr-rLU": u"Français (Luxembourg)", # French (Luxembourg)
+ "fr-rMA": u"Français (Maroc)", # French (Morocco)
+ "fr-rMC": u"Français (Monaco)", # French (Monaco)
+ "fr-rMF": u"Français (Saint-Martin [partie française])", # French (Saint Martin)
+ "fr-rMG": u"Français (Madagascar)", # French (Madagascar)
+ "fr-rML": u"Français (Mali)", # French (Mali)
+ "fr-rMQ": u"Français (Martinique)", # French (Martinique)
+ "fr-rMR": u"Français (Mauritanie)", # French (Mauritania)
+ "fr-rMU": u"Français (Maurice)", # French (Mauritius)
+ "fr-rNC": u"Français (Nouvelle-Calédonie)", # French (New Caledonia)
+ "fr-rNE": u"Français (Niger)", # French (Niger)
+ "fr-rPF": u"Français (Polynésie française)", # French (French Polynesia)
+ "fr-rRE": u"Français (Réunion)", # French (Réunion)
+ "fr-rRW": u"Français (Rwanda)", # French (Rwanda)
+ "fr-rSC": u"Français (Seychelles)", # French (Seychelles)
+ "fr-rSN": u"Français (Sénégal)", # French (Senegal)
+ "fr-rSY": u"Français (Syrie)", # French (Syria)
+ "fr-rTD": u"Français (Tchad)", # French (Chad)
+ "fr-rTG": u"Français (Togo)", # French (Togo)
+ "fr-rTN": u"Français (Tunisie)", # French (Tunisia)
+ "fr-rVU": u"Français (Vanuatu)", # French (Vanuatu)
+ "fr-rYT": u"Français (Mayotte)", # French (Mayotte)
+ "ga": u"Gaeilge", # Irish
+ "ga-rIE": u"Gaeilge (Éire)", # Irish (Ireland)
+ "gl": u"Galego", # Galician
+ "gl-rES": u"Galego (España)", # Galician (Spain)
+ "gsw": u"Schwiizertüütsch", # Swiss German
+ "gsw-rCH": u"Schwiizertüütsch (Schwiiz)", # Swiss German (Switzerland)
+ "gu": u"ગુજરાતી", # Gujarati
+ "gu-rIN": u"ગુજરાતી (ભારત)", # Gujarati (India)
+ "guz": u"Ekegusii", # Gusii
+ "guz-rKE": u"Ekegusii (Kenya)", # Gusii (Kenya)
+ "gv": u"Gaelg", # Manx
+ "gv-rGB": u"Gaelg (Rywvaneth Unys)", # Manx (United Kingdom)
+ "ha": u"Hausa", # Hausa
+ "ha-rLATN": u"Hausa (LATN)", # Hausa (LATN)
+ "ha-rLATN_GH": u"Hausa (Gana,GH)", # Hausa (Ghana,GH)
+ "ha-rLATN_NE": u"Hausa (Nijar,NE)", # Hausa (Niger,NE)
+ "ha-rLATN_NG": u"Hausa (Najeriya,NG)", # Hausa (Nigeria,NG)
+ "haw": u"ʻŌlelo Hawaiʻi", # Hawaiian
+ "haw-rUS": u"ʻŌlelo Hawaiʻi (ʻAmelika Hui Pū ʻIa)", # Hawaiian (United States)
+ "iw": u"עברית", # Hebrew
+ "iw-rIL": u"עברית (ישראל)", # Hebrew (Israel)
+ "hi": u"हिन्दी", # Hindi
+ "hi-rIN": u"हिन्दी (भारत)", # Hindi (India)
+ "hr": u"Hrvatski", # Croatian
+ "hr-rBA": u"Hrvatski (Bosna i Hercegovina)", # Croatian (Bosnia and Herzegovina)
+ "hr-rHR": u"Hrvatski (Hrvatska)", # Croatian (Croatia)
+ "hu": u"Magyar", # Hungarian
+ "hu-rHU": u"Magyar (Magyarország)", # Hungarian (Hungary)
+ "hy": u"հայերեն", # Armenian
+ "hy-rAM": u"հայերեն (Հայաստան)", # Armenian (Armenia)
+ "in": u"Bahasa Indonesia", # Indonesian
+ "in-rID": u"Bahasa Indonesia (Indonesia)", # Indonesian (Indonesia)
+ "ig": u"Igbo", # Igbo
+ "ig-rNG": u"Igbo (Nigeria)", # Igbo (Nigeria)
+ "ii": u"ꆈꌠꉙ", # Sichuan Yi
+ "ii-rCN": u"ꆈꌠꉙ (ꍏꇩ)", # Sichuan Yi (China)
+ "is": u"íslenska", # Icelandic
+ "is-rIS": u"íslenska (Ísland)", # Icelandic (Iceland)
+ "it": u"Italiano", # Italian
+ "it-rCH": u"Italiano (Svizzera)", # Italian (Switzerland)
+ "it-rIT": u"Italiano (Italia)", # Italian (Italy)
+ "it-rSM": u"Italiano (San Marino)", # Italian (San Marino)
+ "ja": u"日本語", # Japanese
+ "ja-rJP": u"日本語 (日本)", # Japanese (Japan)
+ "jgo": u"Ndaꞌa", # Ngomba
+ "jgo-rCM": u"Ndaꞌa (Kamɛlûn)", # Ngomba (Cameroon)
+ "jmc": u"Kimachame", # Machame
+ "jmc-rTZ": u"Kimachame (Tanzania)", # Machame (Tanzania)
+ "ka": u"ქართული", # Georgian
+ "ka-rGE": u"ქართული (საქართველო)", # Georgian (Georgia)
+ "kab": u"Taqbaylit", # Kabyle
+ "kab-rDZ": u"Taqbaylit (Lezzayer)", # Kabyle (Algeria)
+ "kam": u"Kikamba", # Kamba
+ "kam-rKE": u"Kikamba (Kenya)", # Kamba (Kenya)
+ "kde": u"Chimakonde", # Makonde
+ "kde-rTZ": u"Chimakonde (Tanzania)", # Makonde (Tanzania)
+ "kea": u"Kabuverdianu", # Kabuverdianu
+ "kea-rCV": u"Kabuverdianu (Kabu Verdi)", # Kabuverdianu (Cape Verde)
+ "khq": u"Koyra ciini", # Koyra Chiini
+ "khq-rML": u"Koyra ciini (Maali)", # Koyra Chiini (Mali)
+ "ki": u"Gikuyu", # Kikuyu
+ "ki-rKE": u"Gikuyu (Kenya)", # Kikuyu (Kenya)
+ "kk": u"қазақ тілі", # Kazakh
+ "kk-rCYRL": u"қазақ тілі (CYRL)", # Kazakh (CYRL)
+ "kk-rCYRL_KZ": u"қазақ тілі (Қазақстан,KZ)", # Kazakh (Kazakhstan,KZ)
+ "kl": u"Kalaallisut", # Kalaallisut
+ "kl-rGL": u"Kalaallisut (Kalaallit Nunaat)", # Kalaallisut (Greenland)
+ "kln": u"Kalenjin", # Kalenjin
+ "kln-rKE": u"Kalenjin (Emetab Kenya)", # Kalenjin (Kenya)
+ "km": u"ខ្មែរ", # Khmer
+ "km-rKH": u"ខ្មែរ (កម្ពុជា)", # Khmer (Cambodia)
+ "kn": u"ಕನ್ನಡ", # Kannada
+ "kn-rIN": u"ಕನ್ನಡ (ಭಾರತ)", # Kannada (India)
+ "ko": u"한국어", # Korean
+ "ko-rKP": u"한국어 (조선 민주주의 인민 공화국)", # Korean (North Korea)
+ "ko-rKR": u"한국어 (대한민국)", # Korean (South Korea)
+ "kok": u"कोंकणी", # Konkani
+ "kok-rIN": u"कोंकणी (भारत)", # Konkani (India)
+ "ks": u"کٲشُر", # Kashmiri
+ "ks-rARAB": u"کٲشُر (ARAB)", # Kashmiri (ARAB)
+ "ks-rARAB_IN": u"کٲشُر (ہِنٛدوستان,IN)", # Kashmiri (India,IN)
+ "ksb": u"Kishambaa", # Shambala
+ "ksb-rTZ": u"Kishambaa (Tanzania)", # Shambala (Tanzania)
+ "ksf": u"Rikpa", # Bafia
+ "ksf-rCM": u"Rikpa (kamɛrún)", # Bafia (Cameroon)
+ "kw": u"Kernewek", # Cornish
+ "kw-rGB": u"Kernewek (Rywvaneth Unys)", # Cornish (United Kingdom)
+ "lag": u"Kɨlaangi", # Langi
+ "lag-rTZ": u"Kɨlaangi (Taansanía)", # Langi (Tanzania)
+ "lg": u"Luganda", # Ganda
+ "lg-rUG": u"Luganda (Yuganda)", # Ganda (Uganda)
+ "ln": u"Lingála", # Lingala
+ "ln-rAO": u"Lingála (Angóla)", # Lingala (Angola)
+ "ln-rCD": u"Lingála (Repibiki demokratiki ya Kongó)", # Lingala (Congo [DRC])
+ "ln-rCF": u"Lingála (Repibiki ya Afríka ya Káti)", # Lingala (Central African Republic)
+ "ln-rCG": u"Lingála (Kongo)", # Lingala (Congo [Republic])
+ "lo": u"ລາວ", # Lao
+ "lo-rLA": u"ລາວ (ສ.ປ.ປ ລາວ)", # Lao (Laos)
+ "lt": u"Lietuvių", # Lithuanian
+ "lt-rLT": u"Lietuvių (Lietuva)", # Lithuanian (Lithuania)
+ "lu": u"Tshiluba", # Luba-Katanga
+ "lu-rCD": u"Tshiluba (Ditunga wa Kongu)", # Luba-Katanga (Congo [DRC])
+ "luo": u"Dholuo", # Luo
+ "luo-rKE": u"Dholuo (Kenya)", # Luo (Kenya)
+ "luy": u"Luluhia", # Luyia
+ "luy-rKE": u"Luluhia (Kenya)", # Luyia (Kenya)
+ "lv": u"Latviešu", # Latvian
+ "lv-rLV": u"Latviešu (Latvija)", # Latvian (Latvia)
+ "mas": u"Maa", # Masai
+ "mas-rKE": u"Maa (Kenya)", # Masai (Kenya)
+ "mas-rTZ": u"Maa (Tansania)", # Masai (Tanzania)
+ "mer": u"Kĩmĩrũ", # Meru
+ "mer-rKE": u"Kĩmĩrũ (Kenya)", # Meru (Kenya)
+ "mfe": u"Kreol morisien", # Morisyen
+ "mfe-rMU": u"Kreol morisien (Moris)", # Morisyen (Mauritius)
+ "mg": u"Malagasy", # Malagasy
+ "mg-rMG": u"Malagasy (Madagasikara)", # Malagasy (Madagascar)
+ "mgh": u"Makua", # Makhuwa-Meetto
+ "mgh-rMZ": u"Makua (Umozambiki)", # Makhuwa-Meetto (Mozambique)
+ "mgo": u"Metaʼ", # Meta'
+ "mgo-rCM": u"Metaʼ (Kamalun)", # Meta' (Cameroon)
+ "mk": u"македонски", # Macedonian
+ "mk-rMK": u"македонски (Македонија)", # Macedonian (Macedonia [FYROM])
+ "ml": u"മലയാളം", # Malayalam
+ "ml-rIN": u"മലയാളം (ഇന്ത്യ)", # Malayalam (India)
+ "mn": u"монгол", # Mongolian
+ "mn-rCYRL": u"монгол (CYRL)", # Mongolian (CYRL)
+ "mn-rCYRL_MN": u"монгол (Монгол,MN)", # Mongolian (Mongolia,MN)
+ "mr": u"मराठी", # Marathi
+ "mr-rIN": u"मराठी (भारत)", # Marathi (India)
+ "ms": u"Bahasa Melayu", # Malay
+ "ms-rLATN": u"Bahasa Melayu (LATN)", # Malay (LATN)
+ "ms-rLATN_BN": u"Bahasa Melayu (Brunei,BN)", # Malay (Brunei,BN)
+ "ms-rLATN_MY": u"Bahasa Melayu (Malaysia,MY)", # Malay (Malaysia,MY)
+ "ms-rLATN_SG": u"Bahasa Melayu (Singapura,SG)", # Malay (Singapore,SG)
+ "mt": u"Malti", # Maltese
+ "mt-rMT": u"Malti (Malta)", # Maltese (Malta)
+ "mua": u"MUNDAŊ", # Mundang
+ "mua-rCM": u"MUNDAŊ (kameruŋ)", # Mundang (Cameroon)
+ "my": u"ဗမာ", # Burmese
+ "my-rMM": u"ဗမာ (မြန်မာ)", # Burmese (Myanmar [Burma])
+ "naq": u"Khoekhoegowab", # Nama
+ "naq-rNA": u"Khoekhoegowab (Namibiab)", # Nama (Namibia)
+ "nb": u"Norsk bokmål", # Norwegian Bokmål
+ "nb-rNO": u"Norsk bokmål (Norge)", # Norwegian Bokmål (Norway)
+ "nd": u"IsiNdebele", # North Ndebele
+ "nd-rZW": u"IsiNdebele (Zimbabwe)", # North Ndebele (Zimbabwe)
+ "ne": u"नेपाली", # Nepali
+ "ne-rIN": u"नेपाली (भारत)", # Nepali (India)
+ "ne-rNP": u"नेपाली (नेपाल)", # Nepali (Nepal)
+ "nl": u"Nederlands", # Dutch
+ "nl-rAW": u"Nederlands (Aruba)", # Dutch (Aruba)
+ "nl-rBE": u"Nederlands (België)", # Dutch (Belgium)
+ "nl-rCW": u"Nederlands (Curaçao)", # Dutch (Curaçao)
+ "nl-rNL": u"Nederlands (Nederland)", # Dutch (Netherlands)
+ "nl-rSR": u"Nederlands (Suriname)", # Dutch (Suriname)
+ "nl-rSX": u"Nederlands (Sint-Maarten)", # Dutch (Sint Maarten)
+ "nmg": u"Nmg", # Kwasio
+ "nmg-rCM": u"Nmg (Kamerun)", # Kwasio (Cameroon)
+ "nn": u"Nynorsk", # Norwegian Nynorsk
+ "nn-rNO": u"Nynorsk (Noreg)", # Norwegian Nynorsk (Norway)
+ "nus": u"Thok Nath", # Nuer
+ "nus-rSD": u"Thok Nath (Sudan)", # Nuer (Sudan)
+ "nyn": u"Runyankore", # Nyankole
+ "nyn-rUG": u"Runyankore (Uganda)", # Nyankole (Uganda)
+ "om": u"Oromoo", # Oromo
+ "om-rET": u"Oromoo (Itoophiyaa)", # Oromo (Ethiopia)
+ "om-rKE": u"Oromoo (Keeniyaa)", # Oromo (Kenya)
+ "or": u"ଓଡ଼ିଆ", # Oriya
+ "or-rIN": u"ଓଡ଼ିଆ (ଭାରତ)", # Oriya (India)
+ "pa": u"ਪੰਜਾਬੀ", # Punjabi
+ "pa-rARAB": u"پنجاب (ARAB)", # Punjabi (ARAB)
+ "pa-rARAB_PK": u"پنجاب (پکستان,PK)", # Punjabi (Pakistan,PK)
+ "pa-rGURU": u"ਪੰਜਾਬੀ (GURU)", # Punjabi (GURU)
+ "pa-rGURU_IN": u"ਪੰਜਾਬੀ (ਭਾਰਤ,IN)", # Punjabi (India,IN)
+ "pl": u"Polski", # Polish
+ "pl-rPL": u"Polski (Polska)", # Polish (Poland)
+ "ps": u"پښتو", # Pashto
+ "ps-rAF": u"پښتو (افغانستان)", # Pashto (Afghanistan)
+ "pt": u"Português", # Portuguese
+ "pt-rAO": u"Português (Angola)", # Portuguese (Angola)
+ "pt-rBR": u"Português (Brasil)", # Portuguese (Brazil)
+ "pt-rCV": u"Português (Cabo Verde)", # Portuguese (Cape Verde)
+ "pt-rGW": u"Português (Guiné Bissau)", # Portuguese (Guinea-Bissau)
+ "pt-rMO": u"Português (Macau)", # Portuguese (Macau)
+ "pt-rMZ": u"Português (Moçambique)", # Portuguese (Mozambique)
+ "pt-rPT": u"Português (Portugal)", # Portuguese (Portugal)
+ "pt-rST": u"Português (São Tomé e Príncipe)", # Portuguese (São Tomé and Príncipe)
+ "pt-rTL": u"Português (Timor-Leste)", # Portuguese (Timor-Leste)
+ "rm": u"Rumantsch", # Romansh
+ "rm-rCH": u"Rumantsch (Svizra)", # Romansh (Switzerland)
+ "rn": u"Ikirundi", # Rundi
+ "rn-rBI": u"Ikirundi (Uburundi)", # Rundi (Burundi)
+ "ro": u"Română", # Romanian
+ "ro-rMD": u"Română (Republica Moldova)", # Romanian (Moldova)
+ "ro-rRO": u"Română (România)", # Romanian (Romania)
+ "rof": u"Kihorombo", # Rombo
+ "rof-rTZ": u"Kihorombo (Tanzania)", # Rombo (Tanzania)
+ "ru": u"русский", # Russian
+ "ru-rBY": u"русский (Беларусь)", # Russian (Belarus)
+ "ru-rKG": u"русский (Киргизия)", # Russian (Kyrgyzstan)
+ "ru-rKZ": u"русский (Казахстан)", # Russian (Kazakhstan)
+ "ru-rMD": u"русский (Молдова)", # Russian (Moldova)
+ "ru-rRU": u"русский (Россия)", # Russian (Russia)
+ "ru-rUA": u"русский (Украина)", # Russian (Ukraine)
+ "rw": u"Kinyarwanda", # Kinyarwanda
+ "rw-rRW": u"Kinyarwanda (Rwanda)", # Kinyarwanda (Rwanda)
+ "rwk": u"Kiruwa", # Rwa
+ "rwk-rTZ": u"Kiruwa (Tanzania)", # Rwa (Tanzania)
+ "saq": u"Kisampur", # Samburu
+ "saq-rKE": u"Kisampur (Kenya)", # Samburu (Kenya)
+ "sbp": u"Ishisangu", # Sangu
+ "sbp-rTZ": u"Ishisangu (Tansaniya)", # Sangu (Tanzania)
+ "seh": u"Sena", # Sena
+ "seh-rMZ": u"Sena (Moçambique)", # Sena (Mozambique)
+ "ses": u"Koyraboro senni", # Koyraboro Senni
+ "ses-rML": u"Koyraboro senni (Maali)", # Koyraboro Senni (Mali)
+ "sg": u"Sängö", # Sango
+ "sg-rCF": u"Sängö (Ködörösêse tî Bêafrîka)", # Sango (Central African Republic)
+ "shi": u"ⵜⴰⵎⴰⵣⵉⵖⵜ", # Tachelhit
+ "shi-rLATN": u"Tamazight (LATN)", # Tachelhit (LATN)
+ "shi-rLATN_MA": u"Tamazight (lmɣrib,MA)", # Tachelhit (Morocco,MA)
+ "shi-rTFNG": u"ⵜⴰⵎⴰⵣⵉⵖⵜ (TFNG)", # Tachelhit (TFNG)
+ "shi-rTFNG_MA": u"ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ,MA)", # Tachelhit (Morocco,MA)
+ "si": u"සිංහල", # Sinhala
+ "si-rLK": u"සිංහල (ශ්රී ලංකාව)", # Sinhala (Sri Lanka)
+ "sk": u"Slovenčina", # Slovak
+ "sk-rSK": u"Slovenčina (Slovensko)", # Slovak (Slovakia)
+ "sl": u"Slovenščina", # Slovenian
+ "sl-rSI": u"Slovenščina (Slovenija)", # Slovenian (Slovenia)
+ "sn": u"ChiShona", # Shona
+ "sn-rZW": u"ChiShona (Zimbabwe)", # Shona (Zimbabwe)
+ "so": u"Soomaali", # Somali
+ "so-rDJ": u"Soomaali (Jabuuti)", # Somali (Djibouti)
+ "so-rET": u"Soomaali (Itoobiya)", # Somali (Ethiopia)
+ "so-rKE": u"Soomaali (Kiiniya)", # Somali (Kenya)
+ "so-rSO": u"Soomaali (Soomaaliya)", # Somali (Somalia)
+ "sq": u"Shqip", # Albanian
+ "sq-rAL": u"Shqip (Shqipëria)", # Albanian (Albania)
+ "sq-rMK": u"Shqip (Maqedoni)", # Albanian (Macedonia [FYROM])
+ "sr": u"Српски", # Serbian
+ "sr-rCYRL": u"Српски (CYRL)", # Serbian (CYRL)
+ "sr-rCYRL_BA": u"Српски (Босна и Херцеговина,BA)", # Serbian (Bosnia and Herzegovina,BA)
+ "sr-rCYRL_ME": u"Српски (Црна Гора,ME)", # Serbian (Montenegro,ME)
+ "sr-rCYRL_RS": u"Српски (Србија,RS)", # Serbian (Serbia,RS)
+ "sr-rLATN": u"Srpski (LATN)", # Serbian (LATN)
+ "sr-rLATN_BA": u"Srpski (Bosna i Hercegovina,BA)", # Serbian (Bosnia and Herzegovina,BA)
+ "sr-rLATN_ME": u"Srpski (Crna Gora,ME)", # Serbian (Montenegro,ME)
+ "sr-rLATN_RS": u"Srpski (Srbija,RS)", # Serbian (Serbia,RS)
+ "sv": u"Svenska", # Swedish
+ "sv-rAX": u"Svenska (Åland)", # Swedish (Åland Islands)
+ "sv-rFI": u"Svenska (Finland)", # Swedish (Finland)
+ "sv-rSE": u"Svenska (Sverige)", # Swedish (Sweden)
+ "sw": u"Kiswahili", # Swahili
+ "sw-rKE": u"Kiswahili (Kenya)", # Swahili (Kenya)
+ "sw-rTZ": u"Kiswahili (Tanzania)", # Swahili (Tanzania)
+ "sw-rUG": u"Kiswahili (Uganda)", # Swahili (Uganda)
+ "swc": u"Kiswahili ya Kongo", # Congo Swahili
+ "swc-rCD": u"Kiswahili ya Kongo (Jamhuri ya Kidemokrasia ya Kongo)", # Congo Swahili (Congo [DRC])
+ "ta": u"தமிழ்", # Tamil
+ "ta-rIN": u"தமிழ் (இந்தியா)", # Tamil (India)
+ "ta-rLK": u"தமிழ் (இலங்கை)", # Tamil (Sri Lanka)
+ "ta-rMY": u"தமிழ் (மலேஷியா)", # Tamil (Malaysia)
+ "ta-rSG": u"தமிழ் (சிங்கப்பூர்)", # Tamil (Singapore)
+ "te": u"తెలుగు", # Telugu
+ "te-rIN": u"తెలుగు (భారత దేశం)", # Telugu (India)
+ "teo": u"Kiteso", # Teso
+ "teo-rKE": u"Kiteso (Kenia)", # Teso (Kenya)
+ "teo-rUG": u"Kiteso (Uganda)", # Teso (Uganda)
+ "th": u"ไทย", # Thai
+ "th-rTH": u"ไทย (ไทย)", # Thai (Thailand)
+ "ti": u"ትግርኛ", # Tigrinya
+ "ti-rER": u"ትግርኛ (ER)", # Tigrinya (Eritrea)
+ "ti-rET": u"ትግርኛ (ET)", # Tigrinya (Ethiopia)
+ "to": u"Lea fakatonga", # Tongan
+ "to-rTO": u"Lea fakatonga (Tonga)", # Tongan (Tonga)
+ "tr": u"Türkçe", # Turkish
+ "tr-rCY": u"Türkçe (Güney Kıbrıs Rum Kesimi)", # Turkish (Cyprus)
+ "tr-rTR": u"Türkçe (Türkiye)", # Turkish (Turkey)
+ "twq": u"Tasawaq senni", # Tasawaq
+ "twq-rNE": u"Tasawaq senni (Nižer)", # Tasawaq (Niger)
+ "tzm": u"Tamaziɣt", # Central Atlas Tamazight
+ "tzm-rLATN": u"Tamaziɣt (LATN)", # Central Atlas Tamazight (LATN)
+ "tzm-rLATN_MA": u"Tamaziɣt (Meṛṛuk,MA)", # Central Atlas Tamazight (Morocco,MA)
+ "uk": u"українська", # Ukrainian
+ "uk-rUA": u"українська (Україна)", # Ukrainian (Ukraine)
+ "ur": u"اردو", # Urdu
+ "ur-rIN": u"اردو (بھارت)", # Urdu (India)
+ "ur-rPK": u"اردو (پاکستان)", # Urdu (Pakistan)
+ "uz": u"Ўзбек", # Uzbek
+ "uz-rARAB": u"اوزبیک (ARAB)", # Uzbek (ARAB)
+ "uz-rARAB_AF": u"اوزبیک (افغانستان,AF)", # Uzbek (Afghanistan,AF)
+ "uz-rCYRL": u"Ўзбек (CYRL)", # Uzbek (CYRL)
+ "uz-rCYRL_UZ": u"Ўзбек (Ўзбекистон,UZ)", # Uzbek (Uzbekistan,UZ)
+ "uz-rLATN": u"Oʻzbekcha (LATN)", # Uzbek (LATN)
+ "uz-rLATN_UZ": u"Oʻzbekcha (Oʻzbekiston,UZ)", # Uzbek (Uzbekistan,UZ)
+ "vai": u"ꕙꔤ", # Vai
+ "vai-rLATN": u"Vai (LATN)", # Vai (LATN)
+ "vai-rLATN_LR": u"Vai (Laibhiya,LR)", # Vai (Liberia,LR)
+ "vai-rVAII": u"ꕙꔤ (VAII)", # Vai (VAII)
+ "vai-rVAII_LR": u"ꕙꔤ (ꕞꔤꔫꕩ,LR)", # Vai (Liberia,LR)
+ "vi": u"Tiếng Việt", # Vietnamese
+ "vi-rVN": u"Tiếng Việt (Việt Nam)", # Vietnamese (Vietnam)
+ "vun": u"Kyivunjo", # Vunjo
+ "vun-rTZ": u"Kyivunjo (Tanzania)", # Vunjo (Tanzania)
+ "xog": u"Olusoga", # Soga
+ "xog-rUG": u"Olusoga (Yuganda)", # Soga (Uganda)
+ "yav": u"Nuasue", # Yangben
+ "yav-rCM": u"Nuasue (Kemelún)", # Yangben (Cameroon)
+ "yo": u"Èdè Yorùbá", # Yoruba
+ "yo-rNG": u"Èdè Yorùbá (Orílẹ́ède Nàìjíríà)", # Yoruba (Nigeria)
+ # This was the obtained from Locale, but it seems it's different in Settings
+ #"zh": u"中文", # Chinese
+ "zh": u"中文 (简体)", # Chinese
+ "zh-rHANS": u"中文 (HANS)", # Chinese (HANS)
+ "zh-rHANS_CN": u"中文 (中国,CN)", # Chinese (China,CN)
+ "zh-rHANS_HK": u"中文 (香港,HK)", # Chinese (Hong Kong,HK)
+ "zh-rHANS_MO": u"中文 (澳门,MO)", # Chinese (Macau,MO)
+ "zh-rHANS_SG": u"中文 (新加坡,SG)", # Chinese (Singapore,SG)
+ "zh-rHANT": u"中文 (HANT)", # Chinese (HANT)
+ "zh-rHANT_HK": u"中文 (香港,HK)", # Chinese (Hong Kong,HK)
+ "zh-rHANT_MO": u"中文 (澳門,MO)", # Chinese (Macau,MO)
+ "zh-rHANT_TW": u"中文 (台灣,TW)", # Chinese (Taiwan,TW)
+ "zu": u"IsiZulu", # Zulu
+ "zu-rZA": u"IsiZulu (iNingizimu Afrika)", # Zulu (South Africa)
+ }
+
+ if not languageTo in LANGUAGES.keys():
+ raise RuntimeError("%s is not a supported language by AndroidViewClient" % languageTo)
+ self.openQuickSettingsSettings()
+ view = None
+ currentLanguage = None
+ ATTEMPTS = 10
+ if self.vc.getSdkVersion() >= 20:
+ for _ in range(ATTEMPTS):
+ com_android_settings___id_dashboard = self.vc.findViewByIdOrRaise("com.android.settings:id/dashboard")
+ for k, v in LANGUAGE_SETTINGS.iteritems():
+ if DEBUG_CHANGE_LANGUAGE:
+ print >> sys.stderr, "searching for", v
+ view = self.vc.findViewWithText(v, root=com_android_settings___id_dashboard)
+ if view:
+ currentLanguage = k
+ if DEBUG_CHANGE_LANGUAGE:
+ print >> sys.stderr, "found current language:", k
+ break
+ if view:
+ break
+ com_android_settings___id_dashboard.uiScrollable.flingForward()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+ if view is None:
+ raise ViewNotFoundException("text", "'Language & input' (any language)", "ROOT")
+ view.touch()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+ self.vc.findViewWithTextOrRaise(PHONE_LANGUAGE[currentLanguage]).touch()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+ else:
+ for _ in range(ATTEMPTS):
+ android___id_list = self.vc.findViewByIdOrRaise("android:id/list")
+ for k, v in LANGUAGE_SETTINGS.iteritems():
+ view = self.vc.findViewWithText(v, root=android___id_list)
+ if view:
+ currentLanguage = k
+ break
+ if view:
+ break
+ android___id_list.uiScrollable.flingForward()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+ if view is None:
+ raise ViewNotFoundException("text", "'Language & input' (any language)", "ROOT")
+ view.touch()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+ self.vc.findViewWithTextOrRaise(PHONE_LANGUAGE[currentLanguage]).touch()
+ self.vc.sleep(1)
+ self.vc.dump(-1)
+
+ android___id_list = self.vc.findViewByIdOrRaise("android:id/list")
+ android___id_list.uiScrollable.setViewClient(self.vc)
+ if DEBUG_CHANGE_LANGUAGE:
+ print >> sys.stderr, "scrolling to find", LANGUAGES[languageTo]
+ view = android___id_list.uiScrollable.scrollTextIntoView(LANGUAGES[languageTo])
+ if view is not None:
+ view.touch()
+ else:
+ #raise RuntimeError(u"Couldn't change language to %s (%s)" % (LANGUAGES[languageTo], languageTo))
+ raise RuntimeError("Couldn't change language to %s" % languageTo)
+ self.vc.device.press('BACK')
+ self.vc.sleep(1)
+ self.vc.device.press('BACK')
+
+class UiCollection():
+ '''
+ Used to enumerate a container's user interface (UI) elements for the purpose of counting, or
+ targeting a sub elements by a child's text or description.
+ '''
+
+ pass
+
+class UiScrollable(UiCollection):
+ '''
+ A L{UiCollection} that supports searching for items in scrollable layout elements.
+
+ This class can be used with horizontally or vertically scrollable controls.
+ '''
+
+ def __init__(self, view):
+ self.vc = None
+ self.view = view
+ self.vertical = True
+ self.bounds = view.getBounds()
+ (self.x, self.y, self.w, self.h) = view.getPositionAndSize()
+ self.steps = 10
+ self.duration = 500
+ self.swipeDeadZonePercentage = 0.1
+ self.maxSearchSwipes = 10
+
+ def flingBackward(self):
+ if self.vertical:
+ s = (self.x + self.w/2, self.y + self.h * self.swipeDeadZonePercentage)
+ e = (self.x + self.w/2, self.y + self.h - self.h * self.swipeDeadZonePercentage)
+ else:
+ s = (self.x + self.w * self.swipeDeadZonePercentage, self.y + self.h/2)
+ e = (self.x + self.w * (1.0 - self.swipeDeadZonePercentage), self.y + self.h/2)
+ if DEBUG:
+ print >> sys.stderr, "flingBackward: view=", self.view.__smallStr__(), self.view.getPositionAndSize()
+ print >> sys.stderr, "self.view.device.drag(%s, %s, %s, %s)" % (s, e, self.duration, self.steps)
+ self.view.device.drag(s, e, self.duration, self.steps, self.view.device.display['orientation'])
+
+ def flingForward(self):
+ if self.vertical:
+ s = (self.x + self.w/2, (self.y + self.h ) - self.h * self.swipeDeadZonePercentage)
+ e = (self.x + self.w/2, self.y + self.h * self.swipeDeadZonePercentage)
+ else:
+ s = (self.x + self.w * (1.0 - self.swipeDeadZonePercentage), self.y + self.h/2)
+ e = (self.x + self.w * self.swipeDeadZonePercentage, self.y + self.h/2)
+ if DEBUG:
+ print >> sys.stderr, "flingForward: view=", self.view.__smallStr__(), self.view.getPositionAndSize()
+ print >> sys.stderr, "self.view.device.drag(%s, %s, %s, %s)" % (s, e, self.duration, self.steps)
+ self.view.device.drag(s, e, self.duration, self.steps, self.view.device.display['orientation'])
+
+ def flingToBeginning(self, maxSwipes=10):
+ if self.vertical:
+ for _ in range(maxSwipes):
+ if DEBUG:
+ print >> sys.stderr, "flinging to beginning"
+ self.flingBackward()
+
+ def flingToEnd(self, maxSwipes=10):
+ if self.vertical:
+ for _ in range(maxSwipes):
+ if DEBUG:
+ print >> sys.stderr, "flinging to end"
+ self.flingForward()
+
+ def scrollTextIntoView(self, text):
+ '''
+ Performs a forward scroll action on the scrollable layout element until the text you provided is visible,
+ or until swipe attempts have been exhausted. See setMaxSearchSwipes(int)
+ '''
+
+ if self.vc is None:
+ raise ValueError('vc must be set in order to use this method')
+ for n in range(self.maxSearchSwipes):
+ # FIXME: now I need to figure out the best way of navigating to the ViewClient asossiated
+ # with this UiScrollable.
+ # It's using setViewClient() now.
+ if DEBUG or DEBUG_CHANGE_LANGUAGE:
+ print >> sys.stderr, u"Searching for text='%s'" % text
+ for v in self.vc.views:
+ try:
+ print >> sys.stderr, " scrollTextIntoView: v=", v.getId(),
+ print >> sys.stderr, v.getText()
+ except Exception, e:
+ print >> sys.stderr, e
+ pass
+ #v = self.vc.findViewWithText(text, root=self.view)
+ v = self.vc.findViewWithText(text)
+ if v is not None:
+ return v
+ self.flingForward()
+ #self.vc.sleep(1)
+ self.vc.dump(-1)
+ # WARNING: after this dump, the value kept in self.view is outdated, it should be refreshed
+ # in some way
+ return None
+
+ def setAsHorizontalList(self):
+ self.vertical = False
+
+ def setAsVerticalList(self):
+ self.vertical = True
+
+ def setMaxSearchSwipes(self, maxSwipes):
+ self.maxSearchSwipes = maxSwipes
+
+ def setViewClient(self, vc):
+ self.vc = vc
+
+
+class ListView(View):
+ '''
+ ListView class.
+ '''
+
+ pass
+
+class UiAutomator2AndroidViewClient():
+ '''
+ UiAutomator XML to AndroidViewClient
+ '''
+
+ def __init__(self, device, version, uiAutomatorHelper):
+ self.device = device
+ self.version = version
+ self.uiAutomatorHelper = uiAutomatorHelper
+ self.root = None
+ self.nodeStack = []
+ self.parent = None
+ self.views = []
+ self.idCount = 1
+
+ def StartElement(self, name, attributes):
+ '''
+ Expat start element event handler
+ '''
+ if name == 'hierarchy':
+ pass
+ elif name == 'node':
+ # Instantiate an Element object
+ attributes['uniqueId'] = 'id/no_id/%d' % self.idCount
+ bounds = re.split('[\][,]', attributes['bounds'])
+ attributes['bounds'] = ((int(bounds[1]), int(bounds[2])), (int(bounds[4]), int(bounds[5])))
+ if DEBUG_BOUNDS:
+ print >> sys.stderr, "bounds=", attributes['bounds']
+ self.idCount += 1
+ child = View.factory(attributes, self.device, version=self.version, uiAutomatorHelper=self.uiAutomatorHelper)
+ self.views.append(child)
+ # Push element onto the stack and make it a child of parent
+ if not self.nodeStack:
+ self.root = child
+ else:
+ self.parent = self.nodeStack[-1]
+ self.parent.add(child)
+ self.nodeStack.append(child)
+
+ def EndElement(self, name):
+ '''
+ Expat end element event handler
+ '''
+
+ if name == 'hierarchy':
+ pass
+ elif name == 'node':
+ self.nodeStack.pop()
+
+ def CharacterData(self, data):
+ '''
+ Expat character data event handler
+ '''
+
+ if data.strip():
+ data = data.encode()
+ element = self.nodeStack[-1]
+ element.cdata += data
+
+ def Parse(self, uiautomatorxml):
+ # Create an Expat parser
+ parser = xml.parsers.expat.ParserCreate() # @UndefinedVariable
+ # Set the Expat event handlers to our methods
+ parser.StartElementHandler = self.StartElement
+ parser.EndElementHandler = self.EndElement
+ parser.CharacterDataHandler = self.CharacterData
+ # Parse the XML File
+ try:
+ encoded = uiautomatorxml.encode(encoding='utf-8', errors='replace')
+ _ = parser.Parse(encoded, True)
+ except xml.parsers.expat.ExpatError, ex: # @UndefinedVariable
+ print >>sys.stderr, "ERROR: Offending XML:\n", repr(uiautomatorxml)
+ raise RuntimeError(ex)
+ return self.root
+
+class Excerpt2Code():
+ ''' Excerpt XML to code '''
+
+ def __init__(self):
+ self.data = None
+
+ def StartElement(self, name, attributes):
+ '''
+ Expat start element event handler
+ '''
+ if name == 'excerpt':
+ pass
+ else:
+ warnings.warn("Unexpected element: '%s'" % name)
+
+ def EndElement(self, name):
+ '''
+ Expat end element event handler
+ '''
+
+ if name == 'excerpt':
+ pass
+
+ def CharacterData(self, data):
+ '''
+ Expat character data event handler
+ '''
+
+ if data.strip():
+ data = data.encode()
+ if not self.data:
+ self.data = data
+ else:
+ self.data += data
+
+ def Parse(self, excerpt):
+ # Create an Expat parser
+ parser = xml.parsers.expat.ParserCreate() # @UndefinedVariable
+ # Set the Expat event handlers to our methods
+ parser.StartElementHandler = self.StartElement
+ parser.EndElementHandler = self.EndElement
+ parser.CharacterDataHandler = self.CharacterData
+ # Parse the XML
+ _ = parser.Parse(excerpt, 1)
+ return self.data
+
+class ViewClientOptions:
+ '''
+ ViewClient options helper class
+ '''
+
+ DEVIDE = 'device'
+ SERIALNO = 'serialno'
+ AUTO_DUMP = 'autodump'
+ FORCE_VIEW_SERVER_USE = 'forceviewserveruse'
+ LOCAL_PORT = 'localport' # ViewServer local port
+ REMOTE_PORT = 'remoteport' # ViewServer remote port
+ START_VIEW_SERVER = 'startviewserver'
+ IGNORE_UIAUTOMATOR_KILLED = 'ignoreuiautomatorkilled'
+ COMPRESSED_DUMP = 'compresseddump'
+ USE_UIAUTOMATOR_HELPER = 'useuiautomatorhelper'
+
+class ViewClient:
+ '''
+ ViewClient is a I{ViewServer} client.
+
+ ViewServer backend
+ ==================
+ If not running the ViewServer is started on the target device or emulator and then the port
+ mapping is created.
+
+ LocalViewServer backend
+ =======================
+ ViewServer is started as an application services instead of as a system service.
+
+ UiAutomator backend
+ ===================
+ No service is started.
+
+ null backend
+ ============
+ Allows only operations using PX or DIP as hierarchy is not dumped and thus Views not recognized.
+
+ UiAutomatorHelper backend
+ =========================
+ Requires B{Culebra Tester} installed on Android device.
+ '''
+
+ imageDirectory = None
+ ''' The directory used to store screenshot images '''
+
+ def __init__(self, device, serialno, adb=None, autodump=True, forceviewserveruse=False, localport=VIEW_SERVER_PORT, remoteport=VIEW_SERVER_PORT, startviewserver=True, ignoreuiautomatorkilled=False, compresseddump=True, useuiautomatorhelper=False):
+ '''
+ Constructor
+
+ @type device: AdbClient
+ @param device: The device running the C{View server} to which this client will connect
+ @type serialno: str
+ @param serialno: the serial number of the device or emulator to connect to
+ @type adb: str
+ @param adb: the path of the C{adb} executable or None and C{ViewClient} will try to find it
+ @type autodump: boolean
+ @param autodump: whether an automatic dump is performed at the end of this constructor
+ @type forceviewserveruse: boolean
+ @param forceviewserveruse: Force the use of C{ViewServer} even if the conditions to use
+ C{UiAutomator} are satisfied
+ @type localport: int
+ @param localport: the local port used in the redirection
+ @type remoteport: int
+ @param remoteport: the remote port used to start the C{ViewServer} in the device or
+ emulator
+ @type startviewserver: boolean
+ @param startviewserver: Whether to start the B{global} ViewServer
+ @type ignoreuiautomatorkilled: boolean
+ @param ignoreuiautomatorkilled: Ignores received B{Killed} message from C{uiautomator}
+ @type compresseddump: boolean
+ @param compresseddump: turns --compressed flag for uiautomator dump on/off
+ @:type useuiautomatorhelper: boolean
+ @:param useuiautomatorhelper: use UiAutomatorHelper Android app as backend
+ '''
+
+ if not device:
+ raise Exception('Device is not connected')
+ self.device = device
+ ''' The C{AdbClient} device instance '''
+
+ if not serialno:
+ raise ValueError("Serialno cannot be None")
+ self.serialno = self.__mapSerialNo(serialno)
+ ''' The serial number of the device '''
+
+ self.uiAutomatorHelper = None
+ ''' The UiAutomatorHelper '''
+
+ if DEBUG_DEVICE: print >> sys.stderr, "ViewClient: using device with serialno", self.serialno
+
+ if adb:
+ if not os.access(adb, os.X_OK):
+ raise Exception('adb="%s" is not executable' % adb)
+ else:
+ # Using adbclient we don't need adb executable yet (maybe it's needed if we want to
+ # start adb if not running)
+ adb = obtainAdbPath()
+
+ self.adb = adb
+ ''' The adb command '''
+ self.root = None
+ ''' The root node '''
+ self.viewsById = {}
+ ''' The map containing all the L{View}s indexed by their L{View.getUniqueId()} '''
+ self.display = {}
+ ''' The map containing the device's display properties: width, height and density '''
+
+ for prop in [ 'width', 'height', 'density', 'orientation' ]:
+ self.display[prop] = -1
+ if USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES:
+ try:
+ self.display[prop] = device.display[prop]
+ except:
+ if WARNINGS:
+ warnings.warn("Couldn't determine display %s" % prop)
+ else:
+ # these values are usually not defined as properties, so we stick to the -1 set
+ # before
+ pass
+
+ self.build = {}
+ ''' The map containing the device's build properties: version.sdk, version.release '''
+
+ for prop in [VERSION_SDK_PROPERTY, VERSION_RELEASE_PROPERTY]:
+ self.build[prop] = -1
+ try:
+ if USE_ADB_CLIENT_TO_GET_BUILD_PROPERTIES:
+ self.build[prop] = device.getProperty(prop)
+ else:
+ self.build[prop] = device.shell('getprop ro.build.' + prop)[:-2]
+ except:
+ if WARNINGS:
+ warnings.warn("Couldn't determine build %s" % prop)
+
+ if prop == VERSION_SDK_PROPERTY:
+ # we expect it to be an int
+ self.build[prop] = int(self.build[prop] if self.build[prop] else -1)
+
+ self.ro = {}
+ ''' The map containing the device's ro properties: secure, debuggable '''
+ for prop in ['secure', 'debuggable']:
+ try:
+ self.ro[prop] = device.shell('getprop ro.' + prop)[:-2]
+ except:
+ if WARNINGS:
+ warnings.warn("Couldn't determine ro %s" % prop)
+ self.ro[prop] = 'UNKNOWN'
+
+ self.forceViewServerUse = forceviewserveruse
+ ''' Force the use of ViewServer even if the conditions to use UiAutomator are satisfied '''
+ self.useUiAutomator = (self.build[VERSION_SDK_PROPERTY] >= 16) and not forceviewserveruse # jelly bean 4.1 & 4.2
+ if DEBUG:
+ print >> sys.stderr, " ViewClient.__init__: useUiAutomator=", self.useUiAutomator, "sdk=", self.build[VERSION_SDK_PROPERTY], "forceviewserveruse=", forceviewserveruse
+ ''' If UIAutomator is supported by the device it will be used '''
+ self.ignoreUiAutomatorKilled = ignoreuiautomatorkilled
+ ''' On some devices (i.e. Nexus 7 running 4.2.2) uiautomator is killed just after generating
+ the dump file. In many cases the file is already complete so we can ask to ignore the 'Killed'
+ message by setting L{ignoreuiautomatorkilled} to C{True}.
+
+ Changes in v2.3.21 that uses C{/dev/tty} instead of a file may have turned this variable
+ unnecessary, however it has been kept for backward compatibility.
+ '''
+
+ if self.useUiAutomator:
+ self.textProperty = TEXT_PROPERTY_UI_AUTOMATOR
+ else:
+ if self.build[VERSION_SDK_PROPERTY] <= 10:
+ self.textProperty = TEXT_PROPERTY_API_10
+ else:
+ self.textProperty = TEXT_PROPERTY
+ if startviewserver:
+ if not self.serviceResponse(device.shell('service call window 3')):
+ try:
+ self.assertServiceResponse(device.shell('service call window 1 i32 %d' %
+ remoteport))
+ except:
+ msg = 'Cannot start View server.\n' \
+ 'This only works on emulator and devices running developer versions.\n' \
+ 'Does hierarchyviewer work on your device?\n' \
+ 'See https://github.com/dtmilano/AndroidViewClient/wiki/Secure-mode\n\n' \
+ 'Device properties:\n' \
+ ' ro.secure=%s\n' \
+ ' ro.debuggable=%s\n' % (self.ro['secure'], self.ro['debuggable'])
+ raise Exception(msg)
+
+ self.localPort = localport
+ self.remotePort = remoteport
+ # FIXME: it seems there's no way of obtaining the serialno from the MonkeyDevice
+ subprocess.check_call([self.adb, '-s', self.serialno, 'forward', 'tcp:%d' % self.localPort,
+ 'tcp:%d' % self.remotePort])
+
+ self.windows = None
+ ''' The list of windows as obtained by L{ViewClient.list()} '''
+
+
+ # FIXME: may not be true, one may want UiAutomator but without UiAutomatorHelper
+ if self.useUiAutomator:
+ if useuiautomatorhelper:
+ self.uiAutomatorHelper = UiAutomatorHelper(device)
+ else:
+ # culebratester Intrumentation running prevents `uiautomator dump` from working correctly, then if we are not
+ # using UiAutomatorHelper let's kill it, just in case
+ subprocess.check_call([self.adb, '-s', self.serialno, 'shell', 'am', 'force-stop', 'com.dtmilano.android.culebratester'])
+
+
+ self.uiDevice = UiDevice(self)
+ ''' The L{UiDevice} '''
+
+ ''' The output of compressed dump is different than output of uncompressed one.
+ If one requires uncompressed output, this option should be set to False
+ '''
+ self.compressedDump = compresseddump
+
+ self.navBack = None
+ self.navHome = None
+ self.navRecentApps = None
+
+ if autodump:
+ self.dump()
+
+ def __del__(self):
+ # should clean up some things
+ if hasattr(self, 'uiAutomatorHelper') and self.uiAutomatorHelper:
+ if DEBUG or True:
+ print >> sys.stderr, "Stopping UiAutomatorHelper..."
+ self.uiAutomatorHelper.quit()
+
+ @staticmethod
+ def __obtainAdbPath():
+ return obtainAdbPath()
+
+ @staticmethod
+ def __mapSerialNo(serialno):
+ serialno = serialno.strip()
+ #ipRE = re.compile('^\d+\.\d+.\d+.\d+$')
+ if IP_RE.match(serialno):
+ if DEBUG_DEVICE: print >>sys.stderr, "ViewClient: adding default port to serialno", serialno, ADB_DEFAULT_PORT
+ return serialno + ':%d' % ADB_DEFAULT_PORT
+
+ ipPortRE = re.compile('^\d+\.\d+.\d+.\d+:\d+$')
+ if ipPortRE.match(serialno):
+ # nothing to map
+ return serialno
+
+ if re.search("[.*()+]", serialno):
+ raise ValueError("Regular expression not supported as serialno in ViewClient. Found '%s'" % serialno)
+
+ return serialno
+
+ @staticmethod
+ def __obtainDeviceSerialNumber(device):
+ if DEBUG_DEVICE: print >>sys.stderr, "ViewClient: obtaining serial number for connected device"
+ serialno = device.getProperty('ro.serialno')
+ if not serialno:
+ serialno = device.shell('getprop ro.serialno')
+ if serialno:
+ serialno = serialno[:-2]
+ if not serialno:
+ qemu = device.shell('getprop ro.kernel.qemu')
+ if qemu:
+ qemu = qemu[:-2]
+ if qemu and int(qemu) == 1:
+ # FIXME !!!!!
+ # this must be calculated from somewhere, though using a fixed serialno for now
+ warnings.warn("Running on emulator but no serial number was specified then 'emulator-5554' is used")
+ serialno = 'emulator-5554'
+ if not serialno:
+ # If there's only one device connected get its serialno
+ adb = ViewClient.__obtainAdbPath()
+ if DEBUG_DEVICE: print >>sys.stderr, " using adb=%s" % adb
+ s = subprocess.Popen([adb, 'get-serialno'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={}).communicate()[0][:-1]
+ if s != 'unknown':
+ serialno = s
+ if DEBUG_DEVICE: print >>sys.stderr, " serialno=%s" % serialno
+ if not serialno:
+ warnings.warn("Couldn't obtain the serialno of the connected device")
+ return serialno
+
+ @staticmethod
+ def setAlarm(timeout):
+ osName = platform.system()
+ if osName.startswith('Windows'): # alarm is not implemented in Windows
+ return
+ signal.alarm(timeout)
+
+ @staticmethod
+ def connectToDeviceOrExit(timeout=60, verbose=False, ignoresecuredevice=False, ignoreversioncheck=False, serialno=None):
+ '''
+ Connects to a device which serial number is obtained from the script arguments if available
+ or using the default regex C{.*}.
+
+ If the connection is not successful the script exits.
+
+ History
+ -------
+ In MonkeyRunner times, this method was a way of overcoming one of its limitations.
+ L{MonkeyRunner.waitForConnection()} returns a L{MonkeyDevice} even if the connection failed.
+ Then, to detect this situation, C{device.wake()} is attempted and if it fails then it is
+ assumed the previous connection failed.
+
+ @type timeout: int
+ @param timeout: timeout for the connection
+ @type verbose: bool
+ @param verbose: Verbose output
+ @type ignoresecuredevice: bool
+ @param ignoresecuredevice: Ignores the check for a secure device
+ @type ignoreversioncheck: bool
+ @param ignoreversioncheck: Ignores the check for a supported ADB version
+ @type serialno: str
+ @param serialno: The device or emulator serial number
+
+ @return: the device and serialno used for the connection
+ '''
+
+ progname = os.path.basename(sys.argv[0])
+ if serialno is None:
+ # eat all the extra options the invoking script may have added
+ args = sys.argv
+ while len(args) > 1 and args[1][0] == '-':
+ args.pop(1)
+ serialno = args[1] if len(args) > 1 else \
+ os.environ['ANDROID_SERIAL'] if os.environ.has_key('ANDROID_SERIAL') \
+ else '.*'
+ if IP_RE.match(serialno):
+ # If matches an IP address format and port was not specified add the default
+ serialno += ':%d' % ADB_DEFAULT_PORT
+ if verbose:
+ print >> sys.stderr, 'Connecting to a device with serialno=%s with a timeout of %d secs...' % \
+ (serialno, timeout)
+ ViewClient.setAlarm(timeout+5)
+ # NOTE: timeout is used for 2 different timeouts, the one to set the alarm to timeout the connection with
+ # adb and the timeout used by adb (once connected) for the sockets
+ device = adbclient.AdbClient(serialno, ignoreversioncheck=ignoreversioncheck, timeout=timeout)
+ ViewClient.setAlarm(0)
+ if verbose:
+ print >> sys.stderr, 'Connected to device with serialno=%s' % serialno
+ secure = device.getSystemProperty('ro.secure')
+ debuggable = device.getSystemProperty('ro.debuggable')
+ versionProperty = device.getProperty(VERSION_SDK_PROPERTY)
+ if versionProperty:
+ version = int(versionProperty)
+ else:
+ if verbose:
+ print "Couldn't obtain device SDK version"
+ version = -1
+
+ # we are going to use UiAutomator for versions >= 16 that's why we ignore if the device
+ # is secure if this is true
+ if secure == '1' and debuggable == '0' and not ignoresecuredevice and version < 16:
+ print >> sys.stderr, "%s: ERROR: Device is secure, AndroidViewClient won't work." % progname
+ if verbose:
+ print >> sys.stderr, " secure=%s debuggable=%s version=%d ignoresecuredevice=%s" % \
+ (secure, debuggable, version, ignoresecuredevice)
+ sys.exit(2)
+ if re.search("[.*()+]", serialno) and not re.search("(\d{1,3}\.){3}\d{1,3}", serialno):
+ # if a regex was used we have to determine the serialno used
+ serialno = ViewClient.__obtainDeviceSerialNumber(device)
+ if verbose:
+ print >> sys.stderr, 'Actual device serialno=%s' % serialno
+ return device, serialno
+
+ @staticmethod
+ def traverseShowClassIdAndText(view, extraInfo=None, noExtraInfo=None, extraAction=None):
+ '''
+ Shows the View class, id and text if available.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @type extraInfo: method
+ @param extraInfo: the View method to add extra info
+ @type noExtraInfo: bool
+ @param noExtraInfo: Don't add extra info
+ @type extraAction: method
+ @param extraAction: An extra action to be invoked for every view
+
+ @return: the string containing class, id, and text if available
+ '''
+
+ try:
+ eis = ''
+ if extraInfo:
+ eis = extraInfo(view)
+ if not eis and noExtraInfo:
+ eis = noExtraInfo
+ if eis:
+ eis = ' {0}'.format(eis)
+ if extraAction:
+ extraAction(view)
+ _str = unicode(view.getClass())
+ _str += ' '
+ _str += '%s' % view.getId()
+ _str += ' '
+ _str += view.getText() if view.getText() else ''
+ if eis:
+ _str += eis
+ return _str
+ except Exception, e:
+ import traceback
+ return u'Exception in view=%s: %s:%s\n%s' % (view.__smallStr__(), sys.exc_info()[0].__name__, e, traceback.format_exc())
+
+ @staticmethod
+ def traverseShowClassIdTextAndUniqueId(view):
+ '''
+ Shows the View class, id, text if available and unique id.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available and unique Id
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getUniqueId)
+
+ @staticmethod
+ def traverseShowClassIdTextAndContentDescription(view):
+ '''
+ Shows the View class, id, text if available and content description.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available and the content description
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getContentDescription, 'NAF')
+
+ @staticmethod
+ def traverseShowClassIdTextAndTag(view):
+ '''
+ Shows the View class, id, text if available and tag.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available and tag
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getTag, None)
+
+ @staticmethod
+ def traverseShowClassIdTextContentDescriptionAndScreenshot(view):
+ '''
+ Shows the View class, id, text if available and unique id and takes the screenshot.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available and the content description
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getContentDescription, 'NAF', extraAction=ViewClient.writeViewImageToFileInDir)
+
+ @staticmethod
+ def traverseShowClassIdTextAndCenter(view):
+ '''
+ Shows the View class, id and text if available and center.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getCenter)
+
+ @staticmethod
+ def traverseShowClassIdTextPositionAndSize(view):
+ '''
+ Shows the View class, id and text if available.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getPositionAndSize)
+
+ @staticmethod
+ def traverseShowClassIdTextAndBounds(view):
+ '''
+ Shows the View class, id and text if available.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: the string containing class, id, and text if available plus
+ View bounds
+ '''
+
+ return ViewClient.traverseShowClassIdAndText(view, View.getBounds)
+
+ @staticmethod
+ def traverseTakeScreenshot(view):
+ '''
+ Don't show any any, just takes the screenshot.
+ This function can be used as a transform function to L{ViewClient.traverse()}
+
+ @type view: I{View}
+ @param view: the View
+ @return: None
+ '''
+
+ return ViewClient.writeViewImageToFileInDir(view)
+
+
+ # methods that can be used to transform ViewClient.traverse output
+ TRAVERSE_CIT = traverseShowClassIdAndText
+ ''' An alias for L{traverseShowClassIdAndText(view)} '''
+ TRAVERSE_CITUI = traverseShowClassIdTextAndUniqueId
+ ''' An alias for L{traverseShowClassIdTextAndUniqueId(view)} '''
+ TRAVERSE_CITCD = traverseShowClassIdTextAndContentDescription
+ ''' An alias for L{traverseShowClassIdTextAndContentDescription(view)} '''
+ TRAVERSE_CITG = traverseShowClassIdTextAndTag
+ ''' An alias for L{traverseShowClassIdTextAndTag(view)} '''
+ TRAVERSE_CITC = traverseShowClassIdTextAndCenter
+ ''' An alias for L{traverseShowClassIdTextAndCenter(view)} '''
+ TRAVERSE_CITPS = traverseShowClassIdTextPositionAndSize
+ ''' An alias for L{traverseShowClassIdTextPositionAndSize(view)} '''
+ TRAVERSE_CITB = traverseShowClassIdTextAndBounds
+ ''' An alias for L{traverseShowClassIdTextAndBounds(view)} '''
+ TRAVERSE_CITCDS = traverseShowClassIdTextContentDescriptionAndScreenshot
+ ''' An alias for L{traverseShowClassIdTextContentDescriptionAndScreenshot(view)} '''
+ TRAVERSE_S = traverseTakeScreenshot
+ ''' An alias for L{traverseTakeScreenshot(view)} '''
+
+ @staticmethod
+ def sleep(secs=1.0):
+ '''
+ Sleeps for the specified number of seconds.
+
+ @type secs: float
+ @param secs: number of seconds
+ '''
+ time.sleep(secs)
+
+ def assertServiceResponse(self, response):
+ '''
+ Checks whether the response received from the server is correct or raises and Exception.
+
+ @type response: str
+ @param response: Response received from the server
+
+ @raise Exception: If the response received from the server is invalid
+ '''
+
+ if not self.serviceResponse(response):
+ raise Exception('Invalid response received from service.')
+
+ def serviceResponse(self, response):
+ '''
+ Checks the response received from the I{ViewServer}.
+
+ @return: C{True} if the response received matches L{PARCEL_TRUE}, C{False} otherwise
+ '''
+
+ PARCEL_TRUE = "Result: Parcel(00000000 00000001 '........')\r\n"
+ ''' The TRUE response parcel '''
+ if DEBUG:
+ print >>sys.stderr, "serviceResponse: comparing '%s' vs Parcel(%s)" % (response, PARCEL_TRUE)
+ return response == PARCEL_TRUE
+
+ def setViews(self, received, windowId=None):
+ '''
+ Sets L{self.views} to the received value splitting it into lines.
+
+ @type received: str
+ @param received: the string received from the I{View Server}
+ '''
+
+ if not received or received == "":
+ raise ValueError("received is empty")
+ self.views = []
+ ''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''
+ self.__parseTree(received.split("\n"), windowId)
+ if DEBUG:
+ print >>sys.stderr, "there are %d views in this dump" % len(self.views)
+
+ def setViewsFromUiAutomatorDump(self, received):
+ '''
+ Sets L{self.views} to the received value parsing the received XML.
+
+ @type received: str
+ @param received: the string received from the I{UI Automator}
+ '''
+
+ if not received or received == "":
+ raise ValueError("received is empty")
+ self.views = []
+ ''' The list of Views represented as C{str} obtained after splitting it into lines after being received from the server. Done by L{self.setViews()}. '''
+ self.__parseTreeFromUiAutomatorDump(received)
+ if DEBUG:
+ print >>sys.stderr, "there are %d views in this dump" % len(self.views)
+
+
+ def __splitAttrs(self, strArgs):
+ '''
+ Splits the C{View} attributes in C{strArgs} and optionally adds the view id to the C{viewsById} list.
+
+ Unique Ids
+ ==========
+ It is very common to find C{View}s having B{NO_ID} as the Id. This turns very difficult to
+ use L{self.findViewById()}. To help in this situation this method assigns B{unique Ids}.
+
+ The B{unique Ids} are generated using the pattern C{id/no_id/<number>} with C{<number>} starting
+ at 1.
+
+ @type strArgs: str
+ @param strArgs: the string containing the raw list of attributes and values
+
+ @return: Returns the attributes map.
+ '''
+
+ if self.useUiAutomator:
+ raise RuntimeError("This method is not compatible with UIAutomator")
+ # replace the spaces in text:mText to preserve them in later split
+ # they are translated back after the attribute matches
+ textRE = re.compile('%s=%s,' % (self.textProperty, _nd('len')))
+ m = textRE.search(strArgs)
+ if m:
+ __textStart = m.end()
+ __textLen = int(m.group('len'))
+ __textEnd = m.end() + __textLen
+ s1 = strArgs[__textStart:__textEnd]
+ s2 = s1.replace(' ', WS)
+ strArgs = strArgs.replace(s1, s2, 1)
+
+ idRE = re.compile("(?P<viewId>id/\S+)")
+ attrRE = re.compile('%s(?P<parens>\(\))?=%s,(?P<val>[^ ]*)' % (_ns('attr'), _nd('len')), flags=re.DOTALL)
+ hashRE = re.compile('%s@%s' % (_ns('class'), _nh('oid')))
+
+ attrs = {}
+ viewId = None
+ m = idRE.search(strArgs)
+ if m:
+ viewId = m.group('viewId')
+ if DEBUG:
+ print >>sys.stderr, "found view with id=%s" % viewId
+
+ for attr in strArgs.split():
+ m = attrRE.match(attr)
+ if m:
+ __attr = m.group('attr')
+ __parens = '()' if m.group('parens') else ''
+ __len = int(m.group('len'))
+ __val = m.group('val')
+ if WARNINGS and __len != len(__val):
+ warnings.warn("Invalid len: expected: %d found: %d s=%s e=%s" % (__len, len(__val), __val[:50], __val[-50:]))
+ if __attr == self.textProperty:
+ # restore spaces that have been replaced
+ __val = __val.replace(WS, ' ')
+ attrs[__attr + __parens] = __val
+ else:
+ m = hashRE.match(attr)
+ if m:
+ attrs['class'] = m.group('class')
+ attrs['oid'] = m.group('oid')
+ else:
+ if DEBUG:
+ print >>sys.stderr, attr, "doesn't match"
+
+ if True: # was assignViewById
+ if not viewId:
+ # If the view has NO_ID we are assigning a default id here (id/no_id) which is
+ # immediately incremented if another view with no id was found before to generate
+ # a unique id
+ viewId = "id/no_id/1"
+ if viewId in self.viewsById:
+ # sometimes the view ids are not unique, so let's generate a unique id here
+ i = 1
+ while True:
+ newId = re.sub('/\d+$', '', viewId) + '/%d' % i
+ if not newId in self.viewsById:
+ break
+ i += 1
+ viewId = newId
+ if DEBUG:
+ print >>sys.stderr, "adding viewById %s" % viewId
+ # We are assigning a new attribute to keep the original id preserved, which could have
+ # been NO_ID repeated multiple times
+ attrs['uniqueId'] = viewId
+
+ return attrs
+
+ def __parseTree(self, receivedLines, windowId=None):
+ '''
+ Parses the View tree contained in L{receivedLines}. The tree is created and the root node assigned to L{self.root}.
+ This method also assigns L{self.viewsById} values using L{View.getUniqueId} as the key.
+
+ @type receivedLines: str
+ @param receivedLines: the string received from B{View Server}
+ '''
+
+ self.root = None
+ self.viewsById = {}
+ self.views = []
+ parent = None
+ parents = []
+ treeLevel = -1
+ newLevel = -1
+ lastView = None
+ for v in receivedLines:
+ if v == '' or v == 'DONE' or v == 'DONE.':
+ break
+ attrs = self.__splitAttrs(v)
+ if not self.root:
+ if v[0] == ' ':
+ raise Exception("Unexpected root element starting with ' '.")
+ self.root = View.factory(attrs, self.device, self.build[VERSION_SDK_PROPERTY], self.forceViewServerUse, windowId, self.uiAutomatorHelper)
+ if DEBUG: self.root.raw = v
+ treeLevel = 0
+ newLevel = 0
+ lastView = self.root
+ parent = self.root
+ parents.append(parent)
+ else:
+ newLevel = (len(v) - len(v.lstrip()))
+ if newLevel == 0:
+ raise Exception("newLevel==0 treeLevel=%d but tree can have only one root, v=%s" % (treeLevel, v))
+ child = View.factory(attrs, self.device, self.build[VERSION_SDK_PROPERTY], self.forceViewServerUse, windowId, self.uiAutomatorHelper)
+ if DEBUG: child.raw = v
+ if newLevel == treeLevel:
+ parent.add(child)
+ lastView = child
+ elif newLevel > treeLevel:
+ if (newLevel - treeLevel) != 1:
+ raise Exception("newLevel jumps %d levels, v=%s" % ((newLevel-treeLevel), v))
+ parent = lastView
+ parents.append(parent)
+ parent.add(child)
+ lastView = child
+ treeLevel = newLevel
+ else: # newLevel < treeLevel
+ for _ in range(treeLevel - newLevel):
+ parents.pop()
+ parent = parents.pop()
+ parents.append(parent)
+ parent.add(child)
+ treeLevel = newLevel
+ lastView = child
+ self.views.append(lastView)
+ self.viewsById[lastView.getUniqueId()] = lastView
+
+ def __updateNavButtons(self):
+ """
+ Updates the navigation buttons that might be on the device screen.
+ """
+
+ navButtons = None
+ for v in self.views:
+ if v.getId() == 'com.android.systemui:id/nav_buttons':
+ navButtons = v
+ break
+ if navButtons:
+ self.navBack = self.findViewById('com.android.systemui:id/back', navButtons)
+ self.navHome = self.findViewById('com.android.systemui:id/home', navButtons)
+ self.navRecentApps = self.findViewById('com.android.systemui:id/recent_apps', navButtons)
+ else:
+ if self.uiAutomatorHelper:
+ print >> sys.stderr, "WARNING: nav buttons not found. Perhaps the device has hardware buttons."
+ self.navBack = None
+ self.navHome = None
+ self.navRecentApps = None
+
+ def __parseTreeFromUiAutomatorDump(self, receivedXml):
+ if DEBUG:
+ print >> sys.stderr, "__parseTreeFromUiAutomatorDump(", receivedXml[:40], "...)"
+ parser = UiAutomator2AndroidViewClient(self.device, self.build[VERSION_SDK_PROPERTY], self.uiAutomatorHelper)
+ try:
+ start_xml_index = receivedXml.index("<")
+ end_xml_index = receivedXml.rindex(">")
+ except ValueError:
+ raise ValueError("received does not contain valid XML: " + receivedXml)
+ self.root = parser.Parse(receivedXml[start_xml_index:end_xml_index+1])
+ self.views = parser.views
+ self.viewsById = {}
+ for v in self.views:
+ self.viewsById[v.getUniqueId()] = v
+ self.__updateNavButtons()
+ if DEBUG_NAV_BUTTONS:
+ if not self.navBack:
+ print >> sys.stderr, "WARNING: navBack not found"
+ if not self.navHome:
+ print >> sys.stderr, "WARNING: navHome not found"
+ if not self.navRecentApps:
+ print >> sys.stderr, "WARNING: navRecentApps not found"
+
+ def getRoot(self):
+ '''
+ Gets the root node of the C{View} tree
+
+ @return: the root node of the C{View} tree
+ '''
+ return self.root
+
+ def traverse(self, root="ROOT", indent="", transform=None, stream=sys.stdout):
+ '''
+ Traverses the C{View} tree and prints its nodes.
+
+ The nodes are printed converting them to string but other transformations can be specified
+ by providing a method name as the C{transform} parameter.
+
+ @type root: L{View}
+ @param root: the root node from where the traverse starts
+ @type indent: str
+ @param indent: the indentation string to use to print the nodes
+ @type transform: method
+ @param transform: a method to use to transform the node before is printed
+ '''
+
+ if transform is None:
+ # this cannot be a default value, otherwise
+ # TypeError: 'staticmethod' object is not callable
+ # is raised
+ transform = ViewClient.TRAVERSE_CIT
+
+ if type(root) == types.StringType and root == "ROOT":
+ root = self.root
+
+ return ViewClient.__traverse(root, indent, transform, stream)
+# if not root:
+# return
+#
+# s = transform(root)
+# if s:
+# print >>stream, "%s%s" % (indent, s)
+#
+# for ch in root.children:
+# self.traverse(ch, indent=indent+" ", transform=transform, stream=stream)
+
+ @staticmethod
+ def __traverse(root, indent="", transform=View.__str__, stream=sys.stdout):
+ if not root:
+ return
+
+ s = transform(root)
+ if stream and s:
+ ius = "%s%s" % (indent, s if isinstance(s, unicode) else unicode(s, 'utf-8', 'replace'))
+ print >>stream, ius.encode('utf-8', 'replace')
+
+ for ch in root.children:
+ ViewClient.__traverse(ch, indent=indent+" ", transform=transform, stream=stream)
+
+ def dump(self, window=-1, sleep=1):
+ '''
+ Dumps the window content.
+
+ Sleep is useful to wait some time before obtaining the new content when something in the
+ window has changed.
+
+ @type window: int or str
+ @param window: the window id or name of the window to dump.
+ The B{name} is the package name or the window name (i.e. StatusBar) for
+ system windows.
+ The window id can be provided as C{int} or C{str}. The C{str} should represent
+ and C{int} in either base 10 or 16.
+ Use -1 to dump all windows.
+ This parameter only is used when the backend is B{ViewServer} and it's
+ ignored for B{UiAutomator}.
+ @type sleep: int
+ @param sleep: sleep in seconds before proceeding to dump the content
+
+ @return: the list of Views as C{str} received from the server after being split into lines
+ '''
+
+ if sleep > 0:
+ time.sleep(sleep)
+
+ if self.useUiAutomator:
+ if self.uiAutomatorHelper:
+ received = self.uiAutomatorHelper.dumpWindowHierarchy()
+ else:
+ api = self.getSdkVersion()
+ if api >= 23:
+ # In API 23 the process' stdout,in and err are connected to the socket not to the pts as in
+ # previous versions, so we can't redirect to /dev/tty
+ # Also, if we want to write to /sdcard/something it fails event though /sdcard is a symlink
+ if self.serialno.startswith('emulator'):
+ pathname = '/storage/self'
+ else:
+ pathname = '/sdcard'
+ filename = 'window_dump.xml'
+ cmd = 'uiautomator dump %s %s/%s >/dev/null && cat %s/%s' % ('--compressed' if self.compressedDump else '', pathname, filename, pathname, filename)
+ received = self.device.shell(cmd)
+ else:
+ # NOTICE:
+ # Using /dev/tty this works even on devices with no sdcard
+ received = self.device.shell('uiautomator dump %s /dev/tty >/dev/null' % ('--compressed' if api >= 18 and self.compressedDump else ''))
+ if received:
+ received = unicode(received, encoding='utf-8', errors='replace')
+ if not received:
+ raise RuntimeError('ERROR: Empty UiAutomator dump was received')
+ if DEBUG:
+ self.received = received
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, "received %d chars" % len(received)
+ print >>sys.stderr
+ print >>sys.stderr, repr(received)
+ print >>sys.stderr
+ onlyKilledRE = re.compile('Killed$')
+ if onlyKilledRE.search(received):
+ MONKEY = 'com.android.commands.monkey'
+ extraInfo = ''
+ if self.device.shell('ps | grep "%s"' % MONKEY):
+ extraInfo = "\nIt is know that '%s' conflicts with 'uiautomator'. Please kill it and try again." % MONKEY
+ raise RuntimeError('''ERROR: UiAutomator output contains no valid information. UiAutomator was killed, no reason given.''' + extraInfo)
+ if self.ignoreUiAutomatorKilled:
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, "ignoring UiAutomator Killed"
+ killedRE = re.compile('</hierarchy>[\n\S]*Killed', re.MULTILINE)
+ if killedRE.search(received):
+ received = re.sub(killedRE, '</hierarchy>', received)
+ elif DEBUG_RECEIVED:
+ print "UiAutomator Killed: NOT FOUND!"
+ # It seems that API18 uiautomator spits this message to stdout
+ dumpedToDevTtyRE = re.compile('</hierarchy>[\n\S]*UI hierchary dumped to: /dev/tty.*', re.MULTILINE)
+ if dumpedToDevTtyRE.search(received):
+ received = re.sub(dumpedToDevTtyRE, '</hierarchy>', received)
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, "received=", received
+ # API19 seems to send this warning as part of the XML.
+ # Let's remove it if present
+ received = received.replace('WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix.\r\n', '')
+ if re.search('\[: not found', received):
+ raise RuntimeError('''ERROR: Some emulator images (i.e. android 4.1.2 API 16 generic_x86) does not include the '[' command.
+While UiAutomator back-end might be supported 'uiautomator' command fails.
+You should force ViewServer back-end.''')
+
+ if received.startswith('ERROR: could not get idle state.'):
+ # See https://android.googlesource.com/platform/frameworks/testing/+/jb-mr2-release/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java
+ raise RuntimeError('''The views are being refreshed too frequently to dump.''')
+ if received.find(u'Only ROTATION_0 supported') != -1:
+ raise RuntimeError('''UiAutomatorHelper backend with support for only ROTATION_0 found.''')
+ self.setViewsFromUiAutomatorDump(received)
+ else:
+ if isinstance(window, str):
+ if window != '-1':
+ self.list(sleep=0)
+ found = False
+ for wId in self.windows:
+ try:
+ if window == self.windows[wId]:
+ window = wId
+ found = True
+ break
+ except:
+ pass
+ try:
+ if int(window) == wId:
+ window = wId
+ found = True
+ break
+ except:
+ pass
+ try:
+ if int(window, 16) == wId:
+ window = wId
+ found = True
+ break
+ except:
+ pass
+
+ if not found:
+ raise RuntimeError("ERROR: Cannot find window '%s' in %s" % (window, self.windows))
+ else:
+ window = -1
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ s.connect((VIEW_SERVER_HOST, self.localPort))
+ except socket.error, ex:
+ raise RuntimeError("ERROR: Connecting to %s:%d: %s" % (VIEW_SERVER_HOST, self.localPort, ex))
+ cmd = 'dump %x\r\n' % window
+ if DEBUG:
+ print >>sys.stderr, "executing: '%s'" % cmd
+ s.send(cmd)
+ received = ""
+ doneRE = re.compile("DONE")
+ ViewClient.setAlarm(120)
+ while True:
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, " reading from socket..."
+ received += s.recv(1024)
+ if doneRE.search(received[-7:]):
+ break
+ s.close()
+ ViewClient.setAlarm(0)
+ if DEBUG:
+ self.received = received
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, "received %d chars" % len(received)
+ print >>sys.stderr
+ print >>sys.stderr, received
+ print >>sys.stderr
+ if received:
+ for c in received:
+ if ord(c) > 127:
+ received = unicode(received, encoding='utf-8', errors='replace')
+ break
+ self.setViews(received, hex(window)[2:])
+
+ if DEBUG_TREE:
+ self.traverse(self.root)
+
+ return self.views
+
+ def list(self, sleep=1):
+ '''
+ List the windows.
+
+ Sleep is useful to wait some time before obtaining the new content when something in the
+ window has changed.
+ This also sets L{self.windows} as the list of windows.
+
+ @type sleep: int
+ @param sleep: sleep in seconds before proceeding to dump the content
+
+ @return: the list of windows
+ '''
+
+ if sleep > 0:
+ time.sleep(sleep)
+
+ if self.useUiAutomator:
+ raise Exception("Not implemented yet: listing windows with UiAutomator")
+ else:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ s.connect((VIEW_SERVER_HOST, self.localPort))
+ except socket.error, ex:
+ raise RuntimeError("ERROR: Connecting to %s:%d: %s" % (VIEW_SERVER_HOST, self.localPort, ex))
+ s.send('list\r\n')
+ received = ""
+ doneRE = re.compile("DONE")
+ while True:
+ received += s.recv(1024)
+ if doneRE.search(received[-7:]):
+ break
+ s.close()
+ if DEBUG:
+ self.received = received
+ if DEBUG_RECEIVED:
+ print >>sys.stderr, "received %d chars" % len(received)
+ print >>sys.stderr
+ print >>sys.stderr, received
+ print >>sys.stderr
+
+ self.windows = {}
+ for line in received.split('\n'):
+ if not line:
+ break
+ if doneRE.search(line):
+ break
+ values = line.split()
+ if len(values) > 1:
+ package = values[1]
+ else:
+ package = "UNKNOWN"
+ if len(values) > 0:
+ wid = values[0]
+ else:
+ wid = '00000000'
+ self.windows[int('0x' + wid, 16)] = package
+ return self.windows
+
+
+ def findViewById(self, viewId, root="ROOT", viewFilter=None):
+ '''
+ Finds the View with the specified viewId.
+
+ @type viewId: str
+ @param viewId: the ID of the view to find
+ @type root: str
+ @type root: View
+ @param root: the root node of the tree where the View will be searched
+ @type: viewFilter: function
+ @param viewFilter: a function that will be invoked providing the candidate View as a parameter
+ and depending on the return value (C{True} or C{False}) the View will be
+ selected and returned as the result of C{findViewById()} or ignored.
+ This can be C{None} and no extra filtering is applied.
+
+ @return: the C{View} found or C{None}
+ '''
+
+ if not root:
+ return None
+
+ if type(root) == types.StringType and root == "ROOT":
+ return self.findViewById(viewId, self.root, viewFilter)
+
+ if root.getId() == viewId:
+ if viewFilter:
+ if viewFilter(root):
+ return root
+ else:
+ return root
+
+ if re.match('^id/no_id', viewId) or re.match('^id/.+/.+', viewId):
+ if root.getUniqueId() == viewId:
+ if viewFilter:
+ if viewFilter(root):
+ return root;
+ else:
+ return root
+
+
+ for ch in root.children:
+ foundView = self.findViewById(viewId, ch, viewFilter)
+ if foundView:
+ if viewFilter:
+ if viewFilter(foundView):
+ return foundView
+ else:
+ return foundView
+
+ def findViewByIdOrRaise(self, viewId, root="ROOT", viewFilter=None):
+ '''
+ Finds the View or raise a ViewNotFoundException.
+
+ @type viewId: str
+ @param viewId: the ID of the view to find
+ @type root: str
+ @type root: View
+ @param root: the root node of the tree where the View will be searched
+ @type: viewFilter: function
+ @param viewFilter: a function that will be invoked providing the candidate View as a parameter
+ and depending on the return value (C{True} or C{False}) the View will be
+ selected and returned as the result of C{findViewById()} or ignored.
+ This can be C{None} and no extra filtering is applied.
+ @return: the View found
+ @raise ViewNotFoundException: raise the exception if View not found
+ '''
+
+ view = self.findViewById(viewId, root, viewFilter)
+ if view:
+ return view
+ else:
+ raise ViewNotFoundException("ID", viewId, root)
+
+ def findViewByTag(self, tag, root="ROOT"):
+ '''
+ Finds the View with the specified tag
+ '''
+
+ return self.findViewWithAttribute('getTag()', tag, root)
+
+ def findViewByTagOrRaise(self, tag, root="ROOT"):
+ '''
+ Finds the View with the specified tag or raise a ViewNotFoundException
+ '''
+
+ view = self.findViewWithAttribute('getTag()', tag, root)
+ if view:
+ return view
+ else:
+ raise ViewNotFoundException("tag", tag, root)
+
+ def __findViewsWithAttributeInTree(self, attr, val, root):
+ # Note the plural in this method name
+ matchingViews = []
+ if not self.root:
+ print >>sys.stderr, "ERROR: no root, did you forget to call dump()?"
+ return matchingViews
+
+ if type(root) == types.StringType and root == "ROOT":
+ root = self.root
+
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTree: type val=", type(val)
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTree: checking if root=%s has attr=%s == %s" % (root.__smallStr__(), attr, val)
+
+ if root and attr in root.map and root.map[attr] == val:
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTree: FOUND: %s" % root.__smallStr__()
+ matchingViews.append(root)
+ else:
+ for ch in root.children:
+ matchingViews += self.__findViewsWithAttributeInTree(attr, val, ch)
+
+ return matchingViews
+
+ def __findViewWithAttributeInTree(self, attr, val, root):
+ if DEBUG:
+ print >> sys.stderr, " __findViewWithAttributeInTree: type(val)=", type(val)
+ if type(val) != types.UnicodeType and type(val) != re._pattern_type:
+ u = unicode(val, encoding='utf-8', errors='ignore')
+ else:
+ u = val
+ print >> sys.stderr, u'''__findViewWithAttributeInTree({0}'''.format(attr),
+ try:
+ print >> sys.stderr, u''', {0}'''.format(u),
+ except:
+ pass
+ print >> sys.stderr, u'>>>>>>>>>>>>>>>>>>', type(root)
+ if type(root) == types.StringType:
+ print >> sys.stderr, u'>>>>>>>>>>>>>>>>>>', root
+ print >> sys.stderr, u''', {0})'''.format(root)
+ else:
+ print >> sys.stderr, u''', {0})'''.format(root.__smallStr__())
+
+ if not self.root:
+ print >>sys.stderr, "ERROR: no root, did you forget to call dump()?"
+ return None
+
+ if type(root) == types.StringType and root == "ROOT":
+ root = self.root
+
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTree: type val=", type(val)
+ if DEBUG:
+ #print >> sys.stderr, u'''__findViewWithAttributeInTree: checking if root={0}: '''.format(root),
+ print >> sys.stderr, u'''has {0} == '''.format(attr),
+ if type(val) == types.UnicodeType:
+ u = val
+ elif type(val) != re._pattern_type:
+ u = unicode(val, encoding='utf-8', errors='replace')
+ try:
+ print >> sys.stderr, u'''{0}'''.format(u)
+ except:
+ pass
+
+ if isinstance(val, RegexType):
+ return self.__findViewWithAttributeInTreeThatMatches(attr, val, root)
+ else:
+ try:
+ if DEBUG:
+ print >> sys.stderr, u'''__findViewWithAttributeInTree: comparing {0}: '''.format(attr),
+ print >> sys.stderr, u'''{0} == '''.format(root.map[attr]),
+ print >> sys.stderr, u'''{0}'''.format(val)
+ except:
+ pass
+ if root and attr in root.map and root.map[attr] == val:
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTree: FOUND: %s" % root.__smallStr__()
+ return root
+ else:
+ for ch in root.children:
+ v = self.__findViewWithAttributeInTree(attr, val, ch)
+ if v:
+ return v
+
+ return None
+
+ def __findViewWithAttributeInTreeOrRaise(self, attr, val, root):
+ view = self.__findViewWithAttributeInTree(attr, val, root)
+ if view:
+ return view
+ else:
+ raise ViewNotFoundException(attr, val, root)
+
+ def __findViewWithAttributeInTreeThatMatches(self, attr, regex, root, rlist=[]):
+ if not self.root:
+ print >>sys.stderr, "ERROR: no root, did you forget to call dump()?"
+ return None
+
+ if type(root) == types.StringType and root == "ROOT":
+ root = self.root
+
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTreeThatMatches: checking if root=%s attr=%s matches %s" % (root.__smallStr__(), attr, regex)
+
+ if root and attr in root.map and regex.match(root.map[attr]):
+ if DEBUG: print >>sys.stderr, "__findViewWithAttributeInTreeThatMatches: FOUND: %s" % root.__smallStr__()
+ return root
+ #print >>sys.stderr, "appending root=%s to rlist=%s" % (root.__smallStr__(), rlist)
+ #return rlist.append(root)
+ else:
+ for ch in root.children:
+ v = self.__findViewWithAttributeInTreeThatMatches(attr, regex, ch, rlist)
+ if v:
+ return v
+ #print >>sys.stderr, "appending v=%s to rlist=%s" % (v.__smallStr__(), rlist)
+ #return rlist.append(v)
+
+ return None
+ #return rlist
+
+ def findViewWithAttribute(self, attr, val, root="ROOT"):
+ '''
+ Finds the View with the specified attribute and value
+ '''
+ if DEBUG:
+ try:
+ print >> sys.stderr, u'findViewWithAttribute({0}, {1}, {2})'.format(attr, unicode(val, encoding='utf-8', errors='replace'), root)
+ except:
+ pass
+ print >> sys.stderr, " findViewWithAttribute: type(val)=", type(val)
+
+
+ return self.__findViewWithAttributeInTree(attr, val, root)
+
+ def findViewsWithAttribute(self, attr, val, root="ROOT"):
+ '''
+ Finds the Views with the specified attribute and value.
+ This allows you to see all items that match your criteria in the view hierarchy
+
+ Usage:
+ buttons = v.findViewsWithAttribute("class", "android.widget.Button")
+
+ '''
+
+ return self.__findViewsWithAttributeInTree(attr, val, root)
+
+ def findViewWithAttributeOrRaise(self, attr, val, root="ROOT"):
+ '''
+ Finds the View or raise a ViewNotFoundException.
+
+ @return: the View found
+ @raise ViewNotFoundException: raise the exception if View not found
+ '''
+
+ view = self.findViewWithAttribute(attr, val, root)
+ if view:
+ return view
+ else:
+ raise ViewNotFoundException(attr, val, root)
+
+ def findViewWithAttributeThatMatches(self, attr, regex, root="ROOT"):
+ '''
+ Finds the list of Views with the specified attribute matching
+ regex
+ '''
+
+ return self.__findViewWithAttributeInTreeThatMatches(attr, regex, root)
+
+ def findViewWithText(self, text, root="ROOT"):
+ if DEBUG:
+ try:
+ print >>sys.stderr, '''findViewWithText({0}, {1})'''.format(text, root)
+ print >> sys.stderr, " findViewWithText: type(text)=", type(text)
+ except:
+ pass
+
+ if isinstance(text, RegexType):
+ return self.findViewWithAttributeThatMatches(self.textProperty, text, root)
+ #l = self.findViewWithAttributeThatMatches(TEXT_PROPERTY, text)
+ #ll = len(l)
+ #if ll == 0:
+ # return None
+ #elif ll == 1:
+ # return l[0]
+ #else:
+ # print >>sys.stderr, "WARNING: findViewWithAttributeThatMatches invoked by findViewWithText returns %d items." % ll
+ # return l
+ else:
+ return self.findViewWithAttribute(self.textProperty, text, root)
+
+ def findViewWithTextOrRaise(self, text, root="ROOT"):
+ '''
+ Finds the View or raise a ViewNotFoundException.
+
+ @return: the View found
+ @raise ViewNotFoundException: raise the exception if View not found
+ '''
+
+ if DEBUG:
+ print >>sys.stderr, "findViewWithTextOrRaise(%s, %s)" % (text, root)
+ view = self.findViewWithText(text, root)
+ if view:
+ return view
+ else:
+ raise ViewNotFoundException("text", text, root)
+
+ def findViewWithContentDescription(self, contentdescription, root="ROOT"):
+ '''
+ Finds the View with the specified content description
+ '''
+
+ return self.__findViewWithAttributeInTree('content-desc', contentdescription, root)
+
+ def findViewWithContentDescriptionOrRaise(self, contentdescription, root="ROOT"):
+ '''
+ Finds the View with the specified content description
+ '''
+
+ return self.__findViewWithAttributeInTreeOrRaise('content-desc', contentdescription, root)
+
+ def findViewsContainingPoint(self, (x, y), _filter=None):
+ '''
+ Finds the list of Views that contain the point (x, y).
+ '''
+
+ if not _filter:
+ _filter = lambda v: True
+
+ return [v for v in self.views if (v.containsPoint((x,y)) and _filter(v))]
+
+ def findObject(self, **kwargs):
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Finding object with %s through UiAutomatorHelper" % (kwargs)
+ return self.uiAutomatorHelper.findObject(**kwargs)
+ else:
+ warnings.warn("findObject only implemented using UiAutomatorHelper. Use ViewClient.findView...() instead.")
+ return None
+
+ def touch(self, x=-1, y=-1, selector=None):
+ if self.uiAutomatorHelper:
+ if selector:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Touching View by selector=%s through UiAutomatorHelper" % (selector)
+ self.uiAutomatorHelper.findObject(selector=selector).click()
+ else:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Touching (%d, %d) through UiAutomatorHelper" % (x, y)
+ self.uiAutomatorHelper.click(x=int(x), y=int(y))
+ else:
+ self.device.touch(x, y)
+
+ def longTouch(self, x=-1, y=-1, selector=None):
+ if self.uiAutomatorHelper:
+ if selector:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "ViewClient: Long-touching View by selector=%s through UiAutomatorHelper" % (selector)
+ self.uiAutomatorHelper.findObject(selector=selector).longClick()
+ else:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "ViewClient: Long-touching (%d, %d) through UiAutomatorHelper" % (x, y)
+ self.uiAutomatorHelper.swipe(startX=int(x), startY=int(y), endX=int(x), endY=int(y), steps=400)
+ else:
+ self.device.longTouch(x, y)
+
+ def swipe(self, x0=-1, y0=-1, x1=-1, y1=-1, steps=400, segments=[], segmentSteps=5):
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Swipe through UiAutomatorHelper", (x0, y0, x1, y1, steps, segments, segmentSteps)
+ self.uiAutomatorHelper.swipe(startX=x0, startY=y0, endX=x1, endY=y1, steps=steps, segments=segments, segmentSteps=segmentSteps)
+ else:
+ warnings.warn("swipe only implemented using UiAutomatorHelper. Use AdbClient.drag() instead.")
+
+ def pressBack(self):
+ if self.uiAutomatorHelper:
+ self.uiAutomatorHelper.pressBack()
+ else:
+ warnings.warn("pressBak only implemented using UiAutomatorHelper. Use AdbClient.type() instead")
+
+ def pressHome(self):
+ if self.uiAutomatorHelper:
+ self.uiAutomatorHelper.pressHome()
+ else:
+ warnings.warn("pressHome only implemented using UiAutomatorHelper. Use AdbClient.type() instead")
+
+ def pressRecentApps(self):
+ if self.uiAutomatorHelper:
+ self.uiAutomatorHelper.pressRecentApps()
+ else:
+ warnings.warn("pressRecentApps only implemented using UiAutomatorHelper. Use AdbClient.type() instead")
+
+ def pressKeyCode(self, keycode, metaState=0):
+ '''By default no meta state'''
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "pressKeyCode(%d, %d)" % (keycode, metaState)
+ self.uiAutomatorHelper.pressKeyCode(keycode, metaState)
+ else:
+ warnings.warn("pressKeyCode only implemented using UiAutomatorHelper. Use AdbClient.type() instead")
+
+ def setText(self, v, text):
+ if DEBUG:
+ print >> sys.stderr, "setText(%s, '%s')" % (v.__tinyStr__(), text)
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Setting text through UiAutomatorHelper for View with ID=%s" % v.getId()
+ if v.getId():
+ oid = self.uiAutomatorHelper.findObject(selector='res@%s' % v.getId())
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "oid=", oid, "text=", text
+ self.uiAutomatorHelper.setText(oid, text)
+ else:
+ # The View has no ID so we cannot use the ID to create a selector to find it using findObject()
+ # Let's fall back to this method.
+ v.setText(text)
+ else:
+ # This is deleting the existing text, which should be asked in the dialog, but I would have to implement
+ # the dialog myself
+ v.setText(text)
+ # This is not deleting the text, so appending if there's something
+ # v.type(text)
+
+ def getViewIds(self):
+ '''
+ @deprecated: Use L{getViewsById} instead.
+
+ Returns the Views map.
+ '''
+
+ return self.viewsById
+
+ def getViewsById(self):
+ '''
+ Returns the Views map. The keys are C{uniqueIds} and the values are C{View}s.
+ '''
+
+ return self.viewsById
+
+ def __getFocusedWindowPosition(self):
+ return self.__getFocusedWindowId()
+
+ def getSdkVersion(self):
+ '''
+ Gets the SDK version.
+ '''
+
+ return self.build[VERSION_SDK_PROPERTY]
+
+ def isKeyboardShown(self):
+ '''
+ Whether the keyboard is displayed.
+ '''
+
+ return self.device.isKeyboardShown()
+
+ def writeImageToFile(self, filename, _format="PNG", deviceart=None, dropshadow=True, screenglare=True):
+ '''
+ Write the View image to the specified filename in the specified format.
+
+ @type filename: str
+ @param filename: Absolute path and optional filename receiving the image. If this points to
+ a directory, then the filename is determined by the serialno of the device and
+ format extension.
+ @type _format: str
+ @param _format: Image format (default format is PNG)
+ '''
+
+ filename = self.device.substituteDeviceTemplate(filename)
+ if not os.path.isabs(filename):
+ raise ValueError("writeImageToFile expects an absolute path (filename='%s')" % filename)
+ if os.path.isdir(filename):
+ filename = os.path.join(filename, self.serialno + '.' + _format.lower())
+ if DEBUG:
+ print >> sys.stderr, "writeImageToFile: saving image to '%s' in %s format (reconnect=%s)" % (filename, _format, self.device.reconnect)
+ if self.uiAutomatorHelper:
+ if DEBUG_UI_AUTOMATOR_HELPER:
+ print >> sys.stderr, "Taking screenshot using UiAutomatorHelper"
+ received = self.uiAutomatorHelper.takeScreenshot()
+ stream = StringIO.StringIO(received)
+ try:
+ from PIL import Image
+ image = Image.open(stream)
+ except ImportError as ex:
+ self.pilNotInstalledWarning()
+ sys.exit(1)
+ except IOError, ex:
+ print >> sys.stderr, ex
+ print repr(stream)
+ sys.exit(1)
+ else:
+ image = self.device.takeSnapshot(reconnect=self.device.reconnect)
+ if deviceart:
+ if 'STUDIO_DIR' in os.environ:
+ PLUGIN_DIR = 'plugins/android/lib/device-art-resources'
+ osName = platform.system()
+ if osName == 'Darwin':
+ deviceArtDir = os.environ['STUDIO_DIR'] + '/Contents/' + PLUGIN_DIR
+ else:
+ deviceArtDir = os.environ['STUDIO_DIR'] + '/' + PLUGIN_DIR
+ # FIXME: should parse XML
+ deviceArtXml = deviceArtDir + '/device-art.xml'
+ if not os.path.exists(deviceArtXml):
+ warnings.warn("Cannot find device art definition file")
+ # <device id="nexus_5" name="Nexus 5">
+ # <orientation name="port" size="1370,2405" screenPos="144,195" screenSize="1080,1920" shadow="port_shadow.png" back="port_back.png" lights="port_fore.png"/>
+ # <orientation name="land" size="2497,1235" screenPos="261,65" screenSize="1920,1080" shadow="land_shadow.png" back="land_back.png" lights="land_fore.png"/>
+ # </device>
+ orientation = self.display['orientation']
+ if orientation == 0 or orientation == 2:
+ orientationName = 'port'
+ elif orientation == 1 or orientation == 3:
+ orientationName = 'land'
+ else:
+ warnings.warn("Unknown orientation=" + orientation)
+ orientationName = 'port'
+ separator = '_'
+ if deviceart == 'auto':
+ hardware = self.device.getProperty('ro.hardware')
+ if hardware == 'hammerhead':
+ deviceart = 'nexus_5'
+ elif hardware == 'mako':
+ deviceart = 'nexus_4'
+ elif hardware == 'grouper':
+ deviceart = 'nexus_7' # 2012
+ elif hardware == 'flo':
+ deviceart = 'nexus_7_2013'
+ elif hardware in ['mt5861', 'mt5890']:
+ deviceart = 'tv_1080p'
+ elif hardware == 'universal5410':
+ deviceart = 'samsung_s4'
+
+ SUPPORTED_DEVICES = ['nexus_5', 'nexus_4', 'nexus_7', 'nexus_7_2013', 'tv_1080p', 'samsung_s4']
+ if deviceart not in SUPPORTED_DEVICES:
+ warnings.warn("Only %s is supported now, more devices coming soon" % SUPPORTED_DEVICES)
+ if deviceart == 'auto':
+ # it wasn't detected yet, let's assume generic phone
+ deviceart = 'phone'
+
+ screenSize = None
+ if deviceart == 'nexus_5':
+ if orientationName == 'port':
+ screenPos = (144, 195)
+ else:
+ screenPos = (261, 65)
+ elif deviceart == 'nexus_4':
+ if orientationName == 'port':
+ screenPos = (94, 187)
+ else:
+ screenPos = (257, 45)
+ elif deviceart == 'nexus_7': # 2012
+ if orientationName == 'port':
+ screenPos = (142, 190)
+ else:
+ screenPos = (260, 105)
+ elif deviceart == 'nexus_7_2013':
+ if orientationName == 'port':
+ screenPos = (130, 201)
+ screenSize = (800, 1280)
+ else:
+ screenPos = (282, 80)
+ screenSize = (1280, 800)
+ elif deviceart == 'tv_1080p':
+ screenPos = (85, 59)
+ orientationName = ''
+ separator = ''
+ elif deviceart == 'samsung_s4':
+ if orientationName == 'port':
+ screenPos = (76, 220)
+ screenSize = (1078, 1902) # FIXME: (1080, 1920) is the original size
+ else:
+ screenPos = (0, 0)
+ elif deviceart == 'phone':
+ if orientationName == 'port':
+ screenPos = (113, 93)
+ screenSize = (343, 46) # 46?, this is in device-art.xml
+ else:
+ screenPos = (141, 36)
+ screenSize = (324, 255)
+
+ deviceArtModelDir = deviceArtDir + '/' + deviceart
+ if not os.path.isdir(deviceArtModelDir):
+ warnings.warn("Cannot find device art for " + deviceart + ' at ' + deviceArtModelDir)
+ try:
+ from PIL import Image
+ if dropshadow:
+ dropShadowImage = Image.open(deviceArtModelDir + '/%s%sshadow.png' % (orientationName, separator))
+ deviceBack = Image.open(deviceArtModelDir + '/%s%sback.png' % (orientationName, separator))
+ if dropshadow:
+ dropShadowImage.paste(deviceBack, (0, 0), deviceBack)
+ deviceBack = dropShadowImage
+ if screenSize:
+ image = image.resize(screenSize, Image.ANTIALIAS)
+ deviceBack.paste(image, screenPos)
+ if screenglare:
+ screenGlareImage = Image.open(deviceArtModelDir + '/%s%sfore.png' % (orientationName, separator))
+ deviceBack.paste(screenGlareImage, (0, 0), screenGlareImage)
+ image = deviceBack
+ except ImportError as ex:
+ self.pilNotInstalledWarning()
+ else:
+ warnings.warn("ViewClient.writeImageToFile: Cannot add device art because STUDIO_DIR environment variable was not set")
+ image.save(filename, _format)
+
+ def pilNotInstalledWarning(self):
+ warnings.warn('''PIL or Pillow is needed for image manipulation
+
+On Ubuntu install
+
+ $ sudo apt-get install python-imaging python-imaging-tk
+
+On OSX install
+
+ $ brew install homebrew/python/pillow
+''')
+
+ def installPackage(self, apk):
+ return subprocess.check_call([self.adb, "install", "-r", apk], shell=False)
+
+ @staticmethod
+ def writeViewImageToFileInDir(view):
+ '''
+ Write the View image to the directory specified in C{ViewClient.imageDirectory}.
+
+ @type view: View
+ @param view: The view
+ '''
+
+ if not ViewClient.imageDirectory:
+ raise RuntimeError('You must set ViewClient.imageDiretory in order to use this method')
+ view.writeImageToFile(ViewClient.imageDirectory)
+
+ @staticmethod
+ def __pickleable(tree):
+ '''
+ Makes the tree pickleable.
+ '''
+
+ def removeDeviceReference(view):
+ '''
+ Removes the reference to a L{MonkeyDevice}.
+ '''
+
+ view.device = None
+
+ ###########################################################################################
+ # FIXME: Unfortunately deepcopy does not work with MonkeyDevice objects, which is
+ # sadly the reason why we cannot pickle the tree and we need to remove the MonkeyDevice
+ # references.
+ # We wanted to copy the tree to preserve the original and make piclkleable the copy.
+ #treeCopy = copy.deepcopy(tree)
+ treeCopy = tree
+ # IMPORTANT:
+ # This assumes that the first element in the list is the tree root
+ ViewClient.__traverse(treeCopy[0], transform=removeDeviceReference)
+ ###########################################################################################
+ return treeCopy
+
+ def distanceTo(self, tree):
+ '''
+ Calculates the distance between the current state and the tree passed as argument.
+
+ @type tree: list of Views
+ @param tree: Tree of Views
+ @return: the distance
+ '''
+ return ViewClient.distance(ViewClient.__pickleable(self.views), tree)
+
+ @staticmethod
+ def distance(tree1, tree2):
+ '''
+ Calculates the distance between the two trees.
+
+ @type tree1: list of Views
+ @param tree1: Tree of Views
+ @type tree2: list of Views
+ @param tree2: Tree of Views
+ @return: the distance
+ '''
+ ################################################################
+ #FIXME: this should copy the entire tree and then transform it #
+ ################################################################
+ pickleableTree1 = ViewClient.__pickleable(tree1)
+ pickleableTree2 = ViewClient.__pickleable(tree2)
+ s1 = pickle.dumps(pickleableTree1)
+ s2 = pickle.dumps(pickleableTree2)
+
+ if DEBUG_DISTANCE:
+ print >>sys.stderr, "distance: calculating distance between", s1[:20], "and", s2[:20]
+
+ l1 = len(s1)
+ l2 = len(s2)
+ t = float(max(l1, l2))
+
+ if l1 == l2:
+ if DEBUG_DISTANCE:
+ print >>sys.stderr, "distance: trees have same length, using Hamming distance"
+ return ViewClient.__hammingDistance(s1, s2)/t
+ else:
+ if DEBUG_DISTANCE:
+ print >>sys.stderr, "distance: trees have different length, using Levenshtein distance"
+ return ViewClient.__levenshteinDistance(s1, s2)/t
+
+
+ @staticmethod
+ def __hammingDistance(s1, s2):
+ '''
+ Finds the Hamming distance between two strings.
+
+ @param s1: string
+ @param s2: string
+ @return: the distance
+ @raise ValueError: if the lenght of the strings differ
+ '''
+
+ l1 = len(s1)
+ l2 = len(s2)
+
+ if l1 != l2:
+ raise ValueError("Hamming distance requires strings of same size.")
+
+ return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))
+
+ def hammingDistance(self, tree):
+ '''
+ Finds the Hamming distance between this tree and the one passed as argument.
+ '''
+
+ s1 = ' '.join(map(View.__str__, self.views))
+ s2 = ' '.join(map(View.__str__, tree))
+
+ return ViewClient.__hammingDistance(s1, s2)
+
+ @staticmethod
+ def __levenshteinDistance(s, t):
+ '''
+ Find the Levenshtein distance between two Strings.
+
+ Python version of Levenshtein distance method implemented in Java at
+ U{http://www.java2s.com/Code/Java/Data-Type/FindtheLevenshteindistancebetweentwoStrings.htm}.
+
+ This is the number of changes needed to change one String into
+ another, where each change is a single character modification (deletion,
+ insertion or substitution).
+
+ The previous implementation of the Levenshtein distance algorithm
+ was from U{http://www.merriampark.com/ld.htm}
+
+ Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError
+ which can occur when my Java implementation is used with very large strings.
+ This implementation of the Levenshtein distance algorithm
+ is from U{http://www.merriampark.com/ldjava.htm}::
+
+ StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance(*, null) = IllegalArgumentException
+ StringUtils.getLevenshteinDistance("","") = 0
+ StringUtils.getLevenshteinDistance("","a") = 1
+ StringUtils.getLevenshteinDistance("aaapppp", "") = 7
+ StringUtils.getLevenshteinDistance("frog", "fog") = 1
+ StringUtils.getLevenshteinDistance("fly", "ant") = 3
+ StringUtils.getLevenshteinDistance("elephant", "hippo") = 7
+ StringUtils.getLevenshteinDistance("hippo", "elephant") = 7
+ StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8
+ StringUtils.getLevenshteinDistance("hello", "hallo") = 1
+
+ @param s: the first String, must not be null
+ @param t: the second String, must not be null
+ @return: result distance
+ @raise ValueError: if either String input C{null}
+ '''
+ if s is None or t is None:
+ raise ValueError("Strings must not be null")
+
+ n = len(s)
+ m = len(t)
+
+ if n == 0:
+ return m
+ elif m == 0:
+ return n
+
+ if n > m:
+ tmp = s
+ s = t
+ t = tmp
+ n = m;
+ m = len(t)
+
+ p = [None]*(n+1)
+ d = [None]*(n+1)
+
+ for i in range(0, n+1):
+ p[i] = i
+
+ for j in range(1, m+1):
+ if DEBUG_DISTANCE:
+ if j % 100 == 0:
+ print >>sys.stderr, "DEBUG:", int(j/(m+1.0)*100),"%\r",
+ t_j = t[j-1]
+ d[0] = j
+
+ for i in range(1, n+1):
+ cost = 0 if s[i-1] == t_j else 1
+ # minimum of cell to the left+1, to the top+1, diagonally left and up +cost
+ d[i] = min(min(d[i-1]+1, p[i]+1), p[i-1]+cost)
+
+ _d = p
+ p = d
+ d = _d
+
+ if DEBUG_DISTANCE:
+ print >> sys.stderr, "\n"
+ return p[n]
+
+ def levenshteinDistance(self, tree):
+ '''
+ Finds the Levenshtein distance between this tree and the one passed as argument.
+ '''
+
+ s1 = ' '.join(map(View.__microStr__, self.views))
+ s2 = ' '.join(map(View.__microStr__, tree))
+
+ return ViewClient.__levenshteinDistance(s1, s2)
+
+ @staticmethod
+ def excerpt(_str, execute=False):
+ code = Excerpt2Code().Parse(_str)
+ if execute:
+ exec code
+ else:
+ return code
+
+class ConnectedDevice:
+ def __init__(self, device, vc, serialno):
+ self.device = device
+ self.vc = vc
+ self.serialno = serialno
+
+class CulebraOptions:
+ '''
+ Culebra options helper class
+ '''
+
+ HELP = 'help'
+ VERBOSE = 'verbose'
+ VERSION = 'version'
+ IGNORE_SECURE_DEVICE = 'ignore-secure-device'
+ IGNORE_VERSION_CHECK = 'ignore-version-check'
+ FORCE_VIEW_SERVER_USE = 'force-view-server-use' # Same a ViewClientOptions.FORCE_VIEW_SERVER_USE but with dashes
+ DO_NOT_START_VIEW_SERVER = 'do-not-start-view-server'
+ DO_NOT_IGNORE_UIAUTOMATOR_KILLED = 'do-not-ignore-uiautomator-killed'
+ FIND_VIEWS_BY_ID = 'find-views-by-id'
+ FIND_VIEWS_WITH_TEXT = 'find-views-with-text'
+ FIND_VIEWS_WITH_CONTENT_DESCRIPTION = 'find-views-with-content-description'
+ USE_REGEXPS = 'use-regexps'
+ VERBOSE_COMMENTS = 'verbose-comments'
+ UNIT_TEST_CLASS = 'unit-test-class'
+ UNIT_TEST_METHOD = 'unit-test-method'
+ USE_JAR = 'use-jar'
+ USE_DICTIONARY = 'use-dictionary'
+ DICTIONARY_KEYS_FROM = 'dictionary-keys-from'
+ AUTO_REGEXPS = 'auto-regexps'
+ START_ACTIVITY = 'start-activity'
+ OUTPUT = 'output'
+ INTERACTIVE = 'interactive'
+ WINDOW = 'window'
+ APPEND_TO_SYS_PATH = 'append-to-sys-path'
+ PREPEND_TO_SYS_PATH = 'prepend-to-sys-path'
+ SAVE_SCREENSHOT = 'save-screenshot'
+ SAVE_VIEW_SCREENSHOTS = 'save-view-screenshots'
+ GUI = 'gui'
+ SCALE = 'scale'
+ DO_NOT_VERIFY_SCREEN_DUMP = 'do-not-verify-screen-dump'
+ ORIENTATION_LOCKED = 'orientation-locked'
+ SERIALNO = 'serialno'
+ MULTI_DEVICE = 'multi-device'
+ LOG_ACTIONS = 'log-actions'
+ DEVICE_ART = 'device-art'
+ DROP_SHADOW = 'drop-shadow'
+ SCREEN_GLARE = 'glare'
+ NULL_BACK_END = 'null-back-end'
+ USE_UIAUTOMATOR_HELPER = 'use-uiautomator-helper'
+ CONCERTINA = 'concertina'
+ INSTALL_APK = 'install-apk'
+
+ SHORT_OPTS = 'HVvIEFSkw:i:t:d:rCUM:j:D:K:R:a:o:pf:W:GuP:Os:mLA:ZB0hc1:'
+ LONG_OPTS = [HELP, VERBOSE, VERSION, IGNORE_SECURE_DEVICE, IGNORE_VERSION_CHECK, FORCE_VIEW_SERVER_USE,
+ DO_NOT_START_VIEW_SERVER,
+ DO_NOT_IGNORE_UIAUTOMATOR_KILLED,
+ WINDOW + '=',
+ FIND_VIEWS_BY_ID + '=', FIND_VIEWS_WITH_TEXT + '=', FIND_VIEWS_WITH_CONTENT_DESCRIPTION + '=',
+ USE_REGEXPS, VERBOSE_COMMENTS, UNIT_TEST_CLASS, UNIT_TEST_METHOD + '=',
+ USE_JAR + '=', USE_DICTIONARY + '=', DICTIONARY_KEYS_FROM + '=', AUTO_REGEXPS + '=',
+ START_ACTIVITY + '=',
+ OUTPUT + '=', PREPEND_TO_SYS_PATH,
+ SAVE_SCREENSHOT + '=', SAVE_VIEW_SCREENSHOTS + '=',
+ GUI,
+ DO_NOT_VERIFY_SCREEN_DUMP,
+ SCALE + '=',
+ ORIENTATION_LOCKED,
+ SERIALNO + '=',
+ MULTI_DEVICE,
+ LOG_ACTIONS,
+ DEVICE_ART + '=', DROP_SHADOW, SCREEN_GLARE,
+ NULL_BACK_END,
+ USE_UIAUTOMATOR_HELPER,
+ CONCERTINA,
+ INSTALL_APK + '=',
+ ]
+ LONG_OPTS_ARG = {WINDOW: 'WINDOW',
+ FIND_VIEWS_BY_ID: 'BOOL', FIND_VIEWS_WITH_TEXT: 'BOOL', FIND_VIEWS_WITH_CONTENT_DESCRIPTION: 'BOOL',
+ USE_JAR: 'BOOL', USE_DICTIONARY: 'BOOL', DICTIONARY_KEYS_FROM: 'VALUE', AUTO_REGEXPS: 'LIST',
+ START_ACTIVITY: 'COMPONENT',
+ OUTPUT: 'FILENAME',
+ SAVE_SCREENSHOT: 'FILENAME', SAVE_VIEW_SCREENSHOTS: 'DIR',
+ UNIT_TEST_METHOD: 'NAME',
+ SCALE: 'FLOAT',
+ SERIALNO: 'LIST',
+ DEVICE_ART: 'MODEL',
+ INSTALL_APK: 'FILENAME'}
+ OPTS_HELP = {
+ 'H': 'prints this help',
+ 'V': 'verbose comments',
+ 'v': 'prints version number and exists',
+ 'k': 'don\'t ignore UiAutomator killed',
+ 'w': 'use WINDOW content (default: -1, all windows)',
+ 'i': 'whether to use findViewById() in script',
+ 't': 'whether to use findViewWithText() in script',
+ 'd': 'whether to use findViewWithContentDescription',
+ 'r': 'use regexps in matches',
+ 'U': 'generates unit test class and script',
+ 'M': 'generates unit test method. Can be used with or without -U',
+ 'j': 'use jar and appropriate shebang to run script (deprecated)',
+ 'D': 'use a dictionary to store the Views found',
+ 'K': 'dictionary keys from: id, text, content-description',
+ 'R': 'auto regexps (i.e. clock), implies -r. help list options',
+ 'a': 'starts Activity before dump',
+ 'o': 'output filename',
+ 'p': 'prepend environment variables values to sys.path',
+ 'f': 'save screenshot to file',
+ 'W': 'save View screenshots to files in directory',
+ 'E': 'ignores ADB version check',
+ 'G': 'presents the GUI (EXPERIMENTAL)',
+ 'P': 'scale percentage (i.e. 0.5)',
+ 'u': 'do not verify screen state after dump',
+ 'O': 'orientation locked in generated test',
+ 's': 'device serial number (can be more than 1)',
+ 'm': 'enables multi-device test generation',
+ 'L': 'log actions using logcat',
+ 'A': 'device art model to frame screenshot (auto: autodetected)',
+ 'Z': 'drop shadow for device art screenshot',
+ 'B': 'screen glare over screenshot',
+ '0': 'use a null back-end (no View tree obtained)',
+ 'h': 'use UiAutomatorHelper',
+ 'c': 'enable concertina mode (EXPERIMENTAL)',
+ '1': 'install APK as precondition',
+ }
+
+class CulebraTestCase(unittest.TestCase):
+ '''
+ The base class for all CulebraTests.
+
+ Class variables
+ ---------------
+ There are some class variables that can be used to change the behavior of the tests.
+
+ B{serialno}: The serial number of the device. This can also be a list of devices for I{mutli-devices}
+ tests or the keyword C{all} to run the tests on all available devices or C{default} to run the tests
+ only on the default (first) device.
+
+ When a I{multi-device} test is running the available devices are available in a list named
+ L{self.devices} which has the corresponding L{ConnectedDevices} entries.
+
+ Also, in the case of I{multi-devices} tests and to be backward compatible with I{single-device} tests
+ the default device, the first one in the devices list, is assigned to L{self.device}, L{self.vc} and
+ L{self.serialno} too.
+
+ B{verbose}: The verbosity of the tests. This can be changed from the test command line using the
+ command line option C{-v} or C{--verbose}.
+ '''
+
+ kwargs1 = None
+ kwargs2 = None
+ devices = None
+ ''' The list of connected devices '''
+ globalDevices = []
+ ''' The list of connected devices (class instance) '''
+ defaultDevice = None
+ ''' The default L{ConnectedDevice}. Set to the first one found for multi-device cases '''
+ serialno = None
+ ''' The default connected device C{serialno} '''
+ device = None
+ ''' The default connected device '''
+ vc = None
+ ''' The default connected device C{ViewClient} '''
+ verbose = False
+ options = {}
+
+ @classmethod
+ def setUpClass(cls):
+ cls.kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
+ cls.kwargs2 = {'startviewserver': True, 'forceviewserveruse': False, 'autodump': False, 'ignoreuiautomatorkilled': True}
+
+ @classmethod
+ def tearDownClass(cls):
+ if cls.kwargs2['useuiautomatorhelper']:
+ for d in cls.globalDevices:
+ d.vc.uiAutomatorHelper.quit()
+
+ def __init__(self, methodName='runTest'):
+ self.Log = CulebraTestCase.__Log(self)
+ unittest.TestCase.__init__(self, methodName=methodName)
+
+ def setUp(self):
+ __devices = None
+ if self.serialno:
+ # serialno can be 1 serialno, multiple serialnos, 'all' or 'default'
+ if self.serialno.lower() == 'all':
+ __devices = [d.serialno for d in adbclient.AdbClient().getDevices()]
+ elif self.serialno.lower() == 'default':
+ __devices = [adbclient.AdbClient().getDevices()[0].serialno]
+ else:
+ __devices = self.serialno.split()
+ if len(__devices) > 1:
+ self.devices = __devices
+
+ # FIXME: both cases should be unified
+ if self.devices:
+ __devices = self.devices
+ self.devices = []
+ for serialno in __devices:
+ device, serialno = ViewClient.connectToDeviceOrExit(serialno=serialno, **self.kwargs1)
+ if self.options[CulebraOptions.START_ACTIVITY]:
+ device.startActivity(component=self.options[CulebraOptions.START_ACTIVITY])
+ vc = ViewClient(device, serialno, **self.kwargs2)
+ connectedDevice = ConnectedDevice(serialno=serialno, device=device, vc=vc)
+ self.devices.append(connectedDevice)
+ CulebraTestCase.globalDevices.append(connectedDevice)
+ # Select the first devices as default
+ self.defaultDevice = self.devices[0]
+ self.device = self.defaultDevice.device
+ self.serialno = self.defaultDevice.serialno
+ self.vc = self.defaultDevice.vc
+ else:
+ self.devices = []
+ if __devices:
+ # A list containing only one device was specified
+ self.serialno = __devices[0]
+ self.device, self.serialno = ViewClient.connectToDeviceOrExit(serialno=self.serialno, **self.kwargs1)
+ if self.options[CulebraOptions.START_ACTIVITY]:
+ self.device.startActivity(component=self.options[CulebraOptions.START_ACTIVITY])
+ self.vc = ViewClient(self.device, self.serialno, **self.kwargs2)
+ # Set the default device, to be consistent with multi-devices case
+ connectedDevice = ConnectedDevice(serialno=self.serialno, device=self.device, vc=self.vc)
+ self.devices.append(connectedDevice)
+ CulebraTestCase.globalDevices.append(connectedDevice)
+
+ def tearDown(self):
+ pass
+
+ def preconditions(self):
+ if self.options[CulebraOptions.ORIENTATION_LOCKED] is not None:
+ # If orientation locked was set to a valid orientation value then use it to compare
+ # against current orientation (when the test is run)
+ return (self.device.display['orientation'] == self.options[CulebraOptions.ORIENTATION_LOCKED])
+ return True
+
+ def isTestRunningOnMultipleDevices(self):
+ return (len(self.devices) > 1)
+
+ @staticmethod
+ def __passAll(arg):
+ return True
+
+ def all(self, arg, _filter=None):
+ # CulebraTestCase.__passAll cannot be specified as the default argument value
+ if _filter is None:
+ _filter = CulebraTestCase.__passAll
+ if DEBUG_MULTI:
+ print >> sys.stderr, "all(%s, %s)" % (arg, _filter)
+ l = (getattr(d, arg) for d in self.devices)
+ for i in l:
+ print >> sys.stderr, " i=", i
+ return filter(_filter, (getattr(d, arg) for d in self.devices))
+
+ def allVcs(self, _filter=None):
+ return self.all('vc', _filter)
+
+ def allDevices(self, _filter=None):
+ return self.all('device', _filter)
+
+ def allSerialnos(self, _filter=None):
+ return self.all('serialno', _filter)
+
+ def log(self, message, priority='D'):
+ '''
+ Logs a message with the specified priority.
+ '''
+
+ self.device.log('CULEBRA', message, priority, CulebraTestCase.verbose)
+
+ class __Log():
+ '''
+ Log class to simulate C{android.util.Log}
+ '''
+
+ def __init__(self, culebraTestCase):
+ self.culebraTestCase = culebraTestCase
+
+ def __getattr__(self, attr):
+ '''
+ Returns the corresponding log method or @C{AttributeError}.
+ '''
+
+ if attr in ['v', 'd', 'i', 'w', 'e']:
+ return lambda message: self.culebraTestCase.log(message, priority=attr.upper())
+ raise AttributeError(self.__class__.__name__ + ' has no attribute "%s"' % attr)
+
+ @staticmethod
+ def main():
+ # If you want to specify tests classes and methods in the command line you will be forced
+ # to include -s or --serialno and the serial number of the device (could be a regexp)
+ # as ViewClient would have no way of determine what it is.
+ # This could be also a list of devices (delimited by whitespaces) and in such case all of
+ # them will be used.
+ # The special argument 'all' means all the connected devices.
+ ser = ['-s', '--serialno']
+ old = '%(failfast)'
+ new = ' %s s The serial number[s] to connect to or \'all\'\n%s' % (', '.join(ser), old)
+ unittest.TestProgram.USAGE = unittest.TestProgram.USAGE.replace(old, new)
+ argsToRemove = []
+ i = 0
+ while i < len(sys.argv):
+ a = sys.argv[i]
+ if a in ['-v', '--verbose']:
+ # make CulebraTestCase.verbose the same as unittest verbose
+ CulebraTestCase.verbose = True
+ elif a in ser:
+ # remove arguments not handled by unittest
+ if len(sys.argv) > (i+1):
+ argsToRemove.append(sys.argv[i])
+ CulebraTestCase.serialno = sys.argv[i+1]
+ argsToRemove.append(CulebraTestCase.serialno)
+ i += 1
+ else:
+ raise RuntimeError('serial number missing')
+ i += 1
+ for a in argsToRemove:
+ sys.argv.remove(a)
+ unittest.main()
+
+if __name__ == "__main__":
+ try:
+ vc = ViewClient(None)
+ except:
+ print "%s: Don't expect this to do anything" % __file__
diff --git a/AndroidViewClient/src/com/dtmilano/android/viewclient/ViewClient.java b/AndroidViewClient/src/com/dtmilano/android/viewclient/ViewClient.java
new file mode 100755
index 0000000..38e3ffc
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/viewclient/ViewClient.java
@@ -0,0 +1,325 @@
+
+package com.dtmilano.android.viewclient;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipException;
+
+public class ViewClient {
+
+ private static final boolean DEBUG = false;
+
+ private static final String PROGNAME = "java -jar androidviewclient.jar";
+
+ private static final String MONKEYRUNNER = "monkeyrunner";
+
+ private static final int DELAY = 500;
+
+ /**
+ * The <em>tools</em> directory in the jar.
+ */
+ private static final String TOOLS = "tools";
+
+ private enum Command {
+ DUMP, CULEBRA
+ };
+
+ private volatile boolean mProcessFinished = false;
+
+ /**
+ * The destination file as command is extracted from jar.
+ */
+ private File mDest = null;
+
+ private boolean mIsDestCreated = false;
+
+ private boolean mKeep = false;
+
+ /**
+ * Command arguments.
+ */
+ private String[] mArgs = null;
+
+ private JarFile mJar;
+
+ /**
+ * @author diego
+ */
+ private abstract class StreamReaderThread extends Thread {
+ private InputStream mIs;
+ private OutputStream mOs;
+
+ /**
+ * @param is
+ * @param os
+ */
+ public StreamReaderThread(InputStream is, OutputStream os) {
+ this.mIs = is;
+ this.mOs = os;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.lang.Thread#run()
+ */
+ @Override
+ public void run() {
+ do {
+ try {
+ while (mIs.available() > 0) {
+ mOs.write(mIs.read());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ Thread.sleep(DELAY);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } while (!mProcessFinished);
+ }
+ }
+
+ /**
+ * @author diego
+ */
+ private class OutputStreamReaderThread extends StreamReaderThread {
+
+ /**
+ * @param is
+ * @param os
+ */
+ public OutputStreamReaderThread(InputStream is) {
+ super(is, System.out);
+ }
+
+ }
+
+ /**
+ * @author diego
+ */
+ private class ErrorStreamReaderThread extends StreamReaderThread {
+
+ /**
+ * @param is
+ * @param os
+ */
+ public ErrorStreamReaderThread(InputStream is) {
+ super(is, System.err);
+ }
+
+ }
+
+ /**
+ * <em>ViewClient</em>
+ *
+ * @throws IOException
+ */
+ public ViewClient(Command cmd, String[] args) throws IOException {
+ if (args != null && args.length > 0) {
+ mArgs = args;
+ }
+ final File file = new File(URLDecoder.decode(ViewClient.class.getProtectionDomain()
+ .getCodeSource()
+ .getLocation().getPath(), "UTF-8"));
+ if (DEBUG) {
+ System.err.println("jar=" + file.getCanonicalPath() + " exists? " + file.exists());
+ }
+
+ try {
+ mJar = new JarFile(file);
+ } catch (ZipException e) {
+ error("Tools should be started using the jar file.", e);
+ usage();
+ }
+
+ final String entry = TOOLS + "/" + cmd.name().toLowerCase();
+ final JarEntry jarEntry = mJar.getJarEntry(entry);
+ if (jarEntry != null) {
+ final InputStream is = mJar.getInputStream(jarEntry);
+ // We cannot use /tmp or similar because sometimes it's mounted
+ // noexec
+ mDest = new File(System.getProperty("user.home") + File.separator
+ + cmd.name().toLowerCase());
+ final FileOutputStream fos = new java.io.FileOutputStream(mDest);
+ while (is.available() > 0) {
+ fos.write(is.read());
+ }
+ fos.close();
+ is.close();
+ mDest.setExecutable(true);
+ mIsDestCreated = true;
+ if (!mKeep) {
+ mDest.deleteOnExit();
+ }
+ }
+ else {
+ fatal("Cannot extract " + entry + " from jar");
+ }
+
+ }
+
+ /**
+ * Executes the command in a separate process.
+ *
+ * @return the exit value of the process
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public int execute() throws IOException, InterruptedException {
+ if (!mIsDestCreated) {
+ throw new IllegalStateException("Destination was not extracted successfully");
+ }
+ final Runtime runtime = Runtime.getRuntime();
+ final ArrayList<String> cmdList = new ArrayList<String>();
+ final String monkeyrunner = locateMonkeyRunner();
+ if (monkeyrunner != null) {
+ cmdList.add(monkeyrunner);
+ cmdList.add("-plugin");
+ cmdList.add(mJar.getName());
+ }
+ else {
+ if (isWindows()) {
+ fatal(String.format(
+ "%s was not found and %s does not support shebang in scripts. Aborting.",
+ MONKEYRUNNER, System.getProperty("os.name")));
+ }
+ }
+ cmdList.add(mDest.getAbsolutePath());
+ if (mArgs != null) {
+ for (String arg : mArgs) {
+ cmdList.add(arg);
+ }
+ }
+ if (DEBUG) {
+ System.err.println("executing: " + cmdList);
+ }
+ final Process process = runtime.exec(cmdList.toArray(new String[] {}));
+ if (process != null) {
+ mProcessFinished = false;
+ new OutputStreamReaderThread(process.getInputStream()).start();
+ new ErrorStreamReaderThread(process.getErrorStream()).start();
+ process.waitFor();
+ try {
+ Thread.sleep(DELAY + 500);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ mProcessFinished = true;
+ if (DEBUG) {
+ System.err.println("process=" + process + " " + process.exitValue());
+ }
+ return process.exitValue();
+ }
+
+ throw new RuntimeException("Couldn't create process");
+ }
+
+ /**
+ * @return
+ */
+ private static boolean isWindows() {
+ final String os = System.getProperty("os.name");
+ return os.toUpperCase().contains("WINDOWS");
+ }
+
+ /**
+ * Locates <code>monkeyrunner</code> executable in path.
+ *
+ * @return the absolute path of <code>monkeyrunner</code> or
+ * <code>null</code> if not found
+ */
+ private static String locateMonkeyRunner() {
+ final StringTokenizer tokenizer = new StringTokenizer(System.getenv("PATH"),
+ File.pathSeparator);
+ while (tokenizer.hasMoreTokens()) {
+ final String dir = tokenizer.nextToken();
+ File monkeyrunner = new File(dir + File.separator + MONKEYRUNNER + (isWindows() ? ".bat" : ""));
+ if (DEBUG) {
+ System.err.println("searching for " + monkeyrunner + " exist? " + monkeyrunner.exists());
+ }
+ if (monkeyrunner.exists()) {
+ return monkeyrunner.getAbsolutePath();
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Prints usage and exits.
+ */
+ private static void usage() {
+ System.err.println(String.format("usage: %s COMMAND [OPTION]... [ARGS]...", PROGNAME));
+ System.err.println("");
+ System.err.println("Commands:");
+ for (Command cmd : Command.values()) {
+ System.err.println(" " + cmd.name().toLowerCase());
+ }
+ System.exit(1);
+ }
+
+ /**
+ * Obtains the extra arguments in the command line (following command, which
+ * is assumed to be in args[0]).
+ *
+ * @param args the arguments
+ * @return The string array obtained from the arguments
+ */
+ private static String[] obtainExtraArgs(String[] args) {
+ if (args.length > 1) {
+ final String[] extras = new String[args.length - 1];
+ for (int i = 1; i < args.length; i++) {
+ extras[i - 1] = args[i];
+ }
+ return extras;
+ }
+ return null;
+ }
+
+ private static void error(String msg) {
+ System.err.print("ERROR: ");
+ System.err.println(msg);
+ }
+
+ private void error(String msg, Exception e) {
+ error(msg);
+ e.printStackTrace(System.err);
+ }
+
+ private static void fatal(String msg) {
+ error(msg);
+ System.exit(1);
+ }
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ if (args.length < 1) {
+ usage();
+ }
+
+ final String cmdStr = args[0];
+ final String[] extras = obtainExtraArgs(args);
+
+ if (DEBUG) {
+ System.err.println("main: cmd=" + cmdStr + " extras=" + extras);
+ }
+
+ try {
+ System.exit(new ViewClient(Command.valueOf(cmdStr.toUpperCase()), extras).execute());
+ } catch (IllegalArgumentException e) {
+ error("Unknown command: '" + cmdStr + "'");
+ usage();
+ }
+
+ }
+}
diff --git a/AndroidViewClient/src/com/dtmilano/android/window.py b/AndroidViewClient/src/com/dtmilano/android/window.py
new file mode 100755
index 0000000..4f976ad
--- /dev/null
+++ b/AndroidViewClient/src/com/dtmilano/android/window.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Jan 5, 2015
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+@author: Diego Torres Milano
+'''
+
+import sys
+
+DEBUG = False
+
+class Window(object):
+ '''
+ Window class
+ '''
+
+ def __init__(self, num, winId, activity, wvx, wvy, wvw, wvh, px, py, visibility, focused=False):
+ '''
+ Constructor
+
+ @type num: int
+ @param num: Ordering number in Window Manager
+ @type winId: str
+ @param winId: the window ID
+ @type activity: str
+ @param activity: the activity (or sometimes other component) owning the window
+ @type wvx: int
+ @param wvx: window's virtual X
+ @type wvy: int
+ @param wvy: window's virtual Y
+ @type wvw: int
+ @param wvw: window's virtual width
+ @type wvh: int
+ @param wvh: window's virtual height
+ @type px: int
+ @param px: parent's X
+ @type py: int
+ @param py: parent's Y
+ @type visibility: int
+ @param visibility: visibility of the window
+ '''
+
+ if DEBUG: print >> sys.stderr, "Window(%d, %s, %s, %d, %d, %d, %d, %d, %d, %d)" % \
+ (num, winId, activity, wvx, wvy, wvw, wvh, px, py, visibility)
+ self.num = num
+ self.winId = winId
+ self.activity = activity
+ self.wvx = wvx
+ self.wvy = wvy
+ self.wvw = wvw
+ self.wvh = wvh
+ self.px = px
+ self.py = py
+ self.visibility = visibility
+ self.focused = focused
+
+ def __str__(self):
+ return "Window(%d, wid=%s, a=%s, x=%d, y=%d, w=%d, h=%d, px=%d, py=%d, v=%d, f=%s)" % \
+ (self.num, self.winId, self.activity, self.wvx, self.wvy, self.wvw, self.wvh, self.px, self.py, self.visibility, self.focused)
+
diff --git a/AndroidViewClient/src/share/__init__.py b/AndroidViewClient/src/share/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/__init__.py b/AndroidViewClient/src/share/pixmaps/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/culebra.png b/AndroidViewClient/src/share/pixmaps/culebra.png
new file mode 100755
index 0000000..da1c42c
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/culebra.png
Binary files differ
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/__init__.py b/AndroidViewClient/src/share/pixmaps/plugins/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/__init__.py b/AndroidViewClient/src/share/pixmaps/plugins/android/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/__init__.py b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/__init__.py b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/LICENSE b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/LICENSE
new file mode 100755
index 0000000..c2bbd04
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/LICENSE
@@ -0,0 +1 @@
+Samsung S4 vector drawing obtained from http://en.wikipedia.org/wiki/Samsung_Galaxy_S4#/media/File:Samsung_Galaxy_S4.svg under CC BY-SA 3.0
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/__init__.py b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/__init__.py
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_back.png b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_back.png
new file mode 100755
index 0000000..e2d7775
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_back.png
Binary files differ
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_fore.png b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_fore.png
new file mode 100755
index 0000000..a5f22e9
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_fore.png
Binary files differ
diff --git a/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_shadow.png b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_shadow.png
new file mode 100755
index 0000000..c7c2f38
--- /dev/null
+++ b/AndroidViewClient/src/share/pixmaps/plugins/android/lib/device-art-resources/samsung_s4/port_shadow.png
Binary files differ
diff --git a/AndroidViewClient/tests/__init__.py b/AndroidViewClient/tests/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/tests/__init__.py
diff --git a/AndroidViewClient/tests/allTests.py b/AndroidViewClient/tests/allTests.py
new file mode 100755
index 0000000..3f5a44a
--- /dev/null
+++ b/AndroidViewClient/tests/allTests.py
@@ -0,0 +1,31 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 5, 2012
+
+@author: diego
+'''
+import unittest
+import sys
+import os
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.adb.adbclienttests import AdbClientTests
+from com.dtmilano.android.viewclienttests import ViewTests, ViewClientTests
+
+if __name__ == "__main__":
+ #sys.argv = ['', 'ViewTest.testName']
+ #sys,argv = ['allTests', 'AdbClientTests', 'ViewTests', 'ViewClientTests']
+# adbClientTestsSuite = unittest.TestLoader().loadTestsFromTestCase(AdbClientTests)
+# viewTestsSuite = unittest.TestLoader().loadTestsFromTestCase(ViewTests)
+# viewClientTestsSuite = unittest.TestLoader().loadTestsFromTestCase(ViewClientTests)
+# suite = unittest.TestSuite()
+# suite.addTest(adbClientTestsSuite)
+# suite.addTest(viewTestsSuite)
+# suite.addTest(viewClientTestsSuite)
+# unittest.TextTestRunner(verbosity=2).run(suite)
+ pass
diff --git a/AndroidViewClient/tests/com/__init__.py b/AndroidViewClient/tests/com/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/tests/com/__init__.py
diff --git a/AndroidViewClient/tests/com/dtmilano/__init__.py b/AndroidViewClient/tests/com/dtmilano/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/__init__.py
diff --git a/AndroidViewClient/tests/com/dtmilano/android/.gitignore b/AndroidViewClient/tests/com/dtmilano/android/.gitignore
new file mode 100755
index 0000000..6efbe15
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/.gitignore
@@ -0,0 +1 @@
+/dont-commit-*
diff --git a/AndroidViewClient/tests/com/dtmilano/android/__init__.py b/AndroidViewClient/tests/com/dtmilano/android/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/__init__.py
diff --git a/AndroidViewClient/tests/com/dtmilano/android/adb/__init__.py b/AndroidViewClient/tests/com/dtmilano/android/adb/__init__.py
new file mode 100755
index 0000000..18cd8bb
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/adb/__init__.py
@@ -0,0 +1 @@
+#__init__.py
\ No newline at end of file
diff --git a/AndroidViewClient/tests/com/dtmilano/android/adb/adbclienttests.py b/AndroidViewClient/tests/com/dtmilano/android/adb/adbclienttests.py
new file mode 100755
index 0000000..8ba14c9
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/adb/adbclienttests.py
@@ -0,0 +1,241 @@
+'''
+Created on Aug 6, 2013
+
+@author: diego
+'''
+import sys
+import time
+import re
+import unittest
+import os
+import subprocess
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.adb.adbclient import AdbClient
+from com.dtmilano.android.common import obtainAdbPath
+
+VERBOSE = False
+
+TEST_TEMPERATURE_CONVERTER_APP = False
+TEMPERATURE_CONVERTER_PKG = 'com.example.i2at.tc'
+TEMPERATURE_CONVERTER_ACTIVITY = 'TemperatureConverterActivity'
+CALCULATOR_KEYWORD = 'calculator'
+CALCULATOR_ACTIVITY = 'Calculator'
+
+#ANDROIANDROID_SERIAL = 'emulator-5554'
+
+class AdbClientTest(unittest.TestCase):
+
+ androidSerial = None
+ ''' The Android device serial number used by default'''
+
+ @classmethod
+ def setUpClass(cls):
+ cls.adb = obtainAdbPath()
+ # we use 'fakeserialno' and settransport=False so AdbClient does not try to find the
+ # serialno in setTransport()
+ try:
+ adbClient = AdbClient('fakeserialno', settransport=False)
+ except RuntimeError, ex:
+ if re.search('Connection refused', str(ex)):
+ raise RuntimeError("adb is not running")
+ raise(ex)
+ devices = adbClient.getDevices()
+ if len(devices) == 0:
+ raise RuntimeError("This tests require at least one device connected. None was found.")
+ for device in devices:
+ if device.status == 'device':
+ cls.androidSerial = device.serialno
+ if VERBOSE:
+ print "AdbClientTest: using device %s" % cls.androidSerial
+ return
+ raise RuntimeError("No on-line devices found")
+
+ def setUp(self):
+ subprocess.check_call([self.adb, '-s', self.androidSerial, 'forward', '--remove-all'])
+ self.adbClient = AdbClient(self.androidSerial)
+ self.assertIsNotNone(self.adbClient, "adbClient is None")
+
+ def tearDown(self):
+ self.adbClient.close()
+ subprocess.check_call([self.adb, '-s', self.androidSerial, 'forward', '--remove-all'])
+
+ def testSerialno_none(self):
+ try:
+ adbClient = AdbClient(None)
+ self.assertTrue(adbClient.checkConnected())
+ # because serialno is None, transport cannot be set, so next statement
+ # will raise an exception
+ adbClient.getSdkVersion()
+ self.fail("No exception was generated")
+ except RuntimeError, ex:
+ self.assertIsNotNone(re.search("ERROR: Transport is not set", str(ex)), "Couldn't find error message: %s" % ex)
+
+ def testSerialno_nonExistent(self):
+ try:
+ AdbClient('doesnotexist')
+ except RuntimeError, ex:
+ self.assertIsNotNone(re.search("ERROR: couldn't find device that matches 'doesnotexist'", str(ex)), "Couldn't find error message: %s" % ex)
+
+ def testSerialno_empty(self):
+ try:
+ AdbClient('')
+ self.fail("No exception was generated")
+ except ValueError:
+ pass
+
+ def testGetDevices(self):
+ # we use 'fakeserialno' and settransport=False so AdbClient does not try to find the
+ # serialno in setTransport()
+ adbclient = AdbClient('fakeserialno', settransport=False)
+ self.assertTrue(len(adbclient.getDevices()) >= 1)
+
+ def testGetDevices_androidSerial(self):
+ devs = self.adbClient.getDevices()
+ self.assertTrue(self.androidSerial in [d.serialno for d in devs])
+
+ def testGetDevices_regex(self):
+ adbclient = AdbClient('.*', settransport=False)
+ self.assertTrue(len(adbclient.getDevices()) >= 1)
+
+ #@unittest.skipIf(not re.search('emulator-5554', AdbClientTest.androidSerial), "Supported only when emulator is connected")
+ def testAdbClient_serialnoNoRegex(self):
+ if re.search('emulator-5554', AdbClientTest.androidSerial):
+ adbClient = AdbClient('emulator-5554')
+ self.assertIsNotNone(adbClient)
+ self.assertEqual('emulator-5554', adbClient.serialno)
+
+ #@unittest.skipIf(not re.search('emulator', AdbClientTest.androidSerial), "Supported only when emulator is connected")
+ def testAdbClient_serialnoRegex(self):
+ if re.search('emulator', AdbClientTest.androidSerial):
+ adbClient = AdbClient('emulator-.*')
+ self.assertIsNotNone(adbClient)
+ self.assertTrue(re.match('emulator-.*', adbClient.serialno))
+
+ def testAdbClient_serialnoRegexIP(self):
+ IPRE = re.compile('(\d+\.){3}\d+')
+ if IPRE.search(AdbClientTest.androidSerial):
+ adbClient = AdbClient('\d+.*')
+ self.assertIsNotNone(adbClient)
+ self.assertTrue(IPRE.match(adbClient.serialno))
+
+ def testCheckVersion(self):
+ self.adbClient.checkVersion()
+
+ def testShell(self):
+ date = self.adbClient.shell('date +"%Y/%m/%d"')
+ # this raises a ValueError if the format is not correct
+ time.strptime(date, '%Y/%m/%d\r\n')
+
+ def testShell_noOutput(self):
+ empty = self.adbClient.shell('sleep 3')
+ self.assertIs('', empty, "Expected empty output but found '%s'" % empty)
+
+ def testGetProp_ro_serialno(self):
+ serialno = self.adbClient.getProperty('ro.serialno')
+ self.assertIsNotNone(serialno)
+ if re.search('emulator-.*', self.androidSerial):
+ self.assertEqual(serialno, '')
+ elif re.search('VirtualBox', self.adbClient.getProperty('ro.product.model')):
+ self.assertEqual(serialno, '')
+ else:
+ self.assertEqual(serialno, self.androidSerial)
+
+ def testGetProp_ro_kernel_qemu(self):
+ qemu = self.adbClient.getProperty('ro.kernel.qemu')
+ self.assertIsNotNone(qemu)
+ if re.search('emulator-.*', self.androidSerial):
+ self.assertEqual(qemu, '1')
+ else:
+ self.assertEqual(qemu, '')
+
+ def testPress(self):
+ self.adbClient.press('KEYCODE_DPAD_UP')
+
+ def testTouch(self):
+ self.adbClient.touch(480, 1250)
+
+ def testType(self):
+ self.adbClient.type('Android is cool')
+
+ def testType_digits(self):
+ self.adbClient.type('1234')
+
+ def testType_digits_asInt(self):
+ self.adbClient.type(1234)
+
+
+ def __checkPackageInstalled(self):
+ packages = self.adbClient.shell('pm list packages').splitlines()
+ self.assertTrue(packages, "Could not detect any packages installed")
+ if TEST_TEMPERATURE_CONVERTER_APP:
+ self.assertIn('package:' + TEMPERATURE_CONVERTER_PKG, packages, TEMPERATURE_CONVERTER_PKG + " is not installed")
+ return (TEMPERATURE_CONVERTER_PKG, TEMPERATURE_CONVERTER_ACTIVITY)
+ else:
+ for line in packages:
+ if CALCULATOR_KEYWORD in line:
+ pkg = line[line.index(':')+1:]
+ self.assertTrue(pkg, "No calculator package to use for testing")
+ return (pkg, CALCULATOR_ACTIVITY)
+ return False
+
+ def testStartActivity_component(self):
+ pkg = self.__checkPackageInstalled()
+ if pkg:
+ self.adbClient.startActivity(pkg[0] + '/.' + pkg[1])
+
+ def testGetWindows(self):
+ self.assertIsNotNone(self.adbClient.getWindows())
+
+ def testGetFocusedWindow(self):
+ pkg = self.__checkPackageInstalled()
+ if pkg:
+ self.adbClient.startActivity(pkg[0] + '/.' + pkg[1])
+ time.sleep(3)
+ w = self.adbClient.getFocusedWindow()
+ self.assertIsNotNone(w)
+ self.assertEqual(pkg[0] + '/' + pkg[0] + '.' + pkg[1], w.activity)
+
+ def testGetFocusedWindowName(self):
+ pkg = self.__checkPackageInstalled()
+ if pkg:
+ self.adbClient.startActivity(pkg[0] + '/.' + pkg[1])
+ time.sleep(3)
+ n = self.adbClient.getFocusedWindowName()
+ self.assertIsNotNone(n)
+ self.assertEqual(pkg[0] + '/' + pkg[0] + '.' + pkg[1], n)
+
+ def testStartActivity_uri(self):
+ self.adbClient.startActivity(uri='http://www.google.com')
+
+ #@unittest.skip("sequence")
+ def testCommandsSequence(self):
+ self.adbClient.setReconnect(True)
+ if VERBOSE:
+ print "Sending touch(480, 800)"
+ self.adbClient.touch(480, 800)
+ self.assertTrue(self.adbClient.checkConnected())
+ if VERBOSE:
+ print "Typing 'command 1'"
+ self.adbClient.type("command 1")
+ self.assertTrue(self.adbClient.checkConnected())
+ if VERBOSE:
+ print "Typing 'command 2'"
+ self.adbClient.type("command 2")
+ self.assertTrue(self.adbClient.checkConnected())
+ if VERBOSE:
+ print "Pressing ENTER"
+ self.adbClient.press('KEYCODE_ENTER')
+ self.assertTrue(self.adbClient.checkConnected())
+
+ #def testWake(self):
+ # self.adbClient.wake()
+
+if __name__ == "__main__":
+ #print >> sys.stderr, "sys.path=", sys.path
+ #sys.argv = ['', 'AdbClientTest']
+ unittest.main()
\ No newline at end of file
diff --git a/AndroidViewClient/tests/com/dtmilano/android/mocks.py b/AndroidViewClient/tests/com/dtmilano/android/mocks.py
new file mode 100755
index 0000000..2657357
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/mocks.py
@@ -0,0 +1,847 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 6, 2012
+
+@author: diego
+'''
+
+import re
+
+DEBUG = False
+
+TRUE_PARCEL = "Result: Parcel(00000000 00000001 '........')\r\n"
+FALSE_PARCEL = "Result: Parcel(00000000 00000000 '........')\r\n"
+
+DUMP = """\
+com.android.internal.policy.impl.PhoneWindow$DecorView@412a9d08 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,800 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2122315464 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,800 layout:getLayoutDirection()=7,INHERIT layout_horizontalWeight=3,0.0 layout_flags_FLAG_LAYOUT_IN_SCREEN=5,0x100 layout_flags_FLAG_LAYOUT_INSET_DECOR=7,0x10000 layout_flags_FLAG_SPLIT_TOUCH=8,0x800000 layout_flags_FLAG_HARDWARE_ACCELERATED=9,0x1000000 layout_flags=8,25231616 layout_type=21,TYPE_BASE_APPLICATION layout_verticalWeight=3,0.0 layout_x=1,0 layout_y=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@412aaaf8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=3,800 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=2,38 measurement:mMeasuredHeight=3,800 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830334 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,800 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.internal.widget.ActionBarContainer@412ab6e0 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=23,id/action_bar_container layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,38 layout:mBottom=3,110 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarView@412abdf0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=13,id/action_bar layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@412b7498 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,140 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,140 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,24 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,72 layout:mLeft=2,61 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704080 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,201 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,24 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744813920 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,140 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@412b8158 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,id/up layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=2,19 layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@412b84b8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=2,37 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,116 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,37 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,116 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,17 layout:mBottom=2,54 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,37 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=2,19 layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,116 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@412b89a8 text:mText=8,TrashCan getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,116 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,37 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=19,id/action_bar_title layout:mRight=3,116 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,37 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,29 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,37 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,116 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@412b97a0 text:mText=0, getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128605152 text:mResolvedTextDirection=12,FIRST_STRONG mID=22,id/action_bar_subtitle layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,8 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,-4 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarView$HomeView@412b40e8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=2,48 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,72 layout:mLeft=2,13 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704080 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=2,61 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744813920 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@412b5758 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,24 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,24 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130691040 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,id/up layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=3,-11 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@412b5ad8 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,36 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,48 layout:mLeft=1,6 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=7,id/home layout:mRight=2,42 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,12 layout:mBottom=2,60 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=2,12 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=2,12 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,12 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,36 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.view.menu.ActionMenuView@412c27c8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=5,false measurement:mOrientation=1,0 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=3,480 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128606160 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,36 layout:mBottom=2,36 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarContextView@412b9f28 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120215264 text:mResolvedTextDirection=12,FIRST_STRONG mID=21,id/action_context_bar layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830328 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@412ba620 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=2,55 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,690 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/content layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,110 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,690 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,0 layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@412bb588 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=3,690 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,690 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,690 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,690 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.Button@412bba70 text:mText=1,1 getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=2,72 measurement:mMinWidth=2,96 padding:mPaddingBottom=2,12 padding:mPaddingLeft=2,18 padding:mPaddingRight=2,18 padding:mPaddingTop=2,12 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/button1 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,72 padding:mUserPaddingBottom=2,12 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,18 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,18 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,46 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Button@412bc610 text:mText=1,2 getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=2,72 measurement:mMinWidth=2,96 padding:mPaddingBottom=2,12 padding:mPaddingLeft=2,18 padding:mPaddingRight=2,18 padding:mPaddingTop=2,12 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/button2 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,72 layout:mBottom=3,144 padding:mUserPaddingBottom=2,12 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,18 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,18 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,46 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Button@412bd078 text:mText=1,3 getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=2,72 measurement:mMinWidth=2,96 padding:mPaddingBottom=2,12 padding:mPaddingLeft=2,18 padding:mPaddingRight=2,18 padding:mPaddingTop=2,12 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/button3 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,144 layout:mBottom=3,216 padding:mUserPaddingBottom=2,12 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,18 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,18 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,46 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Button@412bdae0 text:mText=1,4 getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=2,72 measurement:mMinWidth=2,96 padding:mPaddingBottom=2,12 padding:mPaddingLeft=2,18 padding:mPaddingRight=2,18 padding:mPaddingTop=2,12 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/button4 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,216 layout:mBottom=3,288 padding:mUserPaddingBottom=2,12 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,18 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,18 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,46 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Button@412be548 text:mText=1,5 getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=2,72 measurement:mMinWidth=2,96 padding:mPaddingBottom=2,12 padding:mPaddingLeft=2,18 padding:mPaddingRight=2,18 padding:mPaddingTop=2,12 measurement:mMeasuredHeight=2,72 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/button5 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,288 layout:mBottom=3,360 padding:mUserPaddingBottom=2,12 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,18 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,18 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,46 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,72 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@412beff8 text:mText=11,Medium Text getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,330 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=7,id/info layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,360 layout:mBottom=3,690 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,29 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,330 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarContainer@412baa00 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 text:mResolvedTextDirection=12,FIRST_STRONG mID=19,id/split_action_bar layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+DONE.
+DONE
+"""
+
+DUMP_SAMPLE_UI = """\
+com.android.internal.policy.impl.PhoneWindow$DecorView@b4784e48 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,752 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2122315464 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,752 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,752 layout:getLayoutDirection()=7,INHERIT layout_horizontalWeight=3,0.0 layout_flags_FLAG_LAYOUT_IN_SCREEN=5,0x100 layout_flags_FLAG_LAYOUT_INSET_DECOR=7,0x10000 layout_flags_FLAG_SPLIT_TOUCH=8,0x800000 layout_flags_FLAG_HARDWARE_ACCELERATED=9,0x1000000 layout_flags=8,25231616 layout_type=21,TYPE_BASE_APPLICATION layout_verticalWeight=3,0.0 layout_x=1,0 layout_y=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b47b13f0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=3,752 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,752 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,752 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830334 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,752 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.internal.widget.ActionBarContainer@b47a46a8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=23,id/action_bar_container layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarView@b4776570 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=13,id/action_bar layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b477e350 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=2,98 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=2,98 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,16 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=2,65 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704080 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=3,163 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,16 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744813920 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,98 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b47b9b08 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,id/up layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=2,19 layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b47f82f0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=2,25 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=2,82 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,25 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=2,82 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,15 layout:mBottom=2,40 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=2,19 layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,82 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b4722880 text:mText=9,Sample UI getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=2,82 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,25 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=19,id/action_bar_title layout:mRight=2,82 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,25 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,20 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,82 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b4785130 text:mText=0, getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128605152 text:mResolvedTextDirection=12,FIRST_STRONG mID=22,id/action_bar_subtitle layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,9 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,-2 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarView$HomeView@b4777390 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=2,56 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=1,9 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704080 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=2,65 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744813920 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,56 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b47a0930 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,16 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,16 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130691040 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,id/up layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830456 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=2,-7 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b47b7e60 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,48 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,48 layout:mLeft=1,4 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=7,id/home layout:mRight=2,52 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,4 layout:mBottom=2,52 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,4 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,8 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,4 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.view.menu.ActionMenuView@b4727510 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=5,false measurement:mOrientation=1,0 measurement:mTotalLength=2,64 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=2,64 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=4,1216 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,64 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.internal.view.menu.ActionMenuPresenter$OverflowMenuButton@b47cca60 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,64 measurement:mMinHeight=2,56 measurement:mMinWidth=2,64 padding:mPaddingBottom=1,0 padding:mPaddingLeft=2,12 padding:mPaddingRight=2,12 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,56 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=2,64 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,56 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,12 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,12 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744683007 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 layout:getLayoutDirection()=7,INHERIT layout:layout_cellsUsed=1,0 layout:layout_expandable=5,false layout:layout_extraPixels=1,0 layout:layout_isOverflowButton=4,true layout:layout_preventEdgeOffset=5,false layout:layout_gravity=15,CENTER_VERTICAL layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,64 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.internal.widget.ActionBarContextView@b47bb880 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120215264 text:mResolvedTextDirection=12,FIRST_STRONG mID=21,id/action_context_bar layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830328 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@b47847a0 drawing:mForeground=52,android.graphics.drawable.NinePatchDrawable@b47b29c0 padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=2,55 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,696 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/content layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,56 layout:mBottom=3,752 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,696 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,0 layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@b47cc868 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1280 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,696 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=3,696 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,696 layout:getLayoutDirection()=7,INHERIT layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1280 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b4727ca8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=3,419 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=4,1240 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=3,419 layout:mLeft=2,40 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2122314448 text:mResolvedTextDirection=12,FIRST_STRONG mID=17,id/content_layout layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,80 layout:mBottom=3,499 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,419 layout:getLayoutDirection()=7,INHERIT layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,40 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,80 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1240 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ToggleButton@b4728a80 isChecked()=5,false text:mText=12,Button 1 OFF getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1140 measurement:mMinHeight=2,48 measurement:mMinWidth=2,64 padding:mPaddingBottom=1,4 padding:mPaddingLeft=2,12 padding:mPaddingRight=2,12 padding:mPaddingTop=1,4 measurement:mMeasuredHeight=2,48 layout:mLeft=2,50 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1190 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=2,50 layout:mBottom=2,98 padding:mUserPaddingBottom=1,4 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,12 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,12 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,29 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=2,10 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,50 layout:layout_rightMargin=2,50 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,50 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=7,button1 getVisibility()=7,VISIBLE layout:getWidth()=4,1140 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b472d690 text:mText=37,(50.0,50.0) (90,186) (90,186) (40,80) getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1240 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,25 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=12,id/textView1 layout:mRight=4,1240 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,108 layout:mBottom=3,133 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,20 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1240 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ToggleButton@b477da08 isChecked()=5,false text:mText=12,Button 2 OFF getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1140 measurement:mMinHeight=2,48 measurement:mMinWidth=2,64 padding:mPaddingBottom=1,4 padding:mPaddingLeft=2,12 padding:mPaddingRight=2,12 padding:mPaddingTop=1,4 measurement:mMeasuredHeight=2,48 layout:mLeft=2,50 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=5,NO_ID layout:mRight=4,1190 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,183 layout:mBottom=3,231 padding:mUserPaddingBottom=1,4 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,12 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,12 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,29 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=2,10 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,50 layout:layout_rightMargin=2,50 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,50 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=7,button2 getVisibility()=7,VISIBLE layout:getWidth()=4,1140 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b477e678 text:mText=38,(50.0,183.0) (90,319) (90,319) (40,80) getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1240 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,25 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=12,id/textView2 layout:mRight=4,1240 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,241 layout:mBottom=3,266 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,20 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1240 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ToggleButton@b4781818 isChecked()=5,false text:mText=14,Button with ID getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1140 measurement:mMinHeight=2,48 measurement:mMinWidth=2,64 padding:mPaddingBottom=1,4 padding:mPaddingLeft=2,12 padding:mPaddingRight=2,12 padding:mPaddingTop=1,4 measurement:mMeasuredHeight=2,48 layout:mLeft=2,50 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=17,id/button_with_id layout:mRight=4,1190 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,316 layout:mBottom=3,364 padding:mUserPaddingBottom=1,4 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=2,12 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=2,12 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744814079 layout:getBaseline()=2,29 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=2,10 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,50 layout:layout_rightMargin=2,50 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,50 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1140 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b477c2f8 text:mText=38,(50.0,316.0) (90,452) (90,452) (40,80) getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMeasuredWidth=4,1240 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,25 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=12,id/textView3 layout:mRight=4,1240 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=3,374 layout:mBottom=3,399 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830464 layout:getBaseline()=2,20 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=2,20 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=4,1240 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ZoomControls@b477ec78 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,158 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 drawing:mDrawLayers=4,true focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMeasuredWidth=3,158 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,48 layout:mLeft=4,1122 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 text:mResolvedTextDirection=12,FIRST_STRONG mID=7,id/zoom layout:mRight=4,1280 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,48 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1744830336 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=4,true layout:layout_mRules_alignParentRight=4,true layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,158 focus:hasFocus()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ZoomButton@b4784998 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,79 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=2,11 padding:mPaddingLeft=1,4 padding:mPaddingRight=1,0 padding:mPaddingTop=1,7 measurement:mMeasuredHeight=2,48 layout:mLeft=1,0 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=10,id/zoomOut layout:mRight=2,79 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,48 padding:mUserPaddingBottom=2,11 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,4 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1742716927 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,79 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ZoomButton@b4727eb0 layout:getBaseline()=2,-1 measurement:mMeasuredWidth=2,79 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=2,47 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,4 padding:mPaddingTop=1,0 measurement:mMeasuredHeight=2,48 layout:mLeft=2,79 drawing:mLayerType=4,NONE mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 text:mResolvedTextDirection=12,FIRST_STRONG mID=9,id/zoomIn layout:mRight=3,158 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 text:mTextDirection=7,INHERIT layout:mTop=1,0 layout:mBottom=2,48 padding:mUserPaddingBottom=2,47 padding:mUserPaddingEnd=2,-1 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRelative=5,false padding:mUserPaddingRight=1,4 padding:mUserPaddingStart=2,-1 mViewFlags=11,-1742716927 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:getLayoutDirection()=7,INHERIT layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT layout:getResolvedLayoutDirection()=22,RESOLVED_DIRECTION_LTR getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,79 focus:hasFocus()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+DONE.
+DONE
+"""
+
+DUMP_API_10 = """\
+com.android.internal.policy.impl.PhoneWindow$DecorView@4066e808 drawing:mForeground=4,null drawing:mForegroundInPadding=4,true padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=3,800 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,25169208 mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,800 layout_flags_FLAG_LAYOUT_IN_SCREEN=5,0x100 layout_flags=5,65792 layout_type=21,TYPE_BASE_APPLICATION layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=4,true isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@40667158 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,51 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=3,800 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=2,38 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=3,800 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653314 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,800 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=4,true isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@40676d60 drawing:mForeground=4,null drawing:mForegroundInPadding=4,true padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,2 padding:mPaddingLeft=1,6 padding:mPaddingRight=1,6 padding:mPaddingTop=1,1 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,38 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,25169200 mID=5,NO_ID layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,38 layout:mBottom=2,76 padding:mUserPaddingBottom=1,2 padding:mUserPaddingRight=1,6 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,38 layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=2,38 layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@4063f6d8 mText=8,Settings getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,468 measurement:mMeasuredHeight=2,35 layout:mLeft=1,6 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,474 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,1 layout:mBottom=2,36 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,25 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,35 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,468 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@40677f28 drawing:mForeground=52,android.graphics.drawable.NinePatchDrawable@406cffd0 drawing:mForegroundInPadding=4,true padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=2,55 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=3,724 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16911408 mID=10,id/content layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,76 layout:mBottom=3,800 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,724 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=1,0 layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=4,true isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ListView@40666588 list:recycleOnMeasure()=4,true getSelectedView()=4,null isFastScrollEnabled()=5,false isScrollingCacheEnabled()=4,true isSmoothScrollbarEnabled()=4,true isStackFromBottom()=5,false isTextFilterEnabled()=5,false scrolling:mFirstPosition=1,0 list:mNextSelectedPosition=2,-1 list:mSelectedPosition=2,-1 list:mItemCount=2,18 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=5,false isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=3,724 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,18483250 mID=7,id/list layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=3,724 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402940417 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,724 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=4,true isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=4,true focus:isFocused()=4,true isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@406c54c0 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,96 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406ff510 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@40704660 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@406af6c8 mText=19,Wireless & networks getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,303 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,303 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,303 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@406c33b8 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@406a44f8 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,97 layout:mBottom=3,193 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406ae108 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@4063a5d8 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@406e1d48 mText=13,Call settings getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,180 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,180 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,180 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@406f0d20 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@406c0f98 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,194 layout:mBottom=3,290 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406eba90 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@40670c00 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@40702d28 mText=20,CyanogenMod settings getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,337 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,337 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,337 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@40720668 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@406f0368 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,291 layout:mBottom=3,387 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406f0b10 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@406f1780 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@40710e30 mText=11,ADWLauncher getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,209 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,209 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,209 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@406b24c0 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@40700580 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,388 layout:mBottom=3,484 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@40702b18 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@4070c698 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@406d83e8 mText=5,Sound getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,92 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=2,92 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,92 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@40672ce8 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@406dc988 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,485 layout:mBottom=3,581 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406e1998 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@4066cce8 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@406715b8 mText=8,Profiles getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,113 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,113 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,113 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@40673968 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@4069f7b0 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,582 layout:mBottom=3,678 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406a3120 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@40680448 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@4067a4f8 mText=7,Display getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,109 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,109 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,109 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@406a5598 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@4063ae20 measurement:mBaselineChildTop=1,0 measurement:mGravity=2,19 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,480 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,15 padding:mPaddingTop=1,0 measurement:mMinHeight=2,96 measurement:mMeasuredWidth=3,480 measurement:mMeasuredHeight=2,96 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=15,id/widget_frame layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=3,679 layout:mBottom=3,775 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=2,15 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,96 list:layout_forceAdd=5,false list:layout_recycledHeaderFooter=5,false list:layout_viewType=21,ITEM_VIEW_TYPE_IGNORE layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,480 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@406f1990 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=2,48 measurement:mMeasuredHeight=2,48 layout:mLeft=1,9 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780336 mID=7,id/icon layout:mRight=2,57 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,24 layout:mBottom=2,72 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653184 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,9 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=2,48 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.RelativeLayout@40701910 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,387 measurement:mMeasuredHeight=2,44 layout:mLeft=2,69 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16780464 mID=5,NO_ID layout:mRight=3,456 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=2,26 layout:mBottom=2,70 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653312 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,9 layout:layout_leftMargin=1,3 layout:layout_rightMargin=1,9 layout:layout_topMargin=1,9 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,387 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@406fdc48 mText=19,Location & security getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=3,283 measurement:mMeasuredHeight=2,44 layout:mLeft=1,0 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=8,id/title layout:mRight=3,283 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=2,44 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402657280 layout:getBaseline()=2,35 getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,44 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=7,VISIBLE layout:getWidth()=3,283 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@40720b90 mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 measurement:mMinHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMeasuredHeight=1,0 layout:mLeft=1,0 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=8,16781312 mID=10,id/summary layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mTop=1,0 layout:mBottom=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingRight=1,0 mViewFlags=9,402653192 layout:getBaseline()=2,-1 getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=8,id/title layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=8,id/title layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT getTag()=4,null getVisibility()=4,GONE layout:getWidth()=1,0 focus:hasFocus()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+DONE.
+DONE
+"""
+
+VIEW_MAP = {'padding:mUserPaddingRight': '12', 'drawing:getSolidColor()': '0', 'getFilterTouchesWhenObscured()': 'false', 'drawing:isOpaque()': 'false', 'mPrivateFlags_DRAWING_CACHE_INVALID': '0x0', 'focus:isFocusable()': 'true', 'mSystemUiVisibility': '0', 'isSoundEffectsEnabled()': 'true', 'layout:layout_width': 'MATCH_PARENT', 'layout:getWidth()': '1140', 'drawing:isDrawingCacheEnabled()': 'false', 'mPrivateFlags_DRAWN': '0x20', 'text:getSelectionEnd()': '-1', 'getTag()': 'null', 'getEllipsize()': 'null', 'focus:hasFocus()': 'false', 'layout:getResolvedLayoutDirection()': 'RESOLVED_DIRECTION_LTR', 'measurement:mMinWidth': '64', 'padding:mUserPaddingEnd': '-1', 'isFocusableInTouchMode()': 'false', 'text:mTextDirection': 'INHERIT', 'isHovered()': 'false', 'layout:layout_leftMargin': '50', 'layout:layout_endMargin': '-2147483648', 'padding:mPaddingBottom': '4', 'measurement:mMeasuredHeight': '48', 'layout:getLayoutDirection()': 'INHERIT', 'layout:mBottom': '364', 'mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE': '0x0', 'layout:layout_startMargin': '-2147483648', 'class': 'android.widget.ToggleButton', 'text:mText': 'Button with ID', 'padding:mPaddingRight': '12', 'mPrivateFlags': '-2130704336', 'layout:layout_bottomMargin': '10', 'layout:layout_height': 'WRAP_CONTENT', 'uniqueId': 'id/button_with_id', 'focus:isFocused()': 'false', 'measurement:mMeasuredWidth': '1140', 'padding:mUserPaddingRelative': 'false', 'text:getSelectionStart()': '-1', 'mViewFlags': '-1744814079', 'isClickable()': 'true', 'getScrollBarStyle()': 'INSIDE_OVERLAY', 'layout:layout_rightMargin': '50', 'padding:mUserPaddingLeft': '12', 'oid': 'b4781818', 'layout:getBaseline()': '29', 'isEnabled()': 'true', 'isChecked()': 'false', 'drawing:mLayerType': 'NONE', 'drawing:willNotDraw()': 'false', 'layout:mRight': '1190', 'drawing:willNotCacheDrawing()': 'false', 'layout:mTop': '316', 'isHapticFeedbackEnabled()': 'true', 'getVisibility()': 'VISIBLE', 'scrolling:mScrollX': '0', 'text:mResolvedTextDirection': 'FIRST_STRONG', 'isInTouchMode()': 'true', 'padding:mPaddingTop': '4', 'layout:layout_weight': '0.0', 'measurement:mMinHeight': '48', 'mID': 'id/button_with_id', 'layout:layout_topMargin': '50', 'padding:mUserPaddingStart': '-1', 'padding:mPaddingLeft': '12', 'isSelected()': 'false', 'isActivated()': 'false', 'padding:mUserPaddingBottom': '4', 'layout:layout_gravity': 'NONE', 'layout:mLeft': '50', 'layout:isLayoutRtl()': 'false', 'layout:getHeight()': '48', 'scrolling:mScrollY': '0'}
+
+VIEW_MAP_API_8 = {'padding:mUserPaddingRight': '12', 'drawing:getSolidColor()': '0', 'getFilterTouchesWhenObscured()': 'false', 'drawing:isOpaque()': 'false', 'mPrivateFlags_DRAWING_CACHE_INVALID': '0x0', 'focus:isFocusable()': 'true', 'mSystemUiVisibility': '0', 'isSoundEffectsEnabled()': 'true', 'layout:layout_width': 'MATCH_PARENT', 'layout:getWidth()': '1140', 'drawing:isDrawingCacheEnabled()': 'false', 'mPrivateFlags_DRAWN': '0x20', 'text:getSelectionEnd()': '-1', 'getTag()': 'null', 'getEllipsize()': 'null', 'focus:hasFocus()': 'false', 'layout:getResolvedLayoutDirection()': 'RESOLVED_DIRECTION_LTR', 'measurement:mMinWidth': '64', 'padding:mUserPaddingEnd': '-1', 'isFocusableInTouchMode()': 'false', 'text:mTextDirection': 'INHERIT', 'isHovered()': 'false', 'layout:layout_leftMargin': '50', 'layout:layout_endMargin': '-2147483648', 'padding:mPaddingBottom': '4', 'measurement:mMeasuredHeight': '48', 'layout:getLayoutDirection()': 'INHERIT', 'layout:mBottom': '364', 'mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE': '0x0', 'layout:layout_startMargin': '-2147483648', 'class': 'android.widget.ToggleButton', 'text:mText': 'Button with ID', 'padding:mPaddingRight': '12', 'mPrivateFlags': '-2130704336', 'layout:layout_bottomMargin': '10', 'layout:layout_height': 'WRAP_CONTENT', 'uniqueId': 'id/button_with_id', 'focus:isFocused()': 'false', 'measurement:mMeasuredWidth': '1140', 'padding:mUserPaddingRelative': 'false', 'text:getSelectionStart()': '-1', 'mViewFlags': '-1744814079', 'isClickable()': 'true', 'getScrollBarStyle()': 'INSIDE_OVERLAY', 'layout:layout_rightMargin': '50', 'padding:mUserPaddingLeft': '12', 'oid': 'b4781818', 'layout:getBaseline()': '29', 'isEnabled()': 'true', 'isChecked()': 'false', 'drawing:mLayerType': 'NONE', 'drawing:willNotDraw()': 'false', 'layout:mRight': '1190', 'drawing:willNotCacheDrawing()': 'false', 'mTop': '316', 'isHapticFeedbackEnabled()': 'true', 'getVisibility()': 'VISIBLE', 'scrolling:mScrollX': '0', 'text:mResolvedTextDirection': 'FIRST_STRONG', 'isInTouchMode()': 'true', 'padding:mPaddingTop': '4', 'layout:layout_weight': '0.0', 'measurement:mMinHeight': '48', 'mID': 'id/button_with_id', 'layout:layout_topMargin': '50', 'padding:mUserPaddingStart': '-1', 'padding:mPaddingLeft': '12', 'isSelected()': 'false', 'isActivated()': 'false', 'padding:mUserPaddingBottom': '4', 'layout:layout_gravity': 'NONE', 'mLeft': '50', 'layout:isLayoutRtl()': 'false', 'layout:getHeight()': '48', 'scrolling:mScrollY': '0'}
+
+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'}
+
+DUMPSYS_WINDOW_PARTIAL = '''
+
+WINDOW MANAGER LAST ANR (dumpsys window lastanr)
+ <no ANR has occurred since boot>
+
+WINDOW MANAGER POLICY STATE (dumpsys window policy)
+ mSafeMode=false mSystemReady=true mSystemBooted=true
+ mLidState=-1 mLidOpenRotation=-1 mHdmiPlugged=false
+ mLastSystemUiFlags=0x400 mResettingSystemUiFlags=0x0 mForceClearedSystemUiFlags=0x0
+ mUiMode=1 mDockMode=0 mCarDockRotation=-1 mDeskDockRotation=-1
+ mUserRotationMode=0 mUserRotation=0 mAllowAllRotations=0
+ mCurrentAppOrientation=5
+ mCarDockEnablesAccelerometer=true mDeskDockEnablesAccelerometer=true
+ mLidKeyboardAccessibility=0 mLidNavigationAccessibility=0 mLidControlsSleep=false
+ mLongPressOnPowerBehavior=-1 mHasSoftInput=true
+ mScreenOnEarly=true mScreenOnFully=true mOrientationSensorEnabled=true
+ mOverscanScreen=(0,0) 768x1280
+ mRestrictedOverscanScreen=(0,0) 768x1184
+ mUnrestrictedScreen=(0,0) 768x1280
+ mRestrictedScreen=(0,0) 768x1184
+ mStableFullscreen=(0,0)-(768,1184)
+ mStable=(0,50)-(768,1184)
+ mSystem=(0,50)-(768,1184)
+
+'''
+
+DUMPSYS_WINDOW_WINDOWS = """
+mock data
+mock data
+"""
+
+DUMPSYS_WINDOW_WINDOWS_SAMPLE_UI = """WINDOW MANAGER WINDOWS (dumpsys window windows)
+ Window #7 Window{b4d250b0 RecentsPanel paused=false}:
+ mSession=Session{b4d254d0 uid 1000} mClient=android.os.BinderProxy@b4c60590
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2014 fl=#820100 fmt=-3 wanim=0x7f0c0008}
+ Requested w=480 h=800 mLayoutSeq=20
+ mBaseLayer=151000 mSubLayer=0 mAnimLayer=151000+0=151000 mLastLayer=0
+ mToken=WindowToken{b4c000b0 token=null}
+ mRootToken=WindowToken{b4c000b0 token=null}
+ mViewVisibility=0x8 mLastHidden=false mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration=null
+ mShownFrame=[0.0,0.0][0.0,0.0]
+ mFrame=[0,0][480,800] last=[0,0][0,0]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[0,0][480,800]
+ mContentFrame=[0,0][480,800] mVisibleFrame=[0,0][480,800]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=false
+ Window #6 Window{b4d27678 StatusBar paused=false}:
+ mSession=Session{b4d254d0 uid 1000} mClient=android.os.BinderProxy@b4d27488
+ mAttrs=WM.LayoutParams{(0,0)(fillx38) gr=#37 sim=#20 ty=2000 fl=#800048 fmt=4 wanim=0x7f0c0009}
+ Requested w=480 h=38 mLayoutSeq=102
+ mBaseLayer=141000 mSubLayer=0 mAnimLayer=141000+0=141000 mLastLayer=141000
+ mSurface=Surface(name=StatusBar, identity=6)
+ Surface: shown=true layer=141000 alpha=1.0 rect=(0.0,0.0) 480.0 x 38.0
+ mToken=WindowToken{b4c000b0 token=null}
+ mRootToken=WindowToken{b4c000b0 token=null}
+ mViewVisibility=0x0 mLastHidden=false mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[0.0,0.0][480.0,38.0]
+ mFrame=[0,0][480,38] last=[0,0][480,38]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[0,0][480,800]
+ mContentFrame=[0,0][480,38] mVisibleFrame=[0,0][480,38]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ Window #5 Window{b4d1bc30 StatusBarExpanded paused=false}:
+ mSession=Session{b4d254d0 uid 1000} mClient=android.os.BinderProxy@b4dca320
+ mAttrs=WM.LayoutParams{(0,-800)(480x762) gr=#37 sim=#10 ty=2017 fl=#811328 pfl=0x8 fmt=-3 wanim=0x1030000}
+ Requested w=480 h=762 mLayoutSeq=102
+ mBaseLayer=131000 mSubLayer=0 mAnimLayer=131005+0=131005 mLastLayer=131005
+ mSurface=Surface(name=StatusBarExpanded, identity=13)
+ Surface: shown=true layer=131005 alpha=1.0 rect=(0.0,-800.0) 480.0 x 762.0
+ mToken=WindowToken{b4c000b0 token=null}
+ mRootToken=WindowToken{b4c000b0 token=null}
+ mViewVisibility=0x0 mLastHidden=false mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[0.0,-800.0][480.0,-38.0]
+ mFrame=[0,-800][480,-38] last=[0,-800][480,-38]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[-10000,-10000][10000,10000]
+ mContentFrame=[0,-800][480,-38] mVisibleFrame=[0,-800][480,-38]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ Window #4 Window{b4d62e40 TrackingView paused=false}:
+ mSession=Session{b4d254d0 uid 1000} mClient=android.os.BinderProxy@b4d62ca8
+ mAttrs=WM.LayoutParams{(0,-800)(fillxfill) gr=#37 sim=#20 ty=2017 fl=#20300 fmt=-3}
+ Requested w=480 h=800 mLayoutSeq=17
+ mBaseLayer=131000 mSubLayer=0 mAnimLayer=131000+0=131000 mLastLayer=0
+ mToken=WindowToken{b4c000b0 token=null}
+ mRootToken=WindowToken{b4c000b0 token=null}
+ mViewVisibility=0x8 mLastHidden=false mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration=null
+ mShownFrame=[0.0,0.0][0.0,0.0]
+ mFrame=[0,-800][480,0] last=[0,0][0,0]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[-10000,-10000][10000,10000]
+ mContentFrame=[0,-800][480,0] mVisibleFrame=[0,-800][480,0]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=false
+ Window #3 Window{b4c01158 Keyguard paused=false}:
+ mSession=Session{b4be1be8 uid 1000} mClient=android.view.ViewRootImpl$W@b4c12f70
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#10 ty=2004 fl=#10120800 pfl=0x8 fmt=-3 wanim=0x10301da or=5}
+ Requested w=480 h=762 mLayoutSeq=32
+ mBaseLayer=111000 mSubLayer=0 mAnimLayer=111000+0=111000 mLastLayer=111000
+ mToken=WindowToken{b4c000b0 token=null}
+ mRootToken=WindowToken{b4c000b0 token=null}
+ mViewVisibility=0x8 mLastHidden=true mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[0.0,38.0][480.0,800.0]
+ mFrame=[0,38][480,800] last=[0,38][480,800]
+ mContainingFrame=[0,38][480,800] mParentFrame=[0,38][480,800] mDisplayFrame=[0,38][480,800]
+ mContentFrame=[0,38][480,800] mVisibleFrame=[0,38][480,800]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mShownAlpha=1.0 mAlpha=1.0 mLastAlpha=0.0
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ Window #2 Window{b4d2a948 com.dtmilano.android.sampleui/com.dtmilano.android.sampleui.MainActivity paused=false}:
+ mSession=Session{b4d3cdf0 uid 10046} mClient=android.os.BinderProxy@b4c09bf0
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#120 ty=1 fl=#1810100 pfl=0x8 wanim=0x1030292}
+ Requested w=480 h=800 mLayoutSeq=102
+ mBaseLayer=21000 mSubLayer=0 mAnimLayer=21010+0=21010 mLastLayer=21010
+ mSurface=Surface(name=com.dtmilano.android.sampleui/com.dtmilano.android.sampleui.MainActivity, identity=28)
+ Surface: shown=true layer=21010 alpha=1.0 rect=(0.0,0.0) 480.0 x 800.0
+ mToken=AppWindowToken{b4d8bf80 token=Token{b4d3ab58 ActivityRecord{b4d3aa20 com.dtmilano.android.sampleui/.MainActivity}}}
+ mRootToken=AppWindowToken{b4d8bf80 token=Token{b4d3ab58 ActivityRecord{b4d3aa20 com.dtmilano.android.sampleui/.MainActivity}}}
+ mAppToken=AppWindowToken{b4d8bf80 token=Token{b4d3ab58 ActivityRecord{b4d3aa20 com.dtmilano.android.sampleui/.MainActivity}}}
+ mViewVisibility=0x0 mLastHidden=false mHaveFrame=true mObscured=false
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[0.0,0.0][480.0,800.0]
+ mFrame=[0,0][480,800] last=[0,0][480,800]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[0,0][480,800]
+ mContentFrame=[0,38][480,800] mVisibleFrame=[0,38][480,800]
+ mContentInsets=[0,38][0,0] last=[0,38][0,0] mVisibleInsets=[0,38][0,0] last=[0,38][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ Window #1 Window{b4d78098 com.android.launcher/com.android.launcher2.Launcher paused=false}:
+ mSession=Session{b4d35180 uid 10012} mClient=android.os.BinderProxy@b4d3b188
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#20 ty=1 fl=#1910100 pfl=0x8 fmt=-2 wanim=0x1030292}
+ Requested w=480 h=800 mLayoutSeq=37
+ mBaseLayer=21000 mSubLayer=0 mAnimLayer=21005+0=21005 mLastLayer=21005
+ mToken=AppWindowToken{b4d14528 token=Token{b4d12ab8 ActivityRecord{b4d12688 com.android.launcher/com.android.launcher2.Launcher}}}
+ mRootToken=AppWindowToken{b4d14528 token=Token{b4d12ab8 ActivityRecord{b4d12688 com.android.launcher/com.android.launcher2.Launcher}}}
+ mAppToken=AppWindowToken{b4d14528 token=Token{b4d12ab8 ActivityRecord{b4d12688 com.android.launcher/com.android.launcher2.Launcher}}}
+ mViewVisibility=0x8 mLastHidden=true mHaveFrame=true mObscured=true
+ mSeq=0 mSystemUiVisibility=0x0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[0.0,0.0][480.0,800.0]
+ mFrame=[0,0][480,800] last=[0,0][480,800]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[0,0][480,800]
+ mContentFrame=[0,38][480,800] mVisibleFrame=[0,38][480,800]
+ mContentInsets=[0,38][0,0] last=[0,38][0,0] mVisibleInsets=[0,38][0,0] last=[0,38][0,0]
+ mShownAlpha=1.0 mAlpha=1.0 mLastAlpha=0.0
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ mWallpaperX=0.5 mWallpaperY=0.5
+ mWallpaperXStep=0.25 mWallpaperYStep=1.0
+ Window #0 Window{b4d2e648 com.android.systemui.ImageWallpaper paused=false}:
+ mSession=Session{b4d254d0 uid 1000} mClient=android.os.BinderProxy@b4d82d48
+ mAttrs=WM.LayoutParams{(0,0)(960x800) gr=#33 ty=2013 fl=#318 fmt=2 wanim=0x10301e4}
+ Requested w=960 h=800 mLayoutSeq=43
+ mIsImWindow=false mIsWallpaper=true mIsFloatingLayer=true mWallpaperVisible=false
+ mBaseLayer=21000 mSubLayer=0 mAnimLayer=21000+0=21000 mLastLayer=21000
+ mSurface=Surface(name=com.android.systemui.ImageWallpaper, identity=8)
+ Surface: shown=false layer=21000 alpha=1.0 rect=(-240.0,0.0) 960.0 x 800.0
+ mToken=WindowToken{b4c64f60 token=android.os.Binder@b4bead18}
+ mRootToken=WindowToken{b4c64f60 token=android.os.Binder@b4bead18}
+ mViewVisibility=0x0 mLastHidden=true mHaveFrame=true mObscured=true
+ mSeq=0 mSystemUiVisibility=0x0
+ Offsets x=-240 y=0
+ mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]
+ mConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mShownFrame=[-240.0,0.0][720.0,800.0]
+ mFrame=[0,0][960,800] last=[0,0][960,800]
+ mContainingFrame=[0,0][480,800] mParentFrame=[0,0][480,800] mDisplayFrame=[-10000,-10000][10000,10000]
+ mContentFrame=[0,0][960,800] mVisibleFrame=[0,0][960,800]
+ mContentInsets=[0,0][0,0] last=[0,0][0,0] mVisibleInsets=[0,0][0,0] last=[0,0][0,0]
+ mDrawPending=false mCommitDrawPending=false mReadyToShow=false mHasDrawn=true
+ mWallpaperX=0.5 mWallpaperY=0.5
+ mWallpaperXStep=0.25 mWallpaperYStep=1.0
+
+ Display: init=480x800 base=480x800 cur=480x800 app=480x800 raw=480x800
+ mCurConfiguration={1.0 310mcc260mnc en_US layoutdir=0 sw320dp w320dp h508dp nrml long port finger qwerty/v/v tball/v s.5}
+ mCurrentFocus=Window{b4d2a948 com.dtmilano.android.sampleui/com.dtmilano.android.sampleui.MainActivity paused=false}
+ mFocusedApp=AppWindowToken{b4d8bf80 token=Token{b4d3ab58 ActivityRecord{b4d3aa20 com.dtmilano.android.sampleui/.MainActivity}}}
+ mInTouchMode=true mLayoutSeq=102
+ mWallpaperTarget=null
+ mLastWallpaperX=0.5 mLastWallpaperY=0.5
+ mWindowAnimationBackgroundSurface:
+ mDimSurface=Surface(name=DimSurface, identity=20)
+ mDimShown=false mLayer=21009 mDimColor=0xff000000
+ mLastDimWidth=480 mLastDimWidth=480
+ mSystemBooted=true mDisplayEnabled=true
+ mLayoutNeeded=false mBlurShown=false
+ mDimAnimator:
+ mDimSurface=Surface(name=DimAnimator, identity=17) 480 x 800
+ mDimShown=true current=0.0 target=0.0 delta=-0.002727273 lastAnimTime=0
+ mDisplayFrozen=false mWindowsFreezingScreen=false mAppsFreezingScreen=0 mWaitingForConfig=false
+ mRotation=0 mAltOrientation=false
+ mLastWindowForcedOrientation-1 mForcedAppOrientation=-1
+ mDeferredRotationPauseCount=0
+ mAnimationPending=false mWindowAnimationScale=1.0 mTransitionWindowAnimationScale=1.0
+ mNextAppTransition=0xffffffff mAppTransitionReady=false
+ mAppTransitionRunning=false mAppTransitionTimeout=false
+ mStartingIconInTransition=false, mSkipAppTransitionAnimation=false
+"""
+
+UIAUTOMATOR_DUMP = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<hierarchy rotation="0">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[0,0][480,800]">
+ <node index="0" text="" class="android.widget.LinearLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[0,0][480,800]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[0,38][480,800]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[0,38][480,800]">
+ <node index="0" text="" class="android.widget.TabHost"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="true"
+ focused="true" scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[0,38][480,800]">
+ <node index="0" text="" class="android.widget.LinearLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false"
+ password="false" selected="false" bounds="[0,38][480,800]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="false"
+ focused="false" scrollable="false" long-clickable="false"
+ password="false" selected="false" bounds="[1,38][479,116]">
+ <node index="0" text="" class="android.widget.TabWidget"
+ package="com.android.launcher" content-desc="" checkable="false"
+ checked="false" clickable="false" enabled="true" focusable="true"
+ focused="false" scrollable="false" long-clickable="false"
+ password="false" selected="false" bounds="[1,38][479,116]">
+ <node index="0" text="Apps" class="android.widget.TextView"
+ package="com.android.launcher" content-desc="Apps" checkable="false"
+ checked="false" clickable="true" enabled="true" focusable="true"
+ focused="false" scrollable="false" long-clickable="false"
+ password="false" selected="true" bounds="[1,38][105,116]" />
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+</hierarchy>
+"""
+
+UIAUTOMATOR_DUMP_API17_CHINESE = '''<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\' ?>
+<hierarchy rotation="0">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false" selected="false"
+ bounds="[0,0][800,1216]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false" selected="false"
+ bounds="[0,33][800,1216]">
+ <node index="0" text="" class="android.view.View" package="android"
+ content-desc="" checkable="false" checked="false" clickable="false"
+ enabled="true" focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="false" bounds="[0,33][800,1216]">
+ <node index="0" text="" class="android.view.View" package="android"
+ content-desc="" checkable="false" checked="false" clickable="false"
+ enabled="true" focusable="false" focused="false" scrollable="true"
+ long-clickable="false" password="false" selected="false" bounds="[0,0][800,1216]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="android"
+ content-desc="\xe7\xa9\xba\xe7\x99\xbd\xe5\xb0\x8f\xe9\x83\xa8\xe4\xbb\xb6\xe3\x80\x82"
+ checkable="false" checked="false" clickable="false" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="true" password="false" selected="false" bounds="[0,66][100,625]" />
+ <node index="1" text="" class="android.widget.FrameLayout"
+ package="android"
+ content-desc="\xe7\x8a\xb6\xe6\x80\x81\xe5\xb0\x8f\xe9\x83\xa8\xe4\xbb\xb6\xe3\x80\x82"
+ checkable="false" checked="false" clickable="false" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="true" password="false" selected="false"
+ bounds="[113,66][686,625]">
+ <node index="0" text="" class="android.widget.GridLayout"
+ package="android" content-desc="\xe7\x8a\xb6\xe6\x80\x81"
+ checkable="false" checked="false" clickable="false" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="false"
+ bounds="[123,76][676,615]">
+ <node index="0" text="" class="android.widget.LinearLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="true" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[123,76][676,351]">
+ <node index="0" text="" class="android.widget.RelativeLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[267,76][609,324]">
+ <node index="0" text="6:40" class="android.widget.TextView"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[267,76][609,324]" />
+ </node>
+ <node index="1" text="" class="android.widget.LinearLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[401,304][676,351]">
+ <node index="0"
+ text="语言"
+ class="android.widget.TextView" package="android"
+ content-desc="" checkable="false" checked="false" clickable="false"
+ enabled="true" focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="true"
+ bounds="[401,304][609,351]" />
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ <node index="1" text="" class="android.widget.FrameLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[120,654][679,1187]">
+ <node index="0" text="" class="android.widget.ViewFlipper"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[120,654][679,1187]">
+ <node index="0" text="" class="android.widget.LinearLayout"
+ package="android"
+ content-desc="\xe6\xbb\x91\xe5\x8a\xa8\xe8\xa7\xa3\xe9\x94\x81\xe3\x80\x82"
+ checkable="false" checked="false" clickable="false" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="false"
+ bounds="[136,670][663,1171]">
+ <node index="0" text="" class="android.widget.FrameLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[136,670][663,1171]">
+ <node index="0" text="" class="android.view.View" package="android"
+ content-desc="\xe6\xbb\x91\xe5\x8a\xa8\xe5\x8c\xba\xe5\x9f\x9f\xe3\x80\x82"
+ checkable="false" checked="false" clickable="false" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="false"
+ bounds="[136,670][663,1171]" />
+ <node index="1"
+ text="\xe6\xad\xa3\xe5\x9c\xa8\xe5\x85\x85\xe7\x94\xb5\xef\xbc\x8c50%"
+ class="android.widget.TextView" package="android" content-desc=""
+ checkable="false" checked="false" clickable="true" enabled="true"
+ focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="true"
+ bounds="[136,670][663,699]" />
+ <node index="2" text="" class="android.widget.LinearLayout"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="true" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="false" bounds="[136,1107][663,1171]">
+ <node index="1" text="ANDROID" class="android.widget.TextView"
+ package="android" content-desc="" checkable="false" checked="false"
+ clickable="false" enabled="true" focusable="false" focused="false"
+ scrollable="false" long-clickable="false" password="false"
+ selected="true" bounds="[355,1124][444,1153]" />
+ </node>
+ <node index="3" text="" class="android.view.View" package="android"
+ content-desc="" checkable="false" checked="false" clickable="false"
+ enabled="true" focusable="false" focused="false" scrollable="false"
+ long-clickable="false" password="false" selected="false"
+ bounds="[157,670][642,1171]" />
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+ </node>
+</hierarchy>
+'''
+
+WINDOWS = {1:'Window1', 2: 'com.example.window', 0xb523d938: 'com.android.launcher', 0xb52f7c88:'StatusBar'}
+
+LIST = '''\
+b522d3f8 com.android.systemui.ImageWallpaper
+b523d938 com.android.launcher/com.android.launcher2.Launcher
+b5339540 com.android.contacts/com.android.contacts.activities.PeopleActivity
+b5252410 com.android.contacts/com.android.contacts.activities.ContactEditorActivity
+b51ea228 InputMethod
+b51da498 Keyguard
+b52f7c88 StatusBar
+b533b2c0 NavigationBar
+b521d218 SearchPanel
+DONE.
+'''
+
+DUMP_STATUSBAR = '''\
+com.android.systemui.statusbar.phone.StatusBarWindowView@b506ea18 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=6,278611 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,800 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653315 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout_horizontalWeight=3,0.0 layout_flags_FLAG_NOT_FOCUSABLE=3,0x8 layout_flags_FLAG_TOUCHABLE_WHEN_WAKING=4,0x40 layout_flags_FLAG_SPLIT_TOUCH=8,0x800000 layout_flags_FLAG_HARDWARE_ACCELERATED=9,0x1000000 layout_flags=8,25165896 layout_type=15,TYPE_STATUS_BAR layout_verticalWeight=3,0.0 layout_x=1,0 layout_y=1,0 layout:layout_height=2,33 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=3,LTR text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,800 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.phone.PhoneStatusBarView@b50702b8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2375763 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_state_mUseColor=9,-16777216 layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,800 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=13,id/status_bar mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,25201968 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653315 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,33 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,800 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b50709a0 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=26,id/notification_lights_out mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b50878b8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,800 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,800 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=22,id/status_bar_contents mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,800 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b5087c00 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,672 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,8 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,684 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=25,id/notification_icon_area mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,692 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=1,0 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,684 drawing:getX()=3,8.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.StatusBarIconView@b5088758 mSlot=4,null layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/moreIcon mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=4,0.65 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=4,0.75 drawing:getScaleY()=4,0.75 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.IconMerger@b508b758 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=2,32 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,672 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=20,id/notificationIcons mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130670416 layout:mRight=3,672 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,672 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.StatusBarIconView@b6257070 mSlot=17,android/0x1040453 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=2,32 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=5,35888 layout:mRight=2,32 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=4,0.65 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,33 layout:layout_width=2,32 drawing:getPivotX()=4,16.0 drawing:getPivotY()=4,16.5 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=4,0.75 drawing:getScaleY()=4,0.75 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,32 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b508bab0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,100 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=3,692 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,100 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=19,id/system_icon_area mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,792 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,100 drawing:getX()=5,692.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b508be00 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/statusIcons mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128606032 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.StatusBarIconView@b50f1dc0 mSlot=12,sync_failing layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b5078b18 mSlot=11,sync_active layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b529cba0 mSlot=9,bluetooth layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b5297d68 mSlot=3,tty layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b5115bd8 mSlot=6,volume layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b529a1d8 mSlot=8,cdma_eri layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.StatusBarIconView@b529e3f8 mSlot=11,alarm_clock layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478496 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b508c150 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity=2,17 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=2,51 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=2,51 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,3 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=25,id/signal_battery_cluster mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=2,51 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,3 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,51 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.SignalClusterView@b508cec0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=2,27 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,3 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,27 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=17,id/signal_cluster mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=2,30 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,28 layout:mTop=1,4 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,27 drawing:getX()=3,3.0 drawing:getY()=3,4.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@b508d3e8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=13,id/wifi_combo mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701152 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653320 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=2,-7 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b508d7b8 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/wifi_signal mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701312 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784256 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.ImageView@b508daa0 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=13,id/wifi_inout mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701312 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.view.View@b508eb00 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=9,id/spacer mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,8 layout:layout_width=1,8 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@b508ed28 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,27 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=2,27 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,24 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,27 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.View@b508f0b0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,8 measurement:mMeasuredWidth=1,8 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703312 layout:mRight=1,8 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,8 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,8 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,8 layout:layout_width=1,8 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=1,8 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@b508f2d0 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,27 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=15,id/mobile_combo mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=2,27 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,24 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=20,3G Phone three bars. getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,27 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b508f650 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,26 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=16,id/mobile_signal mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813104 layout:mRight=2,26 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,24 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,26 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b508f938 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,27 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/mobile_type mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813104 layout:mRight=2,27 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,24 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,27 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b508fc20 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=2,27 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=15,id/mobile_inout mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128606160 layout:mRight=2,27 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,24 layout:mTop=2,24 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=4,27.0 drawing:getY()=4,24.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b508ff08 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/airplane mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b50901f8 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=2,30 measurement:mMeasuredHeight=2,24 measurement:mMeasuredWidth=2,21 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,5 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=10,id/battery mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813104 layout:mRight=2,51 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,28 layout:mTop=1,4 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,5 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=19,Battery 50 percent. getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,24 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,21 drawing:getX()=4,30.0 drawing:getY()=3,4.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.policy.Clock@b50908f0 text:mText=4,6:32 getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,21.0 bg_=4,null layout:mLeft=2,51 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=2,49 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=8,id/clock mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16812080 layout:mRight=3,100 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,25 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,49 drawing:getX()=4,51.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b5091968 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=3,800 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244659 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=5,false drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,33 measurement:mMeasuredWidth=3,800 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=9,id/ticker mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,33 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,800 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageSwitcher@b5091f38 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=4,true drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,8 measurement:mMeasuredHeight=2,32 measurement:mMeasuredWidth=2,32 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=13,id/tickerIcon mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=2,40 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,32 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,32 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,5 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=4,16.0 drawing:getPivotY()=4,16.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=4,0.75 drawing:getScaleY()=4,0.75 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,32 drawing:getX()=3,8.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.AnimatedImageView@b50923b8 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,32 measurement:mMeasuredWidth=2,32 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813104 layout:mRight=2,32 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,32 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784256 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,32 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,32 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.AnimatedImageView@b50926a8 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,32 measurement:mMeasuredWidth=2,32 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130691040 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=2,32 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.TickerView@b5092df8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=4,true drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=2,45 measurement:mMeasuredHeight=2,30 measurement:mMeasuredWidth=3,755 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,13 padding:mPaddingTop=1,3 drawing:mLayerType=4,NONE mID=13,id/tickerText mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16813232 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,30 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=2,13 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,21 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,30 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=1,0 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,755 drawing:getX()=4,45.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b5093350 text:mText=0, getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,19.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,27 measurement:mMeasuredWidth=3,742 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16812080 layout:mRight=3,742 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,30 layout:mTop=1,3 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,21 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,27 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,742 drawing:getX()=3,0.0 drawing:getY()=3,3.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b50937e8 text:mText=0, getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,19.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,27 measurement:mMeasuredWidth=3,742 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594912 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,21 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.PanelHolder@b5093fb8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2245715 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=4,true drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=3,800 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=15,id/panel_holder mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128606032 layout:mRight=3,800 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,33 layout:mTop=2,33 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=2,33 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,800 drawing:getX()=3,0.0 drawing:getY()=4,33.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.phone.NotificationPanelView@b5094cd8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=2,21 measurement:mMeasuredHeight=11,-2147483648 measurement:mMeasuredWidth=10,1073741822 measurement:mMinHeight=3,486 measurement:mMinWidth=1,0 padding:mPaddingBottom=2,21 padding:mPaddingLeft=2,21 padding:mPaddingRight=2,21 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=21,id/notification_panel mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593616 layout:mRight=3,657 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=2,21 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=2,21 padding:mUserPaddingRight=2,21 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653320 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=19,Notification shade. getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,21 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=3,636 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=3,636 drawing:getX()=4,21.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.View@b5099878 layout:mLeft=2,21 measurement:mMeasuredHeight=2,48 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,5 drawing:mLayerType=4,NONE mID=9,id/handle mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130696144 layout:mRight=3,615 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,48 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,48 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=3,594 drawing:getX()=4,21.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Space@b50a3c10 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=2,48 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,32 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b50a3e78 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=2,64 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=2,21 measurement:mMeasuredHeight=2,64 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593776 layout:mRight=3,615 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=2,43 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=4,21.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b50a4430 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=5,false measurement:mOrientation=1,0 measurement:mTotalLength=3,277 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_state_mUseColor=9,-16777216 layout:mLeft=1,0 measurement:mMeasuredHeight=2,64 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=9,id/header mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120205040 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,64 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,64 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,64 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.RelativeLayout@b50a4998 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=2,64 measurement:mMeasuredWidth=3,204 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=2,11 padding:mPaddingRight=2,11 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/datetime mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594672 layout:mRight=3,204 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,64 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=2,11 padding:mUserPaddingRight=2,11 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,64 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,204 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.policy.Clock@b50aa640 text:mText=4,6:32 getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,43.0 bg_=4,null layout:mLeft=2,11 measurement:mMeasuredHeight=2,58 measurement:mMeasuredWidth=2,81 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=8,id/clock mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593904 layout:mRight=2,92 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,61 layout:mTop=1,3 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,58 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=11,false/NO_ID layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=11,false/NO_ID layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=4,true layout:layout_mRules_startOf=11,false/NO_ID layout:layout_mRules_endOf=11,false/NO_ID layout:layout_mRules_alignStart=11,false/NO_ID layout:layout_mRules_alignEnd=11,false/NO_ID layout:layout_mRules_alignParentStart=11,false/NO_ID layout:layout_mRules_alignParentEnd=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=2,11 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,81 drawing:getX()=4,11.0 drawing:getY()=3,3.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.policy.DateView@b50ab028 text:mText=11,Sat, May 11 getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=3,103 measurement:mMeasuredHeight=2,22 measurement:mMeasuredWidth=2,90 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/date mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128598000 layout:mRight=3,193 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,54 layout:mTop=2,32 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,17 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,22 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_mRules_leftOf=11,false/NO_ID layout:layout_mRules_rightOf=8,id/clock layout:layout_mRules_above=11,false/NO_ID layout:layout_mRules_below=11,false/NO_ID layout:layout_mRules_alignBaseline=8,id/clock layout:layout_mRules_alignLeft=11,false/NO_ID layout:layout_mRules_alignTop=11,false/NO_ID layout:layout_mRules_alignRight=11,false/NO_ID layout:layout_mRules_alignBottom=11,false/NO_ID layout:layout_mRules_alignParentLeft=11,false/NO_ID layout:layout_mRules_alignParentTop=11,false/NO_ID layout:layout_mRules_alignParentRight=11,false/NO_ID layout:layout_mRules_alignParentBottom=11,false/NO_ID layout:layout_mRules_center=11,false/NO_ID layout:layout_mRules_centerHorizontal=11,false/NO_ID layout:layout_mRules_centerVertical=11,false/NO_ID layout:layout_mRules_startOf=11,false/NO_ID layout:layout_mRules_endOf=11,false/NO_ID layout:layout_mRules_alignStart=11,false/NO_ID layout:layout_mRules_alignEnd=11,false/NO_ID layout:layout_mRules_alignParentStart=11,false/NO_ID layout:layout_mRules_alignParentEnd=11,false/NO_ID layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,90 drawing:getX()=5,103.0 drawing:getY()=4,32.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Space@b50ab960 bg_=4,null layout:mLeft=3,204 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130695120 layout:mRight=3,521 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,32 layout:mTop=2,32 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,0 layout:layout_width=1,0 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=3,317 drawing:getX()=5,204.0 drawing:getY()=4,32.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b50abbc8 text:mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,15.0 bg_=4,null layout:mLeft=3,521 measurement:mMeasuredHeight=2,27 measurement:mMeasuredWidth=1,6 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,3 padding:mPaddingRight=1,3 padding:mPaddingTop=1,3 drawing:mLayerType=4,NONE mID=20,id/header_debug_info mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130695120 layout:mRight=3,527 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,45 layout:mTop=2,18 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,3 padding:mUserPaddingRight=1,3 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,19 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,27 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=15,CENTER_VERTICAL layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=1,6 drawing:getX()=5,521.0 drawing:getY()=4,18.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b50ac150 layout:getBaseline()=2,-1 layout:mLeft=3,527 measurement:mMeasuredHeight=2,67 measurement:mMeasuredWidth=2,67 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=19,id/clear_all_button mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130704336 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,66 layout:mTop=2,-1 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402800676 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=24,Clear all notifications. getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,67 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,67 layout:layout_width=2,67 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=2,67 drawing:getX()=5,527.0 drawing:getY()=4,-1.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@b5034b58 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=25,id/settings_button_holder mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701152 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653320 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,16 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,67 layout:layout_width=2,67 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b5023fd8 layout:getBaseline()=2,-1 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=18,id/settings_button mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130702336 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402800640 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=15,Quick settings. getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,67 layout:layout_width=2,67 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.ImageView@b506fb28 layout:getBaseline()=2,-1 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=22,id/notification_button mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130702304 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784264 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=14,Notifications. getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,67 layout:layout_width=2,67 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.TextView@b50993f8 text:mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,5 padding:mPaddingLeft=1,5 padding:mPaddingRight=1,5 padding:mPaddingTop=1,5 drawing:mLayerType=4,NONE mID=23,id/emergency_calls_only mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,5 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,5 padding:mUserPaddingRight=1,5 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669576 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@b50351b0 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593776 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,64 layout:mTop=2,64 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=3,0.0 drawing:getY()=4,64.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.ViewStub@b5008050 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=21,id/flip_settings_stub mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478368 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=1,0 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=1,0 mViewFlags=3,136 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=3,LTR text:getRawTextAlignment()=7,INHERIT text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=5,false isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=5,false drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ScrollView@b5006bf0 layout:mFillViewport=5,false drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2375763 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=9,id/scroll mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2127021040 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=7,9043968 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653185 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.policy.NotificationRowLayout@b5005d98 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=3,277 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/latestItems mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593776 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,93 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,93 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@b6252e48 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402686080 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,93 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=7,android text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=4,true isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.View@b6253288 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/top_glow mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128604128 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,4 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.Button@b61f8758 text:mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,24.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=2,64 measurement:mMinWidth=2,85 padding:mPaddingBottom=1,0 padding:mPaddingLeft=2,11 padding:mPaddingRight=2,11 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/veto mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130702304 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=2,11 padding:mUserPaddingRight=2,11 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669577 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=19,Clear notification. getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=2,no accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=4,-106 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=2,64 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.LatestItemView@b61f8ca8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2506835 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=23,FOCUS_BLOCK_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=10,id/content mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669697 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,4 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,4 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.internal.widget.SizeAdaptiveLayout@b61f9138 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/adaptive mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.View@b61f9480 bg_state_mUseColor=9,-16777216 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120215520 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_maxHeight=2,-1 layout:layout_minHeight=2,-1 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.FrameLayout@b61e3008 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=34,id/status_bar_latest_event_content mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120216288 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653320 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_maxHeight=2,85 layout:layout_minHeight=2,85 layout:layout_height=2,85 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b61e3748 layout:getBaseline()=2,-1 bg_state_mUseColor=9,859026917 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/icon mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701312 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402784256 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,85 layout:layout_width=2,85 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=4,true drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b61e3c48 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=2,85 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,0 padding:mPaddingRight=2,11 padding:mPaddingTop=1,3 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=2,11 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=2,11 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,85 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,85 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b61e3fe0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,8 drawing:mLayerType=4,NONE mID=8,id/line1 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,11 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,11 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b61e4490 text:mText=19,Choose input method getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,24.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=8,id/title mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128604160 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.view.ViewStub@b61e57d8 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/time mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478368 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=1,0 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=1,0 mViewFlags=3,136 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=3,LTR text:getRawTextAlignment()=7,INHERIT text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=5,false isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=5,false drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.view.ViewStub@b61e5a18 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/chronometer mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2147478368 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=1,0 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=1,0 mViewFlags=3,136 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=3,LTR text:getRawTextAlignment()=7,INHERIT text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=5,false isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=5,false drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b61e5c58 text:mText=0, getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=8,id/text2 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657288 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=2,-2 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,11 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,11 layout:layout_topMargin=2,-2 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ProgressBar@b61e63e8 progress:getMax()=3,100 progress:getProgress()=1,0 progress:getSecondaryProgress()=1,0 progress:isIndeterminate()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=2,21 measurement:mMinWidth=2,64 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=11,id/progress mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130702304 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,11 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,11 layout:layout_topMargin=1,0 layout:layout_height=2,16 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.LinearLayout@b624d1b8 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388627 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,0 measurement:mTotalLength=1,0 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=8,id/line3 mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701184 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=4,NONE layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,11 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,11 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b624d558 text:mText=38,English (US) - Android keyboard (AOSP) getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,19.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/text mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128604160 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,1.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=1,0 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b624dbd0 text:mText=0, getEllipsize()=3,END text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=2,11 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=7,id/info mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130701312 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=2,11 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=2,11 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.ImageView@b624e080 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=13,id/right_icon mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653192 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=2,11 layout:layout_rightMargin=1,0 layout:layout_startMargin=2,11 layout:layout_topMargin=1,0 layout:layout_height=2,21 layout:layout_width=2,21 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.view.View@b61fa1b8 layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=14,id/bottom_glow mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128604128 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=1,4 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b61fa530 text:mText=0, getEllipsize()=4,null text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,12.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,3 padding:mPaddingRight=1,3 padding:mPaddingTop=1,3 drawing:mLayerType=4,NONE mID=13,id/debug_info mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130701280 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,3 padding:mUserPaddingRight=1,3 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.SettingsPanelView@b506aff8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags_PADDING_NOT_NULL=4,0x20 mGroupFlags=7,2244723 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=3,143 measurement:mMeasuredHeight=11,-2147483648 measurement:mMeasuredWidth=10,1073741822 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=2,21 padding:mPaddingLeft=2,21 padding:mPaddingRight=2,21 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=17,id/settings_panel mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593616 layout:mRight=3,779 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=2,21 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=2,21 padding:mUserPaddingRight=2,21 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653352 drawing:getAlpha()=3,0.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=15,Quick settings. getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=2,21 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=3,636 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=3,636 drawing:getX()=5,143.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=5,false focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.phone.QuickSettingsScrollView@b5007d38 layout:mFillViewport=5,false drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2375763 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=23,FOCUS_AFTER_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=2,21 measurement:mMeasuredHeight=3,505 measurement:mMeasuredWidth=2,43 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2127021040 layout:mRight=3,615 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653697 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=2,43 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=4,21.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=4,true isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsContainerView@b50075c8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=3,505 measurement:mMeasuredWidth=2,43 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=27,id/quick_settings_container mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593776 layout:mRight=3,594 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=7,1572864 layout:mBottom=3,505 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,505 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,594 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b5119340 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120210160 layout:mRight=3,195 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=11,User Owner. getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.FrameLayout@b512b5c8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128597872 layout:mRight=3,195 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b512ba10 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=17,id/user_imageview mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128598000 layout:mRight=3,195 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,MATCH_PARENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b509c250 text:mText=5,Owner getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_state_mUseColor=10,-872415232 layout:mLeft=1,0 measurement:mMeasuredHeight=2,25 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=16,id/user_textview mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128599024 layout:mRight=3,195 scrolling:mScrollX=6,524199 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=3,140 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,17 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=5,140.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50ae1f0 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=3,200 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120206064 layout:mRight=3,395 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=5,200.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b509a950 text:mText=10,Brightness getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=2,41 measurement:mMeasuredHeight=2,84 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=22,id/brightness_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594928 layout:mRight=3,154 scrolling:mScrollX=6,524240 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,124 layout:mTop=2,40 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,84 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,113 drawing:getX()=4,41.0 drawing:getY()=4,40.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b509c5e8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=3,400 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120206064 layout:mRight=3,595 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,165 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=5,400.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b5091158 text:mText=8,Settings getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=2,51 measurement:mMeasuredHeight=2,84 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=20,id/settings_tileview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594928 layout:mRight=3,143 scrolling:mScrollX=6,524250 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,124 layout:mTop=2,40 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,84 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,92 drawing:getX()=4,51.0 drawing:getY()=4,40.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50bcfa8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120210160 layout:mRight=3,195 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,335 layout:mTop=3,170 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=11,Wifi off.. getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=5,170.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50cb510 text:mText=9,Wi-Fi Off getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=2,53 measurement:mMeasuredHeight=2,84 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=16,id/wifi_textview mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128599024 layout:mRight=3,142 scrolling:mScrollX=6,524252 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,124 layout:mTop=2,40 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,76 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,84 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,89 drawing:getX()=4,53.0 drawing:getY()=4,40.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50a1250 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=3,200 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120206064 layout:mRight=3,395 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,335 layout:mTop=3,170 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=5,200.0 drawing:getY()=5,170.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50cb7b0 text:mText=11,Auto Rotate getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=2,37 measurement:mMeasuredHeight=2,84 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=25,id/rotation_lock_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594928 layout:mRight=3,157 scrolling:mScrollX=6,524236 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,124 layout:mTop=2,40 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,84 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,120 drawing:getX()=4,37.0 drawing:getY()=4,40.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50a06b8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=3,400 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=8,16777227 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120206064 layout:mRight=3,595 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,335 layout:mTop=3,170 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=22,Battery Charging, 50%. getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=5,400.0 drawing:getY()=5,170.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.LinearLayout@b509f5f0 measurement:mBaselineChildTop=1,0 measurement:mGravity_NONE=3,0x0 measurement:mGravity_TOP=4,0x30 measurement:mGravity_LEFT=3,0x3 measurement:mGravity_START=8,0x800003 measurement:mGravity_CENTER_VERTICAL=4,0x10 measurement:mGravity_CENTER_HORIZONTAL=3,0x1 measurement:mGravity_CENTER=4,0x11 measurement:mGravity_RELATIVE=8,0x800000 measurement:mGravity=7,8388659 layout:mBaselineAlignedChildIndex=2,-1 layout:mBaselineAligned=4,true measurement:mOrientation=1,1 measurement:mTotalLength=2,81 layout:mUseLargestChild=5,false layout:mWeightSum=4,-1.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=2,31 measurement:mMeasuredHeight=2,81 measurement:mMeasuredWidth=8,16777227 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128593776 layout:mRight=3,163 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,123 layout:mTop=2,42 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653312 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,81 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,132 drawing:getX()=4,31.0 drawing:getY()=4,42.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.ImageView@b509ed78 layout:getBaseline()=2,-1 bg_=4,null layout:mLeft=2,44 measurement:mMeasuredHeight=2,56 measurement:mMeasuredWidth=8,16777227 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=2,13 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=16,id/battery_image mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128598000 layout:mRight=2,87 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,56 layout:mTop=1,0 padding:mUserPaddingBottom=2,13 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653184 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,56 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=2,43 drawing:getX()=4,44.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.widget.TextView@b50d3720 text:mText=13,Charging, 50% getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=2,25 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=19,id/battery_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128594928 layout:mRight=3,132 scrolling:mScrollX=6,524230 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,81 layout:mTop=2,56 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,25 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_gravity=6,CENTER layout:layout_weight=3,0.0 layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,132 drawing:getX()=3,0.0 drawing:getY()=4,56.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b509f938 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=3,165 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120210160 layout:mRight=3,195 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,505 layout:mTop=3,340 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669696 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=19,Airplane Mode Off.. getFilterTouchesWhenObscured()=5,false layout:getHeight()=3,165 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=2,11 drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,195 drawing:getX()=3,0.0 drawing:getY()=5,340.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50d39c0 text:mText=13,Airplane mode getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=2,28 measurement:mMeasuredHeight=2,84 measurement:mMeasuredWidth=2,11 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=25,id/airplane_mode_textview mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2128599024 layout:mRight=3,167 scrolling:mScrollX=6,524227 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=3,124 layout:mTop=2,40 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,76 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,84 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=3,139 drawing:getX()=4,28.0 drawing:getY()=4,40.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b509ffb0 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120216288 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669704 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=15,Alarm set for . getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50e5da8 text:mText=0, getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=17,id/alarm_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130702336 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50a09a8 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120216288 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669704 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50e6048 text:mText=0, getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=20,id/location_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130702336 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b509fc70 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120216288 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669704 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50f7730 text:mText=16,Wireless Display getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=24,id/wifi_display_textview mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130702336 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ com.android.systemui.statusbar.phone.QuickSettingsTileView@b50a0328 drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0 padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0 drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false drawing:mForegroundGravity=3,119 events:mLastTouchDownX=3,0.0 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags_DIRTY=8,0x200000 mPrivateFlags=11,-2120216288 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402669704 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=3,165 layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=4,GONE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=4,true drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=4,true isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=4,true
+ android.widget.TextView@b50f79d0 text:mText=15,Take bug report getEllipsize()=7,MARQUEE text:getSelectionEnd()=2,-1 text:getSelectionStart()=2,-1 text:getTextSize()=4,16.0 bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=1,0 measurement:mMeasuredWidth=1,0 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,3 padding:mPaddingLeft=1,8 padding:mPaddingRight=1,8 padding:mPaddingTop=1,0 drawing:mLayerType=4,NONE mID=5,NO_ID mPrivateFlags_FORCE_LAYOUT=6,0x1000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_NOT_DRAWN=3,0x0 mPrivateFlags=11,-2130702336 layout:mRight=1,0 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=1,0 layout:mTop=1,0 padding:mUserPaddingBottom=1,3 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,8 padding:mUserPaddingRight=1,8 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402657280 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=1,0 accessibility:getImportantForAccessibility()=3,yes accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=12,WRAP_CONTENT layout:layout_width=12,WRAP_CONTENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=7,VISIBLE layout:getWidth()=1,0 drawing:getX()=3,0.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+ android.view.View@b506f8f0 layout:mLeft=2,21 measurement:mMeasuredHeight=2,48 measurement:mMeasuredWidth=2,43 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,5 drawing:mLayerType=4,NONE mID=9,id/handle mPrivateFlags_LAYOUT_REQUIRED=6,0x2000 mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130696144 layout:mRight=3,615 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 mSystemUiVisibility_SYSTEM_UI_FLAG_VISIBLE=3,0x0 mSystemUiVisibility=1,0 layout:mBottom=2,48 layout:mTop=1,0 padding:mUserPaddingBottom=1,0 padding:mUserPaddingEnd=11,-2147483648 padding:mUserPaddingLeft=1,0 padding:mUserPaddingRight=1,0 padding:mUserPaddingStart=11,-2147483648 mViewFlags=9,402653188 drawing:getAlpha()=3,1.0 layout:getBaseline()=2,-1 accessibility:getContentDescription()=4,null getFilterTouchesWhenObscured()=5,false layout:getHeight()=2,48 accessibility:getImportantForAccessibility()=4,auto accessibility:getLabelFor()=2,-1 layout:getLayoutDirection()=22,RESOLVED_DIRECTION_LTR layout:layout_bottomMargin=1,0 layout:layout_endMargin=11,-2147483648 layout:layout_leftMargin=1,0 layout:layout_rightMargin=1,0 layout:layout_startMargin=11,-2147483648 layout:layout_topMargin=1,0 layout:layout_height=2,48 layout:layout_width=12,MATCH_PARENT drawing:getPivotX()=3,0.0 drawing:getPivotY()=3,0.0 layout:getRawLayoutDirection()=7,INHERIT text:getRawTextAlignment()=7,GRAVITY text:getRawTextDirection()=7,INHERIT drawing:getRotation()=3,0.0 drawing:getRotationX()=3,0.0 drawing:getRotationY()=3,0.0 drawing:getScaleX()=3,1.0 drawing:getScaleY()=3,1.0 getScrollBarStyle()=14,INSIDE_OVERLAY drawing:getSolidColor()=1,0 getTag()=4,null text:getTextAlignment()=7,GRAVITY drawing:getTranslationX()=3,0.0 drawing:getTranslationY()=3,0.0 getVisibility()=9,INVISIBLE layout:getWidth()=3,594 drawing:getX()=4,21.0 drawing:getY()=3,0.0 focus:hasFocus()=5,false layout:hasTransientState()=5,false isActivated()=5,false isClickable()=5,false drawing:isDrawingCacheEnabled()=5,false isEnabled()=4,true focus:isFocusable()=5,false isFocusableInTouchMode()=5,false focus:isFocused()=5,false isHapticFeedbackEnabled()=4,true isHovered()=5,false isInTouchMode()=4,true layout:isLayoutRtl()=5,false drawing:isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true drawing:willNotCacheDrawing()=5,false drawing:willNotDraw()=5,false
+DONE.
+DONE
+'''
+
+RUNNING = 1
+STOPPED = 0
+
+class MockDevice(object):
+ '''
+ Mocks an Android device
+ '''
+
+
+ def __init__(self, serialno="MOCK12345678", version=15, startviewserver=False, uiautomatorkilled=False, language='en'):
+ '''
+ Constructor
+ '''
+
+ self.serialno = serialno
+ self.version = version
+ self.service = STOPPED
+ self.viewServer = "WHAT?"
+ if startviewserver:
+ if DEBUG:
+ print >> sys.stderr, "\n**** Starting ViewServer... ****", self
+ self.viewServer = MockViewServer()
+ else:
+ self.viewServer = None
+ self.uiAutomatorKilled = uiautomatorkilled
+ self.language = language
+ self.uiAutomatorDump = {}
+ self.uiAutomatorDump['en'] = UIAUTOMATOR_DUMP
+ # FIXME: MockDevice could not be API17
+ self.uiAutomatorDump['zh'] = UIAUTOMATOR_DUMP_API17_CHINESE
+
+# def __del__(self):
+# self.shutdownMockViewServer()
+
+ def shell(self, cmd):
+ if cmd == 'service call window 3':
+ return FALSE_PARCEL
+ elif re.compile('service call window 1 i32 \d+').match(cmd):
+ self.service = RUNNING
+ return TRUE_PARCEL
+ elif re.compile('service call window 2').match(cmd):
+ self.service = STOPPED
+ return TRUE_PARCEL
+ elif cmd == 'dumpsys window':
+ return DUMPSYS_WINDOW_PARTIAL
+ elif cmd == 'dumpsys window windows':
+ return DUMPSYS_WINDOW_WINDOWS
+
+ m = re.match('uiautomator dump +(\S+)', cmd)
+ if m:
+ if self.version >= 16:
+ # it was simulating a dump to sdcard before
+ #return 'dumped %s' % m.group(1)
+ if not self.uiAutomatorKilled:
+ return self.uiAutomatorDump[self.language]
+ else:
+ return self.uiAutomatorDump[self.language] + "Killed\r\n"
+ else:
+ return "uiautomator: command not found"
+
+ m = re.match('cat (\S+) .*', cmd)
+ if m:
+ return self.uiAutomatorDump[self.language]
+
+ def getProperty(self, property):
+ if property == 'ro.serialno':
+ return self.serialno
+ elif property == 'build.version.sdk' or property == 'ro.build.version.sdk':
+ return self.version
+ elif property == 'display.width':
+ return 768
+ elif property == 'display.height':
+ return 1184
+ return None
+
+ def shutdownMockViewServer(self):
+ if DEBUG:
+ print >> sys.stderr, "MockDevice.shutdownMockViewServer()", self,
+ try:
+ print >> sys.stderr, "viewServer=", self.viewServer
+ except:
+ print >> sys.stderr, "NO VIEWSERVER !!!!", dir(self)
+ if self.viewServer:
+ if DEBUG:
+ print >> sys.stderr, " shutdownMockViewServer: shutting down ViewServer"
+ self.viewServer.shutdown()
+ #del(self.viewServer)
+
+import sys
+import time
+import select
+#from select import cpython_compatible_select as select
+import threading
+import socket
+import SocketServer
+
+
+class MockViewServer():
+ HOST, PORT = "localhost", 4939
+
+ class MockViewServerHandler(SocketServer.BaseRequestHandler):
+ def handle(self):
+ if DEBUG:
+ print >>sys.stderr, "MockViewServerHandler: handling request (self=%s)" % self
+ # self.request is the TCP socket connected to the client
+ self.data = self.request.recv(1024).strip()
+ if DEBUG:
+ print >>sys.stderr, "MockViewServerHandler: data='%s'" % self.data
+ if self.data == 'SHUTDOWN':
+ self.running = False
+ return
+ elif self.data.lower() == 'dump -1':
+ self.request.sendall(DUMP)
+ elif self.data.lower() == 'list':
+ self.request.sendall(LIST)
+ elif self.data.lower() == 'dump b52f7c88':
+ self.request.sendall(DUMP_STATUSBAR)
+ else:
+ raise Exception("MockViewServerHandler: unknown command '%s'" % self.data)
+ #print "{} wrote:".format(self.client_address[0])
+
+ class ServerThread(threading.Thread):
+ def __init__(self, server):
+ super(MockViewServer.ServerThread, self).__init__()
+ self.server = server
+ self.running = True
+ self.pollInterval = 1
+
+ def run(self):
+ if DEBUG:
+ print >> sys.stderr, "ServerThread: serving running=", self.running
+ # In 2.5 serve_forever() never exits and there's no way of stopping the server
+ #self.server.serve_forever(self.pollInterval)
+ while self.running:
+ if DEBUG:
+ print >> sys.stderr, "ServerThread: polling (self=%s)" % self
+ r, w, e = select.select([self.server], [], [], self.pollInterval)
+ if r:
+ if self.server:
+ try:
+ self.server.handle_request()
+ except:
+ print >> sys.stderr, "ServerThread: the socket may have been closed"
+
+
+ def __init__(self, host=HOST, port=PORT):
+ # Create the server, binding to localhost on port
+ if DEBUG:
+ print >>sys.stderr, "MockViewServer: starting server on host=%s port=%s" % (host, port)
+ self.server = SocketServer.TCPServer((host, port), MockViewServer.MockViewServerHandler)
+ self.server.socket.setblocking(0)
+ self.host = host
+ self.port = port
+ # In 2.5 serve_forever() never exits and there's no way of stopping the server
+ #self.server.serve_forever(1)
+ #print >> sys.stderr, "MockViewServer: NEVER REACHED on Linux"
+ # Activate the server; this will keep running until you shutdown
+ self.serverThread = MockViewServer.ServerThread(self.server)
+ self.serverThread.start()
+
+ def shutdown(self):
+ if DEBUG:
+ print >> sys.stderr, "**** MockViewServer.shutdown() ****"
+ try:
+ self.server.socket.shutdown(socket.SHUT_RDWR)
+ #if DEBUG:
+ # print >> sys.stderr, " shutdown: shutting down the server, serve_forever() should exit"
+ #self.server.shutdown()
+ if DEBUG:
+ print >> sys.stderr, " shutdown: DONE"
+ except Exception, ex:
+ print >> sys.stderr, "ERROR", ex
+ pass
+ self.serverThread.running = False
+ #self.server.socket.shutdown(socket.SHUT_RDWR)
+ self.server.socket.close()
+# del(self.server.socket)
+ #del(self.server)
+ time.sleep(120)
+ time.sleep(5)
+
diff --git a/AndroidViewClient/tests/com/dtmilano/android/uiautomator/__init__.py b/AndroidViewClient/tests/com/dtmilano/android/uiautomator/__init__.py
new file mode 100755
index 0000000..d9b1a4e
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/uiautomator/__init__.py
@@ -0,0 +1 @@
+__author__ = 'diego'
diff --git a/AndroidViewClient/tests/com/dtmilano/android/uiautomator/uiautomatorhelpertests.py b/AndroidViewClient/tests/com/dtmilano/android/uiautomator/uiautomatorhelpertests.py
new file mode 100755
index 0000000..207ef3f
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/uiautomator/uiautomatorhelpertests.py
@@ -0,0 +1,81 @@
+#! /usr/bin/env python
+from PIL import Image
+import random
+import sys
+import os
+import time
+import cStringIO
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+
+from com.dtmilano.android.viewclient import ViewClient
+from com.dtmilano.android.uiautomator.uiautomatorhelper import UiAutomatorHelper
+
+__author__ = 'diego'
+
+import unittest
+
+
+DEBUG = False
+
+class UiAutomatorHelperTests(unittest.TestCase):
+ def setUp(self):
+ if DEBUG:
+ print >> sys.stderr, "@@@ UiAutomatorHelperTests.setUp"
+ (self.device, self.serialno) = ViewClient.connectToDeviceOrExit(serialno='.*')
+ self.assertIsNotNone(self.device)
+ self.uiAutomatorHelper = UiAutomatorHelper(self.device)
+
+ def tearDown(self):
+ if DEBUG:
+ print >> sys.stderr, "@@@ UiAutomatorHelperTests.tearDown"
+ self.uiAutomatorHelper.quit()
+
+ def testDumpWindowHierarchy(self):
+ dump = self.uiAutomatorHelper.dumpWindowHierarchy()
+ self.assertIsNotNone(dump)
+
+ def testDumpWindowHierarchy_repeat(self):
+ for _ in range(10):
+ dump = self.uiAutomatorHelper.dumpWindowHierarchy()
+ self.assertIsNotNone(dump)
+
+ def testPressKeyCode(self):
+ response = self.uiAutomatorHelper.pressKeyCode(4)
+ '''4 is KEYCODE_BACK'''
+ if DEBUG:
+ print >> sys.stderr, "response=", response
+
+ def testTakeScreenshot(self):
+ buf = self.uiAutomatorHelper.takeScreenshot()
+ self.assertIsNotNone(buf)
+ self.assertTrue(len(buf) > 0)
+ image = Image.open(cStringIO.StringIO(buf))
+ self.assertIsNotNone(image)
+ self.assertEqual(image.format, 'PNG')
+
+ def testClick_random(self):
+ x = random.randint(0, 1000)
+ y = random.randint(0, 1000)
+ response = self.uiAutomatorHelper.click(x=x, y=y)
+ if DEBUG:
+ print >> sys.stderr, "response=", response
+
+ def testSwipe_random(self):
+ x0 = random.randint(0, 1000)
+ y0 = random.randint(0, 1000)
+ x1 = random.randint(0, 1000)
+ y1 = random.randint(0, 1000)
+ steps = random.randint(10, 100)
+ response = self.uiAutomatorHelper.swipe(startX=x0, startY=y0, endX=x1, endY=y1, steps=steps)
+ if DEBUG:
+ print >> sys.stderr, "response=", response
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/AndroidViewClient/tests/com/dtmilano/android/viewclient-with-real-devices-connected.py b/AndroidViewClient/tests/com/dtmilano/android/viewclient-with-real-devices-connected.py
new file mode 100755
index 0000000..eef6d6f
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/viewclient-with-real-devices-connected.py
@@ -0,0 +1,98 @@
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 5, 2012
+
+@author: diego
+'''
+
+import sys
+import os
+import unittest
+
+# PyDev sets PYTHONPATH, use it
+for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import View, TextView, EditText, ViewClient
+
+
+
+class ViewClientTest(unittest.TestCase):
+
+ serialno1 = 'emulator-5554'
+ device1 = None
+ serialno2 = 'emulator-5556'
+ device2 = None
+
+ @classmethod
+ def setUpClass(cls):
+ '''
+ Set ups the class.
+
+ The preconditions to run this test is to have at least 2 emulators running:
+ - emulator-5554
+ - emulator-5556
+ '''
+ sys.argv = ['testViewClient_localPort_remotePort', serialno1]
+ cls.device1, cls.serialno1 = ViewClient.connectToDeviceOrExit(timeout=30)
+
+ sys.argv = ['testViewClient_localPort_remotePort', serialno2]
+ cls.device2, cls.serialno2 = ViewClient.connectToDeviceOrExit(timeout=30)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ @classmethod
+ def tearDownClass(cls):
+ pass
+
+ def testConnectToDeviceOrExit_none(self):
+ sys.argv = [ 'VIEWCLIENT']
+ device, serialno = ViewClient.connectToDeviceOrExit()
+ self.assertNotEquals(None, device)
+ self.assertNotEquals(None, serialno)
+
+ def testConnectToDeviceOrExit_emulator_5556(self):
+ sys.argv = [ 'VIEWCLIENT', 'emulator-5556']
+ device, serialno = ViewClient.connectToDeviceOrExit()
+ self.assertNotEquals(None, device)
+ self.assertNotEquals(None, serialno)
+
+# @unittest.skip("until multiple devices could be connected")
+# def testViewClient_localPort_remotePort(self):
+# serialno = 'emulator-5554'
+# sys.argv = ['testViewClient_localPort_remotePort', serialno]
+# device, serialno = ViewClient.connectToDeviceOrExit(timeout=30)
+# localPort = 9005
+# remotePort = 9006
+# vc = ViewClient(device=device, serialno=serialno, localport=localPort, remoteport=remotePort, autodump=True)
+# self.assertTrue(vc.getRoot() != None)
+
+ def testViewClient_oneDevice_TwoViewClients(self):
+ localPort1 = 9005
+ remotePort1 = 9006
+ print "Conencting to", remotePort1
+ vc1 = ViewClient(device=ViewClientTest.device1, serialno=ViewClientTest.serialno1,
+ localport=localPort1, remoteport=remotePort1, autodump=True)
+ self.assertTrue(vc1.getRoot() != None)
+ vc1.traverse()
+
+ localPort2 = 9007
+ remotePort2 = 9008
+ print "Conencting to", remotePort2
+ vc2 = ViewClient(device=ViewClientTest.device2, serialno=ViewClientTest.serialno2,
+ localport=localPort2, remoteport=remotePort2, autodump=True)
+ self.assertTrue(vc2.getRoot() != None)
+ vc2.traverse()
+
+if __name__ == "__main__":
+ #import sys;sys.argv = ['', 'Test.testName']
+ unittest.main()
diff --git a/AndroidViewClient/tests/com/dtmilano/android/viewclientconnected.py b/AndroidViewClient/tests/com/dtmilano/android/viewclientconnected.py
new file mode 100755
index 0000000..fbd2025
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/viewclientconnected.py
@@ -0,0 +1,129 @@
+'''
+Created on 2012-10-25
+
+@author: diego
+'''
+
+import sys
+import os
+import unittest
+
+
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import *
+from mocks import MockDevice
+
+VERBOSE = True
+
+# NOTE:
+# Because there's no way of disconnect a MonkeyDevice and there's no
+# either the alternative of connecting twice from the same script
+# this is the only alternative
+SERIALNO = '1.*' # 'emulator-5554'
+#sys.argv = ['ViewClientConnectedTest', SERIALNO]
+#device, serialno = ViewClient.connectToDeviceOrExit(verbose=VERBOSE, serialno=SERIALNO)
+
+class ViewClientConnectedTest(unittest.TestCase):
+
+ def setUp(self):
+ device, serialno = ViewClient.connectToDeviceOrExit(serialno=SERIALNO)
+ self.device = device
+ self.serialno = serialno
+
+
+ def tearDown(self):
+ # WARNING:
+ # There's no way of disconnect the device
+ pass
+
+ @unittest.skip("icannot connect adb to mock device")
+ def testInit_adbNone(self):
+ device = MockDevice()
+ vc = ViewClient(device, serialno=device.serialno, adb=None, autodump=False)
+ self.assertNotEqual(None, vc)
+
+ def testAutodumpVsDump(self):
+ vc = ViewClient(self.device, self.serialno, forceviewserveruse=True)
+ ids = vc.getViewIds()
+ views = vc.dump()
+ self.assertEquals(len(ids), len(views))
+
+ def testNewViewClientInstancesDontDuplicateTreeConnected(self):
+ vc = {}
+ n = {}
+ m = {}
+ d = {}
+
+ for i in range(10):
+ vc[i] = ViewClient(self.device, self.serialno, forceviewserveruse=True)
+ n[i] = len(vc[i].getViewIds())
+ m[i] = len(vc[i].dump())
+ d[i] = len(vc[i].getViewIds())
+ if VERBOSE:
+ print "Pass %d: Found %d views and %d after dump with %d view Ids" % \
+ (i, n[i], m[i], d[i])
+
+ for i in range(1, 10):
+ self.assertEquals(n[0], n[i])
+ self.assertEquals(n[0], m[i])
+ self.assertEquals(n[0], d[i])
+
+ def testViewClientBackendsConsistency(self):
+ kwargs1 = {'verbose': True, 'ignoresecuredevice': False, 'ignoreversioncheck': False}
+
+ kwargs2 = {'forceviewserveruse': False, 'startviewserver': True, 'autodump': False, 'ignoreuiautomatorkilled': True}
+ device1, serialno1 = ViewClient.connectToDeviceOrExit(serialno=SERIALNO, **kwargs1)
+ vc1 = ViewClient(device1, serialno1, **kwargs2)
+ self.assertTrue(vc1.useUiAutomator)
+
+ kwargs2['forceviewserveruse'] = True
+ device2, serialno2 = ViewClient.connectToDeviceOrExit(serialno=SERIALNO, **kwargs1)
+ vc2 = ViewClient(device1, serialno1, **kwargs2)
+ self.assertFalse(vc2.useUiAutomator)
+
+ # UiAutomator
+ dump1 = vc1.dump(-1)
+ # ViewServer
+ dump2 = vc2.dump(-1)
+
+ # Can't do this, v2 usually has much more views than v1
+ #self.assertEqual(len(dump1), len(dump2), "Different number of views (%d != %d)" % (len(dump1), len(dump2)))
+
+ found = False
+ for v2 in dump2:
+ for v1 in dump1:
+ # At least, let's verify that all unique Ids from dump2 (smaller) are in dump1 (bigger)
+ if v2.getUniqueId() == v1.getUniqueId():
+ found = True
+ break
+ self.assertTrue(found)
+
+ missing = ''
+ # The smallest
+ for v2 in dump2:
+ coords = v2.getCoords()
+ found = False
+ for v1 in dump1:
+ msg = "Comparing %s{%s} and %s{%s}" % (v1.getClass(), v1.getId(), v2.getClass(), v2.getId())
+ if coords == v1.getCoords():
+ found = True
+ break
+ if not found:
+ missing += "Couldn't find view with coords=%s in dump1\n" % (str(v2.getCoords()))
+ self.assertEqual('', missing, missing)
+
+if __name__ == "__main__":
+ #import sys;sys.argv = ['', 'Test.testName']
+ unittest.main()
diff --git a/AndroidViewClient/tests/com/dtmilano/android/viewclienttests.py b/AndroidViewClient/tests/com/dtmilano/android/viewclienttests.py
new file mode 100755
index 0000000..633bba9
--- /dev/null
+++ b/AndroidViewClient/tests/com/dtmilano/android/viewclienttests.py
@@ -0,0 +1,1098 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2012 Diego Torres Milano
+Created on Feb 5, 2012
+
+@author: diego
+'''
+
+import sys
+import os
+import time
+import StringIO
+import unittest
+import exceptions
+import platform
+
+# PyDev sets PYTHONPATH, use it
+try:
+ for p in os.environ['PYTHONPATH'].split(':'):
+ if not p in sys.path:
+ sys.path.append(p)
+except:
+ pass
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import *
+from mocks import MockDevice, MockViewServer
+from mocks import DUMP, DUMP_SAMPLE_UI, VIEW_MAP, VIEW_MAP_API_8, VIEW_MAP_API_17, RUNNING, STOPPED, WINDOWS
+
+os_name = platform.system()
+if os_name.startswith('Linux'):
+ TRUE = '/bin/true'
+else:
+ TRUE = '/usr/bin/true'
+
+class ViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.view = View(VIEW_MAP, None, -1)
+
+ def tearDown(self):
+ try:
+ del os.environ['ANDROID_SERIAL']
+ except:
+ pass
+
+ def testViewFactory_View(self):
+ attrs = {'class': 'android.widget.AnyView', 'text:mText': 'Button with ID'}
+ view = View.factory(attrs, None, -1)
+ self.assertTrue(isinstance(view, View))
+
+ def testViewFactory_TextView(self):
+ attrs = {'class': 'android.widget.TextView', 'text:mText': 'Button with ID'}
+ view = View.factory(attrs, None, -1)
+ self.assertTrue(isinstance(view, TextView))
+
+ def testViewFactory_TextView(self):
+ attrs = {'class': 'android.widget.EditText', 'text:mText': 'Button with ID'}
+ view = View.factory(attrs, None, -1)
+ self.assertTrue(isinstance(view, EditText))
+
+ def testView_notSpecifiedSdkVersion(self):
+ device = MockDevice()
+ view = View(VIEW_MAP, device, -1)
+ self.assertEqual(device.version, view.build[VERSION_SDK_PROPERTY])
+
+ def testView_specifiedSdkVersion_8(self):
+ view = View(VIEW_MAP_API_8, MockDevice(), 8)
+ self.assertEqual(8, view.build[VERSION_SDK_PROPERTY])
+
+ def testView_specifiedSdkVersion_10(self):
+ view = View(VIEW_MAP, MockDevice(), 10)
+ self.assertEqual(10, view.build[VERSION_SDK_PROPERTY])
+
+ def testView_specifiedSdkVersion_16(self):
+ view = View(VIEW_MAP, MockDevice(), 16)
+ self.assertEqual(16, view.build[VERSION_SDK_PROPERTY])
+
+ def testInnerMethod(self):
+ v = View({'isChecked()':'true'}, None)
+ self.assertTrue(v.isChecked())
+ v.map['isChecked()'] = 'false'
+ self.assertFalse(v.isChecked(), "Expected False but is %s {%s}" % (v.isChecked(), v.map['isChecked()']))
+ self.assertFalse(v.isChecked())
+ v.map['other'] = 1
+ self.assertEqual(1, v.other())
+ v.map['evenMore'] = "ABC"
+ self.assertEqual("ABC", v.evenMore())
+ v.map['more'] = "abc"
+ v.map['more'] = v.evenMore()
+ self.assertEqual("ABC", v.more())
+ v.map['isMore()'] = 'true'
+ self.assertTrue(v.isMore())
+
+ def testGetClass(self):
+ self.assertEqual('android.widget.ToggleButton', self.view.getClass())
+
+ def testGetId(self):
+ self.assertEqual('id/button_with_id', self.view.getId())
+
+ def testTextPropertyForDifferentSdkVersions(self):
+ 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}
+ for version, textProperty in VP.items():
+ view = View(None, None, version)
+ self.assertEqual(textProperty, view.textProperty, msg='version %d: expected: %s actual: %s' % (version, textProperty, view.textProperty))
+
+ def testTextPropertyForDifferentSdkVersions_device(self):
+ 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}
+ for version, textProperty in VP.items():
+ device = MockDevice(version=version)
+ view = View(None, device, -1)
+ self.assertEqual(textProperty, view.textProperty, msg='version %d' % version)
+
+ def testLeftPropertyForDifferentSdkVersions(self):
+ VP = { -1:LEFT_PROPERTY, 8:LEFT_PROPERTY_API_8, 10:LEFT_PROPERTY, 15:LEFT_PROPERTY, 16:LEFT_PROPERTY, 17:LEFT_PROPERTY}
+ for version, leftProperty in VP.items():
+ view = View(None, None, version)
+ self.assertEqual(leftProperty, view.leftProperty, msg='version %d' % version)
+
+ def testLeftPropertyForDifferentSdkVersions_device(self):
+ VP = { -1:LEFT_PROPERTY, 8:LEFT_PROPERTY_API_8, 10:LEFT_PROPERTY, 15:LEFT_PROPERTY, 16:LEFT_PROPERTY, 17:LEFT_PROPERTY}
+ for version, leftProperty in VP.items():
+ device = MockDevice(version=version)
+ view = View(None, device, -1)
+ self.assertEqual(leftProperty, view.leftProperty, msg='version %d' % version)
+
+ def testTopPropertyForDifferentSdkVersions(self):
+ VP = { -1:TOP_PROPERTY, 8:TOP_PROPERTY_API_8, 10:TOP_PROPERTY, 15:TOP_PROPERTY, 16:TOP_PROPERTY, 17:TOP_PROPERTY}
+ for version, topProperty in VP.items():
+ view = View(None, None, version)
+ self.assertEqual(topProperty, view.topProperty, msg='version %d' % version)
+
+ def testTopPropertyForDifferentSdkVersions_device(self):
+ VP = { -1:TOP_PROPERTY, 8:TOP_PROPERTY_API_8, 10:TOP_PROPERTY, 15:TOP_PROPERTY, 16:TOP_PROPERTY, 17:TOP_PROPERTY}
+ for version, topProperty in VP.items():
+ device = MockDevice(version=version)
+ view = View(None, device, -1)
+ self.assertEqual(topProperty, view.topProperty, msg='version %d' % version)
+
+ def testWidthPropertyForDifferentSdkVersions(self):
+ VP = { -1:WIDTH_PROPERTY, 8:WIDTH_PROPERTY_API_8, 10:WIDTH_PROPERTY, 15:WIDTH_PROPERTY, 16:WIDTH_PROPERTY, 17:WIDTH_PROPERTY}
+ for version, widthProperty in VP.items():
+ view = View(None, None, version)
+ self.assertEqual(widthProperty, view.widthProperty, msg='version %d' % version)
+
+ def testWidthPropertyForDifferentSdkVersions_device(self):
+ VP = { -1:WIDTH_PROPERTY, 8:WIDTH_PROPERTY_API_8, 10:WIDTH_PROPERTY, 15:WIDTH_PROPERTY, 16:WIDTH_PROPERTY, 17:WIDTH_PROPERTY}
+ for version, widthProperty in VP.items():
+ device = MockDevice(version=version)
+ view = View(None, device, -1)
+ self.assertEqual(widthProperty, view.widthProperty, msg='version %d' % version)
+
+ def testHeightPropertyForDifferentSdkVersions(self):
+ VP = { -1:HEIGHT_PROPERTY, 8:HEIGHT_PROPERTY_API_8, 10:HEIGHT_PROPERTY, 15:HEIGHT_PROPERTY, 16:HEIGHT_PROPERTY, 17:HEIGHT_PROPERTY}
+ for version, heightProperty in VP.items():
+ view = View(None, None, version)
+ self.assertEqual(heightProperty, view.heightProperty, msg='version %d' % version)
+
+ def testHeightPropertyForDifferentSdkVersions_device(self):
+ VP = { -1:HEIGHT_PROPERTY, 8:HEIGHT_PROPERTY_API_8, 10:HEIGHT_PROPERTY, 15:HEIGHT_PROPERTY, 16:HEIGHT_PROPERTY, 17:HEIGHT_PROPERTY}
+ for version, heightProperty in VP.items():
+ device = MockDevice(version=version)
+ view = View(None, device, -1)
+ self.assertEqual(heightProperty, view.heightProperty, msg='version %d' % version)
+
+ def testGetText(self):
+ self.assertTrue(self.view.map.has_key('text:mText'))
+ self.assertEqual('Button with ID', self.view.getText())
+ self.assertEqual('Button with ID', self.view['text:mText'])
+
+ def testGetX_specifiedSdkVersion_8(self):
+ view = View(VIEW_MAP_API_8, MockDevice(), 8)
+ self.assertEqual(8, view.build[VERSION_SDK_PROPERTY])
+ self.assertEqual(50, view.getX())
+
+ def testGetX_specifiedSdkVersion_10(self):
+ view = View(VIEW_MAP, MockDevice(), 10)
+ self.assertEqual(10, view.build[VERSION_SDK_PROPERTY])
+ self.assertEqual(50, view.getX())
+
+ def testGetY_specifiedSdkVersion_8(self):
+ view = View(VIEW_MAP_API_8, MockDevice(), 8)
+ self.assertEqual(8, view.build[VERSION_SDK_PROPERTY])
+ self.assertEqual(316, view.getY())
+
+ def testGetY_specifiedSdkVersion_10(self):
+ view = View(VIEW_MAP, MockDevice(), 10)
+ self.assertEqual(10, view.build[VERSION_SDK_PROPERTY])
+ self.assertEqual(316, view.getY())
+
+ def testGetWidth(self):
+ self.assertEqual(1140, self.view.getWidth())
+
+ def testGetHeight(self):
+ self.assertEqual(48, self.view.getHeight())
+
+ def testGetUniqueId(self):
+ self.assertEqual('id/button_with_id', self.view.getUniqueId())
+
+ def testGetUniqueIdEqualsToIdWhenIdIsSpecified(self):
+ self.assertEqual(self.view.getId(), self.view.getUniqueId())
+
+ def testName_Layout_mLeft(self):
+ v = View({'layout:mLeft':200}, None)
+ self.assertEqual(200, v.layout_mLeft())
+
+ def testNameWithColon_this_is_a_fake_name(self):
+ v = View({'this:is_a_fake_name':1}, None)
+ self.assertEqual(1, v.this_is_a_fake_name())
+
+ def testNameWith2Colons_this_is_another_fake_name(self):
+ v = View({'this:is:another_fake_name':1}, None)
+ self.assertEqual(1, v.this_is_another_fake_name())
+
+ def testViewWithoutId(self):
+ v = View({'mID':'id/NO_ID', 'text:mText':'Some text'}, None)
+ self.assertEqual('id/NO_ID', v.getId())
+
+ def testInexistentMethodName(self):
+ v = View({'foo':1}, None)
+ try:
+ v.bar()
+ raise Exception("AttributeError not raised")
+ except AttributeError:
+ pass
+
+ def testViewTreeRoot(self):
+ root = View({'root':1}, None)
+ self.assertTrue(root.parent == None)
+
+ def testViewTree(self):
+ root = View({'root':1}, None)
+ children = ["A", "B", "C"]
+ for s in children:
+ root.add(View({s:1}, None))
+
+ self.assertEquals(len(children), len(root.children))
+
+ def testViewTreeParent(self):
+ root = View({'root':1}, None)
+ children = ["A", "B", "C"]
+ for s in children:
+ root.add(View({s:1}, None))
+
+ for ch in root.children:
+ self.assertTrue(ch.parent == root)
+
+ def testContainsPoint_api15(self):
+ v = View(VIEW_MAP, MockDevice(), 15)
+ (X, Y, W, H) = v.getPositionAndSize()
+ self.assertEqual(X, v.getX())
+ self.assertEqual(Y, v.getY())
+ self.assertEqual(W, v.getWidth())
+ self.assertEqual(H, v.getHeight())
+ self.assertTrue(v.containsPoint((v.getCenter())))
+
+ def testContainsPoint_api17(self):
+ v = View(VIEW_MAP_API_17, MockDevice(), 17)
+ (X, Y, W, H) = v.getPositionAndSize()
+ self.assertEqual(X, v.getX())
+ self.assertEqual(Y, v.getY())
+ self.assertEqual(W, v.getWidth())
+ self.assertEqual(H, v.getHeight())
+ self.assertTrue(v.containsPoint((v.getCenter())))
+
+ def testIsClickable_api15(self):
+ v = View(VIEW_MAP, MockDevice(), 15)
+ self.assertTrue(v.isClickable())
+
+ def testIsClickable_api17(self):
+ v = View(VIEW_MAP_API_17, MockDevice(), 17)
+ self.assertTrue(v.isClickable())
+
+class ViewClientTest(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def testInit_adb(self):
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEqual(None, vc)
+
+ def testInit_adbNone(self):
+ # FIXME: there's a problem here when the mock device is created,
+ # it's intended to be API=15, mock ViewServer is started and then
+ # adb tries (unsuccessfuly) to forward the ports (expected because
+ # adb does not know anything about mock devices).
+ # Then
+ # error: device not found
+ # appears in the console
+ device = MockDevice()
+ try:
+ vc = ViewClient(device, device.serialno, adb=None, autodump=False)
+ self.assertIsNotNone(vc)
+ except subprocess.CalledProcessError:
+ # This is needed because the ports cannot be forwarded if there is no device connected
+ pass
+
+ def testExceptionDeviceNotConnected(self):
+ try:
+ vc = ViewClient(None, None)
+ except Exception, e:
+ self.assertEqual('Device is not connected', e.message)
+
+ def testConnectToDeviceOrExit_environ(self):
+ sys.argv = ['']
+ os.environ['ANDROID_SERIAL'] = 'ABC123'
+ try:
+ ViewClient.connectToDeviceOrExit(timeout=1, verbose=True)
+ except RuntimeError, e:
+ msg = str(e)
+ if re.search('Is adb running on your computer?', msg):
+ # This test required adb running
+ self.fail(msg)
+ elif re.search("There are no connected devices", msg):
+ # special case, when there are no devices connected then the
+ # serialno specified doesn't matter
+ pass
+ elif not re.search("couldn't find device that matches 'ABC123'", msg):
+ self.fail(msg)
+ except exceptions.SystemExit, e:
+ self.assertEquals(3, e.code)
+ except Exception, e: #FIXME: java.lang.NullPointerException:
+ self.fail('Serialno was not taken from environment: ' + msg)
+
+ def testConnectToDeviceOrExit_serialno(self):
+ sys.argv = ['']
+ try:
+ ViewClient.connectToDeviceOrExit(timeout=1, verbose=True, serialno='ABC123')
+ except RuntimeError, e:
+ msg = str(e)
+ if re.search('Is adb running on your computer?', msg):
+ # This test required adb running
+ self.fail(msg)
+ elif re.search("There are no connected devices", msg):
+ # special case, when there are no devices connected then the
+ # serialno specified doesn't matter
+ pass
+ elif not re.search("couldn't find device that matches 'ABC123'", msg):
+ self.fail(msg)
+ except exceptions.SystemExit, e:
+ self.assertEquals(3, e.code)
+ except Exception, e: #FIXME: java.lang.NullPointerException:
+ self.fail('Serialno was not taken from argument: ' + str(e))
+
+ def testConstructor(self):
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+
+ def testMapSerialNo_noPortSpecified(self):
+ vc = ViewClient(MockDevice(), serialno='192.168.1.100', adb=TRUE, autodump=False)
+ self.assertEqual('192.168.1.100:5555', vc.serialno)
+
+ def testMapSerialNo_portSpecified(self):
+ vc = ViewClient(MockDevice(), serialno='192.168.1.100:5555', adb=TRUE, autodump=False)
+ self.assertEqual('192.168.1.100:5555', vc.serialno)
+
+ def testMapSerialNo_emulator(self):
+ vc = ViewClient(MockDevice(), serialno='emulator-5556', adb=TRUE, autodump=False)
+ self.assertEqual('emulator-5556', vc.serialno)
+
+ def testMapSerialNo_regex(self):
+ # This is an edge case. A regex should not be used as the serialno in ViewClient as it's
+ # behavior is not well defined.
+ # MonkeyRunner.waitForConnection() accepts a regexp as serialno but adb -s doesn't
+ try:
+ ViewClient(MockDevice(), serialno='.*', adb=TRUE, autodump=False)
+ self.fail()
+ except ValueError:
+ pass
+
+ def testMapSerialNo_None(self):
+ device = MockDevice()
+ try:
+ ViewClient(device, None, adb=TRUE, autodump=False)
+ self.fail()
+ except ValueError:
+ pass
+
+ def testGetProperty_displayWidth(self):
+ device = MockDevice()
+ self.assertEqual(768, device.getProperty('display.width'))
+
+ def testGetProperty_displayHeight(self):
+ device = MockDevice()
+ self.assertEqual(1184, device.getProperty('display.height'))
+
+ def __mockTree(self, dump=DUMP, version=15, language='en'):
+ device = MockDevice(version=version, language=language)
+ vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ if version <= 15:
+ # We don't want to invoke the ViewServer or MockViewServer for this
+ vc.setViews(dump)
+ else:
+ vc.dump()
+ return vc
+
+ def __mockWindows(self, windows=WINDOWS):
+ device = MockDevice()
+ vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.windows = windows
+ return vc
+
+ def testRoot(self):
+ vc = self.__mockTree()
+ root = vc.root
+ self.assertTrue(root != None)
+ self.assertTrue(root.parent == None)
+ self.assertTrue(root.getClass() == 'com.android.internal.policy.impl.PhoneWindow$DecorView')
+
+ def testParseTree(self):
+ vc = self.__mockTree()
+ # eat all the output
+ vc.traverse(vc.root, transform=self.__eatIt)
+ # We know there are 23 views in ViewServer mock tree
+ self.assertEqual(23, len(vc.getViewIds()))
+
+ def testParsetree_api17(self):
+ vc = self.__mockTree(version=17)
+ # eat all the output
+ vc.traverse(vc.root, transform=self.__eatIt)
+ # We know there are 9 views in UiAutomator mock tree
+ self.assertEqual(9, len(vc.getViewIds()))
+
+ def testParsetree_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ # eat all the output
+ vc.traverse(vc.root, transform=self.__eatIt)
+ # We know there are 21 views in UiAutomator mock tree
+ self.assertEqual(21, len(vc.getViewIds()))
+
+ def __testViewByIds_apiIndependent(self, vc):
+ viewsbyId = vc.getViewsById()
+ self.assertNotEquals(None, viewsbyId)
+ for k, v in viewsbyId.items():
+ self.assertTrue(isinstance(k, str) or isinstance(k, unicode))
+ self.assertTrue(isinstance(v, View), "v=" + unicode(v) + " is not a View")
+ self.assertTrue(re.match("id/.*", v.getUniqueId()) != None)
+ self.assertEquals(k, v.getUniqueId())
+
+ def testGetViewsById(self):
+ vc = self.__mockTree()
+ self.__testViewByIds_apiIndependent(vc)
+
+ def testGetViewsById_api17(self):
+ vc = self.__mockTree(version=17)
+ self.__testViewByIds_apiIndependent(vc)
+
+ def testGetViewsById_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ self.__testViewByIds_apiIndependent(vc)
+
+ def testNewViewClientInstancesDontDuplicateTree(self):
+ vc = {}
+ n = {}
+ for i in range(10):
+ vc[i] = self.__mockTree()
+ n[i] = len(vc[i].getViewIds())
+
+ for i in range(1, 10):
+ self.assertEquals(n[0], n[i])
+
+ def testTraverseShowClassIdAndText(self):
+ device = MockDevice()
+ root = View({'text:mText':'0', 'class': 'android.widget.View', 'mID': 0}, device)
+ root.add(View({'text:mText':'1', 'class': 'android.widget.View', 'mID': 1}, device))
+ root.add(View({'text:mText':'2', 'class': 'android.widget.View', 'mID': 2}, device))
+ v3 = View({'text:mText':'3', 'class': 'android.widget.View', 'mID':3}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35', 'class': 'android.widget.View', 'mID': 35}, device)
+ v3.add(v35)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ treeStr = StringIO.StringIO()
+ vc.traverse(root=root, transform=ViewClient.TRAVERSE_CIT, stream=treeStr)
+ self.assertNotEquals(None, treeStr.getvalue())
+ lines = treeStr.getvalue().splitlines()
+ self.assertEqual(5, len(lines), "lines=%s" % lines)
+ self.assertEqual('android.widget.View 0 0', lines[0])
+ citRE = re.compile(' +android.widget.View \d+ \d+')
+ for l in lines[1:]:
+ self.assertTrue(citRE.match(l), 'l=%s' % l)
+
+
+ def testTraverseShowClassIdTextAndCenter(self):
+ device = MockDevice()
+ root = View({'mID':'0', 'text:mText':'0', 'layout:mLeft':0, 'layout:mTop':0}, device)
+ root.add(View({'mID':'1', 'text:mText':'1', 'layout:mLeft':1, 'layout:mTop':1}, device))
+ root.add(View({'mID':'2', 'text:mText':'2', 'layout:mLeft':2, 'layout:mTop':2}, device))
+ v3 = View({'mID':'3', 'text:mText':'3', 'layout:mLeft':3, 'layout:mTop':3}, device)
+ root.add(v3)
+ v35 = View({'mID':'5', 'text:mText':'5', 'getTag()':'v35', 'layout:mLeft':5, 'layout:mTop':5}, device)
+ v3.add(v35)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ treeStr = StringIO.StringIO()
+ vc.traverse(root=root, transform=ViewClient.TRAVERSE_CITC, stream=treeStr)
+ self.assertNotEquals(None, treeStr.getvalue())
+ lines = treeStr.getvalue().splitlines()
+ self.assertEqual(5, len(lines))
+ self.assertEqual('None 0 0 (0, 0)', lines[0])
+ citRE = re.compile(' +None \d+ \d+ \(\d+, \d+\)')
+ for l in lines[1:]:
+ self.assertTrue(citRE.match(l))
+
+ def __getClassAndId(self, view):
+ try:
+ return "%s %s %s %s" % (view.getClass(), view.getId(), view.getUniqueId(), view.getCoords())
+ except Exception, e:
+ return "Exception in view=%s: %s" % (view.__smallStr__(), e)
+
+ def __eatIt(self, view):
+ return ""
+
+ def testViewWithNoIdReceivesUniqueId(self):
+ vc = self.__mockTree()
+
+ # We know there are 6 views without id in the mock tree
+ for i in range(1, 6):
+ self.assertNotEquals(None, vc.findViewById("id/no_id/%d" % i))
+
+ def testTextWithSpaces(self):
+ vc = self.__mockTree()
+ self.assertNotEqual(None, vc.findViewWithText('Medium Text'))
+
+ def testTextWithVeryLargeContent(self):
+ TEXT = """\
+MOCK@412a9d08 mID=7,id/test drawing:mForeground=4,null padding:mForegroundPaddingBottom=1,0 text:mText=319,[! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p] mViewFlags=11,-1744830336\
+"""
+ vc = self.__mockTree(TEXT)
+ test = vc.findViewById('id/test')
+ text = test.getText()
+ self.assertEqual(319, len(text))
+ self.assertEqual('[', text[0])
+ self.assertEqual(']', text[318])
+ self.assertEqual('-1744830336', test['mViewFlags'])
+
+ def testActionBarSubtitleCoordinates(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ toggleButton = vc.findViewById('id/button_with_id')
+ self.assertNotEqual(None, toggleButton)
+ textView3 = vc.findViewById('id/textView3')
+ self.assertNotEqual(None, textView3)
+ x = toggleButton.getX()
+ y = toggleButton.getY()
+ w = toggleButton.getWidth()
+ h = toggleButton.getHeight()
+ xy = toggleButton.getXY()
+ coords = toggleButton.getCoords()
+ self.assertNotEqual(None, textView3.getText())
+ self.assertNotEqual("", textView3.getText().strip())
+ lv = textView3.getText().strip().split()
+ _list = [ eval(str(v)) for v in lv ]
+ tx = _list[1][0]
+ ty = _list[1][1]
+ tsx = _list[1][0]
+ tsy = _list[1][1]
+ self.assertEqual(tx, x)
+ self.assertEqual(ty, y)
+ self.assertEqual((tsx, tsy), xy)
+ self.assertEqual(((tsx, tsy), (xy[0] + w, xy[1] + h)), coords)
+
+ def testServiceStoppedAfterDestructor(self):
+ device = MockDevice()
+ self.assertTrue(device.service == STOPPED)
+ if True:
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertTrue(device.service == RUNNING)
+ vc.__del__()
+ # Perhpas there are other ViewClients using the same server, we cannot expect it stops
+ #self.assertTrue(device.service == STOPPED)
+
+ def testList(self):
+ vc = self.__mockWindows()
+ self.assertNotEqual(None, vc.windows)
+
+ def testFindViewByIdOrRaise(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ vc.findViewByIdOrRaise('id/up')
+
+ def testFindViewByIdOrRaise_api17(self):
+ vc = self.__mockTree(version=17)
+ vc.traverse(stream=self.openDevNull())
+ vc.findViewByIdOrRaise('id/no_id/9')
+
+ def testFindViewByIdOrRaise_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ vc.traverse(stream=self.openDevNull())
+ vc.findViewByIdOrRaise('id/no_id/21')
+
+ def testFindViewByIdOrRaise_nonExistentView(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ try:
+ vc.findViewByIdOrRaise('id/nonexistent')
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewByIdOrRaise_nonExistentView_api17(self):
+ vc = self.__mockTree(version=17)
+ try:
+ vc.findViewByIdOrRaise('id/nonexistent')
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewByIdOrRaise_nonExistentView_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ try:
+ vc.findViewByIdOrRaise('id/nonexistent')
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewById_root(self):
+ device = None
+ root = View({'mID':'0'}, device)
+ root.add(View({'mID':'1'}, device))
+ root.add(View({'mID':'2'}, device))
+ v3 = View({'mID':'3'}, device)
+ root.add(v3)
+ v35 = View({'mID':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'mID':'4'}, device)
+ root.add(v4)
+ v45 = View({'mID':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewById('5')
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewById('5', root=v4)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewById('5', root=v3)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+
+ def testFindViewById_viewFilter(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ def vf(view):
+ return view.getClass() == 'android.widget.ImageView'
+ view = vc.findViewById('id/up', viewFilter=vf)
+ self.assertNotEqual(view, None)
+
+ def testFindViewById_viewFilterUnmatched(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ def vf(view):
+ return view.getClass() == 'android.widget.TextView'
+ view = vc.findViewById('id/up', viewFilter=vf)
+ self.assertEqual(view, None)
+
+ def testFindViewByIdOrRaise_root(self):
+ device = None
+ root = View({'mID':'0'}, device)
+ root.add(View({'mID':'1'}, device))
+ root.add(View({'mID':'2'}, device))
+ v3 = View({'mID':'3'}, device)
+ root.add(v3)
+ v35 = View({'mID':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'mID':'4'}, device)
+ root.add(v4)
+ v45 = View({'mID':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewByIdOrRaise('5')
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewByIdOrRaise('5', root=v4)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewByIdOrRaise('5', root=v3)
+ self.assertEqual('v35', v5.getTag())
+
+ def testFindViewByIdOrRaise_viewFilter(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ def vf(view):
+ return view.getClass() == 'android.widget.ImageView'
+ view = vc.findViewByIdOrRaise('id/up', viewFilter=vf)
+
+ def testFindViewByIdOrRaise_viewFilterUnmatched(self):
+ vc = self.__mockTree(dump=DUMP_SAMPLE_UI)
+ def vf(view):
+ return view.getClass() == 'android.widget.TextView'
+ try:
+ view = vc.findViewByIdOrRaise('id/up', viewFilter=vf)
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewWithText_root(self):
+ device = None
+ root = View({'text:mText':'0'}, device)
+ root.add(View({'text:mText':'1'}, device))
+ root.add(View({'text:mText':'2'}, device))
+ v3 = View({'text:mText':'3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewWithText('5')
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewWithText('5', root=v4)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewWithText('5', root=v3)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+
+ def testFindViewWithText_regexRoot(self):
+ device = None
+ root = View({'text:mText':'0'}, device)
+ root.add(View({'text:mText':'1'}, device))
+ root.add(View({'text:mText':'2'}, device))
+ v3 = View({'text:mText':'3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewWithText(re.compile('[5]'))
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewWithText(re.compile('[5]'), root=v4)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewWithText(re.compile('[5]'), root=v3)
+ self.assertNotEqual(v5, None)
+ self.assertEqual('v35', v5.getTag())
+
+ def testFindViewWithTextOrRaise_root(self):
+ device = None
+ root = View({'text:mText':'0'}, device)
+ root.add(View({'text:mText':'1'}, device))
+ root.add(View({'text:mText':'2'}, device))
+ v3 = View({'text:mText':'3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewWithTextOrRaise('5')
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewWithTextOrRaise('5', root=v4)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewWithTextOrRaise('5', root=v3)
+ self.assertEqual('v35', v5.getTag())
+
+ def testFindViewWithTextOrRaise_root_disappearingView(self):
+ device = None
+ root = View({'text:mText':'0'}, device)
+ root.add(View({'text:mText':'1'}, device))
+ root.add(View({'text:mText':'2'}, device))
+ v3 = View({'text:mText':'3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v5 = vc.findViewWithTextOrRaise('5')
+ self.assertEqual('v35', v5.getTag())
+ v5 = vc.findViewWithTextOrRaise('5', root=v4)
+ self.assertEqual('v45', v5.getTag())
+ v5 = vc.findViewWithTextOrRaise('5', root=v3)
+ self.assertEqual('v35', v5.getTag())
+ # Then remove v4 and its children
+ root.children.remove(v4)
+ #vc.dump()
+ v4 = vc.findViewWithText('4')
+ self.assertEqual(v4, None, "v4 has not disappeared")
+
+ def testFindViewWithTextOrRaise_rootNonExistent(self):
+ device = None
+ root = View({'text:mText':'0'}, device)
+ root.add(View({'text:mText':'1'}, device))
+ root.add(View({'text:mText':'2'}, device))
+ v3 = View({'text:mText':'3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'5', 'getTag()':'v35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'5', 'getTag()':'v45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ try:
+ vc.findViewWithTextOrRaise('Non Existent', root=v4)
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewWithTextOrRaise_api17(self):
+ vc = self.__mockTree(version=17)
+ vc.findViewWithTextOrRaise("Apps")
+
+ def openDevNull(self):
+ return open('/dev/null', 'a+')
+
+ def testFindViewWithTextOrRaise_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ vc.traverse(transform=ViewClient.TRAVERSE_CIT, stream=self.openDevNull())
+ vc.findViewWithTextOrRaise(u'语言')
+
+ def testFindViewWithTextOrRaise_nonExistent_api17(self):
+ vc = self.__mockTree(version=17)
+ try:
+ vc.findViewWithTextOrRaise('nonexistent text')
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewWithTextOrRaise_nonExistent_api17_zh(self):
+ vc = self.__mockTree(version=17, language='zh')
+ try:
+ vc.findViewWithTextOrRaise(u'不存在的文本')
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewWithContentDescription_root(self):
+ device = None
+ root = View({'text:mText':'0', 'content-desc':'CD0'}, device)
+ root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device))
+ root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device))
+ v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v45 = vc.findViewWithContentDescription('CD45')
+ self.assertNotEqual(v45, None)
+ self.assertEqual('45', v45.getText())
+ v45 = vc.findViewWithContentDescription('CD45', root=v4)
+ self.assertNotEqual(v45, None)
+ self.assertEqual('45', v45.getText())
+ v35 = vc.findViewWithContentDescription('CD35', root=v3)
+ self.assertNotEqual(v35, None)
+ self.assertEqual('35', v35.getText())
+
+ def testFindViewWithContentDescription_regexRoot(self):
+ device = None
+ root = View({'text:mText':'0', 'content-desc':'CD0'}, device)
+ root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device))
+ root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device))
+ v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v45 = vc.findViewWithContentDescription(re.compile('CD4\d'))
+ self.assertNotEqual(v45, None)
+ self.assertEqual('45', v45.getText())
+ v45 = vc.findViewWithContentDescription(re.compile('CD4\d'), root=v4)
+ self.assertNotEqual(v45, None)
+ self.assertEqual('45', v45.getText())
+ v35 = vc.findViewWithContentDescription(re.compile('CD3\d'), root=v3)
+ self.assertNotEqual(v35, None)
+ self.assertEqual('35', v35.getText())
+
+ def testFindViewWithContentDescriptionOrRaise_root(self):
+ device = None
+ root = View({'text:mText':'0', 'content-desc':'CD0'}, device)
+ root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device))
+ root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device))
+ v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ v45 = vc.findViewWithContentDescriptionOrRaise('CD45')
+ self.assertEqual('45', v45.getText())
+ v45 = vc.findViewWithContentDescriptionOrRaise('CD45', root=v4)
+ self.assertEqual('45', v45.getText())
+ v35 = vc.findViewWithContentDescriptionOrRaise('CD35', root=v3)
+ self.assertEqual('35', v35.getText())
+
+ def testFindViewWithContentDescriptionOrRaise_rootNonExistent(self):
+ device = None
+ root = View({'text:mText':'0', 'content-desc':'CD0'}, device)
+ root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device))
+ root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device))
+ v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ try:
+ vc.findViewWithContentDescriptionOrRaise('Non Existent', root=v4)
+ self.fail()
+ except ViewNotFoundException:
+ pass
+
+ def testFindViewWithContentDescriptionOrRaiseExceptionMessage_regexpRoot(self):
+ device = None
+ root = View({'text:mText':'0', 'content-desc':'CD0'}, device)
+ root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device))
+ root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device))
+ v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device)
+ root.add(v3)
+ v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device)
+ v3.add(v35)
+ v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device)
+ root.add(v4)
+ v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device)
+ v4.add(v45)
+ device = MockDevice()
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ self.assertNotEquals(None, vc)
+ vc.root = root
+ try:
+ vc.findViewWithContentDescriptionOrRaise(re.compile('Non Existent'), root=v4)
+ self.fail()
+ except ViewNotFoundException, e:
+ self.assertNotEquals(None, re.search("that matches 'Non Existent'", e.message))
+
+ def testUiAutomatorDump(self):
+ device = MockDevice(version=16)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=True)
+
+ def testUiAutomatorKilled(self):
+ device = MockDevice(version=16, uiautomatorkilled=True)
+ try:
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=True, ignoreuiautomatorkilled=True)
+ except Exception, e:
+ self.assertIsNotNone(re.search('''ERROR: UiAutomator output contains no valid information. UiAutomator was killed, no reason given.''', str(e)))
+
+ def testUiViewServerDump(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ vc.dump()
+ vc.findViewByIdOrRaise('id/home')
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testUiViewServerDump_windowStr(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ vc.dump(window='StatusBar')
+ vc.findViewByIdOrRaise('id/status_bar')
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testUiViewServerDump_windowInt(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ vc.dump(window=0xb52f7c88)
+ vc.findViewByIdOrRaise('id/status_bar')
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testUiViewServerDump_windowIntStr(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ vc.dump(window='0xb52f7c88')
+ vc.findViewByIdOrRaise('id/status_bar')
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testUiViewServerDump_windowIntM1(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False)
+ vc.dump(window=-1)
+ vc.findViewByIdOrRaise('id/home')
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testFindViewsContainingPoint_api15(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE)
+ list = vc.findViewsContainingPoint((200, 200))
+ self.assertNotEquals(None, list)
+ self.assertNotEquals(0, len(list))
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testFindViewsContainingPoint_api17(self):
+ device = MockDevice(version=17)
+ vc = ViewClient(device, device.serialno, adb=TRUE)
+ list = vc.findViewsContainingPoint((55, 75))
+ self.assertNotEquals(None, list)
+ self.assertNotEquals(0, len(list))
+
+ def testFindViewsContainingPoint_filterApi15(self):
+ device = None
+ try:
+ device = MockDevice(version=15, startviewserver=True)
+ vc = ViewClient(device, device.serialno, adb=TRUE)
+ list = vc.findViewsContainingPoint((200, 200), _filter=View.isClickable)
+ self.assertNotEquals(None, list)
+ self.assertNotEquals(0, len(list))
+ finally:
+ if device:
+ device.shutdownMockViewServer()
+
+ def testFindViewsContainingPoint_filterApi17(self):
+ device = MockDevice(version=17)
+ vc = ViewClient(device, device.serialno, adb=TRUE)
+ list = vc.findViewsContainingPoint((55, 75), _filter=View.isClickable)
+ self.assertNotEquals(None, list)
+ self.assertNotEquals(0, len(list))
+
+if __name__ == "__main__":
+ print >> sys.stderr, "ViewClient.__main__:"
+ print >> sys.stderr, "argv=", sys.argv
+ #import sys;sys.argv = ['', 'Test.testName']
+ #sys.argv.append('ViewClientTest.testFindViewsContainingPoint_filterApi17')
+ unittest.main()
diff --git a/AndroidViewClient/tools/culebra b/AndroidViewClient/tools/culebra
new file mode 100755
index 0000000..7aedb00
--- /dev/null
+++ b/AndroidViewClient/tools/culebra
@@ -0,0 +1,1332 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+'''
+Copyright (C) 2013-2016 Diego Torres Milano
+Created on Mar 28, 2013
+
+Culebra helps you create AndroidViewClient scripts generating a working template that can be
+modified to suit more specific needs.
+ __ __ __ __
+ / \ / \ / \ / \
+____________________/ __\/ __\/ __\/ __\_____________________________
+___________________/ /__/ /__/ /__/ /________________________________
+ | / \ / \ / \ / \ \___
+ |/ \_/ \_/ \_/ \ o \
+ \_____/--<
+
+@author: Diego Torres Milano
+@author: Jennifer E. Swofford (ascii art snake)
+
+
+'''
+
+__version__ = '11.5.9'
+
+import re
+import sys
+import os
+import getopt
+import warnings
+import subprocess
+import codecs
+import calendar
+from datetime import date
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient, ViewClientOptions, View, CulebraOptions
+from com.dtmilano.android.culebron import Culebron, Operation, Unit
+
+DEBUG = False
+USAGE = 'usage: %s [OPTION]... [serialno]'
+TAG = 'CULEBRA'
+
+class Descriptor:
+ CONTENT_DESCRIPTION = 'content-description'
+ TEXT = 'text'
+ ID = 'id'
+
+ @staticmethod
+ def findBestDescriptor(view):
+ '''
+ Finds the best possible descriptor for the View
+ '''
+
+ cd = view.getContentDescription()
+ if cd and options[CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION]:
+ return Descriptor.CONTENT_DESCRIPTION
+ else:
+ t = view.getText()
+ if t and options[CulebraOptions.FIND_VIEWS_WITH_TEXT]:
+ return Descriptor.TEXT
+ return Descriptor.ID
+
+
+def fillAutoRegexpsRes():
+ are = {}
+ are['clock'] = re.compile('[012]?\d:[0-5]\d')
+ d = "("
+ for i in range(7):
+ d += calendar.day_abbr[i]
+ if i != 6:
+ d += '|'
+ d += '), ('
+ for i in range(1, 13):
+ d += calendar.month_name[i]
+ if i != 12:
+ d += '|'
+ d += ') [0123]\d'
+ are['date'] = re.compile(d, re.IGNORECASE)
+ are['battery'] = re.compile('Charging, \d\d%')
+ return are
+
+CulebraOptions.AUTO_REGEXPS_RES = fillAutoRegexpsRes()
+SB_NO_JAR = 'no-jar'
+SB_JAR = 'jar'
+SB_JAR_LINUX = 'jar-linux'
+SHEBANG = {
+ SB_NO_JAR: '#! /usr/bin/env python',
+ SB_JAR: '#! /usr/bin/env shebang monkeyrunner -plugin $ANDROID_VIEW_CLIENT_HOME/bin/androidviewclient-$ANDROID_VIEW_CLIENT_VERSION.jar @!',
+ SB_JAR_LINUX: '#! /usr/local/bin/shebang monkeyrunner -plugin $AVC_HOME/bin/androidviewclient-$AVC_VERSION.jar @!'
+ }
+
+indent = ''
+prefix = ''
+
+def shortAndLongOptions():
+ '''
+ @return: the list of corresponding (short-option, long-option) tuples
+ '''
+
+ short_opts = CulebraOptions.SHORT_OPTS.replace(':', '')
+ if len(short_opts) != len(CulebraOptions.LONG_OPTS):
+ s = ""
+ for i in range(max(len(short_opts), len(CulebraOptions.LONG_OPTS))):
+ l = ''
+ try:
+ l = short_opts[i]
+ except IndexError:
+ pass
+ L = ''
+ try:
+ L = CulebraOptions.LONG_OPTS[i]
+ except IndexError:
+ pass
+ s += "%3s - %s\n" % (l, L)
+ raise Exception('There is a mismatch between short and long options: short=%d, long=%d\n%s' %
+ (len(short_opts), len(CulebraOptions.LONG_OPTS), s))
+ t = tuple(short_opts) + tuple(CulebraOptions.LONG_OPTS)
+ l2 = len(t) / 2
+ sl = []
+ for i in range(l2):
+ sl.append((t[i], t[i + l2]))
+ return sl
+
+def usage(exitVal=1):
+ print >> sys.stderr, USAGE % progname
+ print >> sys.stderr, "Try '%s --help' for more information." % progname
+ sys.exit(exitVal)
+
+def help():
+ print >> sys.stderr, USAGE % progname
+ print >> sys.stderr
+ print >> sys.stderr, "Options:"
+ for so, lo in shortAndLongOptions():
+ o = ' -%c, --%s' % (so, lo)
+ if lo[-1] == '=':
+ o += CulebraOptions.LONG_OPTS_ARG[lo[:-1]]
+ try:
+ o = '%-34s %-45s' % (o, CulebraOptions.OPTS_HELP[so])
+ except:
+ pass
+ print >> sys.stderr, o
+ sys.exit(0)
+
+def version():
+ print progname, __version__
+ sys.exit(0)
+
+def autoRegexpsHelp():
+ print >> sys.stderr, "Available %s options:" % CulebraOptions.AUTO_REGEXPS
+ print >> sys.stderr, "\thelp: prints this help"
+ print >> sys.stderr, "\tall: includes all the available regexps"
+ for r in CulebraOptions.AUTO_REGEXPS_RES:
+ print >> sys.stderr, "\t%s: %s" % (r, CulebraOptions.AUTO_REGEXPS_RES[r].pattern)
+ print >> sys.stderr
+ sys.exit(0)
+
+def error(msg, fatal=False):
+ print >> sys.stderr, "%s: ERROR: %s" % (progname, msg)
+ if fatal:
+ sys.exit(1)
+
+def notNull(val, default):
+ if val:
+ return val
+ return default
+
+def printVerboseComments(view):
+ '''
+ Prints the verbose comments for view.
+ '''
+
+ print '\n%s# class=%s' % (indent, view.getClass()),
+ try:
+ text = view.getText()
+ if text:
+ u = 'u' if isinstance(text, unicode) else ''
+ if '\n' in text:
+ text = re.sub(r'\n(.)', r'\n#\1', text)
+ print " text=%c'%s'" % (u, text),
+ except:
+ pass
+ try:
+ contentDescription = view.getContentDescription()
+ if contentDescription:
+ print u" cd='%s'" % contentDescription,
+ except:
+ pass
+ try:
+ tag = view.getTag()
+ if tag and tag != 'null':
+ print ' tag=%s' % tag,
+ except:
+ pass
+ print
+
+def variableNameFromIdOrKey(view):
+ '''
+ Returns a suitable variable name from the id.
+
+ @type view: L{View}
+ @param id: the View from where the I{uniqueId} is obtained
+
+ @return: the variable name from the id
+ '''
+
+ var = view.variableNameFromId()
+ if options[CulebraOptions.USE_DICTIONARY]:
+ return '%sviews[\'%s\']' % (prefix, notNull(dictionaryKeyFrom(options[CulebraOptions.DICTIONARY_KEYS_FROM], view), var))
+ else:
+ return var
+
+def dictionaryKeyFrom(key, view):
+ if key == 'id':
+ return view.getUniqueId()
+ elif key == 'text':
+ return view.getText()
+ elif key == 'content-description':
+ return view.getContentDescription()
+ else:
+ raise Exception('Not a valid dictionary key: %s' % key)
+
+def escapeRegexpSpecialChars(text):
+ return re.escape(text)
+
+def printFindViewWithText(view, useregexp, op=Operation.ASSIGN, arg=None):
+ '''
+ Prints the corresponding statement.
+
+ @type view: L{View}
+ @param view: the View
+ '''
+
+ text = view.getText()
+ isUnicode = isinstance(text, unicode)
+ if isUnicode and sys.stdout.encoding is None:
+ warnings.warn('''\
+You are trying to print unicode characters to an unencoded stdout, it will probably fail.
+You have to set PYTHONIOENCODING environment variable. For example:
+ export PYTHONIOENCODING=utf-8
+ ''')
+
+ u = 'u' if isUnicode else ''
+ if text:
+ var = variableNameFromIdOrKey(view)
+ if text.find(u"\n") > 0 or text.find(u"'") > 0:
+ # 2 quotes + 1 quote = 3 quotes
+ text = "''%s''" % text
+ if useregexp:
+ # if there are special chars already in the text escape them
+ text = escapeRegexpSpecialChars(text)
+ if options[CulebraOptions.AUTO_REGEXPS]:
+ for r in options[CulebraOptions.AUTO_REGEXPS]:
+ autoRegexp = CulebraOptions.AUTO_REGEXPS_RES[r]
+ if autoRegexp.match(text):
+ text = autoRegexp.pattern
+ break
+ text = "re.compile(%s'%s')" % (u, text)
+ else:
+ text = "%s'%s'" % (u, text)
+
+ if op == Operation.ASSIGN:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'finding view with text=%s' % text)
+ print u'%s%s = %svc.findViewWithTextOrRaise(%s)' % (indent, var, prefix, text)
+ elif op == Operation.LONG_TOUCH_VIEW:
+ root = ', root=%svc.findViewByIdOrRaise(\'%s\')' % (prefix, arg.getUniqueId()) if arg else ''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'long touch view with text=%s on ${serialno}' % text)
+ print u'%s[_vc.findViewWithTextOrRaise(%s%s).longTouch() for _vc in %sallVcs()]' % (indent, text, root, prefix)
+ else:
+ logAction(u'long touch view with text=%s' % text)
+ print u'%s%svc.findViewWithTextOrRaise(%s%s).longTouch()' % (indent, prefix, text, root)
+ elif op == Operation.TOUCH_VIEW:
+ root = ', root=%svc.findViewByIdOrRaise(\'%s\')' % (prefix, arg.getUniqueId()) if arg else ''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'touching view with text=%s on ${serialno}' % text)
+ print u'%s[_vc.findViewWithTextOrRaise(%s%s).touch() for _vc in %sallVcs()]' % (indent, text, root, prefix)
+ else:
+ logAction(u'touching view with text=%s' % text)
+ print u'%s%svc.findViewWithTextOrRaise(%s%s).touch()' % (indent, prefix, text, root)
+ elif op == Operation.TYPE:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.findViewWithTextOrRaise("%s").type(u"%s")' % (indent, prefix, text, arg)
+ elif op == Operation.SET_TEXT:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.findViewWithTextOrRaise(%s).setText(u"%s")' % (indent, prefix, text, arg)
+ elif op in [Operation.FLING_BACKWARD, Operation.FLING_FORWARD, Operation.FLING_TO_BEGINNING, Operation.FLING_TO_END]:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ commandName = Operation.toCommandName(op)
+ logAction(u'flinging view with text=%s %s' % (text, commandName))
+ print u'%s%svc.findViewWithTextOrRaise(%s).uiScrollable.%s()' % (indent, prefix, text, commandName)
+ elif op == Operation.TEST:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%sassertIsNotNone(%svc.findViewWithText(%s))' % (indent, prefix, prefix, text)
+ elif kwargs1[CulebraOptions.VERBOSE]:
+ warnings.warn('View with id=%s has no text' % view.getUniqueId())
+
+def printFindViewWithContentDescription(view, useregexp, op=Operation.ASSIGN, arg=None):
+ '''
+ Prints the corresponding statement.
+
+ @type view: L{View}
+ @param view: the View
+ '''
+
+ contentDescription = view.getContentDescription()
+ if contentDescription:
+ var = variableNameFromIdOrKey(view)
+ if useregexp:
+ if options[CulebraOptions.AUTO_REGEXPS]:
+ for r in options[CulebraOptions.AUTO_REGEXPS]:
+ autoRegexp = CulebraOptions.AUTO_REGEXPS_RES[r]
+ if autoRegexp.match(contentDescription):
+ contentDescription = autoRegexp.pattern
+ break
+ contentDescription = "re.compile(u'''%s''')" % contentDescription
+ else:
+ contentDescription = "u'''%s'''" % contentDescription
+
+ if op == Operation.ASSIGN:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'finding view with content-description=%s' % contentDescription)
+ print '%s%s = %svc.findViewWithContentDescriptionOrRaise(%s)' % (indent, var, prefix, contentDescription)
+ elif op == Operation.LONG_TOUCH_VIEW:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'long touch view with content-description=%s on ${serialno}' % contentDescription)
+ # print u'%s[_vc.findViewWithTextOrRaise(%s).touch() for _vc in %sallVcs()]' % (indent, text, root)
+ print u'%s[_vc.findViewWithContentDescriptionOrRaise(%s).longTouch() for _vc in %sallVcs()]' % (indent, contentDescription, prefix)
+ else:
+ logAction(u'long touch view with content-description=%s' % contentDescription)
+ print u'%s%svc.findViewWithContentDescriptionOrRaise(%s).longTouch()' % (indent, prefix, contentDescription)
+ elif op == Operation.TOUCH_VIEW:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'touching view with content-description=%s on ${serialno}' % contentDescription)
+ # print u'%s[_vc.findViewWithTextOrRaise(%s).touch() for _vc in %sallVcs()]' % (indent, text, root)
+ print u'%s[_vc.findViewWithContentDescriptionOrRaise(%s).touch() for _vc in %sallVcs()]' % (indent, contentDescription, prefix)
+ else:
+ logAction(u'touching view with content-description=%s' % contentDescription)
+ print u'%s%svc.findViewWithContentDescriptionOrRaise(%s).touch()' % (indent, prefix, contentDescription)
+ elif op == Operation.TYPE:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.findViewWithContentDescriptionOrRaise(%s).type(u"%s")' % (indent, prefix, contentDescription, arg)
+ elif op == Operation.SET_TEXT:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.findViewWithContentDescriptionOrRaise(%s).setText(u"%s")' % (indent, prefix, contentDescription, arg)
+ elif op == Operation.TEST:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%sassertEquals(%svc.findViewWithContentDescriptionOrRaise(%s).getText(), u\'\'\'%s\'\'\')' % (indent, prefix, prefix, contentDescription, arg)
+ elif op in [Operation.FLING_BACKWARD, Operation.FLING_FORWARD, Operation.FLING_TO_BEGINNING, Operation.FLING_TO_END]:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ commandName = Operation.toCommandName(op)
+ logAction(u'flinging view with content-description=%s %s' % (contentDescription, commandName))
+ print u'%s%svc.findViewWithContentDescriptionOrRaise(%s).uiScrollable.%s()' % (indent, prefix, contentDescription, commandName)
+ else:
+ error("Invalid operation in %s: %s" % (sys._getframe().f_code.co_name), op)
+
+ elif kwargs1[CulebraOptions.VERBOSE]:
+ warnings.warn('View with id=%s has no content-description' % view.getUniqueId())
+
+def printFindViewById(view, op=Operation.ASSIGN, arg=None):
+ '''
+ Prints the corresponding statement.
+
+ @type view: L{View}
+ @param view: the View
+ '''
+
+ var = variableNameFromIdOrKey(view)
+ _id = view.getId() if view.getId() else view.getUniqueId()
+ if op == Operation.ASSIGN:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction('finding view with id=%s on ${serialno}' % _id)
+ print '%s%s = [_vc.findViewByIdOrRaise("%s") for _vc in %sallVcs()]' % (indent, var, _id, prefix)
+ else:
+ logAction('finding view with id=%s' % _id)
+ print '%s%s = %svc.findViewByIdOrRaise("%s")' % (indent, var, prefix, _id)
+ elif op == Operation.LONG_TOUCH_VIEW:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'long touch view with id=%s on ${serialno}' % _id)
+ print '%s[_vc.findViewByIdOrRaise("%s").longTouch() for _vc in %sallVcs()]' % (indent, _id, prefix)
+ else:
+ logAction(u'long touch view with id=%s' % _id)
+ print '%s%svc.findViewByIdOrRaise("%s").longTouch()' % (indent, prefix, _id)
+ elif op == Operation.TOUCH_VIEW:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'touching view with id=%s on ${serialno}' % _id)
+ print '%s[_vc.findViewByIdOrRaise("%s").touch() for _vc in %sallVcs()]' % (indent, _id, prefix)
+ else:
+ logAction(u'touching view with id=%s' % _id)
+ print '%s%svc.findViewByIdOrRaise("%s").touch()' % (indent, prefix, _id)
+ elif op == Operation.TYPE:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction('typing "%s" on view with id=%s' % (arg, _id))
+ print '%s%svc.findViewByIdOrRaise("%s").type(u"%s")' % (indent, prefix, _id, arg)
+ elif op == Operation.SET_TEXT:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction('setting text "%s" on view with id=%s' % (arg, _id))
+ print '%s%svc.findViewByIdOrRaise("%s").setText(u"%s")' % (indent, prefix, _id, arg)
+ elif op == Operation.TEST:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%sassertEquals(%svc.findViewByIdOrRaise("%s").getText(), u\'\'\'%s\'\'\')' % (indent, prefix, prefix, _id, arg)
+ elif op in [Operation.FLING_BACKWARD, Operation.FLING_FORWARD, Operation.FLING_TO_BEGINNING, Operation.FLING_TO_END]:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ commandName = Operation.toCommandName(op)
+ logAction(u'flinging view with id=%s %s' % (_id, commandName))
+ print u'%s%svc.findViewWithIdOrRaise(u"%s").uiScrollable.%s()' % (indent, prefix, _id, commandName)
+ else:
+ error("Invalid operation in %s: %s" % (sys._getframe().f_code.co_name, op))
+
+
+def printTraverse(dump=None):
+ '''
+ Prints the result of traversing the tree.
+ A previously obtained dump can be passed as a parameter and in such case that
+ tree is used.
+
+ @param dump: Dump of Views previously obtained via L{ViewClient.dump()}
+ @type dump: list
+ '''
+
+ print
+ if dump:
+ for view in dump:
+ transform(view)
+ else:
+ vc.traverse(transform=transform)
+ print
+
+def printDump(window, dump=None):
+ '''
+ Prints a dump.
+
+ @param window: The window id to use to print the dump
+ @type window: int or str
+ @param dump: Dump of Views previously obtained via L{ViewClient.dump()}
+ @type dump: list
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction('dumping content of window=%s on ${serialno}' % window)
+ print '%s[_vc.dump(window=%s) for _vc in %sallVcs()]' % (indent, window, prefix)
+ else:
+ logAction('dumping content of window=%s' % window)
+ print '%s%svc.dump(window=%s)' % (indent, prefix, window)
+
+ if not options[CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP]:
+ printTraverse(dump)
+
+def printSleep(secs):
+ '''
+ Prints a sleep.
+
+ This method relies on shortcut variables being set (i.e. _s)
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ print '%s[_vc.sleep(%s) for _vc in %sallVcs()]' % (indent, secs if secs != Operation.DEFAULT else '_s', prefix)
+ else:
+ print '%s%svc.sleep(%s)' % (indent, prefix, secs if secs != Operation.DEFAULT else '_s')
+
+def printWake():
+ '''
+ Prints a wake.
+
+ :return:
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ print '%s[_vc.device.wake() for _vc in %sallVcs()]' % (indent, prefix)
+ else:
+ print '%s%svc.device.wake()' % (indent, prefix)
+
+def printPress(keycode):
+ '''
+ Prints a key press
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ logAction(u'pressing key=%s on ${serialno}' % keycode)
+ print '%s[_d.press(\'%s\') for _d in %sallDevices()]' % (indent, keycode, prefix)
+ else:
+ logAction(u'pressing key=%s' % keycode)
+ print '%s%sdevice.press(\'%s\')' % (indent, prefix, keycode)
+
+def printDrag(start, end, duration, steps, unit, orientation):
+ '''
+ Prints a drag
+ '''
+
+ if unit == Unit.PX:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%sdevice.drag(%s, %s, %d, %d, %d)' % (indent, prefix, start, end, duration, steps, orientation)
+ elif unit == Unit.DIP:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%sdevice.dragDip(%s, %s, %d, %d, %d)' % (indent, prefix, start, end, duration, steps, orientation)
+ else:
+ raise RuntimeError('Invalid unit: %s' % unit)
+
+def printTouch(x, y, unit, orientation):
+ '''
+ Prints a touch
+ '''
+
+ if unit == Unit.PX:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'touching point by PX @ (%s, %s) orientation=%s' % (x, y, orientation))
+ print '%s%sdevice.touch(%s, %s, %s)' % (indent, prefix, x, y, orientation)
+ elif unit == Unit.DIP:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'touching point by DIP @ (%s, %s) orientation=%s' % (x, y, orientation))
+ print '%s%sdevice.touchDip(%s, %s, %s)' % (indent, prefix, x, y, orientation)
+ else:
+ raise RuntimeError('Invalid unit: %s' % unit)
+
+def printLongTouch(x, y, duration, unit, orientation):
+ '''
+ Prints a long touch
+ '''
+
+ if unit == Unit.PX:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'long touching point by PX @ (%s, %s) duration=%s orientation=%s' % (x, y, duration, orientation))
+ print '%s%sdevice.longTouch(%s, %s, %s, %s)' % (indent, prefix, x, y, duration, orientation)
+ elif unit == Unit.DIP:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'long touching point by DIP @ (%s, %s) duration=%s orientation=%s' % (x, y, duration, orientation))
+ print '%s%sdevice.longTouch(%s, %s, %s, %s)' % (indent, prefix, x, y, duration, orientation)
+ else:
+ raise RuntimeError('Invalid unit: %s' % unit)
+
+def printSaveViewScreenshot(view, filename, _format):
+ '''
+ Prints the writeImageToFile for the specified L{View}.
+
+ @type view: L{View}
+ @param view: the View
+ @type filename: str
+ @param filename: the filename to store the image
+ @type _format: str
+ @param _format: The image format (i.e. PNG)
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ # FIXME: if -u was passed in the command line then we are not saving the variables and thus
+ # next line will generate an error in the script as the variable is 'undefined'
+ print '%s%s.writeImageToFile(\'%s\', \'%s\')' % (indent, view.variableNameFromId(), filename, _format)
+
+def printFlingBackward(view):
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ # FIXME: if -u was passed in the command line then we are not saving the variables and thus
+ # next line will generate an error in the script as the variable is 'undefined'
+ logAction('flinging backward view with id=%s' % view.getId())
+ print '%s%s.uiScrollable.flingBackward()' % (indent, view.variableNameFromId())
+
+def printFlingForward(view):
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ # FIXME: if -u was passed in the command line then we are not saving the variables and thus
+ # next line will generate an error in the script as the variable is 'undefined'
+ logAction('flinging forward view with id=%s' % view.getId())
+ print '%s%s.uiScrollable.flingForward()' % (indent, view.variableNameFromId())
+
+def printFlingToBeginning(view):
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ # FIXME: if -u was passed in the command line then we are not saving the variables and thus
+ # next line will generate an error in the script as the variable is 'undefined'
+ logAction('flinging to beginning view with id=%s' % view.getId())
+ print '%s%s.uiScrollable.flingToBeginning()' % (indent, view.variableNameFromId())
+
+def printFlingToEnd(view):
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ # FIXME: if -u was passed in the command line then we are not saving the variables and thus
+ # next line will generate an error in the script as the variable is 'undefined'
+ logAction('flinging to end view with id=%s' % view.getId())
+ print '%s%s.uiScrollable.flingToEnd()' % (indent, view.variableNameFromId())
+
+def printOpenNotification():
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction('opening Notification')
+ print '%s%svc.uiDevice.openNotification()' % (indent, prefix)
+
+def printOpenQuickSettings():
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction('opening Quick Settings')
+ print '%s%svc.uiDevice.openQuickSettings()' % (indent, prefix)
+
+def printChangeLanguage(code):
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction('Changing language to %s' % code)
+ print '%s%svc.uiDevice.changeLanguage("%s")' % (indent, prefix, code)
+
+def printTakeSnapshot(filename, _format, deviceart, dropshadow, screenglare):
+ '''
+ Prints the corresponding writeImageToFile() to take a snapshot
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'taking snapshot @ %s format=%s %s %s %s' % (filename, _format, deviceart, dropshadow, screenglare))
+ print '%s%svc.writeImageToFile(\'%s\', \'%s\', \'%s\', %s, %s)' % (indent, prefix, filename, _format, deviceart, dropshadow, screenglare)
+
+
+def traverseAndPrint(view):
+ '''
+ Traverses the View tree and prints the corresponding statement.
+
+ @type view: L{View}
+ @param view: the View
+ '''
+
+ if DEBUG:
+ print >> sys.stderr, "traverseAndPrint(view=%s)" % view.getId()
+ if options[CulebraOptions.VERBOSE_COMMENTS]:
+ printVerboseComments(view)
+ if options[CulebraOptions.FIND_VIEWS_BY_ID]:
+ printFindViewById(view)
+ if options[CulebraOptions.FIND_VIEWS_WITH_TEXT]:
+ printFindViewWithText(view, options[CulebraOptions.USE_REGEXPS])
+ if options[CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION]:
+ printFindViewWithContentDescription(view, options[CulebraOptions.USE_REGEXPS])
+ if options[CulebraOptions.SAVE_VIEW_SCREENSHOTS]:
+ _format = 'PNG'
+ filename = options[CulebraOptions.SAVE_VIEW_SCREENSHOTS] + os.sep + view.variableNameFromId() + '.' + _format.lower()
+ printSaveViewScreenshot(view, filename, _format)
+
+
+def printStartActivity(component):
+ '''
+ Prints the corresponding startActivity().
+
+ :param component: the component
+ '''
+
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'starting activity=%s' % (component))
+ print '%s%sdevice.startActivity(\'%s\')' % (indent, prefix, component)
+ printSleep(3)
+
+
+def printTouchViewUiAutomatorHelper(view, selector):
+ '''
+ Prints the corresponding touch
+ '''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'touching View by selector=%s' % (selector))
+ print '%s%svc.touch(selector=\'%s\')' % (indent, prefix, selector)
+
+
+def printLongTouchViewUiAutomatorHelper(view, selector):
+ '''
+ Prints the corresponding long touch
+ '''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'long-touching View by selector=%s' % (selector))
+ print '%s%svc.longTouch(selector=\'%s\')' % (indent, prefix, selector)
+
+
+def printSwipeUiAutomatorHelper(startX, startY, endX, endY, steps, unit, orientation):
+ '''
+ Prints a swipe
+ '''
+
+ if unit == Unit.PX:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.swipe(startX=%d, startY=%d, endX=%d, endY=%d, steps=%d)' % (indent, prefix, startX, startY, endX, endY, steps)
+ elif unit == Unit.DIP:
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ print '%s%svc.swipe(startX=%d, startY=%d, endX=%d, endY=%d, steps=%d)' % (indent, prefix, startX, startY, endX, endY, steps)
+ else:
+ raise RuntimeError('Invalid unit: %s' % unit)
+
+
+def printPressBackUiAutomatorHelper():
+ '''
+ Prints the corresponding press
+ '''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'pressing BACK')
+ print '%s%svc.pressBack()' % (indent, prefix)
+
+def printPressHomeUiAutomatorHelper():
+ '''
+ Prints the corresponding press
+ '''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'pressing HOME')
+ print '%s%svc.pressHome()' % (indent, prefix)
+
+def printPressRecentAppsUiAutomatorHelper():
+ '''
+ Prints the corresponding press
+ '''
+ if options[CulebraOptions.MULTI_DEVICE]:
+ warnings.warn('Multi-device not implemented yet for this case')
+ else:
+ logAction(u'pressing RECENT APPS')
+ print '%s%svc.pressRecentApps()' % (indent, prefix)
+
+
+def printOperation(view, op, *args):
+ if len(args) == 0:
+ # We use tuple values in the rest of this method, so if an empty tuple was passed
+ # replace it by one containing None
+ args = ( None, None )
+ elif len(args) < 2:
+ # We use tuple values in the rest of this method, so if an empty tuple was passed
+ # replace it by one containing None
+ args = ( args[0], None )
+ if DEBUG:
+ print >> sys.stderr, "printOperation(",
+ print >> sys.stderr, view.__str__(),
+ print >> sys.stderr, ",", op, ",",
+ for a in args:
+ if isinstance(a, unicode):
+ print >> sys.stderr, a.encode(encoding='ascii', errors='replace'), ", ",
+ else:
+ print >> sys.stderr, a,
+ print >> sys.stderr, ")"
+ if op == Operation.SLEEP:
+ printSleep(secs=args[0])
+ return
+ elif op == Operation.PRESS:
+ printPress(keycode=args[0])
+ return
+ elif op == Operation.PRESS_BACK:
+ printPress('BACK')
+ return
+ elif op == Operation.PRESS_BACK_UI_AUTOMATOR_HELPER:
+ printPressBackUiAutomatorHelper()
+ return
+ elif op == Operation.PRESS_HOME:
+ printPress('HOME')
+ return
+ elif op == Operation.PRESS_HOME_UI_AUTOMATOR_HELPER:
+ printPressHomeUiAutomatorHelper()
+ return
+ elif op == Operation.PRESS_RECENT_APPS:
+ printPress('RECENT_APPS')
+ return
+ elif op == Operation.PRESS_RECENT_APPS_UI_AUTOMATOR_HELPER:
+ printPressRecentAppsUiAutomatorHelper()
+ return
+ elif op == Operation.DUMP:
+ printDump(window=args[0], dump=args[1])
+ return
+ elif op == Operation.DRAG:
+ printDrag(start=args[0], end=args[1], duration=args[2], steps=args[3], unit=args[4], orientation=args[5])
+ return
+ elif op == Operation.TOUCH_POINT:
+ printTouch(x=args[0], y=args[1], unit=args[2], orientation=args[3])
+ return
+ elif op == Operation.TOUCH_VIEW_UI_AUTOMATOR_HELPER:
+ printTouchViewUiAutomatorHelper(view=view, selector=args[0])
+ return
+ elif op == Operation.LONG_TOUCH_POINT:
+ printLongTouch(x=args[0], y=args[1], duration=args[2], unit=args[3], orientation=args[4])
+ return
+ elif op == Operation.LONG_TOUCH_VIEW_UI_AUTOMATOR_HELPER:
+ printLongTouchViewUiAutomatorHelper(view=view, selector=args[0])
+ return
+ elif op == Operation.TRAVERSE:
+ printTraverse()
+ return
+ elif op == Operation.SNAPSHOT:
+ printTakeSnapshot(filename=args[0], _format=args[1], deviceart=args[2], dropshadow=args[3], screenglare=args[4])
+ return
+ elif op == Operation.SWIPE_UI_AUTOMATOR_HELPER:
+ printSwipeUiAutomatorHelper(startX=args[0], startY=args[1], endX=args[2], endY=args[3], steps=args[4], unit=args[5], orientation=args[6])
+ return
+ elif op == Operation.VIEW_SNAPSHOT:
+ printSaveViewScreenshot(view, filename=args[0], _format=args[1])
+ return
+# FIXME: I moved this to printFindViewWithContentDescription(..,op.,,) to solve the problem of variable not defined when
+# the script is invoked with -u
+# elif op == Operation.FLING_BACKWARD:
+# printFlingBackward(view)
+# return
+# elif op == Operation.FLING_FORWARD:
+# printFlingForward(view)
+# return
+# elif op == Operation.FLING_TO_BEGINNING:
+# printFlingToBeginning(view)
+# return
+# elif op == Operation.FLING_TO_END:
+# printFlingToEnd(view)
+# return
+ elif op == Operation.OPEN_NOTIFICATION:
+ printOpenNotification()
+ return
+ elif op == Operation.OPEN_QUICK_SETTINGS:
+ printOpenQuickSettings()
+ return
+ elif op == Operation.CHANGE_LANGUAGE:
+ printChangeLanguage(code=args[0])
+ return
+ elif op == Operation.START_ACTIVITY:
+ printStartActivity(component=args[0])
+ return
+ elif op == Operation.WAKE:
+ printWake()
+ return
+
+ if view is None:
+ warnings.warn('view is None. Perhaps you forgot to add some "op" in the previous if.')
+
+ bd = Descriptor.findBestDescriptor(view)
+ if bd == Descriptor.CONTENT_DESCRIPTION:
+ printFindViewWithContentDescription(view, options[CulebraOptions.USE_REGEXPS], op, args[0])
+ elif bd == Descriptor.TEXT:
+ printFindViewWithText(view, options[CulebraOptions.USE_REGEXPS], op, args[0])
+ else:
+ printFindViewById(view, op, args[0])
+
+def str2bool(v):
+ if len(v) < 1 or len(v) > 5:
+ # len('false')=5
+ warnings.warn("str2bool: strange value for conversion '%s' will be considered 'false'" % v)
+ return v.lower() in ("yes", "true", "t", "1", "on")
+
+def value2dictionaryKey(v):
+ v = v.lower()
+ k = ['id', 'text', 'content-description']
+ sk = ['i', 't', 'd']
+ if v in k:
+ return v
+ if v in sk:
+ return k[sk.index(v)]
+ error("Invalid dictionary key: %s" % v)
+ usage()
+
+def getShebangJar():
+ if options[CulebraOptions.USE_JAR]:
+ import java
+ osName = java.lang.System.getProperty('os.name')
+ if osName == 'Linux':
+ return SHEBANG[SB_JAR_LINUX]
+ else:
+ return SHEBANG[SB_JAR]
+ else:
+ return SHEBANG[SB_NO_JAR]
+
+def getWindowOption():
+ return options[CulebraOptions.WINDOW] if isinstance(options[CulebraOptions.WINDOW], str) and options[CulebraOptions.WINDOW][0] in '-0123456789' else "'%s'" % options[CulebraOptions.WINDOW]
+
+def printScriptHeader():
+ print '''%s
+# -*- coding: utf-8 -*-
+\'\'\'
+Copyright (C) 2013-2016 Diego Torres Milano
+Created on %s by Culebra v%s
+ __ __ __ __
+ / \ / \ / \ / \
+____________________/ __\/ __\/ __\/ __\_____________________________
+___________________/ /__/ /__/ /__/ /________________________________
+ | / \ / \ / \ / \ \___
+ |/ \_/ \_/ \_/ \ o \
+ \_____/--<
+@author: Diego Torres Milano
+@author: Jennifer E. Swofford (ascii art snake)
+\'\'\'
+
+
+import re
+import sys
+import os
+''' % (getShebangJar(), date.today(), __version__)
+
+def printUnittestImport():
+ print '''
+import unittest
+'''
+
+def printAppendToSysPath():
+ print '''
+try:
+ sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+'''
+
+def printPrependToSysPath():
+ print '''
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+'''
+
+def printLogAction(action, priority='D'):
+ # FIXME: This works only for CulebraTestCases
+ # This relies on shortcut variables already set (i.e. _v)
+ if options[CulebraOptions.MULTI_DEVICE]:
+ print u'%s[_d.Log.%s(TAG, "%s", _v) for _d in %sallDevices()]' % (indent, priority.lower(), action, prefix)
+ else:
+ print '%s%sdevice.Log.%s(TAG, "%s", _v)' % (indent, prefix, priority.lower(), action)
+
+def logAction(action):
+ if options[CulebraOptions.LOG_ACTIONS]:
+ printLogAction(action)
+
+def runCulebron():
+ Culebron.checkSupportedSdkVersion(device.getSdkVersion())
+ Culebron.checkDependencies()
+ culebron = Culebron(vc, device, serialno, printOperation, options[CulebraOptions.SCALE], options[CulebraOptions.CONCERTINA])
+ if options[CulebraOptions.DEVICE_ART]:
+ culebron.deviceArt = options[CulebraOptions.DEVICE_ART]
+ culebron.dropShadow = options[CulebraOptions.DROP_SHADOW]
+ culebron.screenGlare = options[CulebraOptions.SCREEN_GLARE]
+ culebron.takeScreenshotAndShowItOnWindow()
+ culebron.mainloop()
+
+def printShortcutVariables():
+ if options[CulebraOptions.UNIT_TEST_CLASS] or options[CulebraOptions.UNIT_TEST_METHOD]:
+ print '''\
+ _s = CulebraTests.sleep
+ _v = CulebraTests.verbose
+'''
+ else:
+ print '''\
+_s = 5
+_v = '--verbose' in sys.argv
+'''
+
+################
+# __main__
+################
+progname = os.path.basename(sys.argv[0])
+try:
+ optlist, args = getopt.getopt(sys.argv[1:], CulebraOptions.SHORT_OPTS, CulebraOptions.LONG_OPTS)
+ sys.argv[1:] = args
+except getopt.GetoptError, e:
+ error(str(e))
+ usage()
+
+kwargs1 = {CulebraOptions.VERBOSE: False, 'ignoresecuredevice': False, 'ignoreversioncheck': False}
+serialno = None
+kwargs2 = {ViewClientOptions.FORCE_VIEW_SERVER_USE: False, ViewClientOptions.START_VIEW_SERVER: True,
+ ViewClientOptions.AUTO_DUMP: False, ViewClientOptions.IGNORE_UIAUTOMATOR_KILLED: True,
+ ViewClientOptions.COMPRESSED_DUMP: True,
+ ViewClientOptions.USE_UIAUTOMATOR_HELPER: False,
+ }
+options = {CulebraOptions.FIND_VIEWS_BY_ID: True, CulebraOptions.FIND_VIEWS_WITH_TEXT: True,
+ CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION: True,
+ CulebraOptions.USE_REGEXPS: False, CulebraOptions.VERBOSE_COMMENTS: False,
+ CulebraOptions.UNIT_TEST_CLASS: False, CulebraOptions.UNIT_TEST_METHOD: None, CulebraOptions.USE_JAR: False,
+ CulebraOptions.USE_DICTIONARY: False, CulebraOptions.DICTIONARY_KEYS_FROM: 'id',
+ CulebraOptions.AUTO_REGEXPS: None, CulebraOptions.START_ACTIVITY: None, CulebraOptions.OUTPUT: None,
+ CulebraOptions.INTERACTIVE: False,
+ CulebraOptions.WINDOW: -1, CulebraOptions.PREPEND_TO_SYS_PATH: False,
+ CulebraOptions.SAVE_SCREENSHOT: None, CulebraOptions.SAVE_VIEW_SCREENSHOTS: None,
+ CulebraOptions.GUI: False,
+ CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP: False,
+ CulebraOptions.SCALE: 1,
+ CulebraOptions.ORIENTATION_LOCKED: None,
+ CulebraOptions.MULTI_DEVICE: False,
+ CulebraOptions.LOG_ACTIONS: False,
+ CulebraOptions.DEVICE_ART: None,
+ CulebraOptions.DROP_SHADOW: False,
+ CulebraOptions.SCREEN_GLARE: False,
+ CulebraOptions.NULL_BACK_END: False,
+ CulebraOptions.CONCERTINA: False,
+ CulebraOptions.INSTALL_APK: None,
+ }
+transform = traverseAndPrint
+for o, a in optlist:
+ o = o.strip('-')
+ if o in ['H', CulebraOptions.HELP]:
+ help()
+ elif o in ['V', CulebraOptions.VERBOSE]:
+ kwargs1[CulebraOptions.VERBOSE] = True
+ elif o in ['v', CulebraOptions.VERSION]:
+ version()
+ elif o in ['I', CulebraOptions.IGNORE_SECURE_DEVICE]:
+ kwargs1['ignoresecuredevice'] = True
+ elif o in ['E', CulebraOptions.IGNORE_VERSION_CHECK]:
+ kwargs1['ignoreversioncheck'] = True
+ elif o in ['F', CulebraOptions.FORCE_VIEW_SERVER_USE]:
+ kwargs2[ViewClientOptions.FORCE_VIEW_SERVER_USE] = True
+ elif o in ['S', CulebraOptions.DO_NOT_START_VIEW_SERVER]:
+ kwargs2[ViewClientOptions.START_VIEW_SERVER] = False
+ elif o in ['k', CulebraOptions.DO_NOT_IGNORE_UIAUTOMATOR_KILLED]:
+ kwargs2[ViewClientOptions.IGNORE_UIAUTOMATOR_KILLED] = False
+ elif o in ['w', CulebraOptions.WINDOW]:
+ options[CulebraOptions.WINDOW] = a
+ elif o in ['i', CulebraOptions.FIND_VIEWS_BY_ID]:
+ options[CulebraOptions.FIND_VIEWS_BY_ID] = str2bool(a)
+ elif o in ['t', CulebraOptions.FIND_VIEWS_WITH_TEXT]:
+ options[CulebraOptions.FIND_VIEWS_WITH_TEXT] = str2bool(a)
+ elif o in ['d', CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION]:
+ options[CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION] = str2bool(a)
+ elif o in ['r', CulebraOptions.USE_REGEXPS]:
+ options[CulebraOptions.USE_REGEXPS] = True
+ elif o in ['C', CulebraOptions.VERBOSE_COMMENTS]:
+ options[CulebraOptions.VERBOSE_COMMENTS] = True
+ elif o in ['U', CulebraOptions.UNIT_TEST_CLASS]:
+ options[CulebraOptions.UNIT_TEST_CLASS] = True
+ elif o in ['M', CulebraOptions.UNIT_TEST_METHOD]:
+ if not a.startswith('test'):
+ warnings.warn('Method name should start with "test"')
+ options[CulebraOptions.UNIT_TEST_METHOD] = a
+ elif o in ['j', CulebraOptions.USE_JAR]:
+ options[CulebraOptions.USE_JAR] = str2bool(a)
+ elif o in ['D', CulebraOptions.USE_DICTIONARY]:
+ options[CulebraOptions.USE_DICTIONARY] = str2bool(a)
+ elif o in ['K', CulebraOptions.DICTIONARY_KEYS_FROM]:
+ options[CulebraOptions.DICTIONARY_KEYS_FROM] = value2dictionaryKey(a)
+ elif o in ['R', CulebraOptions.AUTO_REGEXPS]:
+ options[CulebraOptions.AUTO_REGEXPS] = a.split(',')
+ for r in options[CulebraOptions.AUTO_REGEXPS]:
+ if r == 'help':
+ autoRegexpsHelp()
+ if r == 'all':
+ options[CulebraOptions.AUTO_REGEXPS] = CulebraOptions.AUTO_REGEXPS_RES.keys()
+ break
+ if r not in CulebraOptions.AUTO_REGEXPS_RES:
+ error("invalid auto regexp: %s\n" % (r))
+ usage()
+ # CulebraOptions.AUTO_REGEPXS implies CulebraOptions.USE_REGEXPS
+ options[CulebraOptions.USE_REGEXPS] = True
+ elif o in ['a', CulebraOptions.START_ACTIVITY]:
+ options[CulebraOptions.START_ACTIVITY] = a
+ elif o in ['o', CulebraOptions.OUTPUT]:
+ options[CulebraOptions.OUTPUT] = a
+ elif o in ['p', CulebraOptions.PREPEND_TO_SYS_PATH]:
+ options[CulebraOptions.PREPEND_TO_SYS_PATH] = True
+ elif o in ['f', CulebraOptions.SAVE_SCREENSHOT]:
+ options[CulebraOptions.SAVE_SCREENSHOT] = a
+ elif o in ['W', CulebraOptions.SAVE_VIEW_SCREENSHOTS]:
+ options[CulebraOptions.SAVE_VIEW_SCREENSHOTS] = a
+ elif o in ['G', CulebraOptions.GUI]:
+ options[CulebraOptions.GUI] = True
+ elif o in ['u', CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP]:
+ options[CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP] = True
+ elif o in ['P', CulebraOptions.SCALE]:
+ options[CulebraOptions.SCALE] = float(a)
+ elif o in ['O', CulebraOptions.ORIENTATION_LOCKED]:
+ options[CulebraOptions.ORIENTATION_LOCKED] = 'PENDING'
+ elif o in ['s', CulebraOptions.SERIALNO]:
+ __devices = a.split()
+ if len(__devices) > 1:
+ warnings.warn('List of devices not supported yet. Using first device instead.')
+ serialno = __devices[0]
+ elif o in ['m', CulebraOptions.MULTI_DEVICE]:
+ options[CulebraOptions.MULTI_DEVICE] = True
+ elif o in ['L', CulebraOptions.LOG_ACTIONS]:
+ options[CulebraOptions.LOG_ACTIONS] = True
+ elif o in ['A', CulebraOptions.DEVICE_ART]:
+ options[CulebraOptions.DEVICE_ART] = a
+ elif o in ['Z', CulebraOptions.DROP_SHADOW]:
+ options[CulebraOptions.DROP_SHADOW] = True
+ elif o in ['B', CulebraOptions.SCREEN_GLARE]:
+ options[CulebraOptions.SCREEN_GLARE] = True
+ elif o in ['0', CulebraOptions.NULL_BACK_END]:
+ options[CulebraOptions.NULL_BACK_END] = True
+ elif o in ['h', CulebraOptions.USE_UIAUTOMATOR_HELPER]:
+ kwargs2[ViewClientOptions.USE_UIAUTOMATOR_HELPER] = True
+ elif o in ['c', CulebraOptions.CONCERTINA]:
+ options[CulebraOptions.CONCERTINA] = True
+ elif o in ['1', CulebraOptions.INSTALL_APK]:
+ options[CulebraOptions.INSTALL_APK] = a
+
+if not (options[CulebraOptions.FIND_VIEWS_BY_ID] or options[CulebraOptions.FIND_VIEWS_WITH_TEXT] or options[CulebraOptions.FIND_VIEWS_WITH_CONTENT_DESCRIPTION]):
+ if not options[CulebraOptions.VERBOSE_COMMENTS]:
+ warnings.warn('All printing options disabled. Output will be empty.')
+ else:
+ warnings.warn('Only verbose comments will be printed')
+
+if kwargs2[ViewClientOptions.FORCE_VIEW_SERVER_USE] and options[CulebraOptions.NULL_BACK_END]:
+ warnings.warn(ViewClientOptions.FORCE_VIEW_SERVER_USE + " and " + CulebraOptions.NULL_BACK_END + " cannot be specified at the same time.")
+
+if options[CulebraOptions.MULTI_DEVICE] and not options[CulebraOptions.UNIT_TEST_CLASS]:
+ error("--" + CulebraOptions.MULTI_DEVICE + " only supported for unit tests (please specify --" + CulebraOptions.UNIT_TEST_CLASS + ")", fatal=True)
+
+device, serialno = ViewClient.connectToDeviceOrExit(serialno=serialno, **kwargs1)
+if options[CulebraOptions.ORIENTATION_LOCKED] == 'PENDING':
+ options[CulebraOptions.ORIENTATION_LOCKED] = device.display['orientation']
+if options[CulebraOptions.START_ACTIVITY]:
+ device.startActivity(component=options[CulebraOptions.START_ACTIVITY])
+if not options[CulebraOptions.NULL_BACK_END]:
+ vc = ViewClient(device, serialno, **kwargs2)
+else:
+ vc = None
+if options[CulebraOptions.OUTPUT]:
+ sys.stdout = codecs.open(options[CulebraOptions.OUTPUT], mode='w', encoding='utf-8', errors='replace')
+ import stat
+ st = os.stat(options[CulebraOptions.OUTPUT])
+ os.chmod(options[CulebraOptions.OUTPUT], st.st_mode | stat.S_IEXEC)
+
+if options[CulebraOptions.UNIT_TEST_CLASS] or (not options[CulebraOptions.UNIT_TEST_METHOD]):
+ printScriptHeader()
+
+if options[CulebraOptions.UNIT_TEST_CLASS]:
+ printUnittestImport()
+
+if options[CulebraOptions.PREPEND_TO_SYS_PATH]:
+ printPrependToSysPath()
+
+if options[CulebraOptions.UNIT_TEST_CLASS] or (not options[CulebraOptions.UNIT_TEST_METHOD]):
+ print '''\
+from com.dtmilano.android.viewclient import ViewClient%s
+
+TAG = '%s'
+''' % (', CulebraTestCase' if options[CulebraOptions.UNIT_TEST_CLASS] else '', TAG)
+
+if options[CulebraOptions.UNIT_TEST_CLASS]:
+ print '''
+class CulebraTests(CulebraTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ cls.kwargs1 = %s
+ cls.kwargs2 = %s
+ cls.options = %s
+ cls.sleep = 5
+
+''' % (kwargs1, kwargs2, options),
+
+ print '''\
+ def setUp(self):
+ super(CulebraTests, self).setUp()
+'''
+
+ print '''\
+ def tearDown(self):
+ super(CulebraTests, self).tearDown()
+'''
+
+ print '''\
+ def preconditions(self):
+ if not super(CulebraTests, self).preconditions():
+ return False
+''',
+
+ if options[CulebraOptions.INSTALL_APK]:
+ print '''\
+ if self.vc.installPackage(\"%s\") != 0:
+ return False
+''' % (options[CulebraOptions.INSTALL_APK]),
+
+ print '''\
+ return True
+
+ def %s(self):
+ if not self.preconditions():
+ self.fail('Preconditions failed')
+''' % (options[CulebraOptions.UNIT_TEST_METHOD] if options[CulebraOptions.UNIT_TEST_METHOD] else 'testSomething')
+
+ printShortcutVariables()
+
+ if options[CulebraOptions.SAVE_SCREENSHOT]:
+ print '''\
+ self.vc.writeImageToFile('%s')
+ ''' % options[CulebraOptions.SAVE_SCREENSHOT]
+
+ if options[CulebraOptions.USE_DICTIONARY]:
+ print '''\
+ self.views = dict()'''
+
+ if not options[CulebraOptions.GUI]:
+ vc.dump(window=options[CulebraOptions.WINDOW])
+ indent = ' ' * 8
+ prefix = 'self.'
+
+# if not options[CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP]:
+# print '''\
+# self.vc.dump(%s)
+# ''' % getWindowOption()
+# vc.traverse(transform=transform)
+# print
+
+ if options[CulebraOptions.GUI]:
+ runCulebron()
+ elif not options[CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP]:
+ printDump(getWindowOption())
+ else:
+ print '''\
+ ## your test code here ##
+ '''
+
+ print '''
+
+if __name__ == '__main__':
+ CulebraTests.main()
+'''
+else:
+ # Not a unittest class, still could be a unittest method as we allow to generate methods separately from their classes
+ if not options[CulebraOptions.UNIT_TEST_METHOD]:
+ printShortcutVariables()
+ print '''
+kwargs1 = %s
+device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
+''' % kwargs1,
+
+ if options[CulebraOptions.START_ACTIVITY] and not options[CulebraOptions.UNIT_TEST_METHOD]:
+ print '''\
+device.startActivity(component='%s')''' % options[CulebraOptions.START_ACTIVITY]
+
+ if not options[CulebraOptions.UNIT_TEST_METHOD]:
+ print '''\
+kwargs2 = %s
+vc = ViewClient(device, serialno, **kwargs2)
+#vc.dump(window=%s) # FIXME: seems not needed
+''' % (kwargs2, getWindowOption())
+
+ if options[CulebraOptions.USE_DICTIONARY]:
+ print '''views = dict()'''
+
+ if options[CulebraOptions.SAVE_SCREENSHOT]:
+ print '''\
+vc.writeImageToFile('%s')
+''' % options[CulebraOptions.SAVE_SCREENSHOT]
+
+ if vc:
+ vc.dump(window=options[CulebraOptions.WINDOW])
+ if options[CulebraOptions.UNIT_TEST_METHOD]:
+ print '''
+ def %s(self):
+ \'\'\'
+ Test method.
+ \'\'\'
+
+ if not self.preconditions():
+ self.fail('Preconditions failed')
+''' % (options[CulebraOptions.UNIT_TEST_METHOD])
+ indent = ' ' * 8
+ prefix = 'self.'
+ printShortcutVariables()
+
+ if options[CulebraOptions.GUI]:
+ runCulebron()
+ elif not options[CulebraOptions.DO_NOT_VERIFY_SCREEN_DUMP]:
+ printDump(getWindowOption())
+
+if kwargs2[ViewClientOptions.USE_UIAUTOMATOR_HELPER]:
+ try:
+ vc.uiAutomatorHelper.quit()
+ except:
+ pass
+
+if options[CulebraOptions.INTERACTIVE]:
+ import socket
+ HOST = 'localhost'
+ PORT = 8900
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect((HOST, PORT))
+ s.sendall("RECORD EVENTS START\n")
+ fin = open("/dev/tty")
+ while True:
+ print >> sys.stderr, "Reading events..."
+ data = s.recv(1024)
+ code = ViewClient.excerpt(data)
+ exec code
+ resp = raw_input("Continue recording events? [Y/n]: ")
+ if resp in ['N', 'n']:
+ break
+ s.sendall("RECORD EVENTS STOP\n")
+ s.close()
+
diff --git a/AndroidViewClient/tools/dump b/AndroidViewClient/tools/dump
new file mode 100755
index 0000000..33cbbd5
--- /dev/null
+++ b/AndroidViewClient/tools/dump
@@ -0,0 +1,205 @@
+#! /usr/bin/env python
+'''
+Copyright (C) 2012-2015 Diego Torres Milano
+Created on Feb 3, 2012
+
+@author: diego
+'''
+
+__version__ = '11.5.9'
+
+import sys
+import os
+import getopt
+
+try:
+ sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
+except:
+ pass
+
+from com.dtmilano.android.viewclient import ViewClient, View, ViewClientOptions
+
+HELP = 'help'
+VERBOSE = 'verbose'
+VERSION = 'version'
+IGNORE_SECURE_DEVICE = 'ignore-secure-device'
+IGNORE_VERSION_CHECK = 'ignore-version-check'
+FORCE_VIEW_SERVER_USE = 'force-view-server-use'
+DO_NOT_START_VIEW_SERVER = 'do-not-start-view-server'
+DO_NOT_IGNORE_UIAUTOMATOR_KILLED = 'do-not-ignore-uiautomator-killed'
+WINDOW = 'window'
+ALL = 'all'
+UNIQUE_ID = 'uniqueId'
+POSITION = 'position'
+BOUNDS = 'bounds'
+CONTENT_DESCRIPTION = 'content-description'
+TAG = 'tag'
+CENTER = 'center'
+SAVE_SCREENSHOT = 'save-screenshot'
+SAVE_VIEW_SCREENSHOTS = 'save-view-screenshots'
+DO_NOT_DUMP_VIEWS = 'do-not-dump-views'
+DEVICE_ART = 'device-art'
+DROP_SHADOW = 'drop-shadow'
+SCREEN_GLARE = 'glare'
+USE_UIAUTOMATOR_HELPER = 'use-uiautomator-helper'
+
+MAP = {
+ 'a':View.__str__, ALL:View.__str__,
+ 'i':ViewClient.TRAVERSE_CITUI, UNIQUE_ID:ViewClient.TRAVERSE_CITUI,
+ 'x':ViewClient.TRAVERSE_CITPS, POSITION:ViewClient.TRAVERSE_CITPS,
+ 'b':ViewClient.TRAVERSE_CITB, BOUNDS:ViewClient.TRAVERSE_CITB,
+ 'd':ViewClient.TRAVERSE_CITCD, CONTENT_DESCRIPTION:ViewClient.TRAVERSE_CITCD,
+ 'g':ViewClient.TRAVERSE_CITG, TAG:ViewClient.TRAVERSE_CITG,
+ 'c':ViewClient.TRAVERSE_CITC, CENTER:ViewClient.TRAVERSE_CITC,
+ 'W':ViewClient.TRAVERSE_CITCDS, SAVE_VIEW_SCREENSHOTS:ViewClient.TRAVERSE_CITCDS,
+ 'D':ViewClient.TRAVERSE_S, DO_NOT_DUMP_VIEWS:ViewClient.TRAVERSE_S
+ }
+
+USAGE = 'usage: %s [OPTION]... [serialno]'
+SHORT_OPTS = 'HVvIEFSkw:aixbdgcf:W:DA:ZBh'
+LONG_OPTS = [HELP, VERBOSE, VERSION, IGNORE_SECURE_DEVICE, IGNORE_VERSION_CHECK, FORCE_VIEW_SERVER_USE,
+ DO_NOT_START_VIEW_SERVER, DO_NOT_IGNORE_UIAUTOMATOR_KILLED, WINDOW + '=',
+ ALL, UNIQUE_ID, POSITION, BOUNDS, CONTENT_DESCRIPTION, TAG, CENTER,
+ SAVE_SCREENSHOT + '=', SAVE_VIEW_SCREENSHOTS + '=',
+ DO_NOT_DUMP_VIEWS,
+ DEVICE_ART + '=', DROP_SHADOW, SCREEN_GLARE,
+ USE_UIAUTOMATOR_HELPER,
+ ]
+LONG_OPTS_ARG = {WINDOW: 'WINDOW', SAVE_SCREENSHOT: 'FILE', SAVE_VIEW_SCREENSHOTS: 'DIR', DEVICE_ART: 'MODEL'}
+OPTS_HELP = {
+ 'H': 'prints this help',
+ 'V': 'verbose comments',
+ 'I': 'ignore secure device',
+ 'F': 'force view server use (even if UiAutomator present)',
+ 'S': 'don\'t start ViewServer',
+ 'k': 'don\'t ignore UiAutomator killed',
+ 'w': 'dump WINDOW content (default: -1, all windows)',
+ 'a': 'dump all information about Views',
+ 'i': 'dump View unique IDs',
+ 'x': 'dump View positions',
+ 'b': 'dump View bounds',
+ 'd': 'dump View content descriptions',
+ 'g': 'dump View tags',
+ 'c': 'dump View centers',
+ 'f': 'save screenshot to file',
+ 'W': 'save View screenshots to files in directory',
+ 'E': 'ignores ADB version check',
+ 'D': 'don\'t dump views, only useful if you specified -f or -W',
+ 'A': 'device art model to frame screenshot (auto: autodetected)',
+ 'Z': 'drop shadow for device art screenshot',
+ 'B': 'screen glare over screenshot',
+ 'h': 'use UiAutomatorHelper Android app',
+ }
+
+def shortAndLongOptions():
+ '''
+ @return: the list of corresponding (short-option, long-option) tuples
+ '''
+
+ short_opts = SHORT_OPTS.replace(':', '')
+ if len(short_opts) != len(LONG_OPTS):
+ raise Exception('There is a mismatch between short and long options')
+ t = tuple(short_opts) + tuple(LONG_OPTS)
+ l2 = len(t)/2
+ sl = []
+ for i in range(l2):
+ sl.append((t[i], t[i+l2]))
+ return sl
+
+def usage(exitVal=1):
+ print >> sys.stderr, USAGE % progname
+ print >> sys.stderr, "Try '%s --help' for more information." % progname
+ sys.exit(exitVal)
+
+def help():
+ print >> sys.stderr, USAGE % progname
+ print >> sys.stderr
+ print >> sys.stderr, "Options:"
+ for so, lo in shortAndLongOptions():
+ o = ' -%c, --%s' % (so, lo)
+ if lo[-1] == '=':
+ o += LONG_OPTS_ARG[lo[:-1]]
+ try:
+ o = '%-34s %-45s' % (o, OPTS_HELP[so])
+ except:
+ pass
+ print >> sys.stderr, o
+ sys.exit(0)
+
+def version():
+ print progname, __version__
+ sys.exit(0)
+
+# __main__
+progname = os.path.basename(sys.argv[0])
+try:
+ opts, args = getopt.getopt(sys.argv[1:], SHORT_OPTS, LONG_OPTS)
+ sys.argv[1:] = args
+except getopt.GetoptError, e:
+ print >>sys.stderr, 'ERROR:', str(e)
+ usage()
+
+kwargs1 = {VERBOSE: False, 'ignoresecuredevice': False, 'ignoreversioncheck': False}
+kwargs2 = {ViewClientOptions.FORCE_VIEW_SERVER_USE: False, ViewClientOptions.START_VIEW_SERVER: True,
+ ViewClientOptions.AUTO_DUMP: False, ViewClientOptions.IGNORE_UIAUTOMATOR_KILLED: True,
+ ViewClientOptions.COMPRESSED_DUMP: True,
+ ViewClientOptions.USE_UIAUTOMATOR_HELPER: False,
+ }
+options = {WINDOW: -1, SAVE_SCREENSHOT: None, SAVE_VIEW_SCREENSHOTS: None, DO_NOT_DUMP_VIEWS: False,
+ DEVICE_ART: None, DROP_SHADOW: False, SCREEN_GLARE: False}
+transform = ViewClient.TRAVERSE_CIT
+for o, a in opts:
+ o = o.strip('-')
+ if o in ['H', HELP]:
+ help()
+ elif o in ['V', VERBOSE]:
+ kwargs1[VERBOSE] = True
+ elif o in ['v', VERSION]:
+ version()
+ elif o in ['I', IGNORE_SECURE_DEVICE]:
+ kwargs1['ignoresecuredevice'] = True
+ elif o in ['E', IGNORE_VERSION_CHECK]:
+ kwargs1['ignoreversioncheck'] = True
+ elif o in ['F', FORCE_VIEW_SERVER_USE]:
+ kwargs2[ViewClientOptions.FORCE_VIEW_SERVER_USE] = True
+ elif o in ['S', DO_NOT_START_VIEW_SERVER]:
+ kwargs2[ViewClientOptions.START_VIEW_SERVER] = False
+ elif o in ['k', DO_NOT_IGNORE_UIAUTOMATOR_KILLED]:
+ kwargs2[ViewClientOptions.IGNORE_UIAUTOMATOR_KILLED] = False
+ elif o in ['w', WINDOW]:
+ options[WINDOW] = a
+ elif o in ['f', SAVE_SCREENSHOT]:
+ options[SAVE_SCREENSHOT] = a
+ elif o in ['W', SAVE_VIEW_SCREENSHOTS]:
+ options[SAVE_VIEW_SCREENSHOTS] = a
+ transform = MAP[o]
+ elif o in ['A', DEVICE_ART]:
+ options[DEVICE_ART] = a
+ elif o in ['Z', DROP_SHADOW]:
+ options[DROP_SHADOW] = True
+ elif o in ['B', SCREEN_GLARE]:
+ options[SCREEN_GLARE] = True
+ elif o in ['h', USE_UIAUTOMATOR_HELPER]:
+ kwargs2[ViewClientOptions.USE_UIAUTOMATOR_HELPER] = True
+ elif o in ['D', DO_NOT_DUMP_VIEWS]:
+ options[DO_NOT_DUMP_VIEWS] = True
+ transform = MAP[o]
+ else:
+ transform = MAP[o]
+
+if options[DO_NOT_DUMP_VIEWS]:
+ transform = MAP[DO_NOT_DUMP_VIEWS]
+
+vc = ViewClient(*ViewClient.connectToDeviceOrExit(**kwargs1), **kwargs2)
+if options[SAVE_SCREENSHOT]:
+ vc.device.reconnect = True #(not options[DO_NOT_DUMP_VIEWS])
+ vc.writeImageToFile(options[SAVE_SCREENSHOT], deviceart=options[DEVICE_ART], dropshadow=options[DROP_SHADOW], screenglare=options[SCREEN_GLARE])
+if not options[DO_NOT_DUMP_VIEWS] or options[SAVE_VIEW_SCREENSHOTS]:
+ vc.dump(window=options[WINDOW])
+ ViewClient.imageDirectory = options[SAVE_VIEW_SCREENSHOTS]
+ vc.traverse(transform=transform)
+if kwargs2[ViewClientOptions.USE_UIAUTOMATOR_HELPER]:
+ try:
+ vc.uiAutomatorHelper.quit()
+ except:
+ pass
diff --git a/AndroidViewClient/uml/AndroidViewClient.zargo b/AndroidViewClient/uml/AndroidViewClient.zargo
new file mode 100755
index 0000000..98f8457
--- /dev/null
+++ b/AndroidViewClient/uml/AndroidViewClient.zargo
Binary files differ
diff --git a/AndroidViewClient/viewclient.epydoc b/AndroidViewClient/viewclient.epydoc
new file mode 100755
index 0000000..c2e1686
--- /dev/null
+++ b/AndroidViewClient/viewclient.epydoc
@@ -0,0 +1,149 @@
+[epydoc] # Epydoc section marker (required by ConfigParser)
+
+# The list of objects to document. Objects can be named using
+# dotted names, module filenames, or package directory names.
+# Alases for this option include "objects" and "values".
+modules: src/com/dtmilano/android/
+
+# The type of output that should be generated. Should be one
+# of: html, text, latex, dvi, ps, pdf.
+output: html
+
+# The path to the output directory. May be relative or absolute.
+target: doc/
+
+# An integer indicating how verbose epydoc should be. The default
+# value is 0; negative values will supress warnings and errors;
+# positive values will give more verbose output.
+verbosity: 1
+
+# A boolean value indicating that Epydoc should show a tracaback
+# in case of unexpected error. By default don't show tracebacks
+debug: 0
+
+# If True, don't try to use colors or cursor control when doing
+# textual output. The default False assumes a rich text prompt
+simple-term: 1
+
+
+### Generation options
+
+# The default markup language for docstrings, for modules that do
+# not define __docformat__. Defaults to epytext.
+docformat: epytext
+
+# Whether or not parsing should be used to examine objects.
+parse: yes
+
+# Whether or not introspection should be used to examine objects.
+introspect: yes
+
+# Don't examine in any way the modules whose dotted name match this
+# regular expression pattern.
+#exclude
+
+# Don't perform introspection on the modules whose dotted name match this
+# regular expression pattern.
+#exclude-introspect
+
+# Don't perform parsing on the modules whose dotted name match this
+# regular expression pattern.
+#exclude-parse
+
+# The format for showing inheritance objects.
+# It should be one of: 'grouped', 'listed', 'included'.
+inheritance: listed
+
+# Whether or not to inclue private variables. (Even if included,
+# private variables will be hidden by default.)
+private: yes
+
+# Whether or not to list each module's imports.
+imports: no
+
+# Whether or not to include syntax highlighted source code in
+# the output (HTML only).
+sourcecode: yes
+
+# Whether or not to includea a page with Epydoc log, containing
+# effective option at the time of generation and the reported logs.
+include-log: no
+
+
+### Output options
+
+# The documented project's name.
+#name: Example
+
+# The CSS stylesheet for HTML output. Can be the name of a builtin
+# stylesheet, or the name of a file.
+css: white
+
+# The documented project's URL.
+url: http://dtmilano.com/viewclient
+
+# HTML code for the project link in the navigation bar. If left
+# unspecified, the project link will be generated based on the
+# project's name and URL.
+#link: <a href="somewhere">My Cool Project</a>
+
+# The "top" page for the documentation. Can be a URL, the name
+# of a module or class, or one of the special names "trees.html",
+# "indices.html", or "help.html"
+#top: os.path
+
+# An alternative help file. The named file should contain the
+# body of an HTML file; navigation bars will be added to it.
+#help: my_helpfile.html
+
+# Whether or not to include a frames-based table of contents.
+frames: yes
+
+# Whether each class should be listed in its own section when
+# generating LaTeX or PDF output.
+separate-classes: no
+
+
+### API linking options
+
+# Define a new API document. A new interpreted text role
+# will be created
+#external-api: epydoc
+
+# Use the records in this file to resolve objects in the API named NAME.
+#external-api-file: epydoc:api-objects.txt
+
+# Use this URL prefix to configure the string returned for external API.
+#external-api-root: epydoc:http://epydoc.sourceforge.net/api
+
+
+### Graph options
+
+# The list of graph types that should be automatically included
+# in the output. Graphs are generated using the Graphviz "dot"
+# executable. Graph types include: "classtree", "callgraph",
+# "umlclass". Use "all" to include all graph types
+graph: all
+
+# The path to the Graphviz "dot" executable, used to generate
+# graphs.
+dotpath: /usr/local/bin/dot
+
+# The name of one or more pstat files (generated by the profile
+# or hotshot module). These are used to generate call graphs.
+pstat: profile.out
+
+# Specify the font used to generate Graphviz graphs.
+# (e.g., helvetica or times).
+graph-font: Helvetica
+
+# Specify the font size used to generate Graphviz graphs.
+graph-font-size: 10
+
+
+### Return value options
+
+# The condition upon which Epydoc should exit with a non-zero
+# exit status. Possible values are error, warning, docstring_warning
+#fail-on: error
+