fix: lag when accessibility service switch toggled

This commit is contained in:
hyb1996
2017-07-31 21:28:13 +08:00
parent 6307d3aa96
commit f51d791d98
10 changed files with 75 additions and 14 deletions

View File

@@ -47,7 +47,7 @@ images是图片与图色处理的工具。包括获取图片某点颜色
* y \<y\> 要获取的像素的纵坐标。 * y \<y\> 要获取的像素的纵坐标。
返回图片image在点(x, y)处的像素的ARGB值。 返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB。也就是如果`var argb = images.pixel(image, x, y)`,那么可以通过`(argb & 0xFF000000) >> 24`获取透明度,通过`(argb & 0xFF0000) >> 16`获取R值通过`(argb & 0xFF000000) >> 24`获取G值等或者通过`images.alpha(argb)`, `images.red(argb)`等获取。 该值的格式为0xAARRGGBB。也就是如果`var argb = images.pixel(image, x, y)`,那么可以通过`(argb & 0xFF000000) >> 24`获取透明度,通过`(argb & 0xFF0000) >> 16`获取R值通过`(argb & 0xFF000000) >> 24`获取G值等或者通过`colors.alpha(argb)`, `colors.red(argb)`等获取。
### images.saveImage(image, path) ### images.saveImage(image, path)

View File

@@ -6,7 +6,7 @@
### Tap(x, y) ### Tap(x, y)
点击位置(x, y), 您可以通过"开发者选项"开启指针位置来确定点击坐标。 点击位置(x, y), 您可以通过"开发者选项"开启指针位置来确定点击坐标。
### Swipe(x1, y1, x2, y2) ### Swipe(x1, y1, x2, y2, \[delay\])
滑动。从(x1, y1)位置滑动到(x2, y2)位置。 滑动。从(x1, y1)位置滑动到(x2, y2)位置。
### Home() ### Home()

View File

@@ -53,7 +53,8 @@ public class AccessibilityServiceTool {
"else\n" + "else\n" +
"enabled=$pkg:$enabled\n" + "enabled=$pkg:$enabled\n" +
"settings put secure enabled_accessibility_services $enabled\n" + "settings put secure enabled_accessibility_services $enabled\n" +
"fi"; "fi\n" +
"settings put secure accessibility_enabled 1";
public static boolean enableAccessibilityServiceByRoot(Class<? extends android.accessibilityservice.AccessibilityService> accessibilityService) { public static boolean enableAccessibilityServiceByRoot(Class<? extends android.accessibilityservice.AccessibilityService> accessibilityService) {
String serviceName = App.getApp().getPackageName() + "/" + accessibilityService.getName(); String serviceName = App.getApp().getPackageName() + "/" + accessibilityService.getName();
@@ -62,9 +63,9 @@ public class AccessibilityServiceTool {
public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) { public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) {
if (enableAccessibilityServiceByRoot(AccessibilityService.class)) { if (enableAccessibilityServiceByRoot(AccessibilityService.class)) {
AccessibilityService.waitForEnabled(timeOut); return AccessibilityService.waitForEnabled(timeOut);
} }
return true; return false;
} }
public static void enableAccessibilityServiceByRootIfNeeded() { public static void enableAccessibilityServiceByRootIfNeeded() {

View File

@@ -0,0 +1,28 @@
package com.stardust.scriptdroid.ui.common;
import android.content.Context;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.scriptdroid.R;
/**
* Created by Stardust on 2017/7/31.
*/
public class ProgressDialog {
private MaterialDialog mDialog;
public ProgressDialog(Context context) {
mDialog = new MaterialDialog.Builder(context)
.progress(true, 0)
.cancelable(false)
.content(R.string.text_on_progress)
.show();
}
public void dismiss() {
mDialog.dismiss();
}
}

View File

@@ -8,6 +8,7 @@ import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.SwitchCompat;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
@@ -17,6 +18,7 @@ import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floatingwindow.HoverMenuManger; import com.stardust.scriptdroid.external.floatingwindow.HoverMenuManger;
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
import com.stardust.scriptdroid.ui.common.ProgressDialog;
import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.scriptdroid.sublime.SublimePluginClient; import com.stardust.scriptdroid.sublime.SublimePluginClient;
import com.stardust.scriptdroid.sublime.SublimePluginService; import com.stardust.scriptdroid.sublime.SublimePluginService;
@@ -117,7 +119,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
void setAutoOperateServiceEnable(CompoundButton button, boolean enable) { void setAutoOperateServiceEnable(CompoundButton button, boolean enable) {
boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp()); boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp());
if (enable && !isAccessibilityServiceEnabled) { if (enable && !isAccessibilityServiceEnabled) {
AccessibilityServiceTool.enableAccessibilityService(); enableAccessibilityService();
} else if (!enable && isAccessibilityServiceEnabled) { } else if (!enable && isAccessibilityServiceEnabled) {
if (!AccessibilityService.disable()) { if (!AccessibilityService.disable()) {
AccessibilityServiceTool.goToAccessibilitySetting(); AccessibilityServiceTool.goToAccessibilitySetting();
@@ -125,6 +127,30 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
} }
} }
private void enableAccessibilityService() {
if (!Pref.enableAccessibilityServiceByRoot()) {
AccessibilityServiceTool.goToAccessibilitySetting();
return;
}
final ProgressDialog progress = new ProgressDialog(getContext());
UnderuseExecutors.execute(new Runnable() {
@Override
public void run() {
final boolean succeed = AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(4000);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (!succeed) {
Toast.makeText(getContext(), R.string.text_enable_accessibitliy_service_by_root_failed, Toast.LENGTH_SHORT).show();
AccessibilityServiceTool.goToAccessibilitySetting();
}
progress.dismiss();
}
});
}
});
}
@CheckedChange(R.id.sw_floating_window) @CheckedChange(R.id.sw_floating_window)
void setFloatingWindowEnable(CompoundButton button, boolean enable) { void setFloatingWindowEnable(CompoundButton button, boolean enable) {
if (enable && !HoverMenuManger.isHoverMenuShowing()) { if (enable && !HoverMenuManger.isHoverMenuShowing()) {

View File

@@ -209,6 +209,8 @@
<string name="text_discard_record">放弃录制</string> <string name="text_discard_record">放弃录制</string>
<string name="text_inspect_failed">布局抓取失败,请关闭悬浮窗后动一下页面重试</string> <string name="text_inspect_failed">布局抓取失败,请关闭悬浮窗后动一下页面重试</string>
<string name="script_anr">没有相应,要强制停止吗</string> <string name="script_anr">没有相应,要强制停止吗</string>
<string name="text_enable_accessibitliy_service_by_root_failed">使用root权限开启失败</string>
<string name="text_on_progress">处理中</string>
<string-array name="record_control_keys"> <string-array name="record_control_keys">

View File

@@ -2,7 +2,8 @@ package com.stardust.autojs.runtime.api;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.stardust.autojs.runtime.ScriptStopException;
import com.stardust.autojs.runtime.ScriptException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -38,7 +39,7 @@ public class EventEmitter {
private void ensureListenersNotAtLimit() { private void ensureListenersNotAtLimit() {
if (mMaxListeners != 0 && mListenersMap.size() >= mMaxListeners) { if (mMaxListeners != 0 && mListenersMap.size() >= mMaxListeners) {
throw new ScriptStopException(new TooManyListenersException("max = " + mMaxListeners)); throw new ScriptException(new TooManyListenersException("max = " + mMaxListeners));
} }
} }

View File

@@ -8,7 +8,7 @@ import android.util.SparseArray;
import android.view.KeyEvent; import android.view.KeyEvent;
import com.stardust.autojs.runtime.AccessibilityBridge; import com.stardust.autojs.runtime.AccessibilityBridge;
import com.stardust.autojs.runtime.ScriptStopException; import com.stardust.autojs.runtime.ScriptException;
import com.stardust.autojs.runtime.record.inputevent.TouchObserver; import com.stardust.autojs.runtime.record.inputevent.TouchObserver;
import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.OnKeyListener; import com.stardust.view.accessibility.OnKeyListener;
@@ -53,12 +53,12 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
mAccessibilityBridge.ensureServiceEnabled(); mAccessibilityBridge.ensureServiceEnabled();
AccessibilityService service = mAccessibilityBridge.getService(); AccessibilityService service = mAccessibilityBridge.getService();
if (service == null) if (service == null)
throw new ScriptStopException(); throw new ScriptException();
service.getOnKeyObserver().addListener(this); service.getOnKeyObserver().addListener(this);
} }
private void ensureHandler() { private void ensureHandler() {
if(mHandler == null){ if (mHandler == null) {
mHandler = new Handler(); mHandler = new Handler();
} }
} }

View File

@@ -82,7 +82,7 @@ public class Loopers {
} }
public static void prepare() { public static void prepare() {
if(Looper.myLooper() == Looper.getMainLooper()) if (Looper.myLooper() == Looper.getMainLooper())
return; return;
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare(); Looper.prepare();

View File

@@ -150,12 +150,15 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
return false; return false;
} }
public static void waitForEnabled(long timeOut) { public static boolean waitForEnabled(long timeOut) {
if (instance != null)
return true;
LOCK.lock(); LOCK.lock();
try { try {
ENABLED.await(timeOut, TimeUnit.MILLISECONDS); return ENABLED.await(timeOut, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
return false;
} finally { } finally {
LOCK.unlock(); LOCK.unlock();
} }