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(); + } +} +