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

@@ -86,7 +86,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
HoverMenuService.getEventBus().register(this); HoverMenuService.getEventBus().register(this);
AccessibilityService.getStickOnKeyObserver().addListener(mVolumeKeyListener); AccessibilityService.getStickOnKeyObserver().addListener(mVolumeKeyListener);
if (Pref.isRecordVolumeControlEnable()) { if (Pref.isRecordVolumeControlEnable()) {
AutoJs.getInstance().ensureServiceEnabled(); AutoJs.getInstance().ensureAccessibilityServiceEnabled();
} }
if (Pref.hasRecordTrigger()) { if (Pref.hasRecordTrigger()) {
mKeyObserver = new KeyObserver(mContext); mKeyObserver = new KeyObserver(mContext);

View File

@@ -13,7 +13,6 @@ import com.stardust.autojs.execution.ScriptExecutionListener;
import com.stardust.autojs.execution.ScriptExecutionObserver; import com.stardust.autojs.execution.ScriptExecutionObserver;
import com.stardust.autojs.execution.ScriptExecutionTask; import com.stardust.autojs.execution.ScriptExecutionTask;
import com.stardust.autojs.execution.SimpleScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.script.ScriptSource; import com.stardust.autojs.script.ScriptSource;
@@ -88,7 +87,7 @@ public class ScriptEngineService {
mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER); mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER);
EVENT_BUS.register(this); EVENT_BUS.register(this);
mScriptEngineManager.putGlobal("context", mUiHandler.getContext()); mScriptEngineManager.putGlobal("context", mUiHandler.getContext());
AbstractScriptRuntime.setApplicationContext(builder.mUiHandler.getContext()); ScriptRuntime.setApplicationContext(builder.mUiHandler.getContext().getApplicationContext());
} }
public Console getGlobalConsole() { 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; package com.stardust.autojs.runtime;
import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Looper; 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.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console; 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.UiSelector;
import com.stardust.autojs.runtime.api.image.Images;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester; 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.concurrent.VolatileBox;
import com.stardust.autojs.runtime.api.ui.UI; import com.stardust.autojs.runtime.api.ui.UI;
import com.stardust.pio.UncheckedIOException; import com.stardust.pio.UncheckedIOException;
@@ -20,21 +28,26 @@ import com.stardust.util.ScreenMetrics;
import com.stardust.util.SdkVersionUtil; import com.stardust.util.SdkVersionUtil;
import com.stardust.util.Supplier; import com.stardust.util.Supplier;
import com.stardust.util.UiHandler; import com.stardust.util.UiHandler;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.ContextFactory;
import java.io.File; import java.io.File;
import java.io.IOException; 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. * Created by Stardust on 2017/1/27.
*/ */
public class ScriptRuntime extends AbstractScriptRuntime { public class ScriptRuntime {
private static final String TAG = "ScriptRuntime"; private static final String TAG = "ScriptRuntime";
public static class Builder { public static class Builder {
private UiHandler mUiHandler; private UiHandler mUiHandler;
private Console mConsole; 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 UiHandler mUiHandler;
private AccessibilityBridge mAccessibilityBridge;
private AbstractShell mRootShell; private AbstractShell mRootShell;
private Supplier<AbstractShell> mShellSupplier; private Supplier<AbstractShell> mShellSupplier;
private ScreenMetrics mScreenMetrics = new ScreenMetrics(); private ScreenMetrics mScreenMetrics = new ScreenMetrics();
protected ScriptRuntime(Builder builder) { protected ScriptRuntime(Builder builder) {
super(builder.mUiHandler, builder.mConsole, builder.mAccessibilityBridge, builder.mAppUtils, builder.mScreenCaptureRequester); app = builder.mAppUtils;
mAccessibilityBridge = builder.mAccessibilityBridge;
mUiHandler = builder.mUiHandler; mUiHandler = builder.mUiHandler;
console = builder.mConsole;
accessibilityBridge = builder.mAccessibilityBridge;
mShellSupplier = builder.mShellSupplier; mShellSupplier = builder.mShellSupplier;
ui = new UI(mUiHandler.getContext()); ui = new UI(mUiHandler.getContext());
this.automator = new SimpleActionAutomator(accessibilityBridge, this);
automator.setScreenMetrics(mScreenMetrics); 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() { public UiHandler getUiHandler() {
@@ -104,7 +181,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
} }
public AccessibilityBridge getAccessibilityBridge() { public AccessibilityBridge getAccessibilityBridge() {
return mAccessibilityBridge; return accessibilityBridge;
} }
public void toast(final String text) { public void toast(final String text) {
@@ -142,7 +219,6 @@ public class ScriptRuntime extends AbstractScriptRuntime {
return clip.blockedGetOrThrow(ScriptInterruptedException.class); return clip.blockedGetOrThrow(ScriptInterruptedException.class);
} }
@Override
public AbstractShell getRootShell() { public AbstractShell getRootShell() {
ensureRootShell(); ensureRootShell();
return mRootShell; return mRootShell;
@@ -164,7 +240,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
} }
public UiSelector selector(ScriptEngine engine) { public UiSelector selector(ScriptEngine engine) {
return new UiSelector(mAccessibilityBridge); return new UiSelector(accessibilityBridge);
} }
public boolean isStopped() { public boolean isStopped() {
@@ -196,27 +272,47 @@ public class ScriptRuntime extends AbstractScriptRuntime {
} }
@Override
public void setScreenMetrics(int width, int height) { public void setScreenMetrics(int width, int height) {
mScreenMetrics.setScreenMetrics(width, height); mScreenMetrics.setScreenMetrics(width, height);
} }
@Override
public ScreenMetrics getScreenMetrics() { public ScreenMetrics getScreenMetrics() {
return mScreenMetrics; return mScreenMetrics;
} }
public void ensureAccessibilityServiceEnabled() { public void ensureAccessibilityServiceEnabled() {
mAccessibilityBridge.ensureServiceEnabled(); accessibilityBridge.ensureServiceEnabled();
} }
@Override
public void onExit() { 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) { if (mRootShell != null) {
mRootShell.exit(); mRootShell.exit();
mRootShell = null; mRootShell = null;
} }
mShellSupplier = 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.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import com.stardust.autojs.runtime.AbstractScriptRuntime;
import com.stardust.autojs.runtime.ScriptInterruptedException; import com.stardust.autojs.runtime.ScriptInterruptedException;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.lang.ThreadCompat; import com.stardust.lang.ThreadCompat;
import com.stardust.pio.UncheckedIOException; import com.stardust.pio.UncheckedIOException;
@@ -84,7 +84,7 @@ public class Shell extends AbstractShell implements AutoCloseable {
} }
public Shell(boolean root) { public Shell(boolean root) {
this(AbstractScriptRuntime.getApplicationContext(), root); this(ScriptRuntime.getApplicationContext(), root);
} }
@Override @Override

View File

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

View File

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