|
|
|
|
@@ -1,6 +1,7 @@
|
|
|
|
|
package com.stardust.auojs.inrt.rt;
|
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
|
import android.app.Application;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
@@ -40,15 +41,17 @@ import com.stardust.view.accessibility.AccessibilityService;
|
|
|
|
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
|
|
|
|
import com.stardust.view.accessibility.NotificationListener;
|
|
|
|
|
|
|
|
|
|
import org.opencv.android.BaseLoaderCallback;
|
|
|
|
|
import org.opencv.android.OpenCVLoader;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Created by Stardust on 2017/4/2.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public class AutoJs {
|
|
|
|
|
public class AutoJs extends com.stardust.autojs.AutoJs {
|
|
|
|
|
|
|
|
|
|
private static AutoJs instance;
|
|
|
|
|
private Class<? extends android.accessibilityservice.AccessibilityService> sAccessibilityServiceClass = AccessibilityService.class;
|
|
|
|
|
|
|
|
|
|
public static AutoJs getInstance() {
|
|
|
|
|
return instance;
|
|
|
|
|
@@ -58,166 +61,31 @@ public class AutoJs {
|
|
|
|
|
instance = new AutoJs(context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder();
|
|
|
|
|
private final AccessibilityNotificationObserver mNotificationObserver;
|
|
|
|
|
private ScriptEngineManager mScriptEngineManager;
|
|
|
|
|
private final Context mContext;
|
|
|
|
|
private final UiHandler mUiHandler;
|
|
|
|
|
private final AppUtils mAppUtils;
|
|
|
|
|
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
|
|
|
|
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl();
|
|
|
|
|
private final ScriptEngineService mScriptEngineService;
|
|
|
|
|
private final StardustConsole mGlobalConsole;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private AutoJs(final Context context) {
|
|
|
|
|
mContext = context;
|
|
|
|
|
mUiHandler = new UiHandler(context);
|
|
|
|
|
mAppUtils = new AppUtils(context);
|
|
|
|
|
mGlobalConsole = new GlobalStardustConsole(mUiHandler);
|
|
|
|
|
mNotificationObserver = new AccessibilityNotificationObserver(context);
|
|
|
|
|
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
|
|
|
|
mScriptEngineService = buildScriptEngineService();
|
|
|
|
|
addAccessibilityServiceDelegates();
|
|
|
|
|
registerActivityLifecycleCallbacks();
|
|
|
|
|
InputEventObserver.initGlobal(context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public StardustConsole getGlobalConsole() {
|
|
|
|
|
return mGlobalConsole;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ScriptEngineService buildScriptEngineService() {
|
|
|
|
|
initScriptEngineManager();
|
|
|
|
|
return new ScriptEngineServiceBuilder()
|
|
|
|
|
.uiHandler(mUiHandler)
|
|
|
|
|
.globalConsole(mGlobalConsole)
|
|
|
|
|
.engineManger(mScriptEngineManager)
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initScriptEngineManager() {
|
|
|
|
|
mScriptEngineManager = new ScriptEngineManager(mContext);
|
|
|
|
|
mScriptEngineManager.registerEngine(JavaScriptSource.ENGINE, new Supplier<ScriptEngine>() {
|
|
|
|
|
@Override
|
|
|
|
|
public ScriptEngine get() {
|
|
|
|
|
LoopBasedJavaScriptEngine engine = new LoopBasedJavaScriptEngine(mContext);
|
|
|
|
|
engine.setRuntime(new ScriptRuntime.Builder()
|
|
|
|
|
.setConsole(new StardustConsole(mUiHandler, mGlobalConsole))
|
|
|
|
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
|
|
|
|
.setAccessibilityBridge(new AccessibilityBridgeImpl())
|
|
|
|
|
.setUiHandler(mUiHandler)
|
|
|
|
|
.setAppUtils(mAppUtils)
|
|
|
|
|
.setEngineService(mScriptEngineService)
|
|
|
|
|
.setShellSupplier(new Supplier<AbstractShell>() {
|
|
|
|
|
@Override
|
|
|
|
|
public AbstractShell get() {
|
|
|
|
|
return new Shell(mContext, true);
|
|
|
|
|
}
|
|
|
|
|
}).build());
|
|
|
|
|
return engine;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier<ScriptEngine>() {
|
|
|
|
|
@Override
|
|
|
|
|
public ScriptEngine get() {
|
|
|
|
|
return new RootAutomatorEngine(mContext);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void registerActivityLifecycleCallbacks() {
|
|
|
|
|
App.getApp().registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
|
|
|
|
ScreenMetrics.initIfNeeded(activity);
|
|
|
|
|
mAppUtils.setCurrentActivity(activity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onActivityPaused(Activity activity) {
|
|
|
|
|
mAppUtils.setCurrentActivity(null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onActivityResumed(Activity activity) {
|
|
|
|
|
mAppUtils.setCurrentActivity(activity);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void addAccessibilityServiceDelegates() {
|
|
|
|
|
AccessibilityService.addDelegate(100, mAccessibilityInfoProvider);
|
|
|
|
|
AccessibilityService.addDelegate(200, mNotificationObserver);
|
|
|
|
|
AccessibilityService.addDelegate(300, mAccessibilityActionRecorder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ScriptEngineService getScriptEngineService() {
|
|
|
|
|
return mScriptEngineService;
|
|
|
|
|
private AutoJs(Context context) {
|
|
|
|
|
super(context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void ensureAccessibilityServiceEnabled() {
|
|
|
|
|
if (AccessibilityService.getInstance() == null) {
|
|
|
|
|
String errorMessage = getErrorMessage();
|
|
|
|
|
if (AccessibilityService.getInstance() != null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
String errorMessage = null;
|
|
|
|
|
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(getApplication(), AccessibilityService.class)) {
|
|
|
|
|
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
|
|
|
|
} else {
|
|
|
|
|
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(getApplication(), 2000)) {
|
|
|
|
|
errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (errorMessage != null) {
|
|
|
|
|
AccessibilityServiceTool.goToAccessibilitySetting();
|
|
|
|
|
throw new ScriptException(errorMessage);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getErrorMessage() {
|
|
|
|
|
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), sAccessibilityServiceClass)) {
|
|
|
|
|
return App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
|
|
|
|
} else {
|
|
|
|
|
if (true) {
|
|
|
|
|
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(App.getApp(), 2000)) {
|
|
|
|
|
return App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return App.getApp().getString(R.string.text_no_accessibility_permission);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private class AccessibilityBridgeImpl extends AccessibilityBridge {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void ensureServiceEnabled() {
|
|
|
|
|
AutoJs.this.ensureAccessibilityServiceEnabled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
|
@Override
|
|
|
|
|
public AccessibilityService getService() {
|
|
|
|
|
return AccessibilityService.getInstance();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public AccessibilityInfoProvider getInfoProvider() {
|
|
|
|
|
return mAccessibilityInfoProvider;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public AccessibilityNotificationObserver getNotificationObserver() {
|
|
|
|
|
return mNotificationObserver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester {
|
|
|
|
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
|
|
|
|
@Override
|
|
|
|
|
public void request() {
|
|
|
|
|
Activity activity = mAppUtils.getCurrentActivity();
|
|
|
|
|
if (activity instanceof OnActivityResultDelegate.DelegateHost) {
|
|
|
|
|
ScreenCaptureRequester requester = new ActivityScreenCaptureRequester(
|
|
|
|
|
((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity);
|
|
|
|
|
requester.setOnActivityResultCallback(mCallback);
|
|
|
|
|
requester.request();
|
|
|
|
|
} else {
|
|
|
|
|
ScreenCaptureRequestActivity.request(mContext, mCallback);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
protected Application getApplication() {
|
|
|
|
|
return App.getApp();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|