From 405075757e318c7b362d1a67398bef00da7cd447 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Mon, 14 Aug 2017 21:23:07 +0800 Subject: [PATCH] add: stable mode for AccessibilityService --- app/src/main/AndroidManifest.xml | 13 ++++++++++ .../java/com/stardust/scriptdroid/Pref.java | 9 +++++++ .../accessibility/AccessibilityService.java | 25 +++++++++++++++++++ .../stardust/scriptdroid/autojs/AutoJs.java | 2 +- .../tool/AccessibilityServiceTool.java | 18 +++++++------ .../scriptdroid/ui/main/MainActivity.java | 2 +- .../scriptdroid/ui/main/SideMenuFragment.java | 4 +-- app/src/main/res/values/strings.xml | 6 +++++ app/src/main/res/xml/preferences.xml | 7 ++++++ autojs/src/main/AndroidManifest.xml | 11 -------- .../stardust/autojs/runtime/api/Events.java | 11 +++++--- autojs/src/main/res/values/strings.xml | 1 + .../accessibility/AccessibilityService.java | 4 --- 13 files changed, 83 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/stardust/scriptdroid/accessibility/AccessibilityService.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 48bcd78d..d699b9ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -247,6 +247,19 @@ + + + + + + + + diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java index f6f08258..861303df 100644 --- a/app/src/main/java/com/stardust/scriptdroid/Pref.java +++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java @@ -133,4 +133,13 @@ public class Pref { return def().getString(getString(R.string.key_root_record_out_file_type), "binary") .equals("binary"); } + + public static boolean isObservingKeyEnabled() { + return def().getBoolean(getString(R.string.key_enable_observe_key), false); + } + + public static boolean isStableModeEnabled() { + return def().getBoolean(getString(R.string.key_stable_mode), false); + } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/accessibility/AccessibilityService.java b/app/src/main/java/com/stardust/scriptdroid/accessibility/AccessibilityService.java new file mode 100644 index 00000000..4d311022 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/accessibility/AccessibilityService.java @@ -0,0 +1,25 @@ +package com.stardust.scriptdroid.accessibility; + + +import android.accessibilityservice.AccessibilityServiceInfo; + +import com.stardust.scriptdroid.Pref; + +/** + * Created by Stardust on 2017/8/14. + */ + +public class AccessibilityService extends com.stardust.view.accessibility.AccessibilityService { + + @Override + protected void onServiceConnected() { + AccessibilityServiceInfo serviceInfo = getServiceInfo(); + if (Pref.isStableModeEnabled()) { + serviceInfo.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; + } else { + serviceInfo.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; + } + setServiceInfo(serviceInfo); + super.onServiceConnected(); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index be11468e..4e9a4fb3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -182,7 +182,7 @@ public class AutoJs { public void ensureAccessibilityServiceEnabled() { if (AccessibilityService.getInstance() == null) { String errorMessage = null; - if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityService.class)) { + if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) { errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); } else { if (Pref.enableAccessibilityServiceByRoot()) { diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java b/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java index f5e0bb0c..91f159da 100644 --- a/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java +++ b/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java @@ -3,16 +3,12 @@ package com.stardust.scriptdroid.tool; import android.content.ActivityNotFoundException; import android.content.Context; import android.text.TextUtils; -import android.widget.Toast; -import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.scriptdroid.Pref; -import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.util.UiHandler; -import com.stardust.view.accessibility.AccessibilityService; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.autojs.runtime.api.ProcessShell; +import com.stardust.scriptdroid.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityServiceUtils; import java.util.Locale; @@ -23,9 +19,11 @@ import java.util.Locale; public class AccessibilityServiceTool { + private static final Class sAccessibilityServiceClass = AccessibilityService.class; + public static void enableAccessibilityService() { if (Pref.enableAccessibilityServiceByRoot()) { - if (!enableAccessibilityServiceByRoot(AccessibilityService.class)) { + if (!enableAccessibilityServiceByRoot(sAccessibilityServiceClass)) { goToAccessibilitySetting(); } } else { @@ -62,7 +60,7 @@ public class AccessibilityServiceTool { } public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) { - if (enableAccessibilityServiceByRoot(AccessibilityService.class)) { + if (enableAccessibilityServiceByRoot(sAccessibilityServiceClass)) { return AccessibilityService.waitForEnabled(timeOut); } return false; @@ -71,7 +69,11 @@ public class AccessibilityServiceTool { public static void enableAccessibilityServiceByRootIfNeeded() { if (AccessibilityService.getInstance() == null) if (Pref.enableAccessibilityServiceByRoot()) { - AccessibilityServiceTool.enableAccessibilityServiceByRoot(AccessibilityService.class); + AccessibilityServiceTool.enableAccessibilityServiceByRoot(sAccessibilityServiceClass); } } + + public static boolean isAccessibilityServiceEnabled(Context context) { + return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, sAccessibilityServiceClass); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index 5c2d16d3..4895be0a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -153,7 +153,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega } private void showAccessibilitySettingPromptIfDisabled() { - if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityService.class)) { + if (!AccessibilityServiceTool.isAccessibilityServiceEnabled(this)) { new NotAskAgainDialog.Builder(this, "Eating...love you...miss you...17.4.12") .title(R.string.text_need_to_enable_accessibility_service) .content(R.string.explain_accessibility_permission) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java index 5cf13a4c..7608062c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java @@ -83,7 +83,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { if (mAccessibilityServiceSwitch == null) { return; } - final boolean checked = AccessibilityService.isEnabled(App.getApp()); + final boolean checked = AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp()); mAccessibilityServiceSwitch.post(new Runnable() { @Override public void run() { @@ -118,7 +118,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { @CheckedChange(R.id.sw_accessibility_service) void setAutoOperateServiceEnable(CompoundButton button, boolean enable) { - boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp()); + boolean isAccessibilityServiceEnabled = AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp()); if (enable && !isAccessibilityServiceEnabled) { enableAccessibilityService(); } else if (!enable && isAccessibilityServiceEnabled) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 334c2299..d3621d45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -221,6 +221,12 @@ key_root_record_out_file_type Root录制生成文件类型 binary + key_stable_mode + 开启后布局分析更稳定,但小部分脚本可能无法正常运行。重启无障碍服务生效 + 稳定模式 + key_enable_observe_key + 不启动则无法使用events的按键事件; 启用后软件崩溃等情况会造成按键失灵。重启无障碍服务生效 + 启用按键监听 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 9abf3076..619146a2 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -58,6 +58,13 @@ android:key="@string/key_enable_accessibility_service_by_root" android:summary="@string/summary_enable_accessibility_service_by_root" android:title="@string/text_enable_accessibility_service_by_root"/> + + + diff --git a/autojs/src/main/AndroidManifest.xml b/autojs/src/main/AndroidManifest.xml index ed63e9a6..2c32768d 100644 --- a/autojs/src/main/AndroidManifest.xml +++ b/autojs/src/main/AndroidManifest.xml @@ -7,18 +7,7 @@ > - - - - - - diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java index 8db25df6..fe436072 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java @@ -1,5 +1,6 @@ package com.stardust.autojs.runtime.api; +import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Notification; import android.content.Context; import android.graphics.Point; @@ -7,6 +8,7 @@ import android.os.Handler; import android.view.KeyEvent; import android.view.accessibility.AccessibilityEvent; +import com.stardust.autojs.R; import com.stardust.autojs.core.accessibility.AccessibilityBridge; import com.stardust.autojs.runtime.ScriptBridges; import com.stardust.autojs.runtime.exception.ScriptException; @@ -49,13 +51,16 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver public void observeKey() { if (mListeningKey) return; + AccessibilityService service = mAccessibilityBridge.getService(); + if (service == null) + throw new ScriptException("AccessibilityService = null"); + if ((service.getServiceInfo().flags & AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS) == 0) { + throw new ScriptException(mContext.getString(R.string.text_should_enable_key_observing)); + } ensureHandler(); mLoopers.waitWhenIdle(true); mListeningKey = true; mAccessibilityBridge.ensureServiceEnabled(); - AccessibilityService service = mAccessibilityBridge.getService(); - if (service == null) - throw new ScriptException(); service.getOnKeyObserver().addListener(this); } diff --git a/autojs/src/main/res/values/strings.xml b/autojs/src/main/res/values/strings.xml index 0f292bdb..e69468de 100644 --- a/autojs/src/main/res/values/strings.xml +++ b/autojs/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ 没有悬浮窗权限 使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。 AutoJs + 按键监听未启用,请在软件设置中开启 diff --git a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java index 7d9170dc..6b16b4c8 100644 --- a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java +++ b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java @@ -52,10 +52,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi eventTypes.addAll(set); } - public static boolean isEnabled(Context context) { - return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class); - } - public static AccessibilityService getInstance() { return instance; }