diff --git a/app/build.gradle b/app/build.gradle index 8e0173f6..d39dfb15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -107,7 +107,7 @@ dependencies { compile 'me.zhanghai.android.materialprogressbar:library:1.3.0' compile group: 'com.twofortyfouram', name: 'android-plugin-client-sdk-for-locale', version: '[4.0.2, 5.0[' compile 'com.android.volley:volley:1.0.0' - compile 'com.github.hyb1996:EnhancedFloaty:0.16' + compile 'com.github.hyb1996:EnhancedFloaty:0.17' compile 'com.flurry.android:analytics:7.0.0@aar' compile 'com.pushtorefresh.storio:sqlite:1.12.3' compile 'com.android.support:multidex:1.0.1' diff --git a/app/src/main/assets/js/autojs_init.js b/app/src/main/assets/js/autojs_init.js index 4133a2f9..cd501fe6 100644 --- a/app/src/main/assets/js/autojs_init.js +++ b/app/src/main/assets/js/autojs_init.js @@ -9,7 +9,7 @@ dialogs.rawInput = function(title, prefill){ }; dialogs.input = function(title, prefill){ - return eval(rawInput(title, prefill)); + return eval(dialogs.rawInput(title, prefill) + ""); } dialogs.prompt = dialogs.rawInput; @@ -28,15 +28,18 @@ dialogs.select = function(title, items){ return __runtime__.dialogs.select(title, [].slice.call(arguments, 1)); } -dialogs.singleChoice = function(title, index, items){ - return __runtime__.dialogs.singleChoice(title, index, [].slice.call(arguments, 2)); +dialogs.singleChoice = function(title, items, index){ + index = index || 0; + return __runtime__.dialogs.singleChoice(title, index, items); } -dialogs.multiChoice = function(title, index, items){ - var javaArray = __runtime__.dialogs.multiChoice(title, index, [].slice.call(arguments, 2)); - var jsArray = {}; - for each(i in javaArray){ - jsArray.push(i); +dialogs.multiChoice = function(title, items, index){ + index = index || []; + var javaArray = __runtime__.dialogs.multiChoice(title, index, items); + var jsArray = []; + var len = javaArray.length; + for (var i = 0;i < len;i++){ + jsArray.push(javaArray[i]); } return jsArray; } @@ -56,23 +59,3 @@ var confirm = function(title, prefill){ var prompt = function(title, prefill){ return dialogs.prompt(title, prefill); } -/* - -dialogs.rawInput = function(title, prefill){ - prefill = prefill || ""; - return __runtime__.dialogs.rawInput(title, prefill); -} - -dialogs.input = function(title, prefill){ - return eval(rawInput(title, prefill)); -} - -dialogs.alert = function(title, content){ - __runtime__.dialogs.alert(title, content); -} - -dialogs.select = function(title, content){ - __runtime__.dialogs.alert(title, content); -} - -*/ \ No newline at end of file diff --git a/app/src/main/assets/modules/dialogs.js b/app/src/main/assets/modules/dialogs.js new file mode 100644 index 00000000..d72fc83a --- /dev/null +++ b/app/src/main/assets/modules/dialogs.js @@ -0,0 +1,3 @@ +module.exports = function(){ + +} \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/单选框.js b/app/src/main/assets/sample/对话框/单选框.js new file mode 100644 index 00000000..26e5588d --- /dev/null +++ b/app/src/main/assets/sample/对话框/单选框.js @@ -0,0 +1,2 @@ +var sex = dialogs.singleChoice("请选择性别", ["男", "女", "基佬", "女装", "其他"], 2); +toast("选择了第" + (sex + 1) + "个选项"); \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/多选框.js b/app/src/main/assets/sample/对话框/多选框.js new file mode 100644 index 00000000..88d958c5 --- /dev/null +++ b/app/src/main/assets/sample/对话框/多选框.js @@ -0,0 +1,7 @@ +var i = dialogs.multiChoice("下列作品出自李贽的是", ["《焚书》", "《西湖寻梦》", "《高太史全集》", "《续焚烧书》", "《藏书》"]); +toast("选择了: " + i); +if(i.length == 2 && i.toString() == [0, 4].toString()){ + toast("答对辣"); +}else{ + toast("答错辣"); +} \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/确认框.js b/app/src/main/assets/sample/对话框/确认框.js new file mode 100644 index 00000000..2cbf1d35 --- /dev/null +++ b/app/src/main/assets/sample/对话框/确认框.js @@ -0,0 +1,9 @@ +var handsome = confirm("你帅吗?"); +if(handsome){ + toast("真不要脸!"); + toast("真不要脸!"); + toast("真不要脸!"); + alert("真不要脸!"); +}else{ + toast("嗯"); +} \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/菜单.js b/app/src/main/assets/sample/对话框/菜单.js new file mode 100644 index 00000000..58229795 --- /dev/null +++ b/app/src/main/assets/sample/对话框/菜单.js @@ -0,0 +1,15 @@ +while(true){ + var i = dialogs.select("哲学的基本问题是", "社会和自然的关系问题", "思维与存在的关系问题", "政治和经济的关系问题", "实践和理论的关系问题"); + if(i == -1){ + toast("猜一下呗"); + continue; + } + if(i == 1){ + toast("答对辣"); + break; + }else{ + toast("答错辣") + } +} + + diff --git a/app/src/main/assets/sample/对话框/输入框.js b/app/src/main/assets/sample/对话框/输入框.js new file mode 100644 index 00000000..b2547a4c --- /dev/null +++ b/app/src/main/assets/sample/对话框/输入框.js @@ -0,0 +1,4 @@ +var name = rawInput("请输入名字"); +alert("(•́へ•́╬)", "你好~ " + name); +var expr = dialogs.input("请输入简单的算式", "1+1"); +alert("计算结果为 " + expr); \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/应用工具.js b/app/src/main/assets/sample/应用/应用工具.js similarity index 100% rename from app/src/main/assets/sample/对话框/应用工具.js rename to app/src/main/assets/sample/应用/应用工具.js diff --git a/app/src/main/assets/sample/对话框/打开应用.js b/app/src/main/assets/sample/应用/打开应用.js similarity index 100% rename from app/src/main/assets/sample/对话框/打开应用.js rename to app/src/main/assets/sample/应用/打开应用.js diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index 2dfedee5..94c5e0ed 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.support.annotation.Keep; import android.support.multidex.MultiDexApplication; import android.util.Log; +import android.widget.Toast; import com.iwebpp.node.NodeContext; import com.iwebpp.node.http.ClientRequest; @@ -16,6 +17,7 @@ import com.squareup.leakcanary.LeakCanary; import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.app.VolumeChangeObserver; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.external.floating_window.OverlayPermissionChecker; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.statics.ScriptStatics; import com.stardust.scriptdroid.tool.CrashHandler; diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 5070c849..4eb9c10b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -95,7 +95,6 @@ public class AutoJs implements AccessibilityBridge { private NodeJsJavaScriptEngineManager createScriptEngineManager(Context context) { NodeJsJavaScriptEngineManager manager = new NodeJsJavaScriptEngineManager(context); - manager.setRequirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH); try { manager.setInitScript(PFile.read(context.getAssets().open(INIT_SCRIPT_PATH))); } catch (IOException e) { diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingWindowManger.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingWindowManger.java index 070e0990..11c37550 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingWindowManger.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingWindowManger.java @@ -1,11 +1,17 @@ package com.stardust.scriptdroid.external.floating_window; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; +import android.preference.PreferenceManager; import android.provider.Settings; +import android.support.annotation.RequiresApi; +import android.util.Log; +import android.widget.Toast; import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService; import com.stardust.util.IntentUtil; @@ -15,9 +21,13 @@ import com.stardust.util.IntentUtil; public class FloatingWindowManger { + private static final String KEY_FLOATING_WINDOW_PERMISSION = "May we go back..I...miss..you..Eating..17.5.9"; + private static final String TAG = "FloatingWindowManger"; + public static void showHoverMenu() { if (!HoverMenuService.isServiceRunning()) { - if (!hasFloatingWindowPermission()) { + if (!hasFloatingWindowPermission(App.getApp())) { + Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); goToFloatingWindowPermissionSetting(); } else { HoverMenuService.startService(App.getApp()); @@ -26,33 +36,54 @@ public class FloatingWindowManger { } public static void goToFloatingWindowPermissionSetting() { - String packageName = App.getApp().getPackageName(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - try { - App.getApp().startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:" + packageName)) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } catch (Exception e) { - IntentUtil.goToAppDetailSettings(App.getApp()); - } - } else { + IntentUtil.goToAppDetailSettings(App.getApp()); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private static void goToOverlayPermissionSettings(Context context, String packageName) { + try { + App.getApp().startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + context)) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } catch (Exception e) { IntentUtil.goToAppDetailSettings(App.getApp()); } } - private static boolean hasFloatingWindowPermission() { + public static void checkPermission() { + final OverlayPermissionChecker checker = new OverlayPermissionChecker(App.getApp()); + checker.setCallback(new OverlayPermissionChecker.Callback() { + @Override + public void onCheckResult(boolean granted) { + checker.setCallback(null); + Log.d(TAG, "onCheckResult:" + granted); + setHasFloatingWindowPermission(App.getApp(), granted); + } + }); + checker.check(1500); + } + + public static boolean hasFloatingWindowPermission(Context context) { + return hasOverlayPermission(); + } + + private static void setHasFloatingWindowPermission(Context context, boolean has) { + PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(KEY_FLOATING_WINDOW_PERMISSION, has).apply(); + } + + private static boolean hasOverlayPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return Settings.canDrawOverlays(App.getApp()); } return true; } - public static boolean isFloatingWindowShowing() { + public static boolean isHoverMenuShowing() { return HoverMenuService.isServiceRunning(); } - public static void hideFloatingWindow() { + public static void hideHoverMenu() { if (HoverMenuService.isServiceRunning()) App.getApp().stopService(new Intent(App.getApp(), HoverMenuService.class)); } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/OverlayPermissionChecker.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/OverlayPermissionChecker.java index 41949a7e..2ab56535 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/OverlayPermissionChecker.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/OverlayPermissionChecker.java @@ -1,9 +1,23 @@ package com.stardust.scriptdroid.external.floating_window; +import android.content.Context; +import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.os.Handler; +import android.support.annotation.IntDef; +import android.view.Gravity; +import android.view.View; import android.view.WindowManager; import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.FloatyWindow; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.autojs.api.VolatileBox; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; /** * Created by Stardust on 2017/5/9. @@ -11,41 +25,99 @@ import com.stardust.enhancedfloaty.FloatyWindow; public class OverlayPermissionChecker { - - public static void addFloaty() { - FloatyService.addWindow(new FloatyWindow() { - @Override - public void onCreate(FloatyService floatyService, WindowManager windowManager) { - - } - - @Override - public void onServiceDestroy(FloatyService floatyService) { - - } - - @Override - public void close() { - - } - }); + public interface Callback { + void onCheckResult(boolean granted); } - private static class OnePixelWindow implements FloatyWindow { + private OnePixelWindow mOnePixelWindow = new OnePixelWindow(); + private Callback mCallback; + private Context mContext; + private Handler mHandler; + private Boolean mCheckResult = null; + + public OverlayPermissionChecker(Context context) { + mContext = context; + mHandler = new Handler(context.getMainLooper()); + } + + public void check() { + mCheckResult = null; + try { + FloatyService.addWindow(mOnePixelWindow); + mContext.startService(new Intent(mContext, FloatyService.class)); + } catch (WindowManager.BadTokenException e) { + onCheckResult(false); + } + } + + public void check(int timeOut) { + check(); + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if (mCheckResult == null) { + onCheckResult(false); + } + } + }, timeOut); + } + + public void setCallback(Callback callback) { + mCallback = callback; + } + + private void onCheckResult(boolean b) { + mCheckResult = b; + if (mCallback != null) { + mCallback.onCheckResult(b); + } + } + + + private class OnePixelWindow implements FloatyWindow { + + private View mOnePixelView; + private WindowManager mWindowManager; @Override public void onCreate(FloatyService floatyService, WindowManager windowManager) { - + mWindowManager = windowManager; + mOnePixelView = new View(floatyService) { + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + notifyWindowVisible(); + } + + @Override + protected void onWindowVisibilityChanged(int visibility) { + super.onWindowVisibilityChanged(visibility); + } + }; + mOnePixelView.setWillNotDraw(false); + mOnePixelView.setBackgroundColor(Color.RED); + WindowManager.LayoutParams params = new WindowManager.LayoutParams(10, 10, + WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, + PixelFormat.TRANSLUCENT); + params.gravity = Gravity.TOP | Gravity.START; + windowManager.addView(mOnePixelView, params); + } + + private void notifyWindowVisible() { + onCheckResult(true); + //close(); } @Override public void onServiceDestroy(FloatyService floatyService) { - + close(); } @Override public void close() { - + mWindowManager.removeView(mOnePixelView); + FloatyService.removeWindow(this); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java index 651d6ba6..06ad2d9f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java @@ -15,6 +15,8 @@ import com.stardust.scriptdroid.external.CommonUtils; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.script.Scripts; +import java.io.File; + /** * Created by Stardust on 2017/2/22. */ @@ -35,6 +37,7 @@ public class RunIntentActivity extends Activity { private void handleIntent(Intent intent) { String path = getPath(intent); + String directoryPath = null; String script = intent.getStringExtra(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT); ScriptSource source = null; if (path == null && script != null) { @@ -42,9 +45,13 @@ public class RunIntentActivity extends Activity { } else if (path != null && new PathChecker(this).checkAndToastError(path)) { ScriptSource fileScriptSource = new FileScriptSource(path); source = new SequenceScriptSource(fileScriptSource.getName(), new StringScriptSource(script), fileScriptSource); + directoryPath = new File(path).getParent(); } if (source != null) { - Scripts.run(source); + if (directoryPath == null) + Scripts.run(source); + else + Scripts.run(source, directoryPath); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java index be221ea7..74147767 100644 --- a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import com.stardust.autojs.execution.ExecutionConfig; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.execution.ScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener; @@ -81,15 +82,22 @@ public class Scripts { } public static ScriptExecution run(ScriptFile file) { - return run(new FileScriptSource(file)); + return run(new FileScriptSource(file), file.getParent()); + } + + public static ScriptExecution run(ScriptSource source, String directoryPath) { + return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() + .requirePath(directoryPath, StorageScriptProvider.DEFAULT_DIRECTORY_PATH)); } public static ScriptExecution run(ScriptSource source) { - return AutoJs.getInstance().getScriptEngineService().execute(source); + return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() + .requirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH)); } - public static ScriptExecution runWithBroadcastSender(ScriptSource scriptSource) { - return AutoJs.getInstance().getScriptEngineService().execute(scriptSource, BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER); + public static ScriptExecution runWithBroadcastSender(ScriptSource scriptSource, String directoryPath) { + return AutoJs.getInstance().getScriptEngineService().execute(scriptSource, BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER, + new ExecutionConfig().requirePath(directoryPath, StorageScriptProvider.DEFAULT_DIRECTORY_PATH)); } public static ScriptExecution run(Context context, Sample file) { @@ -97,4 +105,8 @@ public class Scripts { return AutoJs.getInstance().getScriptEngineService().execute(source); } + public static ScriptExecution runWithBroadcastSender(ScriptSource source) { + return AutoJs.getInstance().getScriptEngineService().execute(source, BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER, + new ExecutionConfig().requirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH)); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java index 3cb659a3..4e571950 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java @@ -14,6 +14,7 @@ import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.api.VolatileBox; +import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger; import com.stardust.util.UiHandler; import java.util.ArrayList; @@ -50,7 +51,6 @@ public class StardustConsole extends AbstractConsole { private ConsoleFloaty mConsoleFloaty; private LogListener mLogListener; private UiHandler mUiHandler; - //private volatile VolatileBox mInput = new VolatileBox<>(""); private BlockingQueue mInput = new ArrayBlockingQueue<>(1); private ConsoleView mConsoleView; private volatile boolean mShown = false; @@ -98,6 +98,10 @@ public class StardustConsole extends AbstractConsole { @Override public void show() { + if (!FloatingWindowManger.hasFloatingWindowPermission(mUiHandler.getContext())) { + FloatingWindowManger.goToFloatingWindowPermissionSetting(); + mUiHandler.toast(R.string.text_no_floating_window_permission); + } startFloatyService(); mUiHandler.post(new Runnable() { @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java index 33d8d34d..4124916b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java @@ -206,11 +206,7 @@ public class EditActivity extends Editor920Activity { private void run() { Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED); - if (mFile != null) { - mScriptExecution = Scripts.runWithBroadcastSender(new FileScriptSource(mName, mFile)); - } else { - mScriptExecution = Scripts.runWithBroadcastSender(new StringScriptSource(mName, mEditorDelegate.getText())); - } + mScriptExecution = Scripts.runWithBroadcastSender(new FileScriptSource(mName, mFile), mFile.getParent()); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java index 30ae5468..bdae5c5c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java @@ -78,7 +78,7 @@ public class EditSideMenuFragment extends Fragment { } private void syncSwitchState() { - mFloatingWindowSwitch.setChecked(FloatingWindowManger.isFloatingWindowShowing()); + mFloatingWindowSwitch.setChecked(FloatingWindowManger.isHoverMenuShowing()); } private void setUpSwitchCompat() { @@ -97,10 +97,10 @@ public class EditSideMenuFragment extends Fragment { @ViewBinding.Check(R.id.sw_floating_window) private void setFloatingWindowEnable(boolean enable) { - if (enable && !FloatingWindowManger.isFloatingWindowShowing()) { + if (enable && !FloatingWindowManger.isHoverMenuShowing()) { FloatingWindowManger.showHoverMenu(); - } else if (!enable && FloatingWindowManger.isFloatingWindowShowing()) { - FloatingWindowManger.hideFloatingWindow(); + } else if (!enable && FloatingWindowManger.isHoverMenuShowing()) { + FloatingWindowManger.hideHoverMenu(); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index bae7e94b..012b1a8c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -29,6 +29,7 @@ import com.stardust.app.NotAskAgainDialog; import com.stardust.app.OnActivityResultDelegate; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger; import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.script.sample.Sample; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java index 53aa6207..f81a8103 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java @@ -88,7 +88,7 @@ public class SlideMenuFragment extends Fragment { }); } }, 450); - mFloatingWindowSwitch.setChecked(FloatingWindowManger.isFloatingWindowShowing()); + mFloatingWindowSwitch.setChecked(FloatingWindowManger.isHoverMenuShowing()); } private void setUpSwitchCompat() { @@ -123,10 +123,10 @@ public class SlideMenuFragment extends Fragment { @ViewBinding.Check(R.id.sw_floating_window) private void setFloatingWindowEnable(boolean enable) { - if (enable && !FloatingWindowManger.isFloatingWindowShowing()) { + if (enable && !FloatingWindowManger.isHoverMenuShowing()) { FloatingWindowManger.showHoverMenu(); - } else if (!enable && FloatingWindowManger.isFloatingWindowShowing()) { - FloatingWindowManger.hideFloatingWindow(); + } else if (!enable && FloatingWindowManger.isHoverMenuShowing()) { + FloatingWindowManger.hideHoverMenu(); } } diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index 494d4171..621494e4 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -15,11 +15,9 @@ if(__engine_name__ == "rhino"){ var __asGlobal__ = function(obj, functions){ - __runtime__.console.log(functions); var len = functions.length; for(var i = 0; i < len; i++) { var funcName = functions[i]; - __runtime__.console.log(funcName); this[funcName] = obj[funcName].bind(obj); } } diff --git a/autojs/src/main/assets/modules/__console__.js b/autojs/src/main/assets/modules/__console__.js index af79c9d6..19ee6151 100644 --- a/autojs/src/main/assets/modules/__console__.js +++ b/autojs/src/main/assets/modules/__console__.js @@ -7,6 +7,10 @@ module.exports = function(__runtime__, scope){ console.assertTrue(value, message); } + console.input = function(data, param){ + return eval(console.rawInput.call(console, [].slice(arguments)) + ""); + } + scope.print = console.log.bind(console); scope.log = scope.print; diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index e71f918f..13e26169 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -142,6 +142,10 @@ public class ScriptEngineService { return execute(new ScriptExecutionTask(source, listener, config)); } + public ScriptExecution execute(ScriptSource source, ExecutionConfig config) { + return execute(new ScriptExecutionTask(source, null, config)); + } + public ScriptExecution execute(ScriptSource source, ScriptExecutionListener listener) { return execute(source, listener, ExecutionConfig.getDefault()); } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/AssetAndUrlModuleSourceProvider.java b/autojs/src/main/java/com/stardust/autojs/engine/AssetAndUrlModuleSourceProvider.java new file mode 100644 index 00000000..bf0d4efc --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/engine/AssetAndUrlModuleSourceProvider.java @@ -0,0 +1,47 @@ +package com.stardust.autojs.engine; + +import org.mozilla.javascript.commonjs.module.provider.ModuleSource; +import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.List; + +/** + * Created by Stardust on 2017/5/9. + */ + +public class AssetAndUrlModuleSourceProvider extends UrlModuleSourceProvider { + + private static final String MODULES_PATH = "modules"; + private android.content.Context mContext; + private List mModules; + private final URI mBaseURI = URI.create("file:///android_asset/modules"); + + public AssetAndUrlModuleSourceProvider(android.content.Context context, List list) { + super(list, null); + mContext = context; + try { + mModules = Arrays.asList(mContext.getAssets().list(MODULES_PATH)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + @Override + protected ModuleSource loadFromPrivilegedLocations(String moduleId, Object validator) throws IOException, URISyntaxException { + String moduleIdWithExtension = moduleId; + if (!moduleIdWithExtension.endsWith(".js")) { + moduleIdWithExtension += ".js"; + } + if (mModules.contains(moduleIdWithExtension)) { + return new ModuleSource(new InputStreamReader(mContext.getAssets().open(MODULES_PATH + "/" + moduleIdWithExtension)), null, + URI.create(moduleIdWithExtension), mBaseURI, validator); + } + return super.loadFromPrivilegedLocations(moduleId, validator); + } +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java b/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java index 8eb1e46d..8bb6e7b0 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java @@ -18,7 +18,6 @@ public class NodeJsJavaScriptEngineManager extends RhinoJavaScriptEngineManager @Override protected NodeJsJavaScriptEngine createEngineInner() { NodeJsJavaScriptEngine engine = new NodeJsJavaScriptEngine(this); - initRequireBuilder(engine.getContext(), engine.getScriptable()); return engine; } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index 7a840333..9bf9efc9 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -13,10 +13,15 @@ import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.ImporterTopLevel; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.commonjs.module.RequireBuilder; +import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider; import java.io.File; import java.io.IOException; import java.io.Reader; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -29,6 +34,7 @@ public class RhinoJavaScriptEngine implements ScriptEngine { private static final String LOG_TAG = "RhinoJavaScriptEngine"; private static int contextCount = 0; + private String[] mRequirePath = new String[0]; private Context mContext; private Scriptable mScriptable; @@ -94,9 +100,28 @@ public class RhinoJavaScriptEngine implements ScriptEngine { public void init() { ScriptableObject.putProperty(mScriptable, "__engine_name__", "rhino"); ScriptableObject.putProperty(mScriptable, "__engine__", this); + mRequirePath = (String[]) getTag("__require_path__"); + initRequireBuilder(mContext, mScriptable); mContext.evaluateString(mScriptable, mEngineManager.getInitScript().getScript(), "", 1, null); } + public void setRequirePath(String... requirePath) { + setTag("__require_path__", requirePath); + } + + void initRequireBuilder(Context context, Scriptable scope) { + List list = new ArrayList<>(); + for (String path : mRequirePath) { + list.add(new File(path).toURI()); + } + AssetAndUrlModuleSourceProvider provider = new AssetAndUrlModuleSourceProvider(getEngineManager().getContext(), list); + new RequireBuilder() + .setModuleScriptProvider(new SoftCachingModuleScriptProvider(provider)) + .setSandboxed(false) + .createRequire(context, scope) + .install(scope); + } + public Context getContext() { return mContext; } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngineManager.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngineManager.java index 9a2441be..85dd4068 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngineManager.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngineManager.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -31,7 +32,6 @@ public class RhinoJavaScriptEngineManager extends AbstractScriptEngineManager { private String[] mFunctions; - private String mRequirePath = ""; private ScriptSource mCustomInitScript; private ScriptSource mInitScript; @@ -41,7 +41,6 @@ public class RhinoJavaScriptEngineManager extends AbstractScriptEngineManager { protected RhinoJavaScriptEngine createEngineInner() { RhinoJavaScriptEngine engine = new RhinoJavaScriptEngine(this); - initRequireBuilder(engine.getContext(), engine.getScriptable()); return engine; } @@ -77,20 +76,6 @@ public class RhinoJavaScriptEngineManager extends AbstractScriptEngineManager { return mInitScript; } - public void setRequirePath(String requirePath) { - mRequirePath = requirePath; - } - - void initRequireBuilder(Context context, Scriptable scope) { - List list = Collections.singletonList(new File(mRequirePath).toURI()); - AssetAndUrlModuleSourceProvider provider = new AssetAndUrlModuleSourceProvider(getContext(), list); - new RequireBuilder() - .setModuleScriptProvider(new SoftCachingModuleScriptProvider(provider)) - .setSandboxed(false) - .createRequire(context, scope) - .install(scope); - } - @Override public String[] getGlobalFunctions() { if (mFunctions == null) @@ -114,36 +99,5 @@ public class RhinoJavaScriptEngineManager extends AbstractScriptEngineManager { } - private static class AssetAndUrlModuleSourceProvider extends UrlModuleSourceProvider { - - private static final String MODULES_PATH = "modules"; - private android.content.Context mContext; - private List mModules; - private final URI mBaseURI = URI.create("file:///android_asset/modules"); - - public AssetAndUrlModuleSourceProvider(android.content.Context context, List list) { - super(list, null); - mContext = context; - try { - mModules = Arrays.asList(mContext.getAssets().list(MODULES_PATH)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - - @Override - protected ModuleSource loadFromPrivilegedLocations(String moduleId, Object validator) throws IOException, URISyntaxException { - String moduleIdWithExtension = moduleId; - if (!moduleIdWithExtension.endsWith(".js")) { - moduleIdWithExtension += ".js"; - } - if (mModules.contains(moduleIdWithExtension)) { - return new ModuleSource(new InputStreamReader(mContext.getAssets().open(MODULES_PATH + "/" + moduleIdWithExtension)), null, - URI.create(moduleIdWithExtension), mBaseURI, validator); - } - return super.loadFromPrivilegedLocations(moduleId, validator); - } - } } diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ExecutionConfig.java b/autojs/src/main/java/com/stardust/autojs/execution/ExecutionConfig.java index c5b36b5d..a6df56e8 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/ExecutionConfig.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/ExecutionConfig.java @@ -7,6 +7,7 @@ import java.io.Serializable; */ public class ExecutionConfig implements Serializable { + private String[] mRequirePath = new String[0]; private static final ExecutionConfig DEFAULT = new ExecutionConfig(); public static ExecutionConfig getDefault() { @@ -20,4 +21,12 @@ public class ExecutionConfig implements Serializable { return this; } + public ExecutionConfig requirePath(String... requirePath) { + mRequirePath = requirePath; + return this; + } + + public String[] getRequirePath() { + return mRequirePath; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java index 9a8e96bb..31fa90ea 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java @@ -3,6 +3,7 @@ package com.stardust.autojs.execution; import android.util.Log; import com.stardust.autojs.ScriptEngineService; +import com.stardust.autojs.engine.RhinoJavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.script.ScriptSource; @@ -53,6 +54,7 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu runtime.ensureAccessibilityServiceEnabled(); } engine.put("__runtime__", runtime); + engine.setTag("__require_path__", getConfig().getRequirePath()); engine.init(); } diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java index 5c1e2f73..371c856f 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java @@ -61,6 +61,7 @@ public class ScriptExecuteActivity extends Activity { private void prepare() { mScriptEngine.put("activity", this); mScriptEngine.put("__runtime__", execution.getRuntime()); + mScriptEngine.setTag("__require_path__", execution.getConfig().getRequirePath()); mScriptEngine.init(); }