Esempio n. 1
0
        private NodeList GetWindowNodes(AccessibilityNodeInfo n, AccessibilityEvent e,
                                        Func <AccessibilityNodeInfo, bool> condition, bool disposeIfUnused, NodeList nodes = null)
        {
            if (nodes == null)
            {
                nodes = new NodeList();
            }

            if (n != null)
            {
                var dispose = disposeIfUnused;
                if (n.WindowId == e.WindowId && !(n.ViewIdResourceName?.StartsWith(SystemUiPackage) ?? false) && condition(n))
                {
                    dispose = false;
                    nodes.Add(n);
                }

                for (var i = 0; i < n.ChildCount; i++)
                {
                    GetWindowNodes(n.GetChild(i), e, condition, true, nodes);
                }

                if (dispose)
                {
                    n.Dispose();
                }
            }

            return(nodes);
        }
        public static NodeList GetWindowNodes(AccessibilityNodeInfo n, AccessibilityEvent e,
                                              Func <AccessibilityNodeInfo, bool> condition, bool disposeIfUnused, NodeList nodes = null,
                                              int recursionDepth = 0)
        {
            if (nodes == null)
            {
                nodes = new NodeList();
            }
            var dispose = disposeIfUnused;

            if (n != null && recursionDepth < 100)
            {
                var add = n.WindowId == e.WindowId &&
                          !(n.ViewIdResourceName?.StartsWith(SystemUiPackage) ?? false) &&
                          condition(n);
                if (add)
                {
                    dispose = false;
                    nodes.Add(n);
                }

                for (var i = 0; i < n.ChildCount; i++)
                {
                    var childNode = n.GetChild(i);
                    if (childNode == null)
                    {
                        continue;
                    }
                    else if (i > 100)
                    {
                        Android.Util.Log.Info(BitwardenTag, "Too many child iterations.");
                        break;
                    }
                    else if (childNode.GetHashCode() == n.GetHashCode())
                    {
                        Android.Util.Log.Info(BitwardenTag, "Child node is the same as parent for some reason.");
                    }
                    else
                    {
                        GetWindowNodes(childNode, e, condition, true, nodes, recursionDepth++);
                    }
                }
            }
            if (dispose)
            {
                n?.Recycle();
                n?.Dispose();
            }
            return(nodes);
        }