From 73773faedc8b9016df1512794a98149ab0b74b72 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sun, 16 Jul 2017 10:19:07 +0800
Subject: [PATCH] fix fucking accessibility service
---
app/build.gradle | 4 +-
.../assets/sample/QQ与微信/QQ加群成员脚本.js | 51 ++++++++++------
.../assets/sample/QQ与微信/QQ名片点赞脚本.js | 6 +-
.../QQ与微信/QQ名片点赞(只点赞好友).js | 21 +++++++
.../assets/sample/QQ与微信/QQ点赞群成员.js | 60 ++++++++++++-------
.../floatingwindow/HoverMenuManger.java | 7 ++-
.../floatingwindow/menu/HoverMenuService.java | 8 ++-
.../content/MainMenuNavigatorContent.java | 7 ++-
.../layout_inspector/LayoutInspector.java | 13 ++++
app/src/main/res/values/strings.xml | 1 +
.../res/xml/accessibility_service_config.xml | 4 +-
.../accessibility/AccessibilityService.java | 46 ++++++++------
.../accessibility/LayoutInspectService.java | 27 +++++++++
13 files changed, 186 insertions(+), 69 deletions(-)
create mode 100644 app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
create mode 100644 automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
diff --git a/app/build.gradle b/app/build.gradle
index d71b6250..e00b7437 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 17
targetSdkVersion 23
- versionCode 147
- versionName "2.0.14 Beta"
+ versionCode 148
+ versionName "2.0.14 Alpha"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
diff --git a/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js b/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
index c9844a72..d4db1561 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
@@ -3,27 +3,30 @@
var 好友验证信息 = "AutoJs自动添加群好友";
var 延迟 = 500;
-toast("请打开群成员列表");
+launchApp("QQ");
+toast("请打开要加的群");
+sleep(500);
+if(currentActivity() != "com.tencent.mobileqq.activity.TroopMemberListActivity"){
+ openGroupMemberList();
+}
var added = {};
while(true){
- var list = className("AbsListView").findOne();
- list.children().each(function(child){
- if(child.className() != "android.widget.FrameLayout"){
- return;
- }
- if(!isGroupMember(child)){
- return;
- }
- if(isMyself(child)){
- return;
- }
- child.child(0).click();
- sleep(500);
- addAsFriend();
- sleep(延迟);
- });
- className("AbsListView").findOne().scrollForward();
+ var list = className("AbsListView").findOne();
+ var count = list.childCount();
+ for(var i = 0; i < count; i++){
+ var child = list.child(i);
+ if(!child || child.className() != "android.widget.FrameLayout"){
+ continue;
+ }
+ if(!isGroupMember(child) || isMyself(child)){
+ continue;
+ }
+ child.child(0).click();
+ sleep(500);
+ addAsFriend();
+ sleep(延迟);
+ }
}
@@ -31,6 +34,9 @@ function isGroupMember(child){
if(child.childCount() != 1){
return false;
}
+ if(!child.findByText("Baby Q").isEmpty()){
+ return false;
+ }
return child.child(0) && child.child(0).className() == "android.widget.FrameLayout";
}
@@ -41,6 +47,7 @@ function isMyself(child){
function addAsFriend(){
var qq = getQQ();
+ toast(qq);
if(added[qq]){
while(!click("返回"));
return;
@@ -63,4 +70,12 @@ function addAsFriend(){
function getQQ(){
var qq = textMatches("\\d{5,12}").findOne().text();
return qq;
+}
+
+function openGroupMemberList(){
+ desc("群资料卡").click();
+ var groupMemberCountView = textEndsWith("名成员").findOne();
+ var groupMemberCount = parseInt(/\d+/.exec(groupMemberCountView.text())[0]);
+ groupMemberCountView.parent().click();
+ sleep(groupMemberCount * 4);
}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js b/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
index e5c8538b..f5a691a9 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
@@ -24,11 +24,13 @@ sleep(100);
waitForActivity("com.tencent.mobileqq.activity.VisitorsActivity");
while(notStopped()){
- var i = 0;
+ var i = 0;
while(i < 10){
i += 赞() ? 1 : 0;
click("取消");
}
显示更多();
- 下滑();
+ if(currentActivity() == "com.tencent.mobileqq.activity.VisitorsActivity"){
+ 下滑();
+ }
}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js b/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
new file mode 100644
index 00000000..934a6fd6
--- /dev/null
+++ b/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
@@ -0,0 +1,21 @@
+"auto";
+
+toast("请打开自己的资料页,点击点赞图标");
+sleep(500);
+waitForActivity("com.tencent.mobileqq.activity.VisitorsActivity");
+
+while(notStopped()){
+ for(var i = 0; i < 10; i++){
+ className("ImageView").desc("赞").untilFind().each(function(like){
+ var parent = like.parent();
+ if(like.parent().findByText("(好友)")){
+ like.click();
+ }
+ });
+ }
+ click("显示更多");
+ click("显示更多");
+ if(currentActivity() == "com.tencent.mobileqq.activity.VisitorsActivity"){
+ className("AbsListView").scrollable().scrollForward();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js b/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
index 073d1717..61890e2a 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
@@ -1,24 +1,32 @@
"auto";
-var liked = {};
+
+launchApp("QQ");
+toast("请打开要点赞的群");
+sleep(500);
+if(currentActivity() != "com.tencent.mobileqq.activity.TroopMemberListActivity"){
+ openGroupMemberList();
+}
+
while(true){
var list = className("AbsListView").findOne();
- list.children().each(function(child){
- if(child.className() != "android.widget.FrameLayout"){
- return;
- }
- if(!isGroupMember(child)){
- return;
- }
- if(isMyself(child)){
- return;
- }
- child.child(0).click();
- like();
- while(!click("返回"));
- while(!click("成员资料"));
- while(!click("返回"));
- });
- className("AbsListView").findOne().scrollForward();
+ var count = list.childCount();
+ for(var i = 0; i < count; i++){
+ var child = list.child(i);
+ if(!child || child.className() != "android.widget.FrameLayout"){
+ continue;
+ }
+ if(!isGroupMember(child) || isMyself(child)){
+ continue;
+ }
+ child.child(0).click();
+ sleep(500);
+ like();
+ while(!click("返回"));
+ while(!click("成员资料"));
+ while(!click("返回"));
+ sleep(500);
+ }
+ list.scrollForward();
}
@@ -26,6 +34,9 @@ function isGroupMember(child){
if(child.childCount() != 1){
return false;
}
+ if(!child.findByText("Baby Q").isEmpty()){
+ return false;
+ }
return child.child(0) && child.child(0).className() == "android.widget.FrameLayout";
}
@@ -35,11 +46,6 @@ function isMyself(child){
}
function like(){
- var qq = getQQ();
- if(liked[qq]){
- while(!click("返回"));
- return;
- }
while(!click("更多"));
while(!click("查看个人资料卡"));
var likeBtn = descEndsWith("点击可赞").findOne();
@@ -52,4 +58,12 @@ function like(){
function getQQ(){
var qq = textMatches("\\d{5,12}").findOne().text();
return qq;
+}
+
+function openGroupMemberList(){
+ desc("群资料卡").click();
+ var groupMemberCountView = textEndsWith("名成员").findOne();
+ var groupMemberCount = parseInt(/\d+/.exec(groupMemberCountView.text())[0]);
+ groupMemberCountView.parent().click();
+ sleep(groupMemberCount * 4);
}
\ No newline at end of file
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
index 6d1bcf54..ccf24900 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
@@ -30,7 +30,12 @@ public class HoverMenuManger {
if (!HoverMenuService.isServiceRunning()) {
if (!SettingsCompat.canDrawOverlays(App.getApp())) {
Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
- SettingsCompat.manageDrawOverlays(App.getApp());
+ try {
+ SettingsCompat.manageDrawOverlays(App.getApp());
+ } catch (Exception e) {
+ e.printStackTrace();
+ IntentUtil.goToAppDetailSettings(App.getApp());
+ }
} else {
HoverMenuService.startService(App.getApp());
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
index aa265fcb..8a52e75f 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
@@ -22,6 +22,7 @@ import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayout
import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayoutHierarchyView;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.theme.ThemeColorManagerCompat;
+import com.stardust.util.IntentUtil;
import com.stardust.util.MessageEvent;
import com.stardust.util.MessageIntent;
@@ -129,7 +130,12 @@ public class HoverMenuService extends Service {
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
- SettingsCompat.manageDrawOverlays(this);
+ try {
+ SettingsCompat.manageDrawOverlays(this);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ IntentUtil.goToAppDetailSettings(this);
+ }
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
index f688682d..dc6ed7c0 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
@@ -17,6 +17,7 @@ import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.main.MainActivity_;
import com.stardust.util.ClipboardUtil;
import com.stardust.util.MessageEvent;
+import com.stardust.view.accessibility.AccessibilityService;
import org.greenrobot.eventbus.Subscribe;
@@ -61,10 +62,14 @@ public class MainMenuNavigatorContent implements NavigatorContent {
Toast.makeText(mView.getContext(), R.string.text_layout_inspector_is_dumping, Toast.LENGTH_SHORT).show();
return false;
}
- if (inspector.getCapture() == null) {
+ if (AccessibilityService.getInstance() == null) {
Toast.makeText(mView.getContext(), R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show();
return false;
}
+ if (inspector.getCapture() == null) {
+ Toast.makeText(mView.getContext(), R.string.text_inspect_failed, Toast.LENGTH_SHORT).show();
+ return false;
+ }
return true;
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
index e2a30562..d81f4470 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
@@ -1,5 +1,7 @@
package com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -43,6 +45,17 @@ public class LayoutInspector {
}
}
+ @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));
+ }
+ }
+
public boolean isDumping() {
return mDumping;
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 69df5dc9..b198f3b9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -207,6 +207,7 @@
格式错误
打开无障碍服务
放弃录制
+ 布局抓取失败,请关闭悬浮窗后动一下页面重试
- 无
diff --git a/autojs/src/main/res/xml/accessibility_service_config.xml b/autojs/src/main/res/xml/accessibility_service_config.xml
index 9c541b8b..78d50da7 100644
--- a/autojs/src/main/res/xml/accessibility_service_config.xml
+++ b/autojs/src/main/res/xml/accessibility_service_config.xml
@@ -1,8 +1,8 @@
eventTypes = new HashSet<>();
+ private volatile AccessibilityNodeInfo mRootInActiveWindow;
+ private Timer mTimer;
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
mDelegates.put(uniquePriority, delegate);
@@ -59,15 +62,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.v(TAG, "onAccessibilityEvent: " + event);
- if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
- || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
- || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
- AccessibilityNodeInfo root = super.getRootInActiveWindow();
- if (root != null) {
- mRootInActiveWindow = root;
- Log.d(TAG, "rootInActiveWindow: " + mRootInActiveWindow);
- }
- }
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
return;
for (Map.Entry entry : mDelegates.entrySet()) {
@@ -90,13 +84,17 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public AccessibilityNodeInfo getRootInActiveWindow() {
- return mRootInActiveWindow;
+ try {
+ return super.getRootInActiveWindow();
+ } catch (IllegalStateException e) {
+ return null;
+ }
}
-
@Override
public void onDestroy() {
instance = null;
+ mTimer.cancel();
super.onDestroy();
}
@@ -109,6 +107,16 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
LOCK.lock();
ENABLED.signalAll();
LOCK.unlock();
+ mTimer = new Timer();
+ mTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ AccessibilityNodeInfo root = getRootInActiveWindow();
+ if (root != null) {
+ mRootInActiveWindow = root;
+ }
+ }
+ }, 0, 100);
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
}
diff --git a/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
new file mode 100644
index 00000000..9d72b7e5
--- /dev/null
+++ b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
@@ -0,0 +1,27 @@
+package com.stardust.view.accessibility;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Created by Stardust on 2017/7/13.
+ */
+
+public class LayoutInspectService extends AccessibilityService {
+
+ private static LayoutInspectService instance;
+
+ public static LayoutInspectService getInstance() {
+ return instance;
+ }
+
+
+ @Override
+ protected void onServiceConnected() {
+ AccessibilityServiceInfo info = getServiceInfo();
+ info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+ setServiceInfo(info);
+ super.onServiceConnected();
+ }
+}
+