diff --git a/app/build.gradle b/app/build.gradle
index 7bc80ffe..21302120 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 19
targetSdkVersion 23
- versionCode 118
- versionName "2.0.8Alpha"
+ versionCode 119
+ versionName "2.0.8 Beta"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
@@ -68,14 +68,13 @@ dependencies {
compile group: "pl.openrnd.android", name: "multi-level-listview", version: "1.0.1"
compile 'de.psdev.licensesdialog:licensesdialog:1.8.1'
compile 'io.mattcarroll.hover:hover:0.9.7'
- compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'
compile 'com.ashokvarma.android:bottom-navigation-bar:1.4.1'
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'
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.11'
+ compile 'com.github.hyb1996:EnhancedFloaty:0.12'
compile 'com.android.support:multidex:1.0.1'
compile(name: 'libtermexec-release', ext: 'aar')
compile(name: 'emulatorview-release', ext: 'aar')
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b69ce066..75bc3bac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -84,7 +84,7 @@
android:theme="@style/IssueReporterTheme"/>
-
+
diff --git a/app/src/main/assets/help/catalogue.json b/app/src/main/assets/help/catalogue.json
index 55a9d639..f14a7793 100644
--- a/app/src/main/assets/help/catalogue.json
+++ b/app/src/main/assets/help/catalogue.json
@@ -40,7 +40,7 @@
"path":"documentation"
},
{
- "title": "驻留模式与无障碍服务委托",
+ "title": "模块与第三方jar",
"type": "markdown",
"path":"documentation"
},
diff --git a/app/src/main/assets/help/documentation/模块与第三方jar.md b/app/src/main/assets/help/documentation/模块与第三方jar.md
new file mode 100644
index 00000000..251329fe
--- /dev/null
+++ b/app/src/main/assets/help/documentation/模块与第三方jar.md
@@ -0,0 +1,23 @@
+### loadJar(path)
+* path \ jar文件路径
+
+载入jar文件。之后改文件的所有类均可直接使用。这在使用第三方库时十分方便。
+
+### require(path)
+* path \ js文件的相对路径
+
+载入js文件并返回该模块。模块文件应该有module.exports语句指定模块的输出对象。
+
+例如test.js:
+```
+function sayHello(name){
+ print("Hello, " + name);
+}
+module.exports = sayHello;
+```
+同一个目录下的test_module.js:
+```
+var sayHello = require("test");
+sayHello("AutoJs");
+```
+运行这个脚本将在控制台输出"Hello, AutoJs"
\ No newline at end of file
diff --git a/app/src/main/assets/modules/ui.js b/app/src/main/assets/modules/ui.js
index ba2b627b..9c8f2059 100644
--- a/app/src/main/assets/modules/ui.js
+++ b/app/src/main/assets/modules/ui.js
@@ -14,20 +14,34 @@ gravity
weight
+var ui = {
+
+};
+
+ui.layout = function(xml){
+
+}
+
+
+
ui.layout(
-
-
+
+
);
+
+
+vat text = ui.asadsad;
+
-
+
diff --git a/app/src/main/assets/sample/JavaScript/HelloWorld.js b/app/src/main/assets/sample/JavaScript/HelloWorld.js
index 509a574d..d598500b 100644
--- a/app/src/main/assets/sample/JavaScript/HelloWorld.js
+++ b/app/src/main/assets/sample/JavaScript/HelloWorld.js
@@ -1,2 +1,3 @@
log("Hello world!!!");
+toast("Hello, AutoJs!");
openConsole();
\ 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..6a5b7d6c
--- /dev/null
+++ b/app/src/main/assets/sample/文件读写/写入文本文件.js
@@ -0,0 +1,10 @@
+//文件路径
+var path = "/sdcard/1.txt";
+//要写入的文件内容
+var text = "Hello, AutoJs";
+//以写入模式打开文件
+var file = open(path, "w");
+//写入文件
+file.write(text);
+//关闭文件
+file.close();
\ 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..be609c0c
--- /dev/null
+++ b/app/src/main/assets/sample/文件读写/文件编码转换(高级).js
@@ -0,0 +1,20 @@
+
+
+convert("/sdcard/1.txt", "utf-8", "/sdcard/2.txt", "gbk");
+
+/**
+ * fromFile: 源文件路径
+ * fromEncoding: 源文件编码
+ * toFile: 输出文件路径
+ * toEncoding: 输出文件编码
+ */
+function convert(fromFile, fromEncoding, toFile, toEncoding){
+ fromFile = open(fromFile, "r", fromEncoding);
+ toFile = open(toFile, "w", toEncoding);
+ while(true){
+ var line = fromFile.readline();
+ if(!line)
+ break;
+ toFile.writeline(line);
+ }
+}
\ 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..e49a7de2
--- /dev/null
+++ b/app/src/main/assets/sample/文件读写/文件编码转换.js
@@ -0,0 +1,13 @@
+//以UTF-8编码打开SD卡上的1.txt文件
+var in = open("/sdcard/1.txt", "r", "utf-8");
+//读取文件所有内容
+var text = in.read();
+//关闭文件
+in.close();
+//以gbk编码打开SD卡上的2.txt文件
+var out = open("/sdcard/2.txt", "w", "gbk");
+//写入内容
+out.write(text);
+//关闭文件
+out.close();
+
diff --git a/app/src/main/assets/sample/文件读写/读写文本文件.js b/app/src/main/assets/sample/文件读写/读写文本文件.js
new file mode 100644
index 00000000..5e9f65d5
--- /dev/null
+++ b/app/src/main/assets/sample/文件读写/读写文本文件.js
@@ -0,0 +1,37 @@
+//以写入模式打开SD卡根目录文件1.txt
+var file = open("/sdcard/1.txt", "w")
+//写入aaaa
+file.write("aaaa");
+//写入bbbbb后换行
+file.writeline("bbbbb");
+//写入ccc与ddd两行
+file.writelines(["ccc", "ddd"]);
+//关闭文件
+file.close();
+
+//以附加模式打开文件
+file = open("/sdcard/1.txt", "a");
+//附加一行"啦啦啦啦"
+file.writeline("啦啦啦啦");
+//附加一行"哈哈哈哈"
+file.writeline("哈哈哈哈");
+//附加两行ccc, ddd
+file.writelines(["ccc", "ddd"]);
+//输出缓冲区
+file.flush();
+//关闭文件
+file.close();
+
+
+//以读取模式打开文件
+file = open("/sdcard/test.txt", "r")
+//读取一行并打印
+print(file.readline());
+//读取剩余所有行并打印
+for each(line in file.readlines()){
+ print(line)
+}
+file.close()
+
+//显示控制台
+console.show()
\ 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..2f8e988e
--- /dev/null
+++ b/app/src/main/assets/sample/文件读写/读取文本文件.js
@@ -0,0 +1,11 @@
+//文件路径
+var path = "/sdcard/1.txt";
+//打开文件
+var file = open(path);
+//读取文件的所有内容
+var text = file.read();
+//打印到控制台
+print(text);
+//关闭文件
+file.close();
+console.show();
\ No newline at end of file
diff --git a/app/src/main/assets/sample/选择器/QQ空间点赞(不完美).js b/app/src/main/assets/sample/选择器/QQ空间点赞(不完美).js
new file mode 100644
index 00000000..41483d0e
--- /dev/null
+++ b/app/src/main/assets/sample/选择器/QQ空间点赞(不完美).js
@@ -0,0 +1,49 @@
+"auto";
+
+var 延迟 = 0;
+
+function 点赞(){
+ className("AbsListView").findOne()
+ .children().each(function(ss){
+ try{
+ var 一行 = 找到图标那一行(ss);
+ if(一行){
+ 一行.child(1).click();
+ if(延迟 > 0){
+ sleep(延迟);
+ }
+ }
+ }catch(e){}
+ });
+}
+
+
+function 找到图标那一行(s){
+ for(let i = 0; i < s.getChildCount(); i++){
+ var child = s.child(i);
+ if(child && child.className()
+ .endsWith("RelativeLayout") &&
+ child.getChildCount() >= 4){
+ if(是图片(child.child(1)) &&
+ 是图片(child.child(2)) &&
+ 是图片(child.child(3))){
+ return child;
+ }
+ }
+ }
+}
+
+function 是图片(item){
+ return item &&
+ item.className().endsWith("ImageView");
+}
+
+function 下滑(){
+ className("AbsListView").findOne()
+ .scrollForward();
+}
+
+while(true){
+ 点赞();
+ 下滑();
+}
\ 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..e8ff136b
--- /dev/null
+++ b/app/src/main/assets/sample/选择器/清空酷安动态.js
@@ -0,0 +1,25 @@
+"auto";
+
+//清空酷安动态
+//需要酷安客户端支持
+//务必谨慎使用!!!
+//by dazhang32552732
+toast("正在启动酷安");
+launch("com.coolapk.market");
+sleep(2000);
+while(!click("酷市场"));
+while(!click("我"));
+while(!click("动态"));
+toast("请注意,即将开始删除酷安动态,这将不可恢复,请谨慎操作!");
+sleep(3000);
+toast("操作将在十秒后自动进行,请谨慎操作!");
+sleep(5000);
+toast("操作将在五秒后自动进行,请谨慎操作!");
+sleep(5000);
+toast("操作开始!");
+while(true){
+ id("more_view").click();
+ while(!click("删除"));
+ while(!click("确定"));
+ sleep(1000);
+}
\ No newline at end of file
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 370c0a1b..070e0990 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
@@ -6,6 +6,7 @@ import android.os.Build;
import android.provider.Settings;
import com.stardust.scriptdroid.App;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.util.IntentUtil;
/**
@@ -14,7 +15,7 @@ import com.stardust.util.IntentUtil;
public class FloatingWindowManger {
- public static void showFloatingWindow() {
+ public static void showHoverMenu() {
if (!HoverMenuService.isServiceRunning()) {
if (!hasFloatingWindowPermission()) {
goToFloatingWindowPermissionSetting();
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/ConsoleFloaty.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/ConsoleFloaty.java
similarity index 74%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/ConsoleFloaty.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/ConsoleFloaty.java
index efc88cd0..a58dfff5 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/ConsoleFloaty.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/ConsoleFloaty.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window;
+package com.stardust.scriptdroid.external.floating_window.console;
import android.content.Context;
import android.content.ContextWrapper;
@@ -6,21 +6,28 @@ import android.support.annotation.Nullable;
import android.view.ContextThemeWrapper;
import android.view.View;
+import com.stardust.enhancedfloaty.ResizableExpandableFloaty;
+import com.stardust.enhancedfloaty.ResizableExpandableFloatyService;
import com.stardust.enhancedfloaty.ResizableFloaty;
import com.stardust.enhancedfloaty.ResizableFloatyService;
import com.stardust.scriptdroid.R;
+
/**
* Created by Stardust on 2017/4/20.
*/
-public class ConsoleFloaty extends ResizableFloaty {
+public class ConsoleFloaty extends ResizableExpandableFloaty {
private ContextWrapper mContextWrapper;
private View mResizer, mMoveCursor;
+ public ConsoleFloaty() {
+ setShouldRequestFocusWhenExpand(false);
+ }
+
@Override
- public View inflateCollapsedView(ResizableFloatyService service) {
+ public View inflateCollapsedView(ResizableExpandableFloatyService service) {
ensureContextWrapper(service);
return View.inflate(mContextWrapper, R.layout.floating_window_collapse, null);
}
@@ -32,28 +39,27 @@ public class ConsoleFloaty extends ResizableFloaty {
}
@Override
- public View inflateExpandedView(ResizableFloatyService service) {
+ public View inflateExpandedView(ResizableExpandableFloatyService service) {
ensureContextWrapper(service);
View view = View.inflate(mContextWrapper, R.layout.floating_console_expand, null);
setListeners(view, service);
return view;
}
- private void setListeners(final View view, final ResizableFloatyService service) {
+ private void setListeners(final View view, final ResizableExpandableFloatyService service) {
view.findViewById(R.id.close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
service.stopSelf();
- service.stopForeground(true);
}
});
view.findViewById(R.id.move_or_resize).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- if(mMoveCursor.getVisibility() == View.VISIBLE){
+ if (mMoveCursor.getVisibility() == View.VISIBLE) {
mMoveCursor.setVisibility(View.GONE);
mResizer.setVisibility(View.GONE);
- }else {
+ } else {
mMoveCursor.setVisibility(View.VISIBLE);
mResizer.setVisibility(View.VISIBLE);
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingConsole.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsole.java
similarity index 52%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingConsole.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsole.java
index 32832c84..e58baaf7 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/FloatingConsole.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsole.java
@@ -1,7 +1,8 @@
-package com.stardust.scriptdroid.external.floating_window;
+package com.stardust.scriptdroid.external.floating_window.console;
import android.content.Context;
+import com.stardust.enhancedfloaty.ResizableExpandableFloatyService;
import com.stardust.enhancedfloaty.ResizableFloatyService;
/**
@@ -11,6 +12,6 @@ import com.stardust.enhancedfloaty.ResizableFloatyService;
public class FloatingConsole {
public static void startFloatingService(Context context) {
- ResizableFloatyService.startService(context, new ConsoleFloaty());
+ ResizableExpandableFloatyService.startService(context, new ConsoleFloaty());
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleService.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleService.java
new file mode 100644
index 00000000..31b52789
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleService.java
@@ -0,0 +1,8 @@
+package com.stardust.scriptdroid.external.floating_window.console;
+
+/**
+ * Created by Stardust on 2017/4/30.
+ */
+
+public class FloatingConsoleService {
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleView.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleView.java
new file mode 100644
index 00000000..7a2e38d2
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/console/FloatingConsoleView.java
@@ -0,0 +1,40 @@
+package com.stardust.scriptdroid.external.floating_window.console;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import com.jraska.console.Console;
+import com.stardust.scriptdroid.R;
+
+/**
+ * Created by Stardust on 2017/4/30.
+ */
+
+public class FloatingConsoleView extends Console {
+ public FloatingConsoleView(Context context) {
+ super(context);
+ init();
+ }
+
+ public FloatingConsoleView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public FloatingConsoleView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ public FloatingConsoleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ private void init() {
+ findViewById(R.id.console_scroll_view).setBackground(getBackground());
+ ((TextView) findViewById(R.id.console_text)).setTextIsSelectable(true);
+ }
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuAdapter.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java
similarity index 95%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuAdapter.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java
index ad32b701..ff15d885 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuAdapter.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window;
+package com.stardust.scriptdroid.external.floating_window.menu;
import android.content.Context;
import android.content.res.Resources;
@@ -16,9 +16,9 @@ import android.util.TypedValue;
import android.view.View;
import com.stardust.scriptdroid.R;
-import com.stardust.scriptdroid.external.floating_window.content.MainMenuNavigatorContent;
-import com.stardust.scriptdroid.external.floating_window.content.RecordNavigatorContent;
-import com.stardust.scriptdroid.external.floating_window.content.ScriptListNavigatorContent;
+import com.stardust.scriptdroid.external.floating_window.menu.content.MainMenuNavigatorContent;
+import com.stardust.scriptdroid.external.floating_window.menu.content.RecordNavigatorContent;
+import com.stardust.scriptdroid.external.floating_window.menu.content.ScriptListNavigatorContent;
import com.stardust.theme.ThemeColorManagerCompat;
import java.util.ArrayList;
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuService.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java
similarity index 96%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuService.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java
index 872a9e3e..090cd628 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/HoverMenuService.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window;
+package com.stardust.scriptdroid.external.floating_window.menu;
import android.app.Service;
@@ -17,9 +17,9 @@ import com.stardust.hover.SimpleHoverMenuTransitionListener;
import com.stardust.hover.WindowHoverMenu;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
-import com.stardust.scriptdroid.external.floating_window.view.FloatingLayoutBoundsView;
-import com.stardust.scriptdroid.external.floating_window.view.FloatingLayoutHierarchyView;
-import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
+import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger;
+import com.stardust.scriptdroid.external.floating_window.menu.view.FloatingLayoutBoundsView;
+import com.stardust.scriptdroid.external.floating_window.menu.view.FloatingLayoutHierarchyView;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.theme.ThemeColorManagerCompat;
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/MainMenuNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java
similarity index 94%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/MainMenuNavigatorContent.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java
index 86805612..1c43ea46 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/MainMenuNavigatorContent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window.content;
+package com.stardust.scriptdroid.external.floating_window.menu.content;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -11,9 +11,7 @@ import android.widget.Toast;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
-import com.stardust.view.accessibility.AccessibilityInfoProvider;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
-import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.util.ClipboardUtil;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.MessageEvent;
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/RecordNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java
similarity index 97%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/RecordNavigatorContent.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java
index 1ca65178..54192205 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/RecordNavigatorContent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window.content;
+package com.stardust.scriptdroid.external.floating_window.menu.content;
import android.content.Context;
import android.support.annotation.NonNull;
@@ -14,7 +14,7 @@ import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.accessibility.AccessibilityEventHelper;
import com.stardust.scriptdroid.autojs.AutoJs;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.record.inputevent.InputEventConverter;
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java
similarity index 96%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java
index 0e74d55c..10dea940 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java
@@ -1,4 +1,4 @@
-package com.stardust.scriptdroid.external.floating_window.content;
+package com.stardust.scriptdroid.external.floating_window.menu.content;
import android.content.Context;
import android.support.annotation.NonNull;
@@ -10,7 +10,7 @@ import android.view.ViewGroup;
import com.stardust.autojs.script.FileScriptSource;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.scripts.StorageScriptProvider;
import com.stardust.scriptdroid.ui.edit.EditActivity;
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutBoundsView.java
similarity index 91%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutBoundsView.java
index 36a6f02b..29bc4ce8 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutBoundsView.java
@@ -1,21 +1,18 @@
-package com.stardust.scriptdroid.external.floating_window.view;
+package com.stardust.scriptdroid.external.floating_window.menu.view;
import android.content.Context;
-import android.graphics.Color;
import android.view.KeyEvent;
import android.view.WindowManager;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.layout_inspector.view.LayoutBoundsView;
import com.stardust.scriptdroid.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.util.MessageEvent;
-import org.greenrobot.eventbus.EventBus;
-
/**
* Created by Stardust on 2017/3/12.
*/
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutHierarchyView.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutHierarchyView.java
similarity index 88%
rename from app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutHierarchyView.java
rename to app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutHierarchyView.java
index b6f241c3..36d7ca23 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutHierarchyView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/view/FloatingLayoutHierarchyView.java
@@ -1,24 +1,18 @@
-package com.stardust.scriptdroid.external.floating_window.view;
+package com.stardust.scriptdroid.external.floating_window.menu.view;
import android.content.Context;
-import android.content.DialogInterface;
-import android.util.Log;
import android.view.KeyEvent;
-import android.view.View;
import android.view.WindowManager;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
-import com.stardust.scriptdroid.R;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.layout_inspector.view.LayoutHierarchyView;
import com.stardust.scriptdroid.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.util.MessageEvent;
-import org.greenrobot.eventbus.EventBus;
-
/**
* Created by Stardust on 2017/3/12.
*/
diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java
index 94f08d07..f4b6e0b8 100644
--- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java
@@ -16,6 +16,8 @@ import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.util.ViewUtil;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
/**
@@ -99,33 +101,31 @@ public class LayoutBoundsView extends View {
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && mRootNode != null) {
- NodeInfo nodeInfo = findNodeAt(mRootNode, (int) event.getRawX(), (int) event.getRawY());
- onNodeInfoClick(nodeInfo);
+ ArrayList list = new ArrayList<>();
+ findNodeAt(mRootNode, (int) event.getRawX(), (int) event.getRawY(), list);
+ showNodeInfoList(list);
}
return super.onTouchEvent(event);
}
+ private void showNodeInfoList(ArrayList list) {
+ onNodeInfoClick(list.get(list.size() - 1));
+ }
+
private void onNodeInfoClick(NodeInfo nodeInfo) {
if (mOnNodeInfoSelectListener != null) {
mOnNodeInfoSelectListener.onNodeSelect(nodeInfo);
}
}
- private List findNodeAt(NodeInfo node, int x, int y) {
- List list = null;
+ private void findNodeAt(NodeInfo node, int x, int y, List list) {
for (NodeInfo child : node.getChildren()) {
if (child != null && child.getBoundsInScreen().contains(x, y)) {
- if (list == null)
- list = findNodeAt(child, x, y);
- else
- list.addAll(findNodeAt(child, x, y));
+ list.add(child);
+ findNodeAt(child, x, y, list);
}
}
- if (list == null)
- list = new ArrayList<>();
- list.add(node);
- return list;
}
}
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 7d6f32a1..998e501e 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
@@ -7,8 +7,6 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuItem;
@@ -22,16 +20,11 @@ import com.jecelyin.editor.v2.core.widget.TextView;
import com.jecelyin.editor.v2.ui.EditorDelegate;
import com.jecelyin.editor.v2.view.EditorView;
import com.jecelyin.editor.v2.view.menu.MenuDef;
-import com.stardust.autojs.ScriptExecutionListener;
-import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.script.FileScriptSource;
import com.stardust.autojs.script.JsBeautifier;
-import com.stardust.autojs.script.ScriptSource;
import com.stardust.autojs.script.StringScriptSource;
-import com.stardust.scriptdroid.App;
-import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
-import com.stardust.scriptdroid.autojs.AutoJs;
+import com.stardust.scriptdroid.external.floating_window.console.FloatingConsole;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.tool.JsBeautifierFactory;
import com.stardust.scriptdroid.tool.MaterialDialogFactory;
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 f9ed6e22..da9caea3 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
@@ -11,7 +11,7 @@ import android.view.ViewGroup;
import com.stardust.app.Fragment;
import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.view.ViewBinding;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.console.ConsoleActivity;
@@ -98,7 +98,7 @@ public class EditSideMenuFragment extends Fragment {
@ViewBinding.Check(R.id.sw_floating_window)
private void setFloatingWindowEnable(boolean enable) {
if (enable && !FloatingWindowManger.isFloatingWindowShowing()) {
- FloatingWindowManger.showFloatingWindow();
+ FloatingWindowManger.showHoverMenu();
} else if (!enable && FloatingWindowManger.isFloatingWindowShowing()) {
FloatingWindowManger.hideFloatingWindow();
}
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 1539f4d2..8bd92dfe 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
@@ -11,11 +11,10 @@ import android.view.View;
import android.view.ViewGroup;
import com.stardust.app.Fragment;
-import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger;
-import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
+import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.console.ConsoleActivity;
@@ -110,7 +109,7 @@ public class SlideMenuFragment extends Fragment {
@ViewBinding.Check(R.id.sw_floating_window)
private void setFloatingWindowEnable(boolean enable) {
if (enable && !FloatingWindowManger.isFloatingWindowShowing()) {
- FloatingWindowManger.showFloatingWindow();
+ FloatingWindowManger.showHoverMenu();
} else if (!enable && FloatingWindowManger.isFloatingWindowShowing()) {
FloatingWindowManger.hideFloatingWindow();
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java
index 2d5b9986..47953887 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java
@@ -1,10 +1,9 @@
package com.stardust.scriptdroid.ui.main.operation;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
-import android.support.design.widget.Snackbar;
-import com.squareup.haha.perflib.Main;
import com.stardust.autojs.ScriptExecutionListener;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.script.FileScriptSource;
@@ -19,9 +18,7 @@ import com.stardust.scriptdroid.external.shortcut.ShortcutActivity;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.scripts.sample.Sample;
import com.stardust.scriptdroid.ui.edit.EditActivity;
-import com.stardust.scriptdroid.ui.main.MainActivity;
-
-import java.io.IOException;
+import com.stardust.util.AssetsCache;
/**
* Created by Stardust on 2017/1/23.
@@ -77,6 +74,10 @@ public abstract class ScriptFileOperation {
AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(file));
}
+ public static void run(Context context, Sample file) {
+ AutoJs.getInstance().getScriptEngineService().execute(new StringScriptSource(file.name, AssetsCache.get(context.getAssets(), file.path)));
+ }
+
public static void runOnEditView(ScriptSource scriptSource) {
AutoJs.getInstance().getScriptEngineService().execute(scriptSource, SCRIPT_EXECUTION_LISTENER);
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java
index f750c9b1..4e937a66 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java
@@ -14,6 +14,7 @@ import com.stardust.scriptdroid.scripts.sample.Sample;
import com.stardust.scriptdroid.scripts.sample.SampleFileManager;
import com.stardust.scriptdroid.ui.edit.ViewSampleActivity;
import com.stardust.scriptdroid.ui.main.MainActivity;
+import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation;
import java.io.IOException;
@@ -53,11 +54,15 @@ public class SampleScriptListFragment extends Fragment {
private void showMenuDialog(final Sample sample) {
new MaterialDialog.Builder(getActivity())
.title(sample.name)
- .items(getString(R.string.text_copy_to_my_scripts))
+ .items(getString(R.string.text_run), getString(R.string.text_copy_to_my_scripts))
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {
- copySampleToMyScripts(sample);
+ if (position == 0) {
+ ScriptFileOperation.run(getActivity(), sample);
+ } else {
+ copySampleToMyScripts(sample);
+ }
}
})
@@ -66,13 +71,6 @@ public class SampleScriptListFragment extends Fragment {
private void copySampleToMyScripts(Sample sample) {
MainActivity.importSample(getActivity(), sample);
- try {
- ((MainActivity) getActivity()).getMyScriptListFragment().
- importFile(sample.name, getActivity().getAssets().open(sample.path));
- } catch (IOException e) {
- e.printStackTrace();
- Snackbar.make(mSampleScriptListRecyclerView, R.string.text_import_fail, Snackbar.LENGTH_SHORT).show();
- }
}
private void viewSample(Sample sample) {
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java
index ca00dafe..626cedd3 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java
@@ -28,6 +28,9 @@ import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
import org.greenrobot.eventbus.Subscribe;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
/**
* Created by Stardust on 2017/3/27.
*/
@@ -131,6 +134,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
private StorageScriptProvider mStorageScriptProvider;
private FileProcessListener mFileProcessListener;
private boolean mScriptFileOperationEnabled = true;
+ private Executor mFileListingExecutor = Executors.newSingleThreadExecutor();
public ScriptAndFolderListRecyclerView(Context context) {
super(context);
@@ -153,7 +157,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
if (mFileProcessListener != null) {
mFileProcessListener.onFilesListing();
}
- new Thread(new Runnable() {
+ mFileListingExecutor.execute(new Runnable() {
@Override
public void run() {
final ScriptFile[] scriptFiles = mStorageScriptProvider.getDirectoryScriptFiles(directory);
@@ -163,10 +167,11 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
mAdapter.setScripts(scriptFiles);
if (mFileProcessListener != null)
mFileProcessListener.onFileListed();
+ smoothScrollToPosition(0);
}
});
}
- }).start();
+ });
}
public void setCurrentDirectory(final ScriptFile directory) {
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java
index a3e4a901..3f18849d 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java
@@ -1,6 +1,7 @@
package com.stardust.scriptdroid.ui.main.task;
import android.content.Context;
+import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -75,19 +76,24 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Java
setAdapter(mAdapter);
}
- private void updateEngineList() {
+ public void updateEngineList() {
mScriptEngines.clear();
mScriptEngines.addAll(ScriptEngineService.getInstance().getEngines());
+ mAdapter.notifyDataSetChanged();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- updateEngineList();
- mAdapter.notifyDataSetChanged();
ScriptEngineService.getInstance().registerEngineLifecycleCallback(this);
}
+ @Override
+ protected void onWindowVisibilityChanged(int visibility) {
+ super.onWindowVisibilityChanged(visibility);
+ updateEngineList();
+ }
+
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
index 334bfd29..68b99fa3 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
@@ -2,6 +2,7 @@ package com.stardust.scriptdroid.ui.main.task;
import android.os.Bundle;
import android.support.annotation.Nullable;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
@@ -56,6 +57,19 @@ public class TaskManagerFragment extends Fragment {
}
});
+ final SwipeRefreshLayout swipeRefreshLayout = $(R.id.swipe_refresh_layout);
+ swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ mTaskListRecyclerView.updateEngineList();
+ mTaskListRecyclerView.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ swipeRefreshLayout.setRefreshing(false);
+ }
+ }, 800);
+ }
+ });
}
@ViewBinding.Click(R.id.close_all)
diff --git a/app/src/main/res/drawable/ic_remove_white_24dp.png b/app/src/main/res/drawable/ic_remove_white_24dp.png
new file mode 100644
index 00000000..d28b7118
Binary files /dev/null and b/app/src/main/res/drawable/ic_remove_white_24dp.png differ
diff --git a/app/src/main/res/layout/floating_console_expand.xml b/app/src/main/res/layout/floating_console_expand.xml
index 53e000ac..ed66f5ef 100644
--- a/app/src/main/res/layout/floating_console_expand.xml
+++ b/app/src/main/res/layout/floating_console_expand.xml
@@ -8,12 +8,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="12dp"
- android:background="@drawable/floating_console_bg_bottom"
android:orientation="vertical">
+ app:title="@string/text_console">
+
+
-
diff --git a/app/src/main/res/layout/fragment_task_manager.xml b/app/src/main/res/layout/fragment_task_manager.xml
index a0fb7c68..753ab3c5 100644
--- a/app/src/main/res/layout/fragment_task_manager.xml
+++ b/app/src/main/res/layout/fragment_task_manager.xml
@@ -36,10 +36,18 @@
android:textSize="16sp"/>
-
+ android:layout_height="match_parent">
+
+
+
+
+
保护模式
在本软件界面无法运行自动操作命令以免误触
key_guard_mode
+ 控制台悬浮窗
- 无
diff --git a/app/src/test/java/com/stardust/scriptdroid/ExampleUnitTest.java b/app/src/test/java/com/stardust/scriptdroid/ExampleUnitTest.java
index 9dae6380..a505a8fb 100644
--- a/app/src/test/java/com/stardust/scriptdroid/ExampleUnitTest.java
+++ b/app/src/test/java/com/stardust/scriptdroid/ExampleUnitTest.java
@@ -16,9 +16,9 @@ import static org.junit.Assert.assertTrue;
*/
public class ExampleUnitTest {
// TODO: 2017/3/3 自定义函数
- // TODO: 2017/3/19 exist函数
- // TODO: 2017/3/23 tasker插件
- // TODO: 2017/3/23 任务管理与控制台
+ // TODO: 2017/3/19 exist函数 √
+ // TODO: 2017/3/23 tasker插件 √
+ // TODO: 2017/3/23 任务管理与控制台 √
// TODO: 2017/3/23 悬浮窗加入控制台
// TODO: 2017/3/24 文件读写api
// TODO: 2017/3/24 网络读写api
diff --git a/autojs/build.gradle b/autojs/build.gradle
index 0e6e69d8..0af75243 100644
--- a/autojs/build.gradle
+++ b/autojs/build.gradle
@@ -33,6 +33,7 @@ dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.3.0'
compile 'com.github.hyb1996:node-android-lib:1.0.14'
+ compile 'org.greenrobot:eventbus:3.0.0'
compile project(path: ':common')
compile project(path: ':automator')
}
diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
index 49f1dbaf..92e8563b 100644
--- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
+++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
@@ -6,9 +6,14 @@ 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.runtime.ScriptInterrupptedException;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.script.ScriptSource;
+import com.stardust.lang.ThreadCompat;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
import java.text.DateFormat;
import java.util.Arrays;
@@ -23,6 +28,7 @@ import java.util.Set;
public class ScriptEngineService {
private static final String LOG_TAG = "ScriptEngineService";
+ private static final EventBus EVENT_BUS = new EventBus();
private static ScriptEngineService instance;
public static ScriptEngineService getInstance() {
@@ -33,27 +39,26 @@ public class ScriptEngineService {
instance = service;
}
+ private static final ScriptExecutionListener DEFAULT_LISTENER = new SimpleScriptExecutionListener() {
+ @Override
+ public void onStart(JavaScriptEngine engine, ScriptSource source) {
+ EVENT_BUS.post(new ScriptExecutionEvent(ScriptExecutionEvent.ON_START, source.toString()));
+ }
+
+ @Override
+ public void onException(JavaScriptEngine engine, ScriptSource source, Exception e) {
+ if (!causedByInterrupted(e)) {
+ EVENT_BUS.post(new ScriptExecutionEvent(ScriptExecutionEvent.ON_EXCEPTION, e.getMessage()));
+ }
+ }
+ };
+
+
private final ScriptRuntime mRuntime;
private final Context mContext;
private final Console mConsole;
private final JavaScriptEngineManager mJavaScriptEngineManager;
private final EngineLifecycleObserver mEngineLifecycleObserver = new EngineLifecycleObserver();
- private final ScriptExecutionListener mDefaultListener = new SimpleScriptExecutionListener() {
-
- @Override
- public void onStart(JavaScriptEngine engine, ScriptSource source) {
- mConsole.v(DateFormat.getTimeInstance().format(new Date()) + " " + mContext.getString(R.string.text_start_running) + " " + source);
- }
-
- @Override
- public void onException(JavaScriptEngine engine, ScriptSource source, Exception e) {
- if (!causedByInterruptedException(e)) {
- mRuntime.toast(mContext.getString(R.string.text_error) + ": " + e.getMessage());
- mConsole.e(e.getMessage());
- }
- }
-
- };
ScriptEngineService(ScriptEngineServiceBuilder builder) {
mRuntime = builder.mRuntime;
@@ -61,6 +66,7 @@ public class ScriptEngineService {
mJavaScriptEngineManager = builder.mJavaScriptEngineManager;
mConsole = builder.mConsole;
mJavaScriptEngineManager.setEngineLifecycleCallback(mEngineLifecycleObserver);
+ EVENT_BUS.register(this);
}
public ScriptRuntime getRuntime() {
@@ -72,12 +78,12 @@ public class ScriptEngineService {
}
public ScriptExecutionListener getDefaultListener() {
- return mDefaultListener;
+ return DEFAULT_LISTENER;
}
public JavaScriptEngine createScriptEngine() {
JavaScriptEngine engine = mJavaScriptEngineManager.createEngine();
- Log.i(LOG_TAG, Arrays.toString(Thread.currentThread().getStackTrace()));
+ Log.d(LOG_TAG, Arrays.toString(Thread.currentThread().getStackTrace()));
return engine;
}
@@ -89,18 +95,12 @@ public class ScriptEngineService {
mEngineLifecycleObserver.unregisterCallback(engineLifecycleCallback);
}
- public static boolean causedByInterruptedException(Throwable e) {
- while (e != null) {
- if (e instanceof InterruptedException) {
- return true;
- }
- e = e.getCause();
- }
- return false;
+ public static boolean causedByInterrupted(Throwable e) {
+ return e.getCause() instanceof ScriptInterrupptedException;
}
public ScriptExecution execute(ScriptExecutionTask task) {
- ScriptExecutionListener listener = task.getExecutionListenerOrDefault(mDefaultListener);
+ ScriptExecutionListener listener = task.getExecutionListenerOrDefault(DEFAULT_LISTENER);
ScriptSource source = task.getSource();
int mode = source.getExecutionMode();
if ((mode & ScriptSource.EXECUTION_MODE_UI) != 0) {
@@ -109,7 +109,7 @@ public class ScriptEngineService {
} else {
RunnableScriptExecution scriptExecution = new RunnableScriptExecution(source, listener, task.getConfig());
if (task.getConfig().runInNewThread) {
- new Thread(scriptExecution).start();
+ new ThreadCompat(scriptExecution).start();
} else {
scriptExecution.run();
}
@@ -126,7 +126,17 @@ public class ScriptEngineService {
}
public ScriptExecution execute(ScriptSource source) {
- return execute(source, mDefaultListener, ExecutionConfig.getDefault());
+ return execute(source, DEFAULT_LISTENER, ExecutionConfig.getDefault());
+ }
+
+ @Subscribe
+ public void onScriptExecution(ScriptExecutionEvent event) {
+ if (event.getCode() == ScriptExecutionEvent.ON_START) {
+ mConsole.v(DateFormat.getTimeInstance().format(new Date()) + " " + mContext.getString(R.string.text_start_running) + " " + event.getMessage());
+ } else if (event.getCode() == ScriptExecutionEvent.ON_EXCEPTION) {
+ mRuntime.toast(mContext.getString(R.string.text_error) + ": " + event.getMessage());
+ mConsole.e(event.getMessage());
+ }
}
public int stopAll() {
@@ -209,4 +219,28 @@ public class ScriptEngineService {
}
}
}
+
+
+ private static class ScriptExecutionEvent {
+
+ static final int ON_START = "Eating...".hashCode();
+ static final int ON_SUCCESS = "I...lov...".hashCode();
+ static final int ON_EXCEPTION = "...Sorry...I should not have said it...".hashCode();
+
+ private final int mCode;
+ private final String mMessage;
+
+ ScriptExecutionEvent(int code, String message) {
+ mCode = code;
+ mMessage = message;
+ }
+
+ public int getCode() {
+ return mCode;
+ }
+
+ public String getMessage() {
+ return mMessage;
+ }
+ }
}
diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java b/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java
index 32f58756..708ae267 100644
--- a/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java
+++ b/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java
@@ -1,5 +1,7 @@
package com.stardust.autojs;
+import android.util.Log;
+
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.script.ScriptSource;
@@ -12,6 +14,8 @@ import java.io.Serializable;
public class ScriptExecutionTask implements Serializable {
+ private static final String TAG = "ScriptExecutionTask";
+
private ScriptSource mScriptSource;
private ScriptExecutionListener mExecutionListener;
private ExecutionConfig mExecutionConfig;
@@ -43,8 +47,10 @@ public class ScriptExecutionTask implements Serializable {
engine.setTag("script", mScriptSource);
mExecutionListener.onSuccess(engine, mScriptSource, engine.execute(mScriptSource));
} catch (Exception e) {
+ e.printStackTrace();
mExecutionListener.onException(engine, mScriptSource, e);
} finally {
+ Log.d(TAG, "Engine destroy");
engine.destroy();
}
}
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 cc730d8a..5eced342 100644
--- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java
+++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java
@@ -5,6 +5,7 @@ import android.util.Log;
import com.stardust.autojs.rhino_android.AndroidContextFactory;
import com.stardust.autojs.rhino_android.RhinoAndroidHelper;
+import com.stardust.autojs.runtime.ScriptInterrupptedException;
import com.stardust.autojs.runtime.ScriptStopException;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
@@ -59,6 +60,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine {
@Override
public void forceStop() {
+ Log.d(LOG_TAG, "forceStop: interrupt Thread: " + mThread);
mThread.interrupt();
}
@@ -68,6 +70,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine {
@Override
public synchronized void destroy() {
+ Log.d(LOG_TAG, "on destroy");
Context.exit();
// TODO: 2017/4/6 XXX :在这里回收内存池并不好
final AccessibilityNodeInfoAllocator allocator = (AccessibilityNodeInfoAllocator) getTag("allocator");
@@ -138,7 +141,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine {
protected void observeInstructionCount(Context cx, int instructionCount) {
if (Thread.currentThread().isInterrupted()) {
Context.exit();
- throw new ScriptStopException(new InterruptedException());
+ throw new ScriptInterrupptedException();
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/rhino_android/AndroidContextFactory.java b/autojs/src/main/java/com/stardust/autojs/rhino_android/AndroidContextFactory.java
index d2b0dfed..26afb9e1 100644
--- a/autojs/src/main/java/com/stardust/autojs/rhino_android/AndroidContextFactory.java
+++ b/autojs/src/main/java/com/stardust/autojs/rhino_android/AndroidContextFactory.java
@@ -1,6 +1,7 @@
package com.stardust.autojs.rhino_android;
+import com.stardust.autojs.runtime.ScriptInterrupptedException;
import com.stardust.autojs.runtime.ScriptStopException;
import org.mozilla.javascript.Context;
@@ -39,7 +40,7 @@ public class AndroidContextFactory extends ContextFactory {
@Override
protected void observeInstructionCount(Context cx, int instructionCount) {
if (Thread.currentThread().isInterrupted()) {
- throw new ScriptStopException(new InterruptedException());
+ throw new ScriptInterrupptedException();
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptInterrupptedException.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptInterrupptedException.java
new file mode 100644
index 00000000..947cc741
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptInterrupptedException.java
@@ -0,0 +1,10 @@
+package com.stardust.autojs.runtime;
+
+/**
+ * Created by Stardust on 2017/4/30.
+ */
+
+public class ScriptInterrupptedException extends ScriptStopException {
+
+
+}
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 567fe4f5..58e79558 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java
@@ -78,7 +78,7 @@ public class ScriptRuntime {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
- throw new ScriptStopException(e);
+ throw new ScriptInterrupptedException();
}
}
@@ -142,10 +142,6 @@ public class ScriptRuntime {
Thread.interrupted();
}
- public void stoppedByInterrupted(InterruptedException e) {
- throw new ScriptStopException(e);
- }
-
public void ensureAccessibilityServiceEnabled() {
mAccessibilityBridge.ensureServiceEnabled();
}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/InjectableWebClient.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/InjectableWebClient.java
index 61e64047..361c00b4 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/api/InjectableWebClient.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/InjectableWebClient.java
@@ -10,6 +10,7 @@ import android.webkit.WebView;
import android.webkit.WebViewClient;
+import com.stardust.autojs.runtime.ScriptInterrupptedException;
import com.stardust.autojs.runtime.ScriptStopException;
import org.mozilla.javascript.Context;
@@ -107,7 +108,7 @@ public class InjectableWebClient extends WebViewClient {
try {
ScriptBridge.this.wait();
} catch (InterruptedException e) {
- throw new ScriptStopException(e);
+ throw new ScriptInterrupptedException();
}
}
return result.toString();
@@ -131,7 +132,7 @@ public class InjectableWebClient extends WebViewClient {
try {
this.wait();
} catch (InterruptedException e) {
- throw new ScriptStopException(e);
+ throw new ScriptInterrupptedException();
}
}
return result;
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java
index 2f8c7ae3..f23a5c1a 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java
@@ -8,6 +8,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.AccessibilityBridge;
import com.stardust.autojs.runtime.JavascriptInterface;
+import com.stardust.autojs.runtime.ScriptInterrupptedException;
import com.stardust.autojs.runtime.ScriptStopException;
import com.stardust.automator.AccessibilityEventCommandHost;
import com.stardust.automator.ActionArgument;
@@ -118,7 +119,7 @@ public class UiSelector extends UiGlobalSelector {
do {
if (Thread.currentThread().isInterrupted()) {
Log.d(TAG, "Thread isInterrupted");
- throw new ScriptStopException(new InterruptedException());
+ throw new ScriptInterrupptedException();
}
uiObjectCollection = find();
} while (uiObjectCollection == null || uiObjectCollection.size() == 0);
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java
index 086b09d6..81881e47 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java
@@ -189,7 +189,7 @@ public class SimpleActionAutomator {
private boolean performAction(SimpleAction simpleAction) {
ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
- Log.i(TAG, "performAction: running package is self. return false");
+ Log.d(TAG, "performAction: running package is self. return false");
return false;
}
AccessibilityService service = mAccessibilityBridge.getService();
@@ -200,7 +200,7 @@ public class SimpleActionAutomator {
return false;
AccessibilityNodeInfoAllocator allocator = new AccessibilityNodeInfoAllocator();
simpleAction.setAllocator(allocator);
- Log.i("Automator", "performAction: " + simpleAction + " root = " + root);
+ Log.v(TAG, "performAction: " + simpleAction + " root = " + root);
boolean result = simpleAction.perform(root);
allocator.recycleAll();
return result;
diff --git a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNodeInfoAllocator.java b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNodeInfoAllocator.java
index d05b9d6d..a423ad07 100644
--- a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNodeInfoAllocator.java
+++ b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNodeInfoAllocator.java
@@ -102,7 +102,7 @@ public class AccessibilityNodeInfoAllocator {
} catch (IllegalStateException ignored) {
}
}
- Log.i(TAG, "Total: " + size + " Not recycled: " + notRecycledCount);
+ Log.v(TAG, "Total: " + size + " Not recycled: " + notRecycledCount);
return notRecycledCount;
}
@@ -127,7 +127,12 @@ public class AccessibilityNodeInfoAllocator {
public static void recycleList(AccessibilityNodeInfo root, List list) {
for (AccessibilityNodeInfo nodeInfo : list) {
if (nodeInfo != root) {
- nodeInfo.recycle();
+ try {
+ nodeInfo.recycle();
+ }catch (IllegalStateException e){
+ // FIXME: 2017/4/30
+ e.printStackTrace();
+ }
}
}
}
diff --git a/common/src/main/java/com/stardust/lang/ThreadCompat.java b/common/src/main/java/com/stardust/lang/ThreadCompat.java
new file mode 100644
index 00000000..c6e97dd5
--- /dev/null
+++ b/common/src/main/java/com/stardust/lang/ThreadCompat.java
@@ -0,0 +1,81 @@
+package com.stardust.lang;
+
+import java.lang.ref.WeakReference;
+import java.util.Hashtable;
+import java.util.WeakHashMap;
+
+/**
+ * Created by Stardust on 2017/4/30.
+ */
+
+public class ThreadCompat extends Thread {
+
+ private static volatile WeakHashMap interruptStatus = new WeakHashMap<>();
+
+ public ThreadCompat() {
+ init();
+ }
+
+ private void init() {
+ interruptStatus.put(this, false);
+ }
+
+ public ThreadCompat(Runnable target) {
+ super(target);
+ init();
+ }
+
+ public ThreadCompat(ThreadGroup group, Runnable target) {
+ super(group, target);
+ init();
+ }
+
+ public ThreadCompat(String name) {
+ super(name);
+ init();
+ }
+
+ public ThreadCompat(ThreadGroup group, String name) {
+ super(group, name);
+ init();
+ }
+
+ public ThreadCompat(Runnable target, String name) {
+ super(target, name);
+ init();
+ }
+
+ public ThreadCompat(ThreadGroup group, Runnable target, String name) {
+ super(group, target, name);
+ init();
+ }
+
+ public ThreadCompat(ThreadGroup group, Runnable target, String name, long stackSize) {
+ super(group, target, name, stackSize);
+ init();
+ }
+
+ @Override
+ public void run() {
+ try {
+ super.run();
+ interruptStatus.remove(this);
+ } catch (Throwable e) {
+ interruptStatus.remove(this);
+ throw e;
+ }
+ }
+
+ @Override
+ public boolean isInterrupted() {
+ Boolean isInterrupted = interruptStatus.get(this);
+ return super.isInterrupted() || isInterrupted == null || isInterrupted;
+ }
+
+ @Override
+ public void interrupt() {
+ super.interrupt();
+ interruptStatus.remove(this);
+ }
+
+}