package com.stardust.scriptdroid.sublime;
import android.text.TextUtils;
import android.util.SparseArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.pio.PFile;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.script.Scripts;
/**
* Created by Stardust on 2017/5/11.
*/
public class SublimeResponseHandler implements Handler {
private Router mRouter = new Router("type")
.handler("command", new Router("command")
.handler("run", new Handler() {
@Override
public boolean handle(JsonObject data) {
String script = data.get("script").getAsString();
String name = getName(data);
int viewId = data.get("view_id").getAsInt();
runScript(viewId, name, script);
return false;
}
})
.handler("stop", new Handler() {
@Override
public boolean handle(JsonObject data) {
int viewId = data.get("view_id").getAsInt();
stopScript(viewId);
return true;
}
})
.handler("rerun", new Handler() {
@Override
public boolean handle(JsonObject data) {
int viewId = data.get("view_id").getAsInt();
String script = data.get("script").getAsString();
String name = getName(data);
stopScript(viewId);
runScript(viewId, name, script);
return false;
}
})
.handler("stopAll", new Handler() {
@Override
public boolean handle(JsonObject data) {
AutoJs.getInstance().getScriptEngineService().stopAllAndToast();
return false;
}
}));
private SparseArray<ScriptExecution> mScriptExecutions = new SparseArray<>();
@Override
public boolean handle(JsonObject data) {
return mRouter.handle(data);
}
private void runScript(int viewId, String name, String script) {
if (TextUtils.isEmpty(name)) {
name = "[" + viewId + "]";
} else {
name = PFile.getNameWithoutExtension(name);
}
mScriptExecutions.put(viewId, Scripts.run(new StringScriptSource("<remote>:" + name, script)));
}
private void stopScript(int viewId) {
ScriptExecution execution = mScriptExecutions.get(viewId);
if (execution != null) {
execution.getEngine().forceStop();
mScriptExecutions.delete(viewId);
}
}
private String getName(JsonObject data) {
JsonElement element = data.get("name");
if (element instanceof JsonNull) {
return null;
}
return element.getAsString();
}
}