refactor: remove AbstractScriptRuntime

This commit is contained in:
hyb1996
2017-07-31 10:35:00 +08:00
parent 33cdef21c6
commit 63bc8c0e09
7 changed files with 118 additions and 200 deletions

View File

@@ -13,7 +13,6 @@ import com.stardust.autojs.execution.ScriptExecutionListener;
import com.stardust.autojs.execution.ScriptExecutionObserver;
import com.stardust.autojs.execution.ScriptExecutionTask;
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.script.ScriptSource;
@@ -88,7 +87,7 @@ public class ScriptEngineService {
mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER);
EVENT_BUS.register(this);
mScriptEngineManager.putGlobal("context", mUiHandler.getContext());
AbstractScriptRuntime.setApplicationContext(builder.mUiHandler.getContext());
ScriptRuntime.setApplicationContext(builder.mUiHandler.getContext().getApplicationContext());
}
public Console getGlobalConsole() {

View File

@@ -1,177 +0,0 @@
package com.stardust.autojs.runtime;
import android.content.Context;
import android.os.Build;
import android.support.annotation.CallSuper;
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.Loopers;
import com.stardust.autojs.runtime.api.ScriptBridges;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.api.Events;
import com.stardust.autojs.runtime.api.Timers;
import com.stardust.autojs.runtime.api.UiSelector;
import com.stardust.autojs.runtime.api.image.Images;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
import com.stardust.autojs.runtime.api.ui.Dialogs;
import com.stardust.autojs.runtime.api.ui.UI;
import com.stardust.autojs.runtime.simpleaction.SimpleActionAutomator;
import com.stardust.util.ScreenMetrics;
import com.stardust.util.UiHandler;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Stardust on 2017/5/4.
*/
public abstract class AbstractScriptRuntime {
@ScriptVariable
public AppUtils app;
@ScriptVariable
public Console console;
@ScriptVariable
public SimpleActionAutomator automator;
@ScriptVariable
public AccessibilityInfoProvider info;
@ScriptVariable
public UI ui;
@ScriptVariable
public Dialogs dialogs;
@ScriptVariable
public Events events;
@ScriptVariable
public ScriptBridges bridges = new ScriptBridges();
@ScriptVariable
public Loopers loopers;
@ScriptVariable
public Timers timers;
@ScriptVariable
public AccessibilityBridge accessibilityBridge;
private Images images;
private UiHandler mUiHandler;
private static WeakReference<Context> applicationContext;
private Map<String, Object> mProperties = new ConcurrentHashMap<>();
public AbstractScriptRuntime(UiHandler uiHandler, Console console, AccessibilityBridge bridge, AppUtils appUtils, ScreenCaptureRequester screenCaptureRequester) {
this.app = appUtils;
this.console = console;
accessibilityBridge = bridge;
mUiHandler = uiHandler;
this.automator = new SimpleActionAutomator(bridge, this);
this.info = bridge.getInfoProvider();
Context context = uiHandler.getContext();
this.ui = new UI(context);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
images = new Images(context, this, screenCaptureRequester);
}
dialogs = new Dialogs(app, uiHandler);
}
/**
* Call in init.js
*/
@CallSuper
public void init() {
if (loopers != null)
throw new IllegalStateException("already initialized");
loopers = new Loopers();
events = new Events(mUiHandler.getContext(), accessibilityBridge, bridges, loopers);
timers = new Timers(bridges);
}
public static void setApplicationContext(Context context) {
applicationContext = new WeakReference<>(context);
}
public static Context getApplicationContext() {
if (applicationContext == null || applicationContext.get() == null) {
throw new ScriptEnvironmentException("No application context");
}
return applicationContext.get();
}
@ScriptInterface
public abstract void toast(final String text);
@ScriptInterface
public abstract void sleep(long millis);
@ScriptInterface
public abstract void setClip(final String text);
@ScriptInterface
public abstract AbstractShell getRootShell();
@ScriptInterface
public abstract AbstractShell.Result shell(String cmd, int root);
@ScriptInterface
public abstract UiSelector selector(ScriptEngine engine);
@ScriptInterface
public abstract boolean isStopped();
@ScriptInterface
public abstract void requiresApi(int i);
@ScriptInterface
public abstract void loadJar(String path);
@ScriptInterface
public abstract void exit();
@ScriptInterface
public abstract void setScreenMetrics(int width, int height);
@ScriptInterface
public abstract ScreenMetrics getScreenMetrics();
public abstract void ensureAccessibilityServiceEnabled();
@CallSuper
public void onExit() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
images.releaseScreenCapturer();
}
if (events != null)
events.recycle();
if (loopers != null)
loopers.quitAll();
}
public Object getImages() {
return images;
}
public Object getProperty(String key) {
return mProperties.get(key);
}
public Object putProperty(String key, Object value) {
return mProperties.put(key, value);
}
public Object removeProperty(String key) {
return mProperties.remove(key);
}
}

View File

@@ -1,5 +1,6 @@
package com.stardust.autojs.runtime;
import android.content.Context;
import android.os.Build;
import android.os.Looper;
@@ -9,8 +10,15 @@ import com.stardust.autojs.rhino.AndroidClassLoader;
import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.api.Events;
import com.stardust.autojs.runtime.api.Loopers;
import com.stardust.autojs.runtime.api.ScriptBridges;
import com.stardust.autojs.runtime.api.Timers;
import com.stardust.autojs.runtime.api.UiSelector;
import com.stardust.autojs.runtime.api.image.Images;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
import com.stardust.autojs.runtime.api.ui.Dialogs;
import com.stardust.autojs.runtime.simpleaction.SimpleActionAutomator;
import com.stardust.concurrent.VolatileBox;
import com.stardust.autojs.runtime.api.ui.UI;
import com.stardust.pio.UncheckedIOException;
@@ -20,21 +28,26 @@ import com.stardust.util.ScreenMetrics;
import com.stardust.util.SdkVersionUtil;
import com.stardust.util.Supplier;
import com.stardust.util.UiHandler;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
import org.mozilla.javascript.ContextFactory;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Stardust on 2017/1/27.
*/
public class ScriptRuntime extends AbstractScriptRuntime {
public class ScriptRuntime {
private static final String TAG = "ScriptRuntime";
public static class Builder {
private UiHandler mUiHandler;
private Console mConsole;
@@ -83,20 +96,84 @@ public class ScriptRuntime extends AbstractScriptRuntime {
}
@ScriptVariable
public final AppUtils app;
@ScriptVariable
public final Console console;
@ScriptVariable
public final SimpleActionAutomator automator;
@ScriptVariable
public final AccessibilityInfoProvider info;
@ScriptVariable
public final UI ui;
@ScriptVariable
public final Dialogs dialogs;
@ScriptVariable
public Events events;
@ScriptVariable
public final ScriptBridges bridges = new ScriptBridges();
@ScriptVariable
public Loopers loopers;
@ScriptVariable
public Timers timers;
@ScriptVariable
public final AccessibilityBridge accessibilityBridge;
private Images images;
private static WeakReference<Context> applicationContext;
private Map<String, Object> mProperties = new ConcurrentHashMap<>();
private UiHandler mUiHandler;
private AccessibilityBridge mAccessibilityBridge;
private AbstractShell mRootShell;
private Supplier<AbstractShell> mShellSupplier;
private ScreenMetrics mScreenMetrics = new ScreenMetrics();
protected ScriptRuntime(Builder builder) {
super(builder.mUiHandler, builder.mConsole, builder.mAccessibilityBridge, builder.mAppUtils, builder.mScreenCaptureRequester);
mAccessibilityBridge = builder.mAccessibilityBridge;
app = builder.mAppUtils;
mUiHandler = builder.mUiHandler;
console = builder.mConsole;
accessibilityBridge = builder.mAccessibilityBridge;
mShellSupplier = builder.mShellSupplier;
ui = new UI(mUiHandler.getContext());
this.automator = new SimpleActionAutomator(accessibilityBridge, this);
automator.setScreenMetrics(mScreenMetrics);
this.info = accessibilityBridge.getInfoProvider();
Context context = mUiHandler.getContext();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
images = new Images(context, this, builder.mScreenCaptureRequester);
}
dialogs = new Dialogs(app, mUiHandler);
}
public void init() {
if (loopers != null)
throw new IllegalStateException("already initialized");
loopers = new Loopers();
events = new Events(mUiHandler.getContext(), accessibilityBridge, bridges, loopers);
timers = new Timers(bridges);
}
public static void setApplicationContext(Context context) {
applicationContext = new WeakReference<>(context);
}
public static Context getApplicationContext() {
if (applicationContext == null || applicationContext.get() == null) {
throw new ScriptEnvironmentException("No application context");
}
return applicationContext.get();
}
public UiHandler getUiHandler() {
@@ -104,7 +181,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
}
public AccessibilityBridge getAccessibilityBridge() {
return mAccessibilityBridge;
return accessibilityBridge;
}
public void toast(final String text) {
@@ -142,7 +219,6 @@ public class ScriptRuntime extends AbstractScriptRuntime {
return clip.blockedGetOrThrow(ScriptInterruptedException.class);
}
@Override
public AbstractShell getRootShell() {
ensureRootShell();
return mRootShell;
@@ -164,7 +240,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
}
public UiSelector selector(ScriptEngine engine) {
return new UiSelector(mAccessibilityBridge);
return new UiSelector(accessibilityBridge);
}
public boolean isStopped() {
@@ -196,27 +272,47 @@ public class ScriptRuntime extends AbstractScriptRuntime {
}
@Override
public void setScreenMetrics(int width, int height) {
mScreenMetrics.setScreenMetrics(width, height);
}
@Override
public ScreenMetrics getScreenMetrics() {
return mScreenMetrics;
}
public void ensureAccessibilityServiceEnabled() {
mAccessibilityBridge.ensureServiceEnabled();
accessibilityBridge.ensureServiceEnabled();
}
@Override
public void onExit() {
super.onExit();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
images.releaseScreenCapturer();
}
if (events != null)
events.recycle();
if (loopers != null)
loopers.quitAll();
if (mRootShell != null) {
mRootShell.exit();
mRootShell = null;
}
mShellSupplier = null;
}
public Object getImages() {
return images;
}
public Object getProperty(String key) {
return mProperties.get(key);
}
public Object putProperty(String key, Object value) {
return mProperties.put(key, value);
}
public Object removeProperty(String key) {
return mProperties.remove(key);
}
}

View File

@@ -5,8 +5,8 @@ import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.ScriptInterruptedException;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.lang.ThreadCompat;
import com.stardust.pio.UncheckedIOException;
@@ -84,7 +84,7 @@ public class Shell extends AbstractShell implements AutoCloseable {
}
public Shell(boolean root) {
this(AbstractScriptRuntime.getApplicationContext(), root);
this(ScriptRuntime.getApplicationContext(), root);
}
@Override

View File

@@ -14,7 +14,7 @@ import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.util.Log;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.ScriptInterruptedException;
import com.stardust.autojs.runtime.ScriptVariable;
import com.stardust.autojs.runtime.api.Loopers;
@@ -33,7 +33,7 @@ import java.util.Locale;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class Images {
private AbstractScriptRuntime mScriptRuntime;
private ScriptRuntime mScriptRuntime;
private ScreenCaptureRequester mScreenCaptureRequester;
private ScreenCapturer mScreenCapturer;
private Context mContext;
@@ -41,7 +41,7 @@ public class Images {
@ScriptVariable
public ColorFinder colorFinder = new ColorFinder();
public Images(Context context, AbstractScriptRuntime scriptRuntime, ScreenCaptureRequester screenCaptureRequester) {
public Images(Context context, ScriptRuntime scriptRuntime, ScreenCaptureRequester screenCaptureRequester) {
mScriptRuntime = scriptRuntime;
mScreenCaptureRequester = screenCaptureRequester;
mContext = context;

View File

@@ -10,9 +10,9 @@ import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.AccessibilityBridge;
import com.stardust.autojs.runtime.ScriptInterface;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.AutomatorConfig;
import com.stardust.autojs.runtime.api.Loopers;
import com.stardust.automator.GlobalActionAutomator;
@@ -32,11 +32,11 @@ public class SimpleActionAutomator {
private static final String TAG = "SimpleActionAutomator";
private AccessibilityBridge mAccessibilityBridge;
private AbstractScriptRuntime mScriptRuntime;
private ScriptRuntime mScriptRuntime;
private GlobalActionAutomator mGlobalActionAutomator;
private ScreenMetrics mScreenMetrics;
public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, AbstractScriptRuntime scriptRuntime) {
public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, ScriptRuntime scriptRuntime) {
mAccessibilityBridge = accessibilityBridge;
mScriptRuntime = scriptRuntime;
}