コード例 #1
0
ファイル: ViewState.py プロジェクト: Bludge0n/apk-view-tracer
 def getVisibleState(self):        
     if None == self.node.mParentNode:
         return self.element_parser.getVisible()
     else:
         parent_element_parser = ParseElement(self.node.mParentNode.mElement)
         parent_element_parser.parseElmentData()
         return (self.element_parser.getVisible() and parent_element_parser.getVisible())
コード例 #2
0
ファイル: ViewState.py プロジェクト: Bludge0n/apk-view-tracer
 def getVisibleState_All(self):
     bResult = None
     temp_node = copy.deepcopy(self.node)        
     while (None != temp_node.mParentNode):
         temp_element_parser = ParseElement(temp_node.mElement)
         temp_element_parser.parseElmentData()
         bResult = temp_element_parser.getVisible() and temp_element_parser.getVisible()
         temp_node = temp_node.mParentNode
     return bResult
コード例 #3
0
 def getVisibleState(self):
     if None == self.node.mParentNode:
         return self.element_parser.getVisible()
     else:
         parent_element_parser = ParseElement(
             self.node.mParentNode.mElement)
         parent_element_parser.parseElmentData()
         return (self.element_parser.getVisible()
                 and parent_element_parser.getVisible())
コード例 #4
0
 def __init__(self, node):
     self.node = node
     self.element_data = node.mElement
     self.element_parser = ParseElement(self.element_data)
     self.element_parser.parseElmentData()
     self.ViewGroup_ClassName_list = [
         "android.widget.ListView", "android.widget.GridView",
         "android.widget.RadioGroup", "android.widget.Spinner",
         "android.widget.Gallery"
     ]
コード例 #5
0
ファイル: ViewState.py プロジェクト: Bludge0n/apk-view-tracer
 def getClickableState(self):
     parent_node = self.node.mParentNode
     
     if None == parent_node:
         return self.element_parser.getClickable()
                 
     parent_element_parser = ParseElement(parent_node.mElement)
     parent_element_parser.parseElmentData()
     parent_ClassName = parent_element_parser.getClassName()
     if parent_ClassName in self.ViewGroup_ClassName_list:
         return parent_element_parser.getClickable()
     else:
         return self.element_parser.getClickable()        
コード例 #6
0
ファイル: ViewState.py プロジェクト: Bludge0n/apk-view-tracer
 def __init__(self, node):
     self.node = node
     self.element_data = node.mElement
     self.element_parser = ParseElement(self.element_data)
     self.element_parser.parseElmentData()
     self.ViewGroup_ClassName_list = ["android.widget.ListView", 
                                      "android.widget.GridView", 
                                      "android.widget.RadioGroup",
                                      "android.widget.Spinner",
                                      "android.widget.Gallery"]
コード例 #7
0
ファイル: ViewTree.py プロジェクト: Bludge0n/apk-view-tracer
 def setNodeValue(self, node):
     element = node.mElement
     if None == element:
         msg = "Failed to set Node Value because Error in Node!"
         self.m_logger.error(msg)
         return False
     
     element_parser = ParseElement(node.mElement)
     element_parser.parseElmentData()
     node.mClassName = element_parser.getClassName()
     node.mHashCode = element_parser.getHashCode()
     node.mId = element_parser.getID()
     node.mText = element_parser.getText()
     
     active_state = ViewState(node)
     node.mVisible = element_parser.getVisible()
     node.mClickable = element_parser.getClickable()
     node.mActive = active_state.getActiveState()        
     
     node.mRect = element_parser.getRectArea()
     node.mScrollX = element_parser.scrollX
     node.mScrollY = element_parser.scrollY
     node.mAbsoluteRect = self.getAbsoluteRect(node)
     node.mLocation = self.getViewCenterPoint(node)
コード例 #8
0
 def getVisibleState_All(self):
     bResult = None
     temp_node = copy.deepcopy(self.node)
     while (None != temp_node.mParentNode):
         temp_element_parser = ParseElement(temp_node.mElement)
         temp_element_parser.parseElmentData()
         bResult = temp_element_parser.getVisible(
         ) and temp_element_parser.getVisible()
         temp_node = temp_node.mParentNode
     return bResult
コード例 #9
0
    def getClickableState(self):
        parent_node = self.node.mParentNode

        if None == parent_node:
            return self.element_parser.getClickable()

        parent_element_parser = ParseElement(parent_node.mElement)
        parent_element_parser.parseElmentData()
        parent_ClassName = parent_element_parser.getClassName()
        if parent_ClassName in self.ViewGroup_ClassName_list:
            return parent_element_parser.getClickable()
        else:
            return self.element_parser.getClickable()
コード例 #10
0
 def __init__(self):
     self.element_parser = ParseElement()
コード例 #11
0
class ParseView():
    def __init__(self):
        self.element_parser = ParseElement()

    #406c1d58 com.android.internal.service.wallpaper.ImageWallpaper
    #4054bf40 com.android.launcher/com.android.launcher2.Launcher
    #4073dcd8 com.example.android.apis/com.example.android.apis.ApiDemos
    #406a7510 TrackingView
    #405ec120 StatusBarExpanded
    #40632908 StatusBar
    #4067b9e8 Keyguard
    #DONE
    def isSystemView(self, view_detail):
        if "com.android.internal.service.wallpaper.ImageWallpaper" == view_detail:
            return True
        elif "com.android.launcher/com.android.launcher2.Launcher" == view_detail:
            return True
        elif "TrackingView" == view_detail:
            return True
        elif "StatusBarExpanded" == view_detail:
            return True
        elif "StatusBar" == view_detail:
            return True
        elif "Keyguard" == view_detail:
            return True
        else:
            return False

    def getViewListData(self, view_list_data):
        viewListHashCode_List = []
        viewListHashCode_Dict = {}
        lines_list = view_list_data.split("\n")
        if '' in lines_list:
            lines_list.remove('')
        if 'DONE' in lines_list:
            lines_list.remove('DONE')
        for line in lines_list:
            temp = line.split(" ")
            hashcode = temp[0]
            detail_info = temp[1]
            # clear the views of android system default services or applications
            # ImageWallpaper,Launcher,TrackingView,StatusBarExpanded,StatusBar,Keyguard
            if not self.isSystemView(detail_info):
                viewListHashCode_List.append(hashcode)
                viewListHashCode_Dict[hashcode] = detail_info

        return viewListHashCode_List, viewListHashCode_Dict

    # parse view data by dump, then get the view text list
    def getViewTextList(self, view_dump_data):
        view_text_list = []
        element_list = self.element_parser.getStructure(view_dump_data)[0]
        for element in element_list:
            text = self.element_parser.getText(element)
            view_text_list.append(text)

        return view_text_list

    def isEqualTextList(self, view_dump_data1, view_dump_data2):
        text_list1 = self.getViewTextList(view_dump_data1)
        text_list2 = self.getViewTextList(view_dump_data2)

        return (text_list1 == text_list2)
コード例 #12
0
ファイル: ViewState.py プロジェクト: Bludge0n/apk-view-tracer
class ViewState():
    def __init__(self, node):
        self.node = node
        self.element_data = node.mElement
        self.element_parser = ParseElement(self.element_data)
        self.element_parser.parseElmentData()
        self.ViewGroup_ClassName_list = ["android.widget.ListView", 
                                         "android.widget.GridView", 
                                         "android.widget.RadioGroup",
                                         "android.widget.Spinner",
                                         "android.widget.Gallery"]
    
    ## The Visible state of parent node decide the Visible state of child node
    ## 应该是遍历所有的父节点的,但是下面的setNodeValue()函数是从root node开始,从上往下填值的,所以可以只判断自己和直接父节点的状态即可
    def getVisibleState(self):        
        if None == self.node.mParentNode:
            return self.element_parser.getVisible()
        else:
            parent_element_parser = ParseElement(self.node.mParentNode.mElement)
            parent_element_parser.parseElmentData()
            return (self.element_parser.getVisible() and parent_element_parser.getVisible())
    
    # 遍历所有父节点的方法
    # What does this method can do?  
    def getVisibleState_All(self):
        bResult = None
        temp_node = copy.deepcopy(self.node)        
        while (None != temp_node.mParentNode):
            temp_element_parser = ParseElement(temp_node.mElement)
            temp_element_parser.parseElmentData()
            bResult = temp_element_parser.getVisible() and temp_element_parser.getVisible()
            temp_node = temp_node.mParentNode
        return bResult
    
    ## Some Views 本身的 isClickable()=false, but its parent node 的 isClickable()=true
    ## so, these Views should be clickable
    ## for example, ListView, GridView,  etc. container View
    ## 但是如果,RadioGroup下包含了TextView和一些RadioButton,这个TextView是不可点击的吗? 
    def getClickableState(self):
        parent_node = self.node.mParentNode
        
        if None == parent_node:
            return self.element_parser.getClickable()
                    
        parent_element_parser = ParseElement(parent_node.mElement)
        parent_element_parser.parseElmentData()
        parent_ClassName = parent_element_parser.getClassName()
        if parent_ClassName in self.ViewGroup_ClassName_list:
            return parent_element_parser.getClickable()
        else:
            return self.element_parser.getClickable()        
            
    
    ## mActive = False means it can not handle events
    ## mActive = True means it can handle events
    def getActiveState(self):
        try:
            if self.element_parser.getWillNotDraw():
                msg = "Will Not Draw!"
                return False
            if not self.getVisibleState():
                msg = "Not Visible!"
                return False
            if not self.getClickableState():
                msg = "Not Clickable!"
                return False
            if not self.element_parser.getDRAWN():
                msg = "Not Drawn!"
                return False
            else:
                return True
        except Exception,e:
            msg = "Failed to get Active State of Element! %s" %str(e)
            print msg
            return False
コード例 #13
0
ファイル: ParseView.py プロジェクト: Bludge0n/apk-view-tracer
 def __init__(self):
     self.element_parser = ParseElement()
コード例 #14
0
ファイル: ParseView.py プロジェクト: Bludge0n/apk-view-tracer
class ParseView():
    
    def __init__(self):
        self.element_parser = ParseElement()
    
    #406c1d58 com.android.internal.service.wallpaper.ImageWallpaper
    #4054bf40 com.android.launcher/com.android.launcher2.Launcher
    #4073dcd8 com.example.android.apis/com.example.android.apis.ApiDemos
    #406a7510 TrackingView
    #405ec120 StatusBarExpanded
    #40632908 StatusBar
    #4067b9e8 Keyguard
    #DONE
    def isSystemView(self, view_detail):
        if "com.android.internal.service.wallpaper.ImageWallpaper" == view_detail:
            return True
        elif "com.android.launcher/com.android.launcher2.Launcher" == view_detail:
            return True
        elif "TrackingView" == view_detail:
            return True
        elif "StatusBarExpanded" ==  view_detail:
            return True
        elif "StatusBar" == view_detail:
            return True
        elif "Keyguard" == view_detail:
            return True
        else:
            return False
    
    def getViewListData(self, view_list_data):
        viewListHashCode_List = []
        viewListHashCode_Dict = {}
        lines_list = view_list_data.split("\n")
        if '' in lines_list:
            lines_list.remove('')
        if 'DONE' in lines_list:
            lines_list.remove('DONE')
        for line in lines_list:
            temp = line.split(" ")
            hashcode = temp[0]
            detail_info = temp[1]
            # clear the views of android system default services or applications
            # ImageWallpaper,Launcher,TrackingView,StatusBarExpanded,StatusBar,Keyguard
            if not self.isSystemView(detail_info):
                viewListHashCode_List.append(hashcode)
                viewListHashCode_Dict[hashcode] = detail_info

        return viewListHashCode_List, viewListHashCode_Dict
    
    
    # parse view data by dump, then get the view text list
    def getViewTextList(self, view_dump_data):
        view_text_list = []
        element_list = self.element_parser.getStructure(view_dump_data)[0]
        for element in element_list:
            text = self.element_parser.getText(element)
            view_text_list.append(text)       
        
        return view_text_list
    
    def isEqualTextList(self, view_dump_data1, view_dump_data2):
        text_list1 = self.getViewTextList(view_dump_data1)     
        text_list2 = self.getViewTextList(view_dump_data2) 
        
        return (text_list1 == text_list2)       
コード例 #15
0
    def setNodeValue(self, node):
        element = node.mElement
        if None == element:
            msg = "Failed to set Node Value because Error in Node!"
            self.m_logger.error(msg)
            return False

        element_parser = ParseElement(node.mElement)
        element_parser.parseElmentData()
        node.mClassName = element_parser.getClassName()
        node.mHashCode = element_parser.getHashCode()
        node.mId = element_parser.getID()
        node.mText = element_parser.getText()

        active_state = ViewState(node)
        node.mVisible = element_parser.getVisible()
        node.mClickable = element_parser.getClickable()
        node.mActive = active_state.getActiveState()

        node.mRect = element_parser.getRectArea()
        node.mScrollX = element_parser.scrollX
        node.mScrollY = element_parser.scrollY
        node.mAbsoluteRect = self.getAbsoluteRect(node)
        node.mLocation = self.getViewCenterPoint(node)
コード例 #16
0
class ViewState():
    def __init__(self, node):
        self.node = node
        self.element_data = node.mElement
        self.element_parser = ParseElement(self.element_data)
        self.element_parser.parseElmentData()
        self.ViewGroup_ClassName_list = [
            "android.widget.ListView", "android.widget.GridView",
            "android.widget.RadioGroup", "android.widget.Spinner",
            "android.widget.Gallery"
        ]

    ## The Visible state of parent node decide the Visible state of child node
    ## 应该是遍历所有的父节点的,但是下面的setNodeValue()函数是从root node开始,从上往下填值的,所以可以只判断自己和直接父节点的状态即可
    def getVisibleState(self):
        if None == self.node.mParentNode:
            return self.element_parser.getVisible()
        else:
            parent_element_parser = ParseElement(
                self.node.mParentNode.mElement)
            parent_element_parser.parseElmentData()
            return (self.element_parser.getVisible()
                    and parent_element_parser.getVisible())

    # 遍历所有父节点的方法
    # What does this method can do?
    def getVisibleState_All(self):
        bResult = None
        temp_node = copy.deepcopy(self.node)
        while (None != temp_node.mParentNode):
            temp_element_parser = ParseElement(temp_node.mElement)
            temp_element_parser.parseElmentData()
            bResult = temp_element_parser.getVisible(
            ) and temp_element_parser.getVisible()
            temp_node = temp_node.mParentNode
        return bResult

    ## Some Views 本身的 isClickable()=false, but its parent node 的 isClickable()=true
    ## so, these Views should be clickable
    ## for example, ListView, GridView,  etc. container View
    ## 但是如果,RadioGroup下包含了TextView和一些RadioButton,这个TextView是不可点击的吗?
    def getClickableState(self):
        parent_node = self.node.mParentNode

        if None == parent_node:
            return self.element_parser.getClickable()

        parent_element_parser = ParseElement(parent_node.mElement)
        parent_element_parser.parseElmentData()
        parent_ClassName = parent_element_parser.getClassName()
        if parent_ClassName in self.ViewGroup_ClassName_list:
            return parent_element_parser.getClickable()
        else:
            return self.element_parser.getClickable()

    ## mActive = False means it can not handle events
    ## mActive = True means it can handle events
    def getActiveState(self):
        try:
            if self.element_parser.getWillNotDraw():
                msg = "Will Not Draw!"
                return False
            if not self.getVisibleState():
                msg = "Not Visible!"
                return False
            if not self.getClickableState():
                msg = "Not Clickable!"
                return False
            if not self.element_parser.getDRAWN():
                msg = "Not Drawn!"
                return False
            else:
                return True
        except Exception, e:
            msg = "Failed to get Active State of Element! %s" % str(e)
            print msg
            return False