Files
AutoJs6/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
2017-02-05 20:57:04 +08:00

124 lines
3.8 KiB
Java

package com.stardust.scriptdroid.droid;
import android.app.Activity;
import android.content.DialogInterface;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
import com.stardust.scriptdroid.droid.script.DuktapeJavaScriptEngine;
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
import com.stardust.scriptdroid.droid.script.ScriptExecuteActivity;
import com.stardust.scriptdroid.file.FileUtils;
import java.io.File;
import java.io.FileNotFoundException;
/**
* Created by Stardust on 2017/1/23.
*/
public class Droid {
public static final String UI = "\"ui\";";
public interface OnRunFinishedListener {
void onRunFinished(Object result, Exception e);
}
private static final DroidRuntime RUNTIME = DroidRuntime.getRuntime();
public static final JavaScriptEngine JAVA_SCRIPT_ENGINE = new DuktapeJavaScriptEngine(RUNTIME);
private static final OnRunFinishedListener DEFAULT_LISTENER = new OnRunFinishedListener() {
@Override
public void onRunFinished(Object result, Exception e) {
if (e != null) {
RUNTIME.toast(App.getApp().getString(R.string.text_error) + ": " + e.getMessage());
}
}
};
private static Droid instance = new Droid();
protected Droid() {
}
public static Droid getInstance() {
return instance;
}
public void runScriptFile(File file) {
checkFile(file);
runScript(FileUtils.readString(file));
}
public void runScriptFile(File file, OnRunFinishedListener listener) {
checkFile(file);
runScript(FileUtils.readString(file), listener, RunningConfig.getDefault());
}
private void runScript(String script) {
runScript(script, null, RunningConfig.getDefault());
}
public void runScriptFile(String path) {
runScriptFile(new File(path));
}
public void runScript(final String script, OnRunFinishedListener listener, RunningConfig config) {
listener = listener == null ? DEFAULT_LISTENER : listener;
if (config.runInNewThread) {
if (script.startsWith(UI)) {
ScriptExecuteActivity.runScript(script, listener, config);
} else {
new Thread(new RunScriptRunnable(script, listener, config)).start();
}
} else {
new RunScriptRunnable(script, listener, config).run();
}
}
public int stopAll() {
return JAVA_SCRIPT_ENGINE.stopAll();
}
private void checkFile(File file) {
if (file == null) {
throw new NullPointerException("file = null");
}
if (!file.exists()) {
throw new RuntimeException(new FileNotFoundException(file.getAbsolutePath()));
}
if (!file.canRead()) {
throw new RuntimeException("file is not readable: path=" + file.getAbsolutePath());
}
}
private static class RunScriptRunnable implements Runnable {
private final String mScript;
private OnRunFinishedListener mOnRunFinishedListener;
RunScriptRunnable(String script, OnRunFinishedListener listener, RunningConfig config) {
mOnRunFinishedListener = listener;
mScript = script;
}
@Override
public void run() {
try {
mOnRunFinishedListener.onRunFinished(JAVA_SCRIPT_ENGINE.execute(mScript), null);
} catch (Exception e) {
mOnRunFinishedListener.onRunFinished(null, e);
}
}
public RunScriptRunnable setActivity(Activity a) {
JAVA_SCRIPT_ENGINE.set("activity", Activity.class, a);
return this;
}
}
}