Java Code Examples for android.view.accessibility.AccessibilityNodeInfo#getClassName()

The following examples show how to use android.view.accessibility.AccessibilityNodeInfo#getClassName() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Tree.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
public boolean isAEditText(AccessibilityNodeInfo node) {
    CharSequence classname = node.getClassName();
    if (classname == null) {
        //ouch. Sometimes happens when scanning a webview
        return false;
    }
    Boolean res = mClassesThatAreEditTexts.get(classname.toString());
    if (res == null) {
        res = AccessibilityNodeInfoUtils.nodeMatchesClassByType(mCtx, node,
                EditText.class);
        if (res) {
            mClassesThatAreEditTexts.put(node.getClassName().toString(), res);
        }
    }
    return res;
}
 
Example 2
Source File: Tree.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
public boolean isATextView(AccessibilityNodeInfo node) {
    CharSequence classname = node.getClassName();
    if (classname == null) {
        //ouch. Sometimes happens when scanning a webview
        return false;
    }
    Boolean res = mClassesThatAreTextViews.get(classname.toString());
    if (res == null) {
        res = AccessibilityNodeInfoUtils.nodeMatchesClassByType(mCtx, node,
                TextView.class);
        if (res) {
            mClassesThatAreTextViews.put(node.getClassName().toString(), res);
        }
    }
    return res;
}
 
Example 3
Source File: Tree.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
public void init(AccessibilityNodeInfo node) {
    if (sealed) {
        throw new IllegalArgumentException("sealed! " + super.toString());
    }

    mKey = node.hashCode();
    mClassName = node.getClassName();
    mPackageName = node.getPackageName();
    mIsTextView = isATextView(node);
    mIsEditText = isAEditText(node);
    mIsWebView = isAWebView(node);
    mBoundsInScreen = new Rect();
    mBoundsInParent = new Rect();
    mIsVisibleToUser = node.isVisibleToUser();
    refresh(node);

}
 
Example 4
Source File: AccessibilityNodeInfoUtils.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
/**
 * Determines if the generating class of an
 * {@link AccessibilityNodeInfo} matches a given {@link Class} by
 * type.
 *
 * @param node           A sealed {@link AccessibilityNodeInfo} dispatched by
 *                       the accessibility framework.
 * @param referenceClass A {@link Class} to match by type or inherited type.
 * @return {@code true} if the {@link AccessibilityNodeInfo} object
 * matches the {@link Class} by type or inherited type,
 * {@code false} otherwise.
 */
public static boolean nodeMatchesClassByType(
        Context context, AccessibilityNodeInfo node, Class<?> referenceClass) {
    if ((node == null) || (referenceClass == null)) {
        return false;
    }

    // Attempt to take a shortcut.
    final CharSequence nodeClassName = node.getClassName();
    if (TextUtils.equals(nodeClassName, referenceClass.getName())) {
        return true;
    }

    final ClassLoadingManager loader = ClassLoadingManager.getInstance();
    final CharSequence appPackage = node.getPackageName();
    return loader.checkInstanceOf(context, nodeClassName, appPackage, referenceClass);
}
 
Example 5
Source File: AccessibilityNodeInfoUtils.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
/**
 * Determines if the class of an {@link AccessibilityNodeInfo} matches
 * a given {@link Class} by package and name.
 *
 * @param node               A sealed {@link AccessibilityNodeInfo} dispatched by
 *                           the accessibility framework.
 * @param referenceClassName A class name to match.
 * @return {@code true} if the {@link AccessibilityNodeInfo} matches
 * the class name.
 */
public static boolean nodeMatchesClassByName(
        Context context, AccessibilityNodeInfo node, CharSequence referenceClassName) {
    if ((node == null) || (referenceClassName == null)) {
        return false;
    }

    // Attempt to take a shortcut.
    final CharSequence nodeClassName = node.getClassName();
    if (TextUtils.equals(nodeClassName, referenceClassName)) {
        return true;
    }

    final ClassLoadingManager loader = ClassLoadingManager.getInstance();
    final CharSequence appPackage = node.getPackageName();
    return loader.checkInstanceOf(context, nodeClassName, appPackage, referenceClassName);
}
 
Example 6
Source File: LaunchApp.java    From PUMA with Apache License 2.0 6 votes vote down vote up
private void computeFeatureVector(Hashtable<String, Integer> map, AccessibilityNodeInfo node, int level) {
	if (node == null || node.getClassName() == null) {
		Util.err("node or class name is NULL");
		return;
	}

	String type = node.getClassName().toString();
	String key = type + "@" + level;

	int count = map.containsKey(key) ? map.get(key) : 0;
	count++;

	map.put(key, count);

	int child_cnt = node.getChildCount();
	if (child_cnt > 0) {
		// Util.log("Branch: " + key + ", " + count);
		for (int i = 0; i < child_cnt; i++) {
			AccessibilityNodeInfo child = node.getChild(i);
			computeFeatureVector(map, child, level + 1);
		}
	} else {
		// Util.log("Leaf: " + key + ", " + count);
	}
}
 
Example 7
Source File: Tree.java    From oversec with GNU General Public License v3.0 6 votes vote down vote up
private boolean isAListOrScrollView(AccessibilityNodeInfo node) {
    CharSequence classname = node.getClassName();
    if (classname == null) {
        //ouch. Sometimes happens when scanning a webview
        return false;
    }
    Boolean res = mClassesThatAreListOrScrollViews.get(classname.toString());
    if (res == null) {
        res = AccessibilityNodeInfoUtils.nodeMatchesAnyClassByType(mCtx,
                node, ListView.class, ScrollView.class);
        if (res) {
            mClassesThatAreListOrScrollViews.put(node.getClassName().toString(), res);
        }
    }
    return res;
}
 
Example 8
Source File: AccessibilityUtils.java    From PrivacyStreams with Apache License 2.0 5 votes vote down vote up
public static SerializedAccessibilityNodeInfo serialize(AccessibilityNodeInfo node){
    SerializedAccessibilityNodeInfo serializedNode = new SerializedAccessibilityNodeInfo();
    Rect boundsInScreen = new Rect(), boundsInParent = new Rect();
    if(node == null){
        return null;
    }
    if(node.getClassName() != null)
        serializedNode.className = node.getClassName().toString();
    node.getBoundsInScreen(boundsInScreen);
    node.getBoundsInParent(boundsInParent);

    serializedNode.boundsInScreen = boundsInScreen.flattenToString();
    serializedNode.boundsInParent = boundsInParent.flattenToString();

    if(node.getContentDescription() != null)
        serializedNode.contentDescription = node.getContentDescription().toString();

    if(node.getText() != null){
        serializedNode.text = node.getText().toString();
    }

    if(node.getViewIdResourceName() != null)
        serializedNode.viewId = node.getViewIdResourceName();

    int childCount = node.getChildCount();
    for(int i = 0; i < childCount; i ++){
        if(node.getChild(i) != null){
            serializedNode.children.add(serialize(node.getChild(i)));
        }
    }

    return serializedNode;
}
 
Example 9
Source File: LaunchApp.java    From PUMA with Apache License 2.0 5 votes vote down vote up
private void computeFeatureVectorExactMatch(Hashtable<String, Integer> dict, Hashtable<String, Integer> map, AccessibilityNodeInfo node, int level) {
	if (node == null || node.getClassName() == null) {
		Util.err("node or class name is NULL");
		return;
	}

	String type = node.getClassName().toString();
	String key = type + "@" + level;

	int count = dict.containsKey(key) ? dict.get(key) : 0;
	count++;

	dict.put(key, count);

	String keyExactMatch = type + "@" + level + "@" + count + "@" + getTextDigest(node.getText());
	map.put(keyExactMatch, 1);

	int child_cnt = node.getChildCount();
	if (child_cnt > 0) {
		// Util.log("Branch: " + key + ", " + count);
		for (int i = 0; i < child_cnt; i++) {
			AccessibilityNodeInfo child = node.getChild(i);
			computeFeatureVectorExactMatch(dict, map, child, level + 1);
		}
	} else {
		// Util.log("Leaf: " + key + ", " + count);
	}
}
 
Example 10
Source File: UiChangeHandler.java    From talkback with Apache License 2.0 5 votes vote down vote up
private void sendWindowChangeEventsToWindowChangedListener(
    WindowChangedListener windowChangedListener, List<AccessibilityEvent> windowChangeEventList) {
  if (isRunning) {
    while (!windowChangeEventList.isEmpty()) {
      AccessibilityEvent event = windowChangeEventList.get(0);

      CharSequence packageName = event.getPackageName();
      if (service.getPackageName().equals(packageName)) {
        AccessibilityNodeInfo info = event.getSource();
        if (info != null) {
          CharSequence className = info.getClassName();
          // Check whether the window events in the event list are triggered by opening the
          // Switch Access menu window. If so, clears the event list and calls
          // WindowChangeListener#onSwitchAccessMenuShown to generate screen feedback for
          // the Switch Access menu.
          //
          // We use two criteria to check if a window is a Switch Access menu window:
          // 1. The package of the event is the same as the Switch Access Accessibility
          //    Service.
          // 2. The source AccessibilityNodeInfoCompat of the event has the same class name
          //    as SwitchAccessMenuOverlay.
          if (switchAccessMenus.containsKey(className)) {
            windowChangedListener.onSwitchAccessMenuShown(switchAccessMenus.get(className));
            windowChangeEventList.clear();
            return;
          }
        }
      }

      windowChangedListener.onWindowChangedAndIsNowStable(
          windowChangeEventList.get(0), Performance.EVENT_ID_UNTRACKED);
      windowChangeEventList.remove(0);
    }
  }
}
 
Example 11
Source File: CustomUiDevice.java    From appium-uiautomator2-server with Apache License 2.0 5 votes vote down vote up
@Nullable
private static BySelector toSelector(@Nullable AccessibilityNodeInfo nodeInfo) {
    if (nodeInfo == null) {
        return null;
    }
    final CharSequence className = nodeInfo.getClassName();
    return className == null ? null : By.clazz(className.toString());
}
 
Example 12
Source File: TamicInstallService.java    From Autoinstall with Apache License 2.0 5 votes vote down vote up
/**
 * performClickActionWithFindNode.
 * @param aAccessibilityNodeInfo  aAccessibilityNodeInfo
 * @param aClassName              aClassName
 * @param aNodeTxt                aNodeTxt
 * @param isGlobal                isGlobal
 * @return                        true
 */
private boolean performClickActionWithFindNode(AccessibilityNodeInfo aAccessibilityNodeInfo, String aClassName, String aNodeTxt, boolean isGlobal) {
    if(aAccessibilityNodeInfo == null) {
        return false;
    } else {
        List<AccessibilityNodeInfo> targetList = aAccessibilityNodeInfo.findAccessibilityNodeInfosByText(aNodeTxt);
        if (targetList != null) {
            for (AccessibilityNodeInfo targetNode : targetList) {
                if (aClassName != null) {
                    String targetClassName = targetNode.getClassName() == null ? "" : targetNode.getClassName().toString();
                    if (!aClassName.equals(targetClassName)) {
                        continue;
                    }
                }

                String targetNodeText = targetNode.getText() == null ? "" : targetNode.getText().toString();
                if (!aNodeTxt.equals(targetNodeText)) {
                    continue;
                }

                if (isGlobal && !isAutoRunning) {
                    performGlobalAction(AccessibilityNodeInfo.ACTION_FOCUS);
                } else {
                    performClickAction(targetNode);
                }
                return true;
            }
        }
    }

    return false;
}
 
Example 13
Source File: NodesInfo.java    From Anti-recall with GNU Affero General Public License v3.0 5 votes vote down vote up
private static String print(AccessibilityNodeInfo nodeInfo) {

        if (nodeInfo == null)
            return "";

        CharSequence text = nodeInfo.getText();
        CharSequence description = nodeInfo.getContentDescription();
        CharSequence className = nodeInfo.getClassName();
        CharSequence packageName = nodeInfo.getPackageName();
        boolean focusable = nodeInfo.isFocusable();
        boolean clickable = nodeInfo.isClickable();
        Rect rect = new Rect();
        nodeInfo.getBoundsInScreen(rect);
        String viewId = nodeInfo.getViewIdResourceName();

        return "| "
                + "text: " + text + " \t"
                + "description: " + description + " \t"
                + String.format("%-40s", "ID: " + viewId) + " \t"
                + String.format("%-40s", "class: " + className) + " \t"
                + String.format("%-30s", "location: " + rect) + " \t"
//                + "focusable: " + focusable + " \t"
//                + "clickable: " + clickable + " \t"
//                + String.format("%-30s", "package: " + packageName) + " \t"
                ;

    }
 
Example 14
Source File: AccessibilityHelper.java    From WechatHook-Dusan with Apache License 2.0 5 votes vote down vote up
@TargetApi(21)
public static void performSetText(AccessibilityNodeInfo nodeInfo,String text) {
    if(nodeInfo == null) {
        return;
    }
    CharSequence className = nodeInfo.getClassName();
    if ("android.widget.EditText".equals(className)) {//||"android.widget.TextView".equals(className)
        Bundle arguments = new Bundle();
        arguments.putCharSequence(AccessibilityNodeInfo
                .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
        nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
    }
}
 
Example 15
Source File: Tree.java    From oversec with GNU General Public License v3.0 5 votes vote down vote up
public boolean isAWebView(AccessibilityNodeInfo node) {
    CharSequence classname = node.getClassName();
    if (classname == null) {
        //ouch. Sometimes happens when scanning a webview
        return false;
    }
    //TODO: might be different in older releases without chrome?
    return ("android.webkit.WebView".equals(classname.toString())); //TODO: toString really needed?
}
 
Example 16
Source File: QQClient.java    From Anti-recall with GNU Affero General Public License v3.0 4 votes vote down vote up
protected void parser(AccessibilityNodeInfo group) {
        if (group.getChildCount() == 0)
            return;
        int headIconPos = 0;
        int messagePos = 0;
        subName = "";
        message = "";
        isRecalledMsg = false;

        for (int j = 0; j < group.getChildCount(); j++) {
            AccessibilityNodeInfo child = group.getChild(j);
            if (child == null) {
                Log.d(TAG, "parser: child is null, continue");
                continue;
            }
            String nodeId = child.getViewIdResourceName();
            if (nodeId == null) {
                Log.d(TAG, "parser: node ID is null, continue");
                continue;
            }
            switch (nodeId) {
                case IdHeadIcon:
                    //头像图标
                    headIconPos = j;
                    break;
                case IdChatItem:
                    switch (child.getClassName() + "") {
                        case "android.widget.RelativeLayout":
                            if (child.getChildCount() != 0) {
                                if (child.getContentDescription() != null) {
                                    redPegNode = child;
                                    message = "红包";
                                    //红包或者是分享
                                    Log.d(TAG, "content_layout: 红包");
                                }
                            } else {
                                message = "[图片]";
                                Log.d(TAG, "content_layout: 图片");
                            }
                            break;
                        case "android.widget.LinearLayout": {
                            if (child.getChildCount() == 2) {
                                AccessibilityNodeInfo child1 = child.getChild(0);
                                AccessibilityNodeInfo child2 = child.getChild(1);
                                if (child1 != null && "android.widget.RelativeLayout".contentEquals(child1.getClassName())) {
                                    if (child2 != null && "android.widget.TextView".contentEquals(child2.getClassName())) {
//                                        message = "回复 " + child1.getText() + ": \n" + child2.getText();
                                        message = child2.getText() + "";
                                    }
                                }
                            }
                            Log.d(TAG, "content_layout: 回复消息");
                        }
                        break;
                        case "android.widget.TextView": {
                            message = child.getText() + "";
                            Log.v(TAG, "content_layout: 普通文本");
                        }
                        break;
                    }
                    messagePos = j;
                    break;
                case IdNickName:
                    subName = child.getText() + "";
                    break;
                case IdGrayBar:
                        message = child.getText() + "";
                    Log.w(TAG, "parser: message: " + message);
                        int indexOfRecall = message.indexOf(RECALL);
                        if (indexOfRecall >= 0) {
                            isRecalledMsg = true;
                            subName = message.substring(0, indexOfRecall);
                            message = RECALL;
                            if ("对方".equals(subName))
                                subName = title;
                            else if ("你".equals(subName))
                                subName = "我";
                            Log.v(TAG, "content_layout: 灰底文本");
                        }
                    Log.w(TAG, "parser: " + indexOfRecall + " " + RECALL + " " + message);
                    break;
            }
        }
        if (messagePos < headIconPos)
            // 消息在头像左边
            subName = "我";
        else if ("".equals(subName))
            // 两人聊天时 没有subName
            subName = title;
        Log.v(TAG, "parser: " + title + " - " + subName + " : " + message);
    }
 
Example 17
Source File: ViewHierarchyElementAndroid.java    From Accessibility-Test-Framework-for-Android with Apache License 2.0 4 votes vote down vote up
Builder(int id, @Nullable ViewHierarchyElementAndroid parent, AccessibilityNodeInfo fromInfo) {
  // Bookkeeping
  this.id = id;
  this.parentId = (parent != null) ? parent.getId() : null;

  // API 18+ properties
  this.resourceName = AT_18 ? fromInfo.getViewIdResourceName() : null;
  this.editable = AT_18 ? fromInfo.isEditable() : null;

  // API 16+ properties
  this.visibleToUser = AT_16 ? fromInfo.isVisibleToUser() : null;

  // API 21+ properties
  if (AT_21) {
    ImmutableList.Builder<ViewHierarchyActionAndroid> actionBuilder =
        new ImmutableList.Builder<>();
    actionBuilder.addAll(
        Lists.transform(
            fromInfo.getActionList(),
            action -> ViewHierarchyActionAndroid.newBuilder(action).build()));
    this.actionList = actionBuilder.build();
  }

  // API 24+ properties
  this.drawingOrder = AT_24 ? fromInfo.getDrawingOrder() : null;

  // API 29+ properties
  this.hasTouchDelegate = AT_29 ? (fromInfo.getTouchDelegateInfo() != null) : null;

  // Base properties
  this.className = fromInfo.getClassName();
  this.packageName = fromInfo.getPackageName();
  this.accessibilityClassName = fromInfo.getClassName();
  this.contentDescription = SpannableStringAndroid.valueOf(fromInfo.getContentDescription());
  this.text = SpannableStringAndroid.valueOf(fromInfo.getText());

  this.importantForAccessibility = true;
  this.clickable = fromInfo.isClickable();
  this.longClickable = fromInfo.isLongClickable();
  this.focusable = fromInfo.isFocusable();
  this.scrollable = fromInfo.isScrollable();
  this.canScrollForward =
      ((fromInfo.getActions() & AccessibilityNodeInfo.ACTION_SCROLL_FORWARD) != 0);
  this.canScrollBackward =
      ((fromInfo.getActions() & AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) != 0);
  this.checkable = fromInfo.isCheckable();
  this.checked = fromInfo.isChecked();
  this.touchDelegateBounds = new ArrayList<>(); // Populated after construction
  android.graphics.Rect tempRect = new android.graphics.Rect();
  fromInfo.getBoundsInScreen(tempRect);
  this.boundsInScreen = new Rect(tempRect.left, tempRect.top, tempRect.right, tempRect.bottom);
  this.nonclippedHeight = null;
  this.nonclippedWidth = null;
  this.textSize = null;
  this.textColor = null;
  this.backgroundDrawableColor = null;
  this.typefaceStyle = null;
  this.enabled = fromInfo.isEnabled();
}