@Override public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType(); switch (eventType) { case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: for (String id : installBtnId) { AccessibilityNodeInfo node = AccessibilityNodeUtil.findNodeById(event.getSource(), id); if (node != null) { AccessibilityNodeUtil.click(node); Toast.makeText(this, "安装成功", Toast.LENGTH_SHORT).show(); break; } } break; default: break; } }
/** 是否为群聊天 */ private boolean isMemberChatUi(AccessibilityNodeInfo nodeInfo) { if(nodeInfo == null) { return false; } AccessibilityNodeInfo label = AccessibilityUtils.findNodeInfosById(nodeInfo, ID_GROUP_NAME); if(label != null) { String title = String.valueOf(label.getText()); LogUtils.printOut("title", title); if(title != null && title.endsWith(")")) { return true; } } return false; }
@Override public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String searched, int virtualViewId) { if (TextUtils.isEmpty(searched)) { return Collections.emptyList(); } String searchedLowerCase = searched.toLowerCase(); List<AccessibilityNodeInfo> result = new ArrayList<AccessibilityNodeInfo>(); switch (virtualViewId) { case View.NO_ID: { findAccessibilityNodeInfosByTextInChild(searchedLowerCase, VIRTUAL_VIEW_ID_DECREMENT, result); findAccessibilityNodeInfosByTextInChild(searchedLowerCase, VIRTUAL_VIEW_ID_INPUT, result); findAccessibilityNodeInfosByTextInChild(searchedLowerCase, VIRTUAL_VIEW_ID_INCREMENT, result); return result; } case VIRTUAL_VIEW_ID_DECREMENT: case VIRTUAL_VIEW_ID_INCREMENT: case VIRTUAL_VIEW_ID_INPUT: { findAccessibilityNodeInfosByTextInChild(searchedLowerCase, virtualViewId, result); return result; } } return super.findAccessibilityNodeInfosByText(searched, virtualViewId); }
@TargetApi(21) private void FillPassword(String url, AccessibilityNodeInfo usernameEdit, List<AccessibilityNodeInfo> passwordFields) { if ((keepass2android.kbbridge.KeyboardData.hasData()) && (_hasUsedData == false)) { fillDataInTextField(usernameEdit, getLastReceivedCredentialsUser()); for (int i=0;i<passwordFields.size();i++) { fillDataInTextField(passwordFields.get(i), getLastReceivedCredentialsPassword()); } _hasUsedData = true; } //LookupCredentialsActivity.LastReceivedCredentials = null; }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public static SimpleAction createActionWithEditableFilter(final int action, int index, final String text) { return new SearchTargetAction(action, new FilterAction.EditableFilter(index)) { @Override protected void performAction(UiObject node) { Bundle args = new Bundle(); if (action == AccessibilityNodeInfo.ACTION_SET_TEXT) { args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text); } else { args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, node.text() + text); } node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args); } }; }
/** * 在当前页面查找文字内容并点击 * * @param text */ public static void findTextAndClick(AccessibilityService accessibilityService, String text) { AccessibilityNodeInfo accessibilityNodeInfo = accessibilityService.getRootInActiveWindow(); if (accessibilityNodeInfo == null) { return; } List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text); if (nodeInfoList != null && !nodeInfoList.isEmpty()) { for (AccessibilityNodeInfo nodeInfo : nodeInfoList) { if (nodeInfo != null && (text.equals(nodeInfo.getText()) || text.equals(nodeInfo.getContentDescription()))) { performClick(nodeInfo); break; } } } }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void openEnvelopeWx() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { Log.w(TAG, "rootWindow为空"); return; } List<AccessibilityNodeInfo> list6 = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/b43"); Log.w(TAG, "b43list:" + list6); for (AccessibilityNodeInfo n : list6) { n.performAction(AccessibilityNodeInfo.ACTION_CLICK); isAutoOpen = true; } /** * 判断一下是否已经被抢完了 抢完了就返回 */ List<AccessibilityNodeInfo> list7 = nodeInfo.findAccessibilityNodeInfosByText(WX_ACTION_BACK_NO_MONEY); if (list7 != null && list7.size() != 0) { Log.e(TAG, "[红包被抢完],手动返回"); performGlobalAction(GLOBAL_ACTION_HOME); } }
public static boolean hasAccessibilityNode(AccessibilityNodeInfo info, String[] texts) { if (texts != null) { for (String textItem : texts) { List<AccessibilityNodeInfo> nodes = info.findAccessibilityNodeInfosByText(textItem); if (nodes != null && !nodes.isEmpty()) { AccessibilityNodeInfo node; for (int i = 0; i < nodes.size(); i++) { node = nodes.get(i); BaseAccessibility.logPrint("find text=" + textItem + " enable=" + node.isEnabled()); CharSequence text = node.getText(); if (TextUtils.equals(text, textItem)) { return true; } } } } } return false; }
@TargetApi(21) @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(com.google.android.exoplayer2.ui.DefaultTimeBar.class.getCanonicalName()); info.setContentDescription(getProgressText()); if (duration <= 0) { return; } if (Util.SDK_INT >= 21) { info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD); info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD); } else if (Util.SDK_INT >= 16) { info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); } }
/** * 爬遍所有节点查找可点的按钮,用于解决Android5.1等组件层次分离的情况 * @param root 界面根节点 */ void crawlButton(AccessibilityNodeInfo root) { AccessibilityNodeInfo child; Integer size = root.getChildCount(); for (Integer i=0;i < size;i++) { child = root.getChild(i); if (child != null) { if (child.getClassName().toString().equals("android.widget.Button")) { // Log.d("crawl-button", child.toString()); //Log.d("click", "OPEN"); child.performAction(AccessibilityNodeInfo.ACTION_CLICK); // 拆红包 cnt_open += 1; flags_detail = 1; // 红包有效 state = State.DETAIL; } crawlButton(child); } } }
@Override public boolean performAccessibilityAction(View host, int action, Bundle arguments) { if (super.performAccessibilityAction(host, action, arguments)) { return true; } switch (action) { case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: adjustPicker(1); return true; case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: adjustPicker(-1); return true; } return false; }
public static AccessibilityNodeInfo getRootAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo accessibilityNodeInfo) throws MyException { if (null == accessibilityNodeInfo) { throw new NullPointerException("accessibilityNodeInfo"); } AccessibilityNodeInfo current = null; try { current = accessibilityNodeInfo; while (true) { AccessibilityNodeInfo parent = current.getParent(); if (null == parent) { return current; } current = parent; } } catch (Exception e) { if (null != current) { current.recycle(); } throw new MyException(e); } }
/** * Returns the node's bounds clipped to the size of the display * * @param node * @param width pixel width of the display * @param height pixel height of the display * @return null if node is null, else a Rect containing visible bounds */ public static Rect getVisibleBoundsInScreen(AccessibilityNodeInfo node, int width, int height) { if (node == null) { return null; } // targeted node's bounds Rect nodeRect = new Rect(); node.getBoundsInScreen(nodeRect); Rect displayRect = new Rect(); displayRect.top = 0; displayRect.left = 0; displayRect.right = width; displayRect.bottom = height; boolean intersect = nodeRect.intersect(displayRect); return nodeRect; }
/** 查看领取详情或者返回 */ private void clickRedPacketAfter() { // 到这, 领取流程算是完了 isReceived = false; // 查看领取详情, 或者返回 if(!config().isSmartBackQQ()){ SystemClock.sleep(999); AccessibilityNodeInfo nodeInfo = mService.getRootInActiveWindow(); if(nodeInfo == null) { LogUtils.printErr(TAG, "rootWindow为空"); return; } AccessibilityNodeInfo look = AccessibilityUtils.findNodeInfosByText(nodeInfo, KEY_LOOK); if(look != null){ AccessibilityUtils.performClick(look); } }else{ back(); } }
/** * 检查viewId进行点击 * * @param accessibilityService * @param id */ public static void findViewIdAndClick(AccessibilityService accessibilityService, String id) { AccessibilityNodeInfo accessibilityNodeInfo = accessibilityService.getRootInActiveWindow(); if (accessibilityNodeInfo == null) { return; } List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id); if (nodeInfoList != null && !nodeInfoList.isEmpty()) { for (AccessibilityNodeInfo nodeInfo : nodeInfoList) { if (nodeInfo != null) { performClick(nodeInfo); break; } } } }
/** * 封装节点属性 * @param node * @param childNum * @param childPath * @return */ private static NodeAttr setFuntion(AccessibilityNodeInfo node,int childNum,String childPath){ NodeAttr attr = new NodeAttr(); //attr.setChildNum(childNum); attr.setChildPath(childPath+childNum); attr.setNode(node); Map<String,Object> function = new HashMap<String,Object>(); function.put("isClickable",node.isClickable()); function.put("isEditable",node.isEditable()); function.put("getChildCount",node.getChildCount()); function.put("getClassName",node.getClassName()); function.put("getText",node.getText()); function.put("getContentDescription",node.getContentDescription()); attr.setFunction(function); return attr; }
@Override public void onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event, StringBuilder sb) { AccessibilityNodeInfo source = event.getSource(); if (source == null) return; String bounds = NodeInfo.boundsToString(AccessibilityNodeInfoHelper.getBoundsInScreen(source)); source.recycle(); onAccessibilityEvent(event, bounds, sb); }
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) private void refreshChildList(AccessibilityNodeInfo root) { if (root == null) return; root.refresh(); int childCount = root.getChildCount(); for (int i = 0; i < childCount; i++) { refreshChildList(root.getChild(i)); } }
/** * 通过文本查找节点(注: text是包含contains,而不是完全equals) * @param nodeInfo * @param text * @return */ public static AccessibilityNodeInfo findNodeByText(AccessibilityNodeInfo nodeInfo, String text) { List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text); if(list == null || list.isEmpty()) { return null; } return list.get(0); }
@TargetApi(14) @SuppressLint({"Override"}) public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(AbsHListView.class.getName()); if (isEnabled()) { if (getFirstVisiblePosition() > 0) { info.addAction(8192); } if (getLastVisiblePosition() < getCount() - 1) { info.addAction(4096); } } }
/** * 获取一个可以点击的节点 */ private AccessibilityNodeInfo getClickableNode(AccessibilityNodeInfo node) { AccessibilityNodeInfo parent=node; while (parent != null) { if (parent.isClickable()) { break; } parent = parent.getParent(); } return parent; }
/** * * @param root is the rootview of a given page. * @param packageName denotes the related app for this given page. * @return A list of accessibility node infos representing a list of messages in a given chat app */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public static List<AccessibilityNodeInfo> getMessageList(AccessibilityNodeInfo root, String packageName){ if(root!=null) return root.findAccessibilityNodeInfosByViewId(getMessageListResourceId(packageName)); else return new ArrayList<>(); }
public UiTree(@NonNull String className, @Nullable AccessibilityNodeInfo accessibilityNodeInfo) throws UiNode.NullChildAccessibilityNodeInfoException, MyException { if (null == className) { throw new NullPointerException("className"); } mClassName = className; mNode = (null == accessibilityNodeInfo ? null : new UiNode(getRootAccessibilityNodeInfo(accessibilityNodeInfo))); mFoundForm = findForm(); mLog = obtainLog(); }
/** */ @Override @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(ViewPagerWidget.class.getName()); }
public static void recycleList(AccessibilityNodeInfo root, List<AccessibilityNodeInfo> list) { for (AccessibilityNodeInfo nodeInfo : list) { if (nodeInfo != root && nodeInfo != null) { //// FIXME: 2017/5/1 Issue #180 nodeInfo.recycle(); } } }
@Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setScrollable(isScrollableForAccessibility()); View selectedView = getSelectedView(); if (selectedView != null) { info.setEnabled(selectedView.isEnabled()); } }
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) public static AccessibilityNodeInfo.AccessibilityAction findAction(View view, int actionId) { AccessibilityNodeInfo accessibilityNodeInfo = view.createAccessibilityNodeInfo(); for (AccessibilityNodeInfo.AccessibilityAction accessibilityAction : accessibilityNodeInfo.getActionList()) { if (actionId == accessibilityAction.getId()) { return accessibilityAction; } } throw new AccessibilityActionNotFoundException(actionId); }
private void openDelay(final AccessibilityNodeInfo nodeInfo, final int delaytime, final String text) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); try { sleep(delaytime); } catch (InterruptedException mE) { mE.printStackTrace(); } openNext(nodeInfo, text); } }).start(); }
/** * * @param root * @param appName * @return */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public static String getBrowserCurrentUrl(AccessibilityNodeInfo root, String appName){ try{ AccessibilityNodeInfo bar = root.findAccessibilityNodeInfosByViewId(getUrlResourceId(appName)).get(0); if(bar!=null){ return bar.getText().toString(); } } catch (Exception exception){ return null; } return null; }
private String[] getSenderContentDescriptionFromNode(AccessibilityNodeInfo node) { int count = node.getChildCount(); String[] result = {"unknownSender", "unknownTime"}; for (int i = 0; i < count; i++) { AccessibilityNodeInfo thisNode = node.getChild(i); if ("android.widget.ImageView".equals(thisNode.getClassName()) && "unknownSender".equals(result[0])) { CharSequence contentDescription = thisNode.getContentDescription(); if (contentDescription != null) result[0] = contentDescription.toString().replaceAll("头像$", ""); } else if ("android.widget.TextView".equals(thisNode.getClassName()) && "unknownTime".equals(result[1])) { CharSequence thisNodeText = thisNode.getText(); if (thisNodeText != null) result[1] = thisNodeText.toString(); } } return result; }
@Override public void onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event, StringBuilder sb) { AccessibilityNodeInfo source = event.getSource(); if (source == null) return; UiObject uiObject = UiObject.createRoot(service.getRootInActiveWindow()); List<UiObject> editableList = FilterAction.EditableFilter.findEditable(uiObject); int i = findInEditableList(editableList, source); sb.append("while(!input(").append(i).append(", \"").append(source.getText()).append("\"));"); source.recycle(); }
@Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setClassName(RadioButton.class.getName()); info.setCheckable(true); info.setChecked(false); }
private void WeChatUIRobRedMoney(AccessibilityNodeInfo nodeInfo) { if (isSelfSendMoney) { // 自己发的,回复一下数据 detailGetMoneyOk = false; detailGetNameOk = false; } if (!isNotDO) { S(" 准备点击红包--"); // 红包 List<AccessibilityNodeInfo> redMoneyItems = nodeInfo.findAccessibilityNodeInfosByViewId(WechatVersionUtils.getWechatGetRedMoneyId(context)); S(" redMoneyItems:" + redMoneyItems); if (redMoneyItems != null && redMoneyItems.size() > 0) { AccessibilityNodeInfo nodeInfo1 = redMoneyItems.get(redMoneyItems.size() - 1); S(" 要开始点击红包了:" + nodeInfo1.getText().toString()); if (nodeInfo1.getText().toString().equals("查看红包")||nodeInfo1.getText().toString().equals("领取红包")) { // TODO 是否抢自己的红包 boolean isRobSelf = true; if (!isRobSelf) { return; } isSelfSendMoney = true; } else { isSelfSendMoney = false; } // TODO 随机延时 固定延时 delayRob(nodeInfo1.getParent()); } } isNotDO = false; }
/** * Returns the first object to match the {@code selector} criteria. */ public UiObject2 findObject(Object selector) throws Exception { AccessibilityNodeInfo node; uiDevice.waitForIdle(); node = ((NodeInfoList) selector).getNodeList().size() > 0 ? ((NodeInfoList) selector).getNodeList().get(0) : null; selector = By.clazz(node.getClassName().toString()); if (node == null) { return null; } return doFindObject(selector, node); }
@SuppressLint("NewApi") private boolean fill() { AccessibilityNodeInfo rootNode = getRootInActiveWindow(); if (rootNode != null) { SharedPreferences sharedPreferences = getSharedPreferences("hook_Cosplay", AccessibilityService.MODE_PRIVATE); String htmly = sharedPreferences.getString("io_kii", ""); return findEditText(rootNode, htmly); } return false; }
@TargetApi(14) public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); if (VERSION.SDK_INT >= 14) { info.setClassName(SurfaceRenderView.class.getName()); } }
/** * Find out whether you are at the main page of chatting * @param root * @param appName * @return boolean whether you are at the main page of a chatting application or not */ public static boolean getMainPageSymbol(AccessibilityNodeInfo root, String appName){ try{ AccessibilityNodeInfo mainPage = root.findAccessibilityNodeInfosByViewId(getMainPageSymbolResourceId(appName)).get(0); if(mainPage!=null){ return true; } } catch (Exception exception){ return false; } return false; }
/** */ @Override @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(ButtonWidget.class.getName()); }
/** * * @param nodeInfoList is the complete list of node infos in a page. * @return the first webview node. */ public static String getWebViewTitle(List<AccessibilityNodeInfo> nodeInfoList) { for (AccessibilityNodeInfo nodeInfo : nodeInfoList) { Logging.debug(nodeInfo.getClassName().toString()); if (nodeInfo.getClassName().equals(ANDROID_WEBVIEW_CLASSNAME)) { return nodeInfo.getContentDescription().toString(); }else if (nodeInfo.getClassName().equals(ANDROID_VIEW_FIREFOXCLASSNAME)) { return nodeInfo.getText().toString(); } } return null; }
private void parseNodeInfoAndOpenGetPacketDialog(AccessibilityNodeInfo accessibilityNodeInfo){ if(accessibilityNodeInfo != null && accessibilityNodeInfo.getChildCount() >0){ for(int i = 0;i<accessibilityNodeInfo.getChildCount();i++){ AccessibilityNodeInfo child = accessibilityNodeInfo.getChild(i); parseNodeInfoAndOpenGetPacketDialog(child); } }else{ if(accessibilityNodeInfo != null && !TextUtils.isEmpty(accessibilityNodeInfo.getText())&&accessibilityNodeInfo.getText().toString().contains("领取红包")){ Log.i(TAG,"领取红包"); if(accessibilityNodeInfo.isClickable()){ accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); }else{ AccessibilityNodeInfo parent = accessibilityNodeInfo.getParent(); while(parent != null ){ if(parent.isClickable()){ parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } parent = parent.getParent(); Log.i(TAG," 找到一个可以点击的节点"); } } } } }