add: stable mode for AccessibilityService
This commit is contained in:
@@ -247,6 +247,19 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name="com.stardust.scriptdroid.accessibility.AccessibilityService"
|
||||||
|
android:label="@string/_app_name"
|
||||||
|
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.accessibilityservice.AccessibilityService"/>
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.accessibilityservice"
|
||||||
|
android:resource="@xml/accessibility_service_config"/>
|
||||||
|
|
||||||
|
</service>
|
||||||
|
|
||||||
<receiver android:name=".external.widget.ScriptWidget">
|
<receiver android:name=".external.widget.ScriptWidget">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
|
||||||
|
|||||||
@@ -133,4 +133,13 @@ public class Pref {
|
|||||||
return def().getString(getString(R.string.key_root_record_out_file_type), "binary")
|
return def().getString(getString(R.string.key_root_record_out_file_type), "binary")
|
||||||
.equals("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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -182,7 +182,7 @@ public class AutoJs {
|
|||||||
public void ensureAccessibilityServiceEnabled() {
|
public void ensureAccessibilityServiceEnabled() {
|
||||||
if (AccessibilityService.getInstance() == null) {
|
if (AccessibilityService.getInstance() == null) {
|
||||||
String errorMessage = 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);
|
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||||
} else {
|
} else {
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
|
|||||||
@@ -3,16 +3,12 @@ package com.stardust.scriptdroid.tool;
|
|||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.ScriptRuntime;
|
|
||||||
import com.stardust.scriptdroid.Pref;
|
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.App;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.autojs.runtime.api.ProcessShell;
|
import com.stardust.autojs.runtime.api.ProcessShell;
|
||||||
|
import com.stardust.scriptdroid.accessibility.AccessibilityService;
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@@ -23,9 +19,11 @@ import java.util.Locale;
|
|||||||
|
|
||||||
public class AccessibilityServiceTool {
|
public class AccessibilityServiceTool {
|
||||||
|
|
||||||
|
private static final Class<AccessibilityService> sAccessibilityServiceClass = AccessibilityService.class;
|
||||||
|
|
||||||
public static void enableAccessibilityService() {
|
public static void enableAccessibilityService() {
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
if (!enableAccessibilityServiceByRoot(AccessibilityService.class)) {
|
if (!enableAccessibilityServiceByRoot(sAccessibilityServiceClass)) {
|
||||||
goToAccessibilitySetting();
|
goToAccessibilitySetting();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -62,7 +60,7 @@ public class AccessibilityServiceTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) {
|
public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) {
|
||||||
if (enableAccessibilityServiceByRoot(AccessibilityService.class)) {
|
if (enableAccessibilityServiceByRoot(sAccessibilityServiceClass)) {
|
||||||
return AccessibilityService.waitForEnabled(timeOut);
|
return AccessibilityService.waitForEnabled(timeOut);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -71,7 +69,11 @@ public class AccessibilityServiceTool {
|
|||||||
public static void enableAccessibilityServiceByRootIfNeeded() {
|
public static void enableAccessibilityServiceByRootIfNeeded() {
|
||||||
if (AccessibilityService.getInstance() == null)
|
if (AccessibilityService.getInstance() == null)
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
AccessibilityServiceTool.enableAccessibilityServiceByRoot(AccessibilityService.class);
|
AccessibilityServiceTool.enableAccessibilityServiceByRoot(sAccessibilityServiceClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isAccessibilityServiceEnabled(Context context) {
|
||||||
|
return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, sAccessibilityServiceClass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showAccessibilitySettingPromptIfDisabled() {
|
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")
|
new NotAskAgainDialog.Builder(this, "Eating...love you...miss you...17.4.12")
|
||||||
.title(R.string.text_need_to_enable_accessibility_service)
|
.title(R.string.text_need_to_enable_accessibility_service)
|
||||||
.content(R.string.explain_accessibility_permission)
|
.content(R.string.explain_accessibility_permission)
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
|
|||||||
if (mAccessibilityServiceSwitch == null) {
|
if (mAccessibilityServiceSwitch == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final boolean checked = AccessibilityService.isEnabled(App.getApp());
|
final boolean checked = AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp());
|
||||||
mAccessibilityServiceSwitch.post(new Runnable() {
|
mAccessibilityServiceSwitch.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -118,7 +118,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
|
|||||||
|
|
||||||
@CheckedChange(R.id.sw_accessibility_service)
|
@CheckedChange(R.id.sw_accessibility_service)
|
||||||
void setAutoOperateServiceEnable(CompoundButton button, boolean enable) {
|
void setAutoOperateServiceEnable(CompoundButton button, boolean enable) {
|
||||||
boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp());
|
boolean isAccessibilityServiceEnabled = AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp());
|
||||||
if (enable && !isAccessibilityServiceEnabled) {
|
if (enable && !isAccessibilityServiceEnabled) {
|
||||||
enableAccessibilityService();
|
enableAccessibilityService();
|
||||||
} else if (!enable && isAccessibilityServiceEnabled) {
|
} else if (!enable && isAccessibilityServiceEnabled) {
|
||||||
|
|||||||
@@ -221,6 +221,12 @@
|
|||||||
<string name="key_root_record_out_file_type">key_root_record_out_file_type</string>
|
<string name="key_root_record_out_file_type">key_root_record_out_file_type</string>
|
||||||
<string name="text_root_record_out_file_type">Root录制生成文件类型</string>
|
<string name="text_root_record_out_file_type">Root录制生成文件类型</string>
|
||||||
<string name="text_binary">binary</string>
|
<string name="text_binary">binary</string>
|
||||||
|
<string name="key_stable_mode">key_stable_mode</string>
|
||||||
|
<string name="summary_stable_mode">开启后布局分析更稳定,但小部分脚本可能无法正常运行。重启无障碍服务生效</string>
|
||||||
|
<string name="text_stable_mode">稳定模式</string>
|
||||||
|
<string name="key_enable_observe_key">key_enable_observe_key</string>
|
||||||
|
<string name="summary_enable_observe_key">不启动则无法使用events的按键事件; 启用后软件崩溃等情况会造成按键失灵。重启无障碍服务生效</string>
|
||||||
|
<string name="text_enable_observe_key">启用按键监听</string>
|
||||||
|
|
||||||
|
|
||||||
<string-array name="record_control_keys">
|
<string-array name="record_control_keys">
|
||||||
|
|||||||
@@ -58,6 +58,13 @@
|
|||||||
android:key="@string/key_enable_accessibility_service_by_root"
|
android:key="@string/key_enable_accessibility_service_by_root"
|
||||||
android:summary="@string/summary_enable_accessibility_service_by_root"
|
android:summary="@string/summary_enable_accessibility_service_by_root"
|
||||||
android:title="@string/text_enable_accessibility_service_by_root"/>
|
android:title="@string/text_enable_accessibility_service_by_root"/>
|
||||||
|
|
||||||
|
<com.stardust.theme.preference.ThemeColorSwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/key_stable_mode"
|
||||||
|
android:summary="@string/summary_stable_mode"
|
||||||
|
android:title="@string/text_stable_mode"/>
|
||||||
|
|
||||||
</com.stardust.theme.preference.ThemeColorPreferenceCategory>
|
</com.stardust.theme.preference.ThemeColorPreferenceCategory>
|
||||||
|
|
||||||
<com.stardust.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_appearance">
|
<com.stardust.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_appearance">
|
||||||
|
|||||||
@@ -7,18 +7,7 @@
|
|||||||
>
|
>
|
||||||
<activity android:name=".execution.ScriptExecuteActivity"/>
|
<activity android:name=".execution.ScriptExecuteActivity"/>
|
||||||
|
|
||||||
<service
|
|
||||||
android:name="com.stardust.view.accessibility.AccessibilityService"
|
|
||||||
android:label="@string/_app_name"
|
|
||||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.accessibilityservice.AccessibilityService"/>
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data
|
|
||||||
android:name="android.accessibilityservice"
|
|
||||||
android:resource="@xml/accessibility_service_config"/>
|
|
||||||
|
|
||||||
</service>
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.stardust.autojs.runtime.api;
|
package com.stardust.autojs.runtime.api;
|
||||||
|
|
||||||
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
@@ -7,6 +8,7 @@ import android.os.Handler;
|
|||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
|
|
||||||
|
import com.stardust.autojs.R;
|
||||||
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
||||||
import com.stardust.autojs.runtime.ScriptBridges;
|
import com.stardust.autojs.runtime.ScriptBridges;
|
||||||
import com.stardust.autojs.runtime.exception.ScriptException;
|
import com.stardust.autojs.runtime.exception.ScriptException;
|
||||||
@@ -49,13 +51,16 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
|
|||||||
public void observeKey() {
|
public void observeKey() {
|
||||||
if (mListeningKey)
|
if (mListeningKey)
|
||||||
return;
|
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();
|
ensureHandler();
|
||||||
mLoopers.waitWhenIdle(true);
|
mLoopers.waitWhenIdle(true);
|
||||||
mListeningKey = true;
|
mListeningKey = true;
|
||||||
mAccessibilityBridge.ensureServiceEnabled();
|
mAccessibilityBridge.ensureServiceEnabled();
|
||||||
AccessibilityService service = mAccessibilityBridge.getService();
|
|
||||||
if (service == null)
|
|
||||||
throw new ScriptException();
|
|
||||||
service.getOnKeyObserver().addListener(this);
|
service.getOnKeyObserver().addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
<string name="text_no_floating_window_permission">没有悬浮窗权限</string>
|
<string name="text_no_floating_window_permission">没有悬浮窗权限</string>
|
||||||
<string name="text_accessibility_service_description">使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。</string>
|
<string name="text_accessibility_service_description">使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。</string>
|
||||||
<string name="_app_name">AutoJs</string>
|
<string name="_app_name">AutoJs</string>
|
||||||
|
<string name="text_should_enable_key_observing">按键监听未启用,请在软件设置中开启</string>
|
||||||
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -52,10 +52,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|||||||
eventTypes.addAll(set);
|
eventTypes.addAll(set);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEnabled(Context context) {
|
|
||||||
return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AccessibilityService getInstance() {
|
public static AccessibilityService getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user