add: apk builder plugin support; fix: inrt AutoJs.ensureServiceEnabled
This commit is contained in:
9
app/src/main/assets/sample/HTTP网络请求/获取网页.js
Normal file
9
app/src/main/assets/sample/HTTP网络请求/获取网页.js
Normal file
@@ -0,0 +1,9 @@
|
||||
var url = "www.baidu.com";
|
||||
var res = http.get(url);
|
||||
if(res.statusCode == 200){
|
||||
toast("请求成功");
|
||||
console.show();
|
||||
log(res.body.string());
|
||||
}else{
|
||||
toast("请求失败:" + res.statusMessage);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.stardust.scriptdroid.autojs;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -52,7 +53,7 @@ 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;
|
||||
|
||||
@@ -64,24 +65,15 @@ public class AutoJs {
|
||||
instance = new AutoJs(context);
|
||||
}
|
||||
|
||||
private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder();
|
||||
private final AccessibilityNotificationObserver mNotificationObserver;
|
||||
private ScriptEngineManager mScriptEngineManager;
|
||||
private final LayoutInspector mLayoutInspector = new LayoutInspector();
|
||||
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 Console mGlobalConsole;
|
||||
|
||||
|
||||
private AutoJs(final Context context) {
|
||||
mContext = context;
|
||||
mUiHandler = new UiHandler(context);
|
||||
mAppUtils = new AppUtils(context);
|
||||
mGlobalConsole = new GlobalStardustConsole(mUiHandler) {
|
||||
super(context);
|
||||
getScriptEngineService().registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Console createGlobalConsole() {
|
||||
return new GlobalStardustConsole(getUiHandler()) {
|
||||
@Override
|
||||
public String println(int level, CharSequence charSequence) {
|
||||
String log = super.println(level, charSequence);
|
||||
@@ -89,172 +81,33 @@ public class AutoJs {
|
||||
return log;
|
||||
}
|
||||
};
|
||||
mNotificationObserver = new AccessibilityNotificationObserver(context);
|
||||
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
||||
mScriptEngineService = buildScriptEngineService();
|
||||
addAccessibilityServiceDelegates();
|
||||
mScriptEngineService.registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
|
||||
registerActivityLifecycleCallbacks();
|
||||
InputEventObserver.initGlobal(context);
|
||||
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_13, context, new BaseLoaderCallback(context) {
|
||||
});
|
||||
}
|
||||
|
||||
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 AccessibilityActionRecorder getAccessibilityActionRecorder() {
|
||||
return mAccessibilityActionRecorder;
|
||||
}
|
||||
|
||||
public AppUtils getAppUtils() {
|
||||
return mAppUtils;
|
||||
}
|
||||
|
||||
public UiHandler getUiHandler() {
|
||||
return mUiHandler;
|
||||
}
|
||||
|
||||
public LayoutInspector getLayoutInspector() {
|
||||
return mLayoutInspector;
|
||||
}
|
||||
|
||||
public Console getGlobalConsole() {
|
||||
return mGlobalConsole;
|
||||
}
|
||||
|
||||
public ScriptEngineService getScriptEngineService() {
|
||||
return mScriptEngineService;
|
||||
}
|
||||
|
||||
public AccessibilityInfoProvider getInfoProvider() {
|
||||
return mAccessibilityInfoProvider;
|
||||
}
|
||||
|
||||
public void ensureAccessibilityServiceEnabled() {
|
||||
if (AccessibilityService.getInstance() == null) {
|
||||
String errorMessage = null;
|
||||
if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) {
|
||||
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||
} else {
|
||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) {
|
||||
errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout);
|
||||
}
|
||||
} else {
|
||||
errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission);
|
||||
if (AccessibilityService.getInstance() != null) {
|
||||
return;
|
||||
}
|
||||
String errorMessage = null;
|
||||
if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) {
|
||||
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||
} else {
|
||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) {
|
||||
errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout);
|
||||
}
|
||||
}
|
||||
if (errorMessage != null) {
|
||||
AccessibilityServiceTool.goToAccessibilitySetting();
|
||||
throw new ScriptException(errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission);
|
||||
}
|
||||
}
|
||||
if (errorMessage != null) {
|
||||
AccessibilityServiceTool.goToAccessibilitySetting();
|
||||
throw new ScriptException(errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Application getApplication() {
|
||||
return App.getApp();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.stardust.scriptdroid.build;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
|
||||
import com.stardust.pio.UncheckedIOException;
|
||||
import com.stardust.util.DeveloperUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/11/29.
|
||||
*/
|
||||
|
||||
public class ApkBuilderPluginHelper {
|
||||
|
||||
private static final String PLUGIN_PACKAGE_NAME = "org.autojs.apkbuilderplugin";
|
||||
private static final String TEMPLATE_APK_PATH = "template.apk";
|
||||
|
||||
public static boolean checkPlugin(Context context) {
|
||||
return DeveloperUtils.checkSignature(context, PLUGIN_PACKAGE_NAME);
|
||||
}
|
||||
|
||||
public static InputStream openTemplateApk(Context context) {
|
||||
try {
|
||||
return context.getPackageManager().getResourcesForApplication(PLUGIN_PACKAGE_NAME)
|
||||
.getAssets().open(TEMPLATE_APK_PATH);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@ import io.reactivex.subjects.PublishSubject;
|
||||
/**
|
||||
* Created by Stardust on 2017/11/27.
|
||||
*/
|
||||
|
||||
//TODO rx
|
||||
public class TimedTaskManager {
|
||||
|
||||
|
||||
@@ -75,23 +75,6 @@ public class TimedTaskManager {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Flowable<TimedTask> getTaskById(int id) {
|
||||
return RXSQLite.rx(SQLite.select()
|
||||
.from(TimedTask.class)
|
||||
.where(TimedTask_Table.id.is(id)))
|
||||
.queryStreamResults()
|
||||
.subscribeOn(Schedulers.io());
|
||||
}
|
||||
|
||||
private Completable removeTask(int id) {
|
||||
return RXSQLite.rx(SQLite.delete(TimedTaskDatabase.class)
|
||||
.where(TimedTask_Table.id.is(id)))
|
||||
.execute()
|
||||
.subscribeOn(Schedulers.io());
|
||||
|
||||
}
|
||||
|
||||
public void cancelTask(TimedTask timedTask) {
|
||||
TimedTaskScheduler.cancel(mContext, timedTask);
|
||||
mTimedTaskModelAdapter.delete(timedTask);
|
||||
|
||||
@@ -1,17 +1,22 @@
|
||||
package com.stardust.scriptdroid.ui.build;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.afollestad.materialdialogs.DialogAction;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.scriptdroid.autojs.build.AutoJsApkBuilder;
|
||||
import com.stardust.scriptdroid.build.ApkBuilderPluginHelper;
|
||||
import com.stardust.scriptdroid.network.download.DownloadManager;
|
||||
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
|
||||
import com.stardust.scriptdroid.model.script.ScriptFile;
|
||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||
import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder;
|
||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||
import com.stardust.util.IntentUtil;
|
||||
|
||||
import org.androidannotations.annotations.AfterViews;
|
||||
@@ -20,6 +25,7 @@ import org.androidannotations.annotations.EActivity;
|
||||
import org.androidannotations.annotations.ViewById;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
@@ -61,9 +67,28 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
||||
if (sourcePath != null) {
|
||||
setupWithSourceFile(new ScriptFile(sourcePath));
|
||||
}
|
||||
showPluginDownloadDialogIfNeeded();
|
||||
|
||||
}
|
||||
|
||||
private void showPluginDownloadDialogIfNeeded() {
|
||||
if (ApkBuilderPluginHelper.checkPlugin(this)) {
|
||||
return;
|
||||
}
|
||||
new ThemeColorMaterialDialogBuilder(this)
|
||||
.content(R.string.no_apk_builder_plugin)
|
||||
.positiveText(R.string.ok)
|
||||
.negativeText(R.string.text_exit)
|
||||
.onPositive((dialog, which) -> downloadPlugin())
|
||||
.onNegative((dialog, which) -> finish())
|
||||
.show();
|
||||
|
||||
}
|
||||
|
||||
private void downloadPlugin() {
|
||||
// TODO: 2017/11/29
|
||||
}
|
||||
|
||||
private void setupWithSourceFile(ScriptFile file) {
|
||||
mSourcePath.setText(file.getPath());
|
||||
mOutputPath.setText(file.getParent());
|
||||
@@ -102,6 +127,14 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
||||
|
||||
@Click(R.id.fab)
|
||||
void buildApk() {
|
||||
if (!ApkBuilderPluginHelper.checkPlugin(this)) {
|
||||
Toast.makeText(this, R.string.text_apk_builder_plugin_unavailable, Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
doBuildingApk();
|
||||
}
|
||||
|
||||
private void doBuildingApk() {
|
||||
String jsPath = mSourcePath.getText().toString();
|
||||
String versionName = mVersionName.getText().toString();
|
||||
int versionCode = Integer.parseInt(mVersionCode.getText().toString());
|
||||
@@ -110,20 +143,21 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
||||
File outApk = new File(mOutputPath.getText().toString(),
|
||||
String.format("%s_v%s.apk", appName, versionName));
|
||||
showProgressDialog();
|
||||
Observable.fromCallable(() ->
|
||||
new AutoJsApkBuilder(getAssets().open("template.apk"), outApk, tmpDir.getPath())
|
||||
.setProgressCallback(BuildActivity.this)
|
||||
.prepare()
|
||||
.withConfig(new AutoJsApkBuilder.AppConfig(appName, versionName, versionCode, jsPath))
|
||||
.build()
|
||||
.sign()
|
||||
.cleanWorkspace()
|
||||
Observable.fromCallable(() -> {
|
||||
InputStream templateApk = ApkBuilderPluginHelper.openTemplateApk(BuildActivity.this);
|
||||
return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath())
|
||||
.setProgressCallback(BuildActivity.this)
|
||||
.prepare()
|
||||
.withConfig(new AutoJsApkBuilder.AppConfig(appName, versionName, versionCode, jsPath))
|
||||
.build()
|
||||
.sign()
|
||||
.cleanWorkspace();
|
||||
}
|
||||
)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(apkBuilder -> onBuildSuccessful(outApk),
|
||||
this::onBuildFailed);
|
||||
|
||||
}
|
||||
|
||||
private void showProgressDialog() {
|
||||
|
||||
@@ -330,4 +330,6 @@
|
||||
<string name="text_day6">六</string>
|
||||
<string name="text_day7">日</string>
|
||||
<string name="text_weekly_task_should_check_day_of_week">至少选择一周中的一天</string>
|
||||
<string name="no_apk_builder_plugin">没有安装打包插件,是否立即下载?</string>
|
||||
<string name="text_apk_builder_plugin_unavailable">打包插件不可用</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user