Rename and refactor autojs to support future developing of other script language

This commit is contained in:
hyb1996
2017-05-07 23:32:53 +08:00
parent 840bb56528
commit 472bd46b87
25 changed files with 717 additions and 184 deletions

View File

@@ -6,7 +6,7 @@
<application
android:label="@string/app_name"
>
<activity android:name=".engine.ScriptExecuteActivity"/>
<activity android:name=".execution.ScriptExecuteActivity"/>
</application>
</manifest>

View File

@@ -1,11 +1,11 @@
package com.stardust.autojs;
import android.content.Context;
import android.util.Log;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.JavaScriptEngineManager;
import com.stardust.autojs.engine.ScriptExecuteActivity;
import com.stardust.autojs.engine.AbstractScriptEngineManager;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.execution.ScriptExecuteActivity;
import com.stardust.autojs.execution.ExecutionConfig;
import com.stardust.autojs.execution.RunnableScriptExecution;
import com.stardust.autojs.execution.ScriptExecution;
@@ -23,14 +23,9 @@ import com.stardust.util.UiHandler;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.microedition.khronos.opengles.GL;
import static com.stardust.autojs.runtime.ScriptInterruptedException.causedByInterrupted;
/**
@@ -63,7 +58,7 @@ public class ScriptEngineService {
private final Context mContext;
private UiHandler mUiHandler;
private final Console mGlobalConsole;
private final JavaScriptEngineManager mJavaScriptEngineManager;
private final ScriptEngineManager mScriptEngineManager;
private final EngineLifecycleObserver mEngineLifecycleObserver = new EngineLifecycleObserver();
private ScriptExecutionObserver mScriptExecutionObserver = new ScriptExecutionObserver();
@@ -71,9 +66,9 @@ public class ScriptEngineService {
mRuntimeSupplier = builder.mRuntimeSupplier;
mUiHandler = builder.mUiHandler;
mContext = mUiHandler.getContext();
mJavaScriptEngineManager = builder.mJavaScriptEngineManager;
mScriptEngineManager = builder.mScriptEngineManager;
mGlobalConsole = builder.mGlobalConsole;
mJavaScriptEngineManager.setEngineLifecycleCallback(mEngineLifecycleObserver);
mScriptEngineManager.setEngineLifecycleCallback(mEngineLifecycleObserver);
mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER);
EVENT_BUS.register(this);
}
@@ -82,8 +77,8 @@ public class ScriptEngineService {
return mGlobalConsole;
}
public JavaScriptEngine createScriptEngine() {
JavaScriptEngine engine = mJavaScriptEngineManager.createEngine();
public ScriptEngine createScriptEngine() {
ScriptEngine engine = mScriptEngineManager.createEngine();
return engine;
}
@@ -91,11 +86,11 @@ public class ScriptEngineService {
return mRuntimeSupplier.get();
}
public void registerEngineLifecycleCallback(JavaScriptEngineManager.EngineLifecycleCallback engineLifecycleCallback) {
public void registerEngineLifecycleCallback(AbstractScriptEngineManager.EngineLifecycleCallback engineLifecycleCallback) {
mEngineLifecycleObserver.registerCallback(engineLifecycleCallback);
}
public void unregisterEngineLifecycleCallback(JavaScriptEngineManager.EngineLifecycleCallback engineLifecycleCallback) {
public void unregisterEngineLifecycleCallback(AbstractScriptEngineManager.EngineLifecycleCallback engineLifecycleCallback) {
mEngineLifecycleObserver.unregisterCallback(engineLifecycleCallback);
}
@@ -154,7 +149,7 @@ public class ScriptEngineService {
}
public int stopAll() {
return mJavaScriptEngineManager.stopAll();
return mScriptEngineManager.stopAll();
}
@@ -167,43 +162,43 @@ public class ScriptEngineService {
}
public String[] getGlobalFunctions() {
return mJavaScriptEngineManager.getGlobalFunctions();
return mScriptEngineManager.getGlobalFunctions();
}
public Set<JavaScriptEngine> getEngines() {
return mJavaScriptEngineManager.getEngines();
public Set<ScriptEngine> getEngines() {
return mScriptEngineManager.getEngines();
}
private static class EngineLifecycleObserver implements JavaScriptEngineManager.EngineLifecycleCallback {
private static class EngineLifecycleObserver implements AbstractScriptEngineManager.EngineLifecycleCallback {
private final Set<JavaScriptEngineManager.EngineLifecycleCallback> mEngineLifecycleCallbacks = new LinkedHashSet<>();
private final Set<AbstractScriptEngineManager.EngineLifecycleCallback> mEngineLifecycleCallbacks = new LinkedHashSet<>();
@Override
public void onEngineCreate(JavaScriptEngine engine) {
public void onEngineCreate(ScriptEngine engine) {
synchronized (mEngineLifecycleCallbacks) {
for (JavaScriptEngineManager.EngineLifecycleCallback callback : mEngineLifecycleCallbacks) {
for (AbstractScriptEngineManager.EngineLifecycleCallback callback : mEngineLifecycleCallbacks) {
callback.onEngineCreate(engine);
}
}
}
@Override
public void onEngineRemove(JavaScriptEngine engine) {
public void onEngineRemove(ScriptEngine engine) {
synchronized (mEngineLifecycleCallbacks) {
for (JavaScriptEngineManager.EngineLifecycleCallback callback : mEngineLifecycleCallbacks) {
for (AbstractScriptEngineManager.EngineLifecycleCallback callback : mEngineLifecycleCallbacks) {
callback.onEngineRemove(engine);
}
}
}
void registerCallback(JavaScriptEngineManager.EngineLifecycleCallback callback) {
void registerCallback(AbstractScriptEngineManager.EngineLifecycleCallback callback) {
synchronized (mEngineLifecycleCallbacks) {
mEngineLifecycleCallbacks.add(callback);
}
}
void unregisterCallback(JavaScriptEngineManager.EngineLifecycleCallback callback) {
void unregisterCallback(AbstractScriptEngineManager.EngineLifecycleCallback callback) {
synchronized (mEngineLifecycleCallbacks) {
mEngineLifecycleCallbacks.remove(callback);
}

View File

@@ -1,8 +1,7 @@
package com.stardust.autojs;
import android.content.Context;
import com.stardust.autojs.engine.JavaScriptEngineManager;
import com.stardust.autojs.engine.AbstractScriptEngineManager;
import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.util.Supplier;
@@ -15,7 +14,7 @@ import com.stardust.util.UiHandler;
public class ScriptEngineServiceBuilder {
Supplier<ScriptRuntime> mRuntimeSupplier;
JavaScriptEngineManager mJavaScriptEngineManager;
ScriptEngineManager mScriptEngineManager;
Console mGlobalConsole;
UiHandler mUiHandler;
@@ -33,8 +32,8 @@ public class ScriptEngineServiceBuilder {
return this;
}
public ScriptEngineServiceBuilder engineManger(JavaScriptEngineManager manager) {
mJavaScriptEngineManager = manager;
public ScriptEngineServiceBuilder engineManger(ScriptEngineManager manager) {
mScriptEngineManager = manager;
return this;
}

View File

@@ -17,37 +17,28 @@ import java.util.Set;
* Created by Stardust on 2017/1/27.
*/
public abstract class JavaScriptEngineManager {
public abstract class AbstractScriptEngineManager implements ScriptEngineManager {
public interface EngineLifecycleCallback {
void onEngineCreate(JavaScriptEngine engine);
void onEngineRemove(JavaScriptEngine engine);
}
private static final String TAG = "JavaScriptEngineManager";
private static final String TAG = "AbstractScriptEngineManager";
private Map<String, Object> mGlobalVariableMap = new HashMap<>();
private final Set<JavaScriptEngine> mEngines = new HashSet<>();
private final Set<ScriptEngine> mEngines = new HashSet<>();
private EngineLifecycleCallback mEngineLifecycleCallback;
private final ScriptSource INIT_SCRIPT;
private android.content.Context mContext;
public JavaScriptEngineManager(Context context) {
public AbstractScriptEngineManager(Context context) {
mContext = context;
INIT_SCRIPT = new StringScriptSource(readInitScript());
}
public JavaScriptEngine createEngine() {
JavaScriptEngine engine = createEngineInner();
public ScriptEngine createEngine() {
ScriptEngine engine = createEngineInner();
putProperties(engine);
addEngine(engine);
return engine;
}
private void addEngine(JavaScriptEngine engine) {
private void addEngine(ScriptEngine engine) {
synchronized (mEngines) {
mEngines.add(engine);
if (mEngineLifecycleCallback != null) {
@@ -56,7 +47,7 @@ public abstract class JavaScriptEngineManager {
}
}
public void put(String varName, Object value) {
public void putGlobal(String varName, Object value) {
mGlobalVariableMap.put(varName, value);
}
@@ -64,11 +55,11 @@ public abstract class JavaScriptEngineManager {
mEngineLifecycleCallback = engineLifecycleCallback;
}
public Set<JavaScriptEngine> getEngines() {
public Set<ScriptEngine> getEngines() {
return mEngines;
}
protected abstract JavaScriptEngine createEngineInner();
protected abstract ScriptEngine createEngineInner();
public abstract String[] getGlobalFunctions();
@@ -76,13 +67,13 @@ public abstract class JavaScriptEngineManager {
return mContext;
}
protected void putProperties(JavaScriptEngine engine) {
protected void putProperties(ScriptEngine engine) {
for (Map.Entry<String, Object> variable : mGlobalVariableMap.entrySet()) {
engine.put(variable.getKey(), variable.getValue());
}
}
void removeEngine(JavaScriptEngine engine) {
public void removeEngine(ScriptEngine engine) {
synchronized (mEngines) {
if (mEngines.remove(engine) && mEngineLifecycleCallback != null) {
mEngineLifecycleCallback.onEngineRemove(engine);
@@ -90,28 +81,11 @@ public abstract class JavaScriptEngineManager {
}
}
private String readInitScript() {
try {
return PFile.read(mContext.getAssets().open("javascript_engine_init.js"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public ScriptSource getInitScript() {
if (BuildConfig.DEBUG) {
// 调试时不缓存INIT_SCRIPT否则修改javascript_engine_init.js后不会更新
return new StringScriptSource(readInitScript());
} else {
return INIT_SCRIPT;
}
}
public int stopAll() {
synchronized (mEngines) {
int n = mEngines.size();
for (JavaScriptEngine engine : mEngines) {
for (ScriptEngine engine : mEngines) {
engine.forceStop();
}
return n;

View File

@@ -6,6 +6,7 @@ import com.stardust.autojs.rhino_android.AndroidContextFactory;
import com.stardust.autojs.rhino_android.RhinoAndroidHelper;
import com.stardust.autojs.runtime.ScriptInterruptedException;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.pio.UncheckedIOException;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
@@ -14,7 +15,8 @@ import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import java.io.File;
import java.util.Hashtable;
import java.io.IOException;
import java.io.Reader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -22,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
* Created by Stardust on 2017/4/2.
*/
public class RhinoJavaScriptEngine implements JavaScriptEngine {
public class RhinoJavaScriptEngine implements ScriptEngine {
private static final String LOG_TAG = "RhinoJavaScriptEngine";
@@ -48,7 +50,15 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine {
@Override
public Object execute(ScriptSource source) {
return mContext.evaluateString(mScriptable, source.getScript(), "<script>", 1, null);
Reader reader = source.getScriptReader();
if (reader == null) {
return mContext.evaluateString(mScriptable, source.getScript(), "<script>", 1, null);
}
try {
return mContext.evaluateReader(mScriptable, source.getScriptReader(), "<script>", 1, null);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override

View File

@@ -1,9 +1,11 @@
package com.stardust.autojs.engine;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.BuildConfig;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.autojs.script.SequenceScriptSource;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.pio.PFile;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
@@ -25,12 +27,13 @@ import java.util.List;
* Created by Stardust on 2017/3/1.
*/
public class RhinoJavaScriptEngineManager extends JavaScriptEngineManager {
public class RhinoJavaScriptEngineManager extends AbstractScriptEngineManager {
private String[] mFunctions;
private String mRequirePath = "";
private ScriptSource mCustomInitScript;
private ScriptSource mInitScript;
public RhinoJavaScriptEngineManager(android.content.Context context) {
super(context);
@@ -42,6 +45,38 @@ public class RhinoJavaScriptEngineManager extends JavaScriptEngineManager {
return engine;
}
public void setInitScript(String script) {
setInitScriptSource(new StringScriptSource(script));
}
public void setInitScriptSource(ScriptSource initScriptSource) {
if (BuildConfig.DEBUG) {
mCustomInitScript = initScriptSource;
} else {
mInitScript = new SequenceScriptSource("<init>", new StringScriptSource(readInitScript()), initScriptSource);
}
}
private String readInitScript() {
try {
return PFile.read(getContext().getAssets().open("javascript_engine_init.js"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
ScriptSource getInitScript() {
if (mInitScript == null || BuildConfig.DEBUG) {
// 调试时不缓存INIT_SCRIPT否则修改javascript_engine_init.js后不会更新
if (mCustomInitScript != null) {
mInitScript = new SequenceScriptSource("<init>", new StringScriptSource(readInitScript()), mCustomInitScript);
} else {
mInitScript = new StringScriptSource(readInitScript());
}
}
return mInitScript;
}
public void setRequirePath(String requirePath) {
mRequirePath = requirePath;
}
@@ -64,7 +99,7 @@ public class RhinoJavaScriptEngineManager extends JavaScriptEngineManager {
}
private String[] getGlobalFunctionsInner() {
JavaScriptEngine engine = createEngine();
ScriptEngine engine = createEngine();
ScriptSource source = new StringScriptSource("this", "this");
engine.setTag("script", source);
Scriptable scriptable = (Scriptable) engine.execute(source);

View File

@@ -6,15 +6,15 @@ import com.stardust.autojs.script.ScriptSource;
* Created by Stardust on 2017/4/2.
* <p>
* <p>
* A JavaScriptEngine is created by {@link JavaScriptEngineManager#createEngine()}, and then can be
* used to execute script with {@link JavaScriptEngine#execute(ScriptSource)} in the **same** thread.
* A ScriptEngine is created by {@link AbstractScriptEngineManager#createEngine()}, and then can be
* used to execute script with {@link ScriptEngine#execute(ScriptSource)} in the **same** thread.
* When the execution finish successfully, the engine should be destroy in the thread that created it.
* <p>
* If you want to stop the engine in other threads, you should call {@link JavaScriptEngine#forceStop()}.
* If you want to stop the engine in other threads, you should call {@link ScriptEngine#forceStop()}.
* It will throw a {@link com.stardust.autojs.runtime.ScriptStopException}.
*/
public interface JavaScriptEngine {
public interface ScriptEngine {
void put(String name, Object value);

View File

@@ -0,0 +1,33 @@
package com.stardust.autojs.engine;
import java.util.Set;
/**
* Created by Stardust on 2017/5/7.
*/
public interface ScriptEngineManager {
interface EngineLifecycleCallback {
void onEngineCreate(ScriptEngine engine);
void onEngineRemove(ScriptEngine engine);
}
ScriptEngine createEngine();
void putGlobal(String varName, Object value);
void setEngineLifecycleCallback(EngineLifecycleCallback engineLifecycleCallback);
void removeEngine(ScriptEngine engine);
Set<ScriptEngine> getEngines();
String[] getGlobalFunctions();
int stopAll();
}

View File

@@ -3,7 +3,7 @@ package com.stardust.autojs.execution;
import android.util.Log;
import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.script.ScriptSource;
@@ -14,7 +14,7 @@ import com.stardust.autojs.script.ScriptSource;
public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecution implements ScriptExecution, Runnable {
private static final String TAG = "RunnableScriptExecution";
private JavaScriptEngine mJavaScriptEngine;
private ScriptEngine mScriptEngine;
private ScriptRuntime mScriptRuntime;
private ScriptEngineService mScriptEngineService;
@@ -25,12 +25,12 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu
@Override
public void run() {
mJavaScriptEngine = mScriptEngineService.createScriptEngine();
mScriptEngine = mScriptEngineService.createScriptEngine();
mScriptRuntime = mScriptEngineService.createScriptRuntime();
execute(mScriptRuntime, mJavaScriptEngine);
execute(mScriptRuntime, mScriptEngine);
}
private void execute(ScriptRuntime runtime, JavaScriptEngine engine) {
private void execute(ScriptRuntime runtime, ScriptEngine engine) {
try {
prepare(runtime, engine);
doExecution(engine);
@@ -43,7 +43,7 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu
}
}
private void prepare(ScriptRuntime runtime, JavaScriptEngine engine) {
private void prepare(ScriptRuntime runtime, ScriptEngine engine) {
if ((getSource().getExecutionMode() & ScriptSource.EXECUTION_MODE_AUTO) != 0) {
runtime.ensureAccessibilityServiceEnabled();
}
@@ -51,15 +51,15 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu
engine.init();
}
private void doExecution(JavaScriptEngine engine) {
private void doExecution(ScriptEngine engine) {
engine.setTag("script", getSource());
getListener().onStart(this);
getListener().onSuccess(this, engine.execute(getSource()));
}
@Override
public JavaScriptEngine getEngine() {
return mJavaScriptEngine;
public ScriptEngine getEngine() {
return mScriptEngine;
}
@Override

View File

@@ -1,4 +1,4 @@
package com.stardust.autojs.engine;
package com.stardust.autojs.execution;
import android.app.Activity;
import android.content.Context;
@@ -6,9 +6,7 @@ import android.content.Intent;
import android.os.Bundle;
import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.execution.ScriptExecutionListener;
import com.stardust.autojs.execution.ScriptExecutionTask;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.script.ScriptSource;
@@ -21,7 +19,7 @@ public class ScriptExecuteActivity extends Activity {
private static ActivityScriptExecution execution;
private Object mResult;
private JavaScriptEngine mJavaScriptEngine;
private ScriptEngine mScriptEngine;
private ScriptExecutionListener mExecutionListener;
private ScriptSource mScriptSource;
@@ -39,7 +37,7 @@ public class ScriptExecuteActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mScriptSource = execution.getSource();
mJavaScriptEngine = execution.getEngine();
mScriptEngine = execution.getEngine();
mExecutionListener = execution.getListener();
runScript();
}
@@ -55,15 +53,15 @@ public class ScriptExecuteActivity extends Activity {
}
private void doExecution() {
mJavaScriptEngine.setTag("script", mScriptSource);
mScriptEngine.setTag("script", mScriptSource);
mExecutionListener.onStart(execution);
mResult = mJavaScriptEngine.execute(mScriptSource);
mResult = mScriptEngine.execute(mScriptSource);
}
private void prepare() {
mJavaScriptEngine.put("activity", this);
mJavaScriptEngine.put("__runtime__", execution.getRuntime());
mJavaScriptEngine.init();
mScriptEngine.put("activity", this);
mScriptEngine.put("__runtime__", execution.getRuntime());
mScriptEngine.init();
}
@Override
@@ -75,25 +73,25 @@ public class ScriptExecuteActivity extends Activity {
@Override
protected void onDestroy() {
super.onDestroy();
mJavaScriptEngine.put("activity", null);
mJavaScriptEngine.destroy();
mScriptEngine.put("activity", null);
mScriptEngine.destroy();
execution = null;
}
private static class ActivityScriptExecution extends ScriptExecution.AbstractScriptExecution {
private JavaScriptEngine mJavaScriptEngine;
private ScriptEngine mScriptEngine;
private ScriptRuntime mScriptRuntime;
ActivityScriptExecution(ScriptEngineService service, ScriptExecutionTask task) {
super(task);
mJavaScriptEngine = service.createScriptEngine();
mScriptEngine = service.createScriptEngine();
mScriptRuntime = service.createScriptRuntime();
}
@Override
public JavaScriptEngine getEngine() {
return mJavaScriptEngine;
public ScriptEngine getEngine() {
return mScriptEngine;
}
@Override

View File

@@ -1,6 +1,6 @@
package com.stardust.autojs.execution;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.script.ScriptSource;
@@ -10,7 +10,7 @@ import com.stardust.autojs.script.ScriptSource;
public interface ScriptExecution {
JavaScriptEngine getEngine();
ScriptEngine getEngine();
ScriptRuntime getRuntime();
@@ -29,7 +29,7 @@ public interface ScriptExecution {
}
@Override
public abstract JavaScriptEngine getEngine();
public abstract ScriptEngine getEngine();
@Override
public abstract ScriptRuntime getRuntime();

View File

@@ -1,6 +1,6 @@
package com.stardust.autojs.runtime;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console;
@@ -52,7 +52,7 @@ public abstract class AbstractScriptRuntime {
public abstract AbstractShell.Result shell(String cmd, int root);
@JavascriptInterface
public abstract UiSelector selector(JavaScriptEngine engine);
public abstract UiSelector selector(ScriptEngine engine);
@JavascriptInterface
public abstract boolean isStopped();

View File

@@ -3,7 +3,7 @@ package com.stardust.autojs.runtime;
import android.os.Build;
import com.stardust.autojs.R;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.rhino_android.AndroidClassLoader;
import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils;
@@ -72,7 +72,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
return ProcessShell.execCommand(cmd, root != 0);
}
public UiSelector selector(JavaScriptEngine engine) {
public UiSelector selector(ScriptEngine engine) {
return new UiSelector(mAccessibilityBridge);
}

View File

@@ -2,8 +2,12 @@ package com.stardust.autojs.script;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.pio.PFile;
import com.stardust.pio.UncheckedIOException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
/**
* Created by Stardust on 2017/4/2.
@@ -35,6 +39,15 @@ public class FileScriptSource extends ScriptSource {
return mScript;
}
@Override
public Reader getScriptReader() {
try {
return new FileReader(mFile);
} catch (FileNotFoundException e) {
throw new UncheckedIOException(e);
}
}
@Override
public String toString() {
return mFile.toString();

View File

@@ -1,10 +1,14 @@
package com.stardust.autojs.script;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import com.stardust.util.MapEntries;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -36,8 +40,21 @@ public abstract class ScriptSource implements Serializable {
return mName;
}
@NonNull
public abstract String getScript();
@Nullable
public abstract Reader getScriptReader();
@NonNull
public Reader getNonNullScriptReader() {
Reader reader = getScriptReader();
if (reader == null) {
return new StringReader(getScript());
}
return reader;
}
public int getExecutionMode() {
if (mExecutionMode == -1) {
mExecutionMode = parseExecutionMode(getScript());

View File

@@ -1,33 +0,0 @@
package com.stardust.autojs.script;
/**
* Created by Stardust on 2017/4/2.
*/
public class ScriptSourceWithInit extends ScriptSource {
private String mScript;
private ScriptSource mMainScriptSource;
public ScriptSourceWithInit(ScriptSource initScriptSource, ScriptSource mainScriptSource) {
super(mainScriptSource.getName());
mMainScriptSource = mainScriptSource;
StringBuilder stringBuilder = new StringBuilder();
if (initScriptSource.getScript() != null)
stringBuilder.append(initScriptSource.getScript()).append("\n");
stringBuilder.append(mainScriptSource.getScript());
mScript = stringBuilder.toString();
}
@Override
public String getScript() {
return mScript;
}
@Override
public String toString() {
return mMainScriptSource.toString();
}
}

View File

@@ -0,0 +1,54 @@
package com.stardust.autojs.script;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.stardust.io.ConcatReader;
import java.io.Reader;
import java.io.StringReader;
/**
* Created by Stardust on 2017/4/2.
*/
public class SequenceScriptSource extends ScriptSource {
private String mScript;
private ScriptSource mSecondScriptSource;
private ScriptSource mFirstScriptSource;
public SequenceScriptSource(String name, ScriptSource firstScriptSource, ScriptSource secondScriptSource) {
super(name);
mSecondScriptSource = secondScriptSource;
mFirstScriptSource = firstScriptSource;
}
@NonNull
@Override
public String getScript() {
concatScriptsIfNeeded();
return mScript;
}
private void concatScriptsIfNeeded() {
if (mScript != null)
return;
mScript = mFirstScriptSource.getScript() + mSecondScriptSource.getScript();
}
@Nullable
@Override
public Reader getScriptReader() {
if (mScript != null)
return new StringReader(mScript);
return new ConcatReader(mFirstScriptSource.getNonNullScriptReader(), mSecondScriptSource.getNonNullScriptReader());
}
@Override
public String toString() {
return mSecondScriptSource.toString();
}
}

View File

@@ -1,6 +1,10 @@
package com.stardust.autojs.script;
import android.support.annotation.Nullable;
import java.io.Reader;
/**
* Created by Stardust on 2017/4/2.
*/
@@ -24,4 +28,10 @@ public class StringScriptSource extends ScriptSource {
return mScript;
}
@Nullable
@Override
public Reader getScriptReader() {
return null;
}
}