Skip to content

Commit 192131b

Browse files
committed
Added Excerpt2Code and excerpt()
- Reformat - culebra: Added interactive support
1 parent d5302e6 commit 192131b

2 files changed

Lines changed: 78 additions & 33 deletions

File tree

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

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -919,15 +919,15 @@ def EndElement(self, name):
919919
if name == 'hierarchy':
920920
pass
921921
elif name == 'node':
922-
self.nodeStack.pop( )
922+
self.nodeStack.pop()
923923

924924
def CharacterData(self, data):
925925
'''
926926
Expat character data event handler
927927
'''
928928

929-
if data.strip( ):
930-
data = data.encode( )
929+
if data.strip():
930+
data = data.encode()
931931
element = self.nodeStack[-1]
932932
element.cdata += data
933933

@@ -942,6 +942,52 @@ def Parse(self, uiautomatorxml):
942942
parserStatus = parser.Parse(uiautomatorxml, 1)
943943
return self.root
944944

945+
class Excerpt2Code():
946+
''' Excerpt XML to code '''
947+
948+
def __init__(self):
949+
self.data = None
950+
951+
def StartElement(self, name, attributes):
952+
'''
953+
Expat start element event handler
954+
'''
955+
if name == 'excerpt':
956+
pass
957+
else:
958+
warnings.warn("Unexpected element: '%s'" % name)
959+
960+
def EndElement(self, name):
961+
'''
962+
Expat end element event handler
963+
'''
964+
965+
if name == 'excerpt':
966+
pass
967+
968+
def CharacterData(self, data):
969+
'''
970+
Expat character data event handler
971+
'''
972+
973+
if data.strip():
974+
data = data.encode()
975+
if not self.data:
976+
self.data = data
977+
else:
978+
self.data += data
979+
980+
def Parse(self, excerpt):
981+
# Create an Expat parser
982+
parser = xml.parsers.expat.ParserCreate()
983+
# Set the Expat event handlers to our methods
984+
parser.StartElementHandler = self.StartElement
985+
parser.EndElementHandler = self.EndElement
986+
parser.CharacterDataHandler = self.CharacterData
987+
# Parse the XML
988+
parserStatus = parser.Parse(excerpt, 1)
989+
return self.data
990+
945991
class ViewClient:
946992
'''
947993
ViewClient is a I{ViewServer} client.
@@ -2053,6 +2099,14 @@ def isKeyboardShown(self):
20532099
return "mInputShown=true" in dim
20542100
return False
20552101

2102+
@staticmethod
2103+
def excerpt(str, execute=False):
2104+
code = Excerpt2Code().Parse(str)
2105+
if execute:
2106+
exec code
2107+
else:
2108+
return code
2109+
20562110

20572111
if __name__ == "__main__":
20582112
try:

AndroidViewClient/tools/culebra

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ try:
4747
except:
4848
pass
4949

50-
from com.dtmilano.android.viewclient import ViewClient
50+
from com.dtmilano.android.viewclient import ViewClient, View
5151

5252
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
5353

@@ -464,32 +464,23 @@ vc.dump(window=options[WINDOW])
464464
vc.traverse(transform=transform)
465465

466466
if options[INTERACTIVE]:
467-
sys.path.insert(0, '/Users/diego/Work/workspace/AndroidEventRecorder/src')
468-
print sys.path
469-
import com.dtmilano.android.eventrecorder
470-
#from com.dtmilano.android.eventrecorder import EventRecorder
471-
# try:
472-
# #cmdStr = "/bin/ls -l"
473-
# cmdStr = "/Users/diego/Work/workspace/AndroidEventPlayer/samples/runme.sh"
474-
# #cmdStr = '%(ANDROID_EVENT_PLAYER_HOME)s/src/com/dtmilano/android/eventrecorder.py -v -n -d %(TIMED)s %(DEVICE)s' % {'ANDROID_EVENT_PLAYER_HOME': '/Users/diego/Work/workspace/AndroidEventPlayer', 'TIMED': '', 'DEVICE': '/dev/input/event0'}
475-
# print cmdStr
476-
# cmd = cmdStr.split()
477-
#
478-
# pipe = subprocess.Popen(cmd, shell=False) #, stdout=subprocess.PIPE)
479-
# if not pipe:
480-
# print >>sys.stderr, "Cannot create pipe"
481-
# sys.exit(2)
482-
# print "pipe", pipe
483-
# pipe.communicate()
484-
#
485-
# while True:
486-
# print >>sys.stderr, "reading..."
487-
# line = pipe.stdout.readline()
488-
# if not line:
489-
# break
490-
# print line
491-
# self.pipe.poll()
492-
# if self.pipe.returncode is not None:
493-
# break
494-
# except Exception, e:
495-
# print >>sys.stderr, "ERROR:", e
467+
import socket
468+
HOST = 'localhost'
469+
PORT = 8900
470+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
471+
s.connect((HOST, PORT))
472+
s.sendall("RECORD EVENTS START\n")
473+
fin = open("/dev/tty")
474+
while True:
475+
print >>sys.stderr, "Reading events..."
476+
data = s.recv(1024)
477+
code = ViewClient.excerpt(data)
478+
exec code
479+
# unfortunately, this does not work with monkeyrunner
480+
#resp = raw_input("Continue recording events? [Y/n]: ")
481+
print >>sys.stderr, "Continue recording events? [Y/n]: "
482+
resp = fin.readline().strip()
483+
if resp in ['N', 'n']:
484+
break
485+
s.sendall("RECORD EVENTS STOP\n")
486+
s.close()

0 commit comments

Comments
 (0)