diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java index c68907b8..c414ce56 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java @@ -86,7 +86,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat HoverMenuService.getEventBus().register(this); AccessibilityService.getStickOnKeyObserver().addListener(mVolumeKeyListener); if (Pref.isRecordVolumeControlEnable()) { - AutoJs.getInstance().ensureServiceEnabled(); + AutoJs.getInstance().ensureAccessibilityServiceEnabled(); } if (Pref.hasRecordTrigger()) { mKeyObserver = new KeyObserver(mContext); diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index a2f6b7b9..cb2260dd 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -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() { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java deleted file mode 100644 index c618c21a..00000000 --- a/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java +++ /dev/null @@ -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 applicationContext; - private Map 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); - } - -} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index 7d4188e0..40dd947e 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -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 applicationContext; + private Map mProperties = new ConcurrentHashMap<>(); private UiHandler mUiHandler; - private AccessibilityBridge mAccessibilityBridge; private AbstractShell mRootShell; private Supplier 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); + } + } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java index cb49d3ba..122d625f 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java @@ -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 diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/image/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/image/Images.java index 42bb480b..18c83939 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/image/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/image/Images.java @@ -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; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/simpleaction/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/simpleaction/SimpleActionAutomator.java index 5772ce77..861068b8 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/simpleaction/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/simpleaction/SimpleActionAutomator.java @@ -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; }