UAT_tree.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. # -*- coding:utf-8 -*-
  2. import os, sys, time,json
  3. from collections import OrderedDict
  4. from ssat_sdk.utils.string_util import strToList
  5. from UAT_log import error,info,debug
  6. DEBUG = True
  7. INFO = True
  8. ERROR = True
  9. class FirstLevel():
  10. ParentCol = 0
  11. ShortCutKeyCol = ParentCol + 1
  12. UIViewCol = ParentCol + 2
  13. MoveKeyCol = ParentCol + 3
  14. ToParentKeyCol = ParentCol + 4
  15. LayoutCol = ParentCol + 5
  16. OptionCol = ParentCol + 6
  17. OptionViewCol = ParentCol + 7
  18. FocusSelectCol = ParentCol + 8
  19. FocuseViewCol = ParentCol + 9
  20. EnterKeyCol = ParentCol + 10
  21. TextValueCol = ParentCol + 11
  22. InfoViewCol = ParentCol + 12
  23. OthersCol = ParentCol + 13
  24. class NLevel():
  25. ParentCol = 0
  26. UIViewCol = ParentCol + 1
  27. MoveKeyCol = ParentCol + 2
  28. ToParentKeyCol = ParentCol + 3
  29. LayoutCol = ParentCol + 4
  30. OptionCol = ParentCol + 5
  31. OptionViewCol = ParentCol + 6
  32. FocusSelectCol = ParentCol + 7
  33. FocuseViewCol = ParentCol + 8
  34. EnterKeyCol = ParentCol + 9
  35. TextValueCol = ParentCol + 10
  36. InfoViewCol = ParentCol + 11
  37. OthersCol = ParentCol + 12
  38. class DialogLevel():
  39. DialogCol = 0
  40. UIViewCol = DialogCol + 1
  41. MoveKeyCol = DialogCol + 2
  42. ToParentKeyCol = DialogCol + 3
  43. LayoutCol = DialogCol + 4
  44. OptionCol = DialogCol + 5
  45. OptionViewCol = DialogCol + 6
  46. FocusSelectCol = DialogCol + 7
  47. FocuseViewCol = DialogCol + 8
  48. EnterKeyCol = DialogCol + 9
  49. TextValueCol = DialogCol + 10
  50. InfoViewCol = DialogCol + 11
  51. OthersCol = DialogCol + 12
  52. FirstPrev = "first-prev"
  53. class UATTree():
  54. TAB_NAME = "name"
  55. TAB_SHORTCUT_KEY = "shortcut_key"
  56. TAB_UI_VIEW = "uiview"
  57. TAB_MOVE_KEY = "move_key"
  58. TAB_TOPARENT_KEY = "toparent_key"
  59. TAB_LAYOUT = "layout"
  60. TAB_OPTION = "option"
  61. TAB_LEVEL = "level"
  62. TAB_PREV_PARENT = "prev_parent"
  63. TAB_NEXT_PARENT = "next_parent"
  64. TAB_OPTION_VIEW = "optionView"
  65. TAB_FOCUS_SELECT = "focus-select"
  66. TAB_FOCUSE_VIEW = "focuseView"
  67. TAB_TEXT_VALUE = "textValue"
  68. TAB_ENTER_KEY = "enter_key"
  69. TAB_PARENT_NAME = "parentName"
  70. TAB_INFO_VIEW = "infoView"
  71. TAB_OTHERS = "others"
  72. def __init__(self):
  73. self.treeDict = OrderedDict()
  74. self.dialogDict = OrderedDict()
  75. self.cls = "UATTree"
  76. '''
  77. char为该项参数的括符符号,必须成对带入。默认为中括号[]
  78. '''
  79. #将数据从excel表格里取出来,只返回括号里面的内容
  80. def parseParam(self, key, params, char = "[]"):
  81. # 为防止key在其他地方存在相同关键字,添加一个"["做区别
  82. key = key + char[0]
  83. keyIndex = params.find(key)
  84. if keyIndex == -1:
  85. return ""
  86. # key.__len__()-1 为去掉"["的处理
  87. str1 = params[keyIndex + key.__len__()-1:params.__len__()]
  88. i1 = str1.find(char[0])
  89. i2 = str1.find(char[1])
  90. if i1 == -1 or i2 == -1:
  91. return ""
  92. str2 = str1[i1 + 1: i2]
  93. return str2.strip()
  94. def findAllParam(self, key, params,seg="[]"):
  95. paramArr = []
  96. # for i in range(2):
  97. while True:
  98. keyIndex = params.find(key)
  99. if keyIndex == -1:
  100. break
  101. endIndex = params.find(seg[1])
  102. oneParam = params[keyIndex+key.__len__()+1:endIndex]
  103. params = params[endIndex+1:]
  104. paramArr.append(oneParam)
  105. return paramArr
  106. '''
  107. 返回:{key:value,key2:value2,...}
  108. '''
  109. def parseMulParam(self, keyList, params):
  110. paramDict = {}
  111. for key in keyList:
  112. value = self.parseParam(key, params)
  113. paramDict[key] = value
  114. return paramDict
  115. '''
  116. 例如:enter_key,event[]ir[]同时存在多个
  117. 返回:[[key,value],[key,value],...]
  118. '''
  119. def parseMulParam_Same(self, keyList, params):
  120. mulParam=[]
  121. for key in keyList:
  122. paramArr = self.findAllParam(key, params)
  123. for param in paramArr:
  124. keyItem = [key]
  125. keyItem.append(param)
  126. mulParam.append(keyItem)
  127. return mulParam
  128. #KeyDict数据
  129. Key_AM = "am" #android am命令
  130. Key_Event = "event" #android KeyEvent
  131. Key_IR = "ir" #红外按键
  132. Key_Input = "input" #Android input命令
  133. Max_Try = "max_try"
  134. #根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合
  135. '''
  136. 用于解析move key参数
  137. '''
  138. def parseKey(self, keyStr):
  139. keyList = [self.Key_AM, self.Key_Event, self.Key_IR, self.Key_Input, self.Max_Try]
  140. keyDict = self.parseMulParam(keyList, keyStr)
  141. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  142. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  143. return keyDict
  144. '''
  145. 不考虑按键种类,解析按键名、等待时间等参数,enter,wait=1,enterParent=hdmi_settings
  146. 返回结果:{"keyvalue":[left,right,enter],"wait":'1',"times":"1"}
  147. '''
  148. def parseKeyParam(self, keyParamStr):
  149. paramDict = {self.Key_Value:[],self.Wait_Time:'0', self.Key_Times:'1', self.Duration_Time:'1'}
  150. paramArr = strToList(keyParamStr,",")
  151. keyValue=[]
  152. for param in paramArr:
  153. if "=" not in param:
  154. keyValue.append(param.strip())
  155. else:
  156. pArr = strToList(param,"=")
  157. paramDict[pArr[0].strip().lower()] = pArr[1].strip()
  158. paramDict[self.Key_Value] = keyValue
  159. return paramDict
  160. # enterKeyDict数据
  161. Wait_Time = "wait"
  162. Duration_Time = "duration"
  163. Enter_Parent = "enterparent"
  164. Key_Value = "keyvalue"
  165. Key_Type = "keytype"
  166. Key_Param = "key_param"
  167. Key_Times = "times"
  168. # 根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合
  169. '''
  170. 返回值:[{"enterParent":"","key_param":{"keyType","event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}}
  171. ,...]
  172. '''
  173. def parseEnterKey(self, keyStr, optionName):
  174. keyList = [self.Key_Event, self.Key_IR, self.Key_Input]
  175. keyArr = self.parseMulParam_Same(keyList, keyStr)
  176. retArr = []
  177. for keyItem in keyArr:
  178. nextPDict = {} #{"enterParent":"","key_param":{"keyType","event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}}
  179. keyParamDict = self.parseKeyParam(keyItem[1])
  180. keyParamDict[self.Key_Type] = keyItem[0]
  181. nextPDict[self.Key_Param] = keyParamDict
  182. keyParamDict[self.Wait_Time] = float(keyParamDict[self.Wait_Time])
  183. keyParamDict[self.Duration_Time] = float(keyParamDict[self.Duration_Time])
  184. keyParamDict[self.Key_Times] = int(keyParamDict[self.Key_Times])
  185. if keyParamDict.has_key(self.Enter_Parent) is False:
  186. keyParamDict[self.Enter_Parent] = optionName
  187. nextPDict[self.Enter_Parent] = keyParamDict[self.Enter_Parent]
  188. retArr.append(nextPDict)
  189. return retArr
  190. #Android View数据
  191. View_ID = "resid" #android view resource-id
  192. View_Text = "text" #android view 文本内容。 用于焦点定位,文本组件坐标被焦点组件坐标包含
  193. View_Desc = "desc" #android view描述
  194. View_Bounds = "bounds" #android view 坐标
  195. View_Index = "index"
  196. View_Class = "class"
  197. '''
  198. 主要用于infoView数据解析
  199. '''
  200. def parseView(self, viewStr):
  201. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class]
  202. positionList = [u"left",u"top",u"right",u"bottom"]
  203. paramDict = self.parseMulParam(keyList, viewStr)
  204. boundsStr = paramDict[self.View_Bounds]
  205. if boundsStr != "":
  206. i = boundsStr.find(",")
  207. if i != -1:
  208. boundsList = strToList(boundsStr,",")
  209. boundsListToInt = []
  210. for bl in boundsList:
  211. bl = int(bl)
  212. boundsListToInt.append(bl)
  213. # 将读取出来的列表与positionList合并成为字典,为了与uiautomator viewer相匹配
  214. boundsDic = dict(map(lambda x, y: [x, y], positionList, boundsListToInt))
  215. paramDict['bounds'] = boundsDic
  216. ret = paramDict
  217. return ret
  218. ret = self.parseMulParam(keyList, viewStr)
  219. return ret
  220. View_sambounds = "sambounds" #采样时的样本坐标,用于和select-focus、focusView的坐标做相对比较,计算相对位置,用于确定是否被选中。
  221. '''
  222. 用于optionView的数据解析
  223. '''
  224. def parseOptionView(self, viewStr):
  225. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class
  226. ,self.View_sambounds]
  227. return self.parseMulParam(keyList, viewStr)
  228. # UI 界面数据
  229. UIView_Activity = "activity" # android activity
  230. UIVIew_Action = "action"
  231. UIView_ID = "resid" # android view resource-id
  232. UIView_Text = "text" # android view 文本内容
  233. UIView_Desc = "desc" # android view描述
  234. UIView_Bounds = "bounds" # android view 坐标
  235. UIView_Dialog_F = "dialog_forward" # 进入时可能出现的弹窗
  236. UIView_Dialog_B = "dialog_back" # 退出时可能出现的弹窗
  237. def parseUIView(self, viewStr):
  238. keyList = [self.UIView_Activity, self.UIVIew_Action, self.UIView_ID, self.UIView_Text, self.UIView_Desc,
  239. self.UIView_Bounds, self.UIView_Dialog_F, self.UIView_Dialog_B]
  240. uiView = self.parseMulParam(keyList, viewStr)
  241. return self.parseDialogParam(uiView)
  242. def parseDialogParam(self, uiView):
  243. dialog_F_List = strToList(uiView[self.UIView_Dialog_F], ",")
  244. dialog_B_List = strToList(uiView[self.UIView_Dialog_B], ",")
  245. self.addDialogList(dialog_F_List, uiView, True)
  246. self.addDialogList(dialog_B_List, uiView, False)
  247. return uiView
  248. def addDialogList(self, dialog_List, uiView, isForward):
  249. for dialog in dialog_List:
  250. dialog_A = strToList(dialog.lower(), "&")
  251. if dialog_A.__len__() == 2:
  252. dialog_Name = dialog_A[0]
  253. dialog_Choose = dialog_A[1]
  254. else:
  255. error(str(self.__class__), "parseDialogParam", "Dialog %s set error"%dialog, ERROR)
  256. return
  257. if self.dialogDict.has_key(dialog_Name):
  258. if isForward is True:
  259. dialog_Type = self.UIView_Dialog_F
  260. else:
  261. dialog_Type = self.UIView_Dialog_B
  262. uiView[dialog_Type] = {}
  263. uiView[dialog_Type][dialog_Name] = self.dialogDict[dialog_Name]
  264. uiView[dialog_Type][dialog_Name]["choose"] = self.dialogDict[dialog_Name][UATTree.TAB_OPTION][dialog_Choose]
  265. else:
  266. error(str(self.__class__), "parseDialogParam", "Dialog %s read fail"%dialog_Name, ERROR)
  267. # Android Layout数据
  268. Layout_ID = "resid" # android view resource-id
  269. Layout_Desc = "desc" # android view描述
  270. Layout_Bounds = "bounds" # android view 坐标
  271. Layout_Class = "class" #android view class类型
  272. Layout_Limit = "limit" #layout是否限制optionView焦点操作范围。0:不限制,1:限制,默认为0
  273. '''
  274. layout:各属性值,用于综合确定一个布局组件
  275. :return layout 字典:{"resid":"","desc":"","bounds":""}
  276. '''
  277. def parseLayout(self, viewStr):
  278. keyList = [self.Layout_ID, self.Layout_Desc, self.Layout_Bounds, self.Layout_Class, self.Layout_Limit]
  279. paramDict = self.parseMulParam(keyList, viewStr)
  280. if paramDict.has_key(self.Layout_Limit) and paramDict[self.Layout_Limit].__len__()>0:
  281. paramDict[self.Layout_Limit] = int(paramDict[self.Layout_Limit]) #字符'0'转数字0
  282. return paramDict
  283. #Android FocusView数据
  284. Focus_ID = "resid" #android view resource-id
  285. Focus_Text = "text" #android view 文本内容
  286. Focus_Desc = "desc" #android view描述
  287. View_Bounds = "bounds" #android view 坐标
  288. View_Class = "class"
  289. def parseFocus(self, viewStr):
  290. keyList = [self.Focus_ID, self.Focus_Text, self.Focus_Desc, self.View_Bounds, self.View_Class,
  291. self.View_sambounds]
  292. return self.parseMulParam(keyList, viewStr)
  293. #Value数据
  294. ValueView_ID = "resid" #android view resource-id
  295. ValueView_Text = "text" #android view 文本内容
  296. ValueView_Desc = "desc" #android view描述
  297. ValueView_Bounds = "bounds"
  298. ValueView_Class = "class"
  299. ValueView_Value = "value" # 输入的值范围。格式:first, second, ... 或者 0-100
  300. ValueView_Min = "minvalue" # 如果是数值范围形式的值,返回最小值
  301. ValueView_Max = "maxvalue" # 如果是数值范围形式的值,返回最小值
  302. ValueView_StepSize = "stepsize" # 如果是数值范围形式的值,每次调整数值的步长。读不到此参数时,默认为1。
  303. ValueView_Duration = "duration" # 如果是数值范围形式的值,每次调整数值的间隔时间。读不到此参数时,默认为0.2。
  304. def parseValueView(self, viewStr):
  305. keyList = [self.ValueView_ID, self.ValueView_Text, self.ValueView_Desc, self.ValueView_Value,
  306. self.ValueView_StepSize, self.ValueView_Duration, self.ValueView_Bounds, self.ValueView_Class,
  307. self.View_sambounds]
  308. paramDict = self.parseMulParam(keyList, viewStr)
  309. valueStr = paramDict[self.ValueView_Value]
  310. sign = []
  311. valueListDelStr = []
  312. flagList = []
  313. flag_v = False # value前缀不为字母
  314. if valueStr != "":
  315. i = valueStr.find(",")
  316. if i != -1:
  317. valueList = strToList(valueStr, ",")
  318. isRange = False
  319. # 前缀字母,后缀数字
  320. for val in valueList:
  321. if (ord(val[0])>57 or ord(val[0])<48) and (47 < ord(val[1]) < 58):
  322. sign.append(val[0])
  323. valueDelStr = val.strip(val[0])
  324. valueListDelStr.append(valueDelStr)
  325. flagList.append(True) #value前缀为字母
  326. else:
  327. flagList.append(False)
  328. for f in flagList:
  329. flag_v = f
  330. flag_v = flag_v and f
  331. if flag_v == False:
  332. sign = []
  333. # 处理range类型(数值)
  334. try:
  335. if valueList.__len__() == 2:
  336. if flag_v == True: #//
  337. valueList = valueListDelStr
  338. paramDict[self.ValueView_Min] = -float(valueList[0])#//
  339. else:
  340. paramDict[self.ValueView_Min] = float(valueList[0])
  341. paramDict[self.ValueView_Max] = float(valueList[1])
  342. isRange = True
  343. except Exception,ValueError:
  344. info(self.cls, "parseValueView", "valueList %s not range value.", INFO)
  345. # 处理非range类型(选项)
  346. if isRange is False:
  347. for value in valueList:
  348. valueViewStr = self.parseParam(value, viewStr, "{}")
  349. if valueViewStr == "":
  350. debug(self.cls, "parseValueView", "value %s 没有任何配置信息!!!请加入该value信息,否则可能将导致设值失败!!!"%value, DEBUG)
  351. # 读出来的数值未带大括号,需加上大括号,并且json格式化
  352. valueView = eval("{%s}" % valueViewStr)
  353. paramDict[value] = valueView
  354. return paramDict,sign
  355. #focus-select数据,不仅有select或者focus类型,还有指定组件属性情况,用于处理界面多个聚焦方式出现的场景
  356. FS_Type = "type"
  357. FS_ID = "resid" #android view resource-id
  358. FS_Text = "text" #android view 文本内容。
  359. FS_Desc = "desc" #android view描述
  360. FS_Bounds = "bounds" #android view 坐标
  361. FS_Class = "class"
  362. def parseFocusSelectType(self, fsType):
  363. keyList = [self.FS_Type,self.FS_ID,self.FS_Text,self.FS_Desc,self.FS_Bounds,
  364. self.View_sambounds]
  365. return self.parseMulParam(keyList, fsType)
  366. '''
  367. 扫描parent数据行时,要把建立当前parent的prevParent和nextParent关系。
  368. '''
  369. def addParent(self,level, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  370. # print "addParent, level,parentName:", level, parentName
  371. if not self.treeDict.has_key(level):
  372. self.treeDict[level] = {}
  373. parentDict = {}
  374. parentDict[UATTree.TAB_NAME] = parentName
  375. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  376. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  377. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  378. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  379. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  380. parentDict[UATTree.TAB_OPTION] = {}
  381. parentDict[UATTree.TAB_LEVEL] = level
  382. parentDict[UATTree.TAB_PREV_PARENT] = None
  383. parentDict[UATTree.TAB_NEXT_PARENT] = {}
  384. parentDict[UATTree.TAB_OTHERS] = self.parseOthers(others)
  385. if "first" <> level:
  386. prevParent = self.getPreParentByParent(parentDict)
  387. if prevParent is not None:
  388. parentDict[UATTree.TAB_PREV_PARENT] = prevParent
  389. prevParent[UATTree.TAB_NEXT_PARENT][parentName] = parentDict
  390. self.treeDict[level][parentName] = parentDict
  391. '''
  392. 扫描option行的时候,会把option字典关联到相应的parent字典里
  393. '''
  394. def addOption(self, level, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  395. # print "addOption, level,parentName,optionName:", level, parentName,optionName
  396. if self.treeDict.has_key(level) and self.treeDict[level].has_key(parentName):
  397. optionDict = {}
  398. optionDict[UATTree.TAB_NAME] = optionName
  399. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseOptionView(optionView)
  400. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  401. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  402. optionDict[UATTree.TAB_ENTER_KEY] = self.parseEnterKey(enterKey, optionName)
  403. optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue)
  404. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  405. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  406. optionDict[UATTree.TAB_LEVEL] = level
  407. self.treeDict[level][parentName][UATTree.TAB_OPTION][optionName] = optionDict
  408. def addDialog(self, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  409. # print "addDialog, parentName:", parentName
  410. parentDict = {}
  411. parentDict[UATTree.TAB_NAME] = parentName
  412. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  413. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  414. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  415. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  416. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  417. parentDict[UATTree.TAB_OPTION] = {}
  418. parentDict[UATTree.TAB_OTHERS] = self.parseDialogOthers(others)
  419. self.dialogDict[parentName] = parentDict
  420. def addDialogOption(self, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  421. # print "addDialogOption, parentName,optionName:", parentName, optionName
  422. if self.dialogDict.has_key(parentName):
  423. optionDict = {}
  424. optionDict[UATTree.TAB_NAME] = optionName
  425. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseView(optionView)
  426. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  427. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  428. optionDict[UATTree.TAB_ENTER_KEY] = self.parseKey(enterKey)
  429. optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue)
  430. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  431. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  432. self.dialogDict[parentName][UATTree.TAB_OPTION][optionName] = optionDict
  433. def findParentDict(self, parentName):
  434. parentName = parentName.lower()
  435. levelList = self.treeDict.keys()
  436. for index in range(levelList.__len__()-1, -1, -1):
  437. level = levelList[index]
  438. if self.treeDict[level].has_key(parentName):
  439. return self.treeDict[level][parentName]
  440. return None
  441. def getSubOptionDict(self, parentName):
  442. parentDict = self.findParentDict(parentName)
  443. if parentDict is not None:
  444. return parentDict[UATTree.TAB_OPTION]
  445. return None
  446. def findOption(self, optionName):
  447. optionName = optionName.lower()
  448. levelList = self.treeDict.keys()
  449. for index in range(levelList.__len__()-1, -1, -1):
  450. level = levelList[index]
  451. levelDict = self.treeDict[level]
  452. for parent in levelDict.keys():
  453. parentDict = levelDict[parent]
  454. for option in parentDict.keys():
  455. optionDict = parentDict[UATTree.TAB_OPTION]
  456. if optionDict.has_key(optionName):
  457. return optionDict[optionName]
  458. def getOpitonInLevel(self,targetOptionName, level):
  459. levelDict = self.treeDict[level]
  460. for parentName in levelDict.keys():
  461. parentDict = levelDict[parentName]
  462. for optionName in parentDict[UATTree.TAB_OPTION].keys():
  463. if targetOptionName == optionName:
  464. return parentDict[UATTree.TAB_OPTION][optionName]
  465. else:
  466. return None
  467. '''
  468. 检测option的enter_key中是否存在对应parentName
  469. '''
  470. def checkEnterParentEK(self, enterKey, parentName):
  471. # print "checkEnterParentEK,enterKey,parentName:",enterKey, parentName
  472. for keyItem in enterKey:
  473. if keyItem[self.Enter_Parent] == parentName:
  474. return True
  475. return False
  476. '''
  477. 检测option字典,是否下一级nextParent包含这一个parentName
  478. '''
  479. def checkOptionEnterParent(self, option, parentName):
  480. enterKey = option[self.TAB_ENTER_KEY]
  481. if option[self.TAB_NAME] == parentName:
  482. return True
  483. return self.checkEnterParentEK(enterKey, parentName)
  484. '''
  485. 根据parentName,在EnterKey所有列表中,找到匹配的enterKey字典选项
  486. 返回值:{"enterParent":"","key_param":{"keyType","event","keyvalue":[left,right,enter],"wait":1,"enterParent":"hdmi_settings"}
  487. '''
  488. def getEKByParent(self, enterKeys, parentName):
  489. for keyItem in enterKeys:
  490. if keyItem[self.Enter_Parent] == parentName:
  491. return keyItem[self.Key_Param]
  492. return None
  493. '''
  494. 获取option的parent
  495. '''
  496. def getParentByOption(self, option):
  497. parentName = option[UATTree.TAB_PARENT_NAME]
  498. levelName = option[UATTree.TAB_LEVEL]
  499. if self.treeDict[levelName].has_key(parentName):
  500. parent = self.treeDict[levelName][parentName]
  501. return parent
  502. else:
  503. return None
  504. '''
  505. 根据Parent数据,查上一级parent。
  506. '''
  507. def getPreParentByParent(self, parent):
  508. prevLevel = self.getPrevLevel(parent[self.TAB_LEVEL])
  509. levelDict = self.treeDict[prevLevel]
  510. # print "getPreParentByParent,levelDict:",levelDict
  511. for parentName in levelDict.keys():
  512. parentDict = levelDict[parentName]
  513. # print "getPreParentByParent,parentDict:", parentDict
  514. for optionName in parentDict[UATTree.TAB_OPTION].keys():
  515. option = parentDict[UATTree.TAB_OPTION][optionName]
  516. # print "getPreParentByParent,option:", option
  517. if self.checkOptionEnterParent(option, parent[self.TAB_NAME]):
  518. return parentDict
  519. error(str(self.__class__), "getPreParentByParent",
  520. "Parent %s's prevparent not found in level %s"%(parent[self.TAB_NAME], prevLevel), ERROR)
  521. return None
  522. '''
  523. 获取当前level的前一个level名
  524. '''
  525. def getPrevLevel(self, level):
  526. self.levelList = self.treeDict.keys()
  527. index = self.levelList.index(level)
  528. if index == 0:
  529. return FirstPrev
  530. else:
  531. return self.levelList[index-1]
  532. '''
  533. 获取当前Parent的上一级parent
  534. '''
  535. def getPrevParent(self, parent):
  536. return parent[UATTree.TAB_PREV_PARENT]
  537. '''
  538. 获取当前parent下一级所有parent的字典
  539. '''
  540. def getNextParentList(self, parent):
  541. return parent[UATTree.TAB_NEXT_PARENT]
  542. def printTree(self):
  543. for level in self.treeDict.keys():
  544. print level
  545. for parent in self.treeDict[level].keys():
  546. dict1 = self.treeDict[level][parent]
  547. print level, "::parent ", dict1["name"], "name", "shortcut_key", "uiview", "move_key", "toparent_key", "layout"
  548. print level, "::parent ", dict1["name"], dict1["shortcut_key"], dict1["uiview"], dict1["move_key"], dict1["toparent_key"], dict1["layout"]
  549. for option in dict1["option"].keys():
  550. dict2 = dict1["option"][option]
  551. print level, "::option ", dict2
  552. Key_HeartBeat = "heartbeat_key"
  553. def parseOthers(self, othersStr):
  554. othersDict = {}
  555. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  556. hb_keyDict = {}
  557. if othersDict[self.Key_HeartBeat] != "":
  558. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  559. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  560. othersDict[self.Key_HeartBeat] = hb_keyDict
  561. return othersDict
  562. def parseHeartBeatKey(self, hb_keyStr):
  563. keyList = [self.Key_Event, self.Key_IR]
  564. keyDict = self.parseMulParam(keyList, hb_keyStr)
  565. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  566. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  567. return keyDict
  568. def parseDialogOthers(self, othersStr):
  569. othersDict = {}
  570. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  571. hb_keyDict = {}
  572. if othersDict[self.Key_HeartBeat] != "":
  573. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  574. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  575. othersDict[self.Key_HeartBeat] = hb_keyDict
  576. return othersDict
  577. if __name__ == '__main__':
  578. uatTree = UATTree()