From 73773faedc8b9016df1512794a98149ab0b74b72 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sun, 16 Jul 2017 10:19:07 +0800
Subject: [PATCH 1/5] fix fucking accessibility service
---
app/build.gradle | 4 +-
.../assets/sample/QQ与微信/QQ加群成员脚本.js | 51 ++++++++++------
.../assets/sample/QQ与微信/QQ名片点赞脚本.js | 6 +-
.../QQ与微信/QQ名片点赞(只点赞好友).js | 21 +++++++
.../assets/sample/QQ与微信/QQ点赞群成员.js | 60 ++++++++++++-------
.../floatingwindow/HoverMenuManger.java | 7 ++-
.../floatingwindow/menu/HoverMenuService.java | 8 ++-
.../content/MainMenuNavigatorContent.java | 7 ++-
.../layout_inspector/LayoutInspector.java | 13 ++++
app/src/main/res/values/strings.xml | 1 +
.../res/xml/accessibility_service_config.xml | 4 +-
.../accessibility/AccessibilityService.java | 46 ++++++++------
.../accessibility/LayoutInspectService.java | 27 +++++++++
13 files changed, 186 insertions(+), 69 deletions(-)
create mode 100644 app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
create mode 100644 automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
diff --git a/app/build.gradle b/app/build.gradle
index d71b6250..e00b7437 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 17
targetSdkVersion 23
- versionCode 147
- versionName "2.0.14 Beta"
+ versionCode 148
+ versionName "2.0.14 Alpha"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
diff --git a/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js b/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
index c9844a72..d4db1561 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ加群成员脚本.js
@@ -3,27 +3,30 @@
var 好友验证信息 = "AutoJs自动添加群好友";
var 延迟 = 500;
-toast("请打开群成员列表");
+launchApp("QQ");
+toast("请打开要加的群");
+sleep(500);
+if(currentActivity() != "com.tencent.mobileqq.activity.TroopMemberListActivity"){
+ openGroupMemberList();
+}
var added = {};
while(true){
- var list = className("AbsListView").findOne();
- list.children().each(function(child){
- if(child.className() != "android.widget.FrameLayout"){
- return;
- }
- if(!isGroupMember(child)){
- return;
- }
- if(isMyself(child)){
- return;
- }
- child.child(0).click();
- sleep(500);
- addAsFriend();
- sleep(延迟);
- });
- className("AbsListView").findOne().scrollForward();
+ var list = className("AbsListView").findOne();
+ var count = list.childCount();
+ for(var i = 0; i < count; i++){
+ var child = list.child(i);
+ if(!child || child.className() != "android.widget.FrameLayout"){
+ continue;
+ }
+ if(!isGroupMember(child) || isMyself(child)){
+ continue;
+ }
+ child.child(0).click();
+ sleep(500);
+ addAsFriend();
+ sleep(延迟);
+ }
}
@@ -31,6 +34,9 @@ function isGroupMember(child){
if(child.childCount() != 1){
return false;
}
+ if(!child.findByText("Baby Q").isEmpty()){
+ return false;
+ }
return child.child(0) && child.child(0).className() == "android.widget.FrameLayout";
}
@@ -41,6 +47,7 @@ function isMyself(child){
function addAsFriend(){
var qq = getQQ();
+ toast(qq);
if(added[qq]){
while(!click("返回"));
return;
@@ -63,4 +70,12 @@ function addAsFriend(){
function getQQ(){
var qq = textMatches("\\d{5,12}").findOne().text();
return qq;
+}
+
+function openGroupMemberList(){
+ desc("群资料卡").click();
+ var groupMemberCountView = textEndsWith("名成员").findOne();
+ var groupMemberCount = parseInt(/\d+/.exec(groupMemberCountView.text())[0]);
+ groupMemberCountView.parent().click();
+ sleep(groupMemberCount * 4);
}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js b/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
index e5c8538b..f5a691a9 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ名片点赞脚本.js
@@ -24,11 +24,13 @@ sleep(100);
waitForActivity("com.tencent.mobileqq.activity.VisitorsActivity");
while(notStopped()){
- var i = 0;
+ var i = 0;
while(i < 10){
i += 赞() ? 1 : 0;
click("取消");
}
显示更多();
- 下滑();
+ if(currentActivity() == "com.tencent.mobileqq.activity.VisitorsActivity"){
+ 下滑();
+ }
}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js b/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
new file mode 100644
index 00000000..934a6fd6
--- /dev/null
+++ b/app/src/main/assets/sample/QQ与微信/QQ名片点赞(只点赞好友).js
@@ -0,0 +1,21 @@
+"auto";
+
+toast("请打开自己的资料页,点击点赞图标");
+sleep(500);
+waitForActivity("com.tencent.mobileqq.activity.VisitorsActivity");
+
+while(notStopped()){
+ for(var i = 0; i < 10; i++){
+ className("ImageView").desc("赞").untilFind().each(function(like){
+ var parent = like.parent();
+ if(like.parent().findByText("(好友)")){
+ like.click();
+ }
+ });
+ }
+ click("显示更多");
+ click("显示更多");
+ if(currentActivity() == "com.tencent.mobileqq.activity.VisitorsActivity"){
+ className("AbsListView").scrollable().scrollForward();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js b/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
index 073d1717..61890e2a 100644
--- a/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
+++ b/app/src/main/assets/sample/QQ与微信/QQ点赞群成员.js
@@ -1,24 +1,32 @@
"auto";
-var liked = {};
+
+launchApp("QQ");
+toast("请打开要点赞的群");
+sleep(500);
+if(currentActivity() != "com.tencent.mobileqq.activity.TroopMemberListActivity"){
+ openGroupMemberList();
+}
+
while(true){
var list = className("AbsListView").findOne();
- list.children().each(function(child){
- if(child.className() != "android.widget.FrameLayout"){
- return;
- }
- if(!isGroupMember(child)){
- return;
- }
- if(isMyself(child)){
- return;
- }
- child.child(0).click();
- like();
- while(!click("返回"));
- while(!click("成员资料"));
- while(!click("返回"));
- });
- className("AbsListView").findOne().scrollForward();
+ var count = list.childCount();
+ for(var i = 0; i < count; i++){
+ var child = list.child(i);
+ if(!child || child.className() != "android.widget.FrameLayout"){
+ continue;
+ }
+ if(!isGroupMember(child) || isMyself(child)){
+ continue;
+ }
+ child.child(0).click();
+ sleep(500);
+ like();
+ while(!click("返回"));
+ while(!click("成员资料"));
+ while(!click("返回"));
+ sleep(500);
+ }
+ list.scrollForward();
}
@@ -26,6 +34,9 @@ function isGroupMember(child){
if(child.childCount() != 1){
return false;
}
+ if(!child.findByText("Baby Q").isEmpty()){
+ return false;
+ }
return child.child(0) && child.child(0).className() == "android.widget.FrameLayout";
}
@@ -35,11 +46,6 @@ function isMyself(child){
}
function like(){
- var qq = getQQ();
- if(liked[qq]){
- while(!click("返回"));
- return;
- }
while(!click("更多"));
while(!click("查看个人资料卡"));
var likeBtn = descEndsWith("点击可赞").findOne();
@@ -52,4 +58,12 @@ function like(){
function getQQ(){
var qq = textMatches("\\d{5,12}").findOne().text();
return qq;
+}
+
+function openGroupMemberList(){
+ desc("群资料卡").click();
+ var groupMemberCountView = textEndsWith("名成员").findOne();
+ var groupMemberCount = parseInt(/\d+/.exec(groupMemberCountView.text())[0]);
+ groupMemberCountView.parent().click();
+ sleep(groupMemberCount * 4);
}
\ No newline at end of file
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
index 6d1bcf54..ccf24900 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java
@@ -30,7 +30,12 @@ public class HoverMenuManger {
if (!HoverMenuService.isServiceRunning()) {
if (!SettingsCompat.canDrawOverlays(App.getApp())) {
Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
- SettingsCompat.manageDrawOverlays(App.getApp());
+ try {
+ SettingsCompat.manageDrawOverlays(App.getApp());
+ } catch (Exception e) {
+ e.printStackTrace();
+ IntentUtil.goToAppDetailSettings(App.getApp());
+ }
} else {
HoverMenuService.startService(App.getApp());
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
index aa265fcb..8a52e75f 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java
@@ -22,6 +22,7 @@ import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayout
import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayoutHierarchyView;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.theme.ThemeColorManagerCompat;
+import com.stardust.util.IntentUtil;
import com.stardust.util.MessageEvent;
import com.stardust.util.MessageIntent;
@@ -129,7 +130,12 @@ public class HoverMenuService extends Service {
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
- SettingsCompat.manageDrawOverlays(this);
+ try {
+ SettingsCompat.manageDrawOverlays(this);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ IntentUtil.goToAppDetailSettings(this);
+ }
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
index f688682d..dc6ed7c0 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java
@@ -17,6 +17,7 @@ import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.main.MainActivity_;
import com.stardust.util.ClipboardUtil;
import com.stardust.util.MessageEvent;
+import com.stardust.view.accessibility.AccessibilityService;
import org.greenrobot.eventbus.Subscribe;
@@ -61,10 +62,14 @@ public class MainMenuNavigatorContent implements NavigatorContent {
Toast.makeText(mView.getContext(), R.string.text_layout_inspector_is_dumping, Toast.LENGTH_SHORT).show();
return false;
}
- if (inspector.getCapture() == null) {
+ if (AccessibilityService.getInstance() == null) {
Toast.makeText(mView.getContext(), R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show();
return false;
}
+ if (inspector.getCapture() == null) {
+ Toast.makeText(mView.getContext(), R.string.text_inspect_failed, Toast.LENGTH_SHORT).show();
+ return false;
+ }
return true;
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
index e2a30562..d81f4470 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/layout_inspector/LayoutInspector.java
@@ -1,5 +1,7 @@
package com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -43,6 +45,17 @@ public class LayoutInspector {
}
}
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+ private void refreshChildList(AccessibilityNodeInfo root) {
+ if (root == null)
+ return;
+ root.refresh();
+ int childCount = root.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ refreshChildList(root.getChild(i));
+ }
+ }
+
public boolean isDumping() {
return mDumping;
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 69df5dc9..b198f3b9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -207,6 +207,7 @@
格式错误
打开无障碍服务
放弃录制
+ 布局抓取失败,请关闭悬浮窗后动一下页面重试
- 无
diff --git a/autojs/src/main/res/xml/accessibility_service_config.xml b/autojs/src/main/res/xml/accessibility_service_config.xml
index 9c541b8b..78d50da7 100644
--- a/autojs/src/main/res/xml/accessibility_service_config.xml
+++ b/autojs/src/main/res/xml/accessibility_service_config.xml
@@ -1,8 +1,8 @@
eventTypes = new HashSet<>();
+ private volatile AccessibilityNodeInfo mRootInActiveWindow;
+ private Timer mTimer;
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
mDelegates.put(uniquePriority, delegate);
@@ -59,15 +62,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.v(TAG, "onAccessibilityEvent: " + event);
- if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
- || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
- || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
- AccessibilityNodeInfo root = super.getRootInActiveWindow();
- if (root != null) {
- mRootInActiveWindow = root;
- Log.d(TAG, "rootInActiveWindow: " + mRootInActiveWindow);
- }
- }
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
return;
for (Map.Entry entry : mDelegates.entrySet()) {
@@ -90,13 +84,17 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override
public AccessibilityNodeInfo getRootInActiveWindow() {
- return mRootInActiveWindow;
+ try {
+ return super.getRootInActiveWindow();
+ } catch (IllegalStateException e) {
+ return null;
+ }
}
-
@Override
public void onDestroy() {
instance = null;
+ mTimer.cancel();
super.onDestroy();
}
@@ -109,6 +107,16 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
LOCK.lock();
ENABLED.signalAll();
LOCK.unlock();
+ mTimer = new Timer();
+ mTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ AccessibilityNodeInfo root = getRootInActiveWindow();
+ if (root != null) {
+ mRootInActiveWindow = root;
+ }
+ }
+ }, 0, 100);
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
}
diff --git a/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
new file mode 100644
index 00000000..9d72b7e5
--- /dev/null
+++ b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspectService.java
@@ -0,0 +1,27 @@
+package com.stardust.view.accessibility;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Created by Stardust on 2017/7/13.
+ */
+
+public class LayoutInspectService extends AccessibilityService {
+
+ private static LayoutInspectService instance;
+
+ public static LayoutInspectService getInstance() {
+ return instance;
+ }
+
+
+ @Override
+ protected void onServiceConnected() {
+ AccessibilityServiceInfo info = getServiceInfo();
+ info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+ setServiceInfo(info);
+ super.onServiceConnected();
+ }
+}
+
From 248338016b97a11e63e2df676a63dab4ac081d36 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sun, 16 Jul 2017 21:47:34 +0800
Subject: [PATCH 2/5] save works
---
.../InputEventToSendEventJsConverter.java | 18 ++--
.../theme/ThemeColorManagerCompat.java | 2 +
.../src/main/assets/javascript_engine_init.js | 1 +
.../execution/RootedScriptExecution.java | 34 ++++++++
.../autojs/runtime/api/AbstractShell.java | 8 ++
.../autojs/runtime/api/InputEventSender.java | 86 +++++++++++++++++++
6 files changed, 140 insertions(+), 9 deletions(-)
create mode 100644 autojs/src/main/java/com/stardust/autojs/execution/RootedScriptExecution.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/InputEventSender.java
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/record/inputevent/InputEventToSendEventJsConverter.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/record/inputevent/InputEventToSendEventJsConverter.java
index 58e1c6b4..93b4efa5 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/record/inputevent/InputEventToSendEventJsConverter.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/record/inputevent/InputEventToSendEventJsConverter.java
@@ -22,8 +22,8 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
private int mLastTouchY = -1;
public InputEventToSendEventJsConverter() {
- mCode.append("var sh = new Shell(true);\n")
- .append("sh.SetScreenMetrics(").append(getDeviceScreenWidth()).append(", ")
+ mCode.append("var ies = new InputEventSender();\n")
+ .append("ies.setScreenMetrics(").append(getDeviceScreenWidth()).append(", ")
.append(getDeviceScreenHeight()).append(");\n");
}
@@ -33,7 +33,7 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
if (mLastEventTime == 0) {
mLastEventTime = event.time;
} else if (event.time - mLastEventTime > 0.03) {
- mCode.append("sleep(").append((long) (1000 * (event.time - mLastEventTime))).append(");\n");
+ mCode.append("sleep(").append((long) (1000L * (event.time - mLastEventTime))).append(");\n");
mLastEventTime = event.time;
}
int device = parseDeviceNumber(event.device);
@@ -51,7 +51,7 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
}
}
checkLastTouch();
- mCode.append("sh.SendEvent(");
+ mCode.append("ies.sendEvent(");
if (device != mTouchDevice) {
mCode.append(device).append(", ");
}
@@ -62,11 +62,11 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
private void checkLastTouch() {
if (mLastTouchX >= 0) {
- mCode.append("sh.TouchX(").append(mLastTouchX).append(");\n");
+ mCode.append("ies.touchX(").append(mLastTouchX).append(");\n");
mLastTouchX = -1;
}
if (mLastTouchY >= 0) {
- mCode.append("sh.TouchY(").append(mLastTouchY).append(");\n");
+ mCode.append("ies.touchY(").append(mLastTouchY).append(");\n");
mLastTouchY = -1;
}
}
@@ -93,7 +93,7 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
setTouchDevice(device);
}
if (mLastTouchX >= 0) {
- mCode.append("sh.Touch(")
+ mCode.append("ies.touch(")
.append(mLastTouchX).append(", ")
.append(value).append(");\n");
mLastTouchX = -1;
@@ -103,7 +103,7 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
}
private void setTouchDevice(int i) {
- mCode.append("sh.SetTouchDevice(").append(i).append(");\n");
+ mCode.append("ies.setInputDevice(").append(i).append(");\n");
mTouchDevice = i;
}
@@ -119,7 +119,7 @@ public class InputEventToSendEventJsConverter extends InputEventConverter {
@Override
public void stop() {
super.stop();
- mCode.append("sh.exitAndWaitFor();");
+ mCode.append("ies.exitAndWaitFor();");
}
private static String hex2dec(String hex) {
diff --git a/app/src/main/java/com/stardust/theme/ThemeColorManagerCompat.java b/app/src/main/java/com/stardust/theme/ThemeColorManagerCompat.java
index 0c23a47e..22fdaf75 100644
--- a/app/src/main/java/com/stardust/theme/ThemeColorManagerCompat.java
+++ b/app/src/main/java/com/stardust/theme/ThemeColorManagerCompat.java
@@ -1,5 +1,7 @@
package com.stardust.theme;
+import com.jecelyin.editor.v2.core.widget.JecEditText;
+import com.jecelyin.editor.v2.ui.EditorDelegate;
import com.stardust.scriptdroid.*;
import com.stardust.scriptdroid.R;
diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js
index acb0ee54..57803c14 100644
--- a/autojs/src/main/assets/javascript_engine_init.js
+++ b/autojs/src/main/assets/javascript_engine_init.js
@@ -36,3 +36,4 @@ require("__general__")(__runtime__, this);
})(__that__);
__importClass__(com.stardust.autojs.runtime.api.Shell);
+__importClass__(com.stardust.autojs.runtime.api.InputEventSender);
diff --git a/autojs/src/main/java/com/stardust/autojs/execution/RootedScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/RootedScriptExecution.java
new file mode 100644
index 00000000..befbc6f7
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/execution/RootedScriptExecution.java
@@ -0,0 +1,34 @@
+package com.stardust.autojs.execution;
+
+import com.stardust.autojs.ScriptEngineService;
+import com.stardust.autojs.engine.ScriptEngine;
+import com.stardust.autojs.runtime.ScriptRuntime;
+import com.stardust.autojs.runtime.api.AbstractShell;
+import com.stardust.autojs.runtime.api.ProcessShell;
+import com.stardust.util.IntentExtras;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Stardust on 2017/7/16.
+ */
+
+public class RootedScriptExecution extends RunnableScriptExecution {
+
+ private static int count = 0;
+ private static Map arguments = new HashMap<>();
+
+ public RootedScriptExecution(ScriptEngineService service, ScriptExecutionTask task) {
+ super(service, task);
+ }
+
+ @Override
+ public void run() {
+ }
+
+
+ public static void main(String[] args) {
+ }
+
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java
index 66b84337..d051e8ac 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java
@@ -190,4 +190,12 @@ public abstract class AbstractShell {
}
public abstract void exitAndWaitFor();
+
+ public void sleep(long i) {
+ exec("sleep " + i);
+ }
+
+ public void usleep(long l) {
+ exec("usleep " + l);
+ }
}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/InputEventSender.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/InputEventSender.java
new file mode 100644
index 00000000..7c60b680
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/InputEventSender.java
@@ -0,0 +1,86 @@
+package com.stardust.autojs.runtime.api;
+
+import com.stardust.util.ScreenMetrics;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Created by Stardust on 2017/7/16.
+ */
+
+public class InputEventSender {
+ private DataOutputStream mDeviceFile;
+ private ScreenMetrics mScreenMetrics;
+
+
+ public InputEventSender(String devicePath) throws FileNotFoundException {
+ mDeviceFile = new DataOutputStream(new FileOutputStream(devicePath));
+ }
+
+ public InputEventSender(int i) throws FileNotFoundException {
+ this("/dev/input/event" + i);
+ }
+
+ public InputEventSender() {
+
+ }
+
+
+ public void sendEvent(int type, int code, int value) throws IOException {
+ for (int i = 0; i < 16; i++)
+ mDeviceFile.writeByte(0);
+ mDeviceFile.writeShort(type);
+ mDeviceFile.writeShort(code);
+ mDeviceFile.writeInt(value);
+ mDeviceFile.flush();
+ }
+
+
+ public void setInputDevice(int i) throws IOException {
+ if (mDeviceFile != null) {
+ mDeviceFile.close();
+ }
+ mDeviceFile = new DataOutputStream(new FileOutputStream("/dev/input/event" + i));
+ }
+
+ public void Touch(int x, int y) throws IOException {
+ TouchX(x);
+ TouchY(y);
+ }
+
+ public void setScreenMetrics(int width, int height) {
+ if (mScreenMetrics == null) {
+ mScreenMetrics = new ScreenMetrics();
+ }
+ mScreenMetrics.setScreenMetrics(width, height);
+ }
+
+ public void TouchX(int x) throws IOException {
+ sendEvent(3, 53, scaleX(x));
+ }
+
+ private int scaleX(int x) {
+ return mScreenMetrics.scaleX(x);
+ }
+
+ public void TouchY(int y) throws IOException {
+ sendEvent(3, 54, scaleY(y));
+ }
+
+ private int scaleY(int y) {
+ return mScreenMetrics.scaleY(y);
+
+ }
+
+
+ public void close() throws IOException {
+ mDeviceFile.close();
+ }
+
+}
+
From 21c4a38b86e619a11c7f322b137ea9dd33cc7fa5 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Mon, 17 Jul 2017 23:26:15 +0800
Subject: [PATCH 3/5] add files and docs of files and images
---
app/build.gradle | 4 +-
app/src/main/assets/help/catalogue.json | 37 +++-
.../help/documentation/图片与图色处理.md | 178 +++++++++++++++-
.../help/documentation/如何阅读本文档.md | 30 +++
.../assets/help/documentation/文件读写.md | 196 ++++++++++++++++++
.../assets/help/documentation/自动操作函数.md | 6 +-
.../sample/图片与图色处理/颜色获取和检测.js | 8 +-
.../sample/文件读写/删除所有空文件夹.js | 20 ++
.../InputEventToSendEventJsConverter.java | 26 +--
.../script_list/MyScriptListFragment.java | 5 +-
autojs/src/main/assets/modules/__images__.js | 50 +++--
autojs/src/main/assets/modules/__io__.js | 1 +
.../runtime/api/image/ColorDetector.java | 24 ++-
.../autojs/runtime/api/image/ColorFinder.java | 1 +
.../autojs/runtime/api/image/Images.java | 17 +-
.../res/xml/accessibility_service_config.xml | 4 +-
.../accessibility/AccessibilityService.java | 34 ++-
.../src/main/java/com/stardust/pio/PFile.java | 156 ++++++++++----
18 files changed, 666 insertions(+), 131 deletions(-)
create mode 100644 app/src/main/assets/help/documentation/如何阅读本文档.md
create mode 100644 app/src/main/assets/help/documentation/文件读写.md
create mode 100644 app/src/main/assets/sample/文件读写/删除所有空文件夹.js
diff --git a/app/build.gradle b/app/build.gradle
index e00b7437..20d2ee55 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 17
targetSdkVersion 23
- versionCode 148
- versionName "2.0.14 Alpha"
+ versionCode 150
+ versionName "2.0.14 Alpha3"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
diff --git a/app/src/main/assets/help/catalogue.json b/app/src/main/assets/help/catalogue.json
index 1f6fe58d..0789d4dc 100644
--- a/app/src/main/assets/help/catalogue.json
+++ b/app/src/main/assets/help/catalogue.json
@@ -5,6 +5,11 @@
"type": "markdown",
"path":"documentation"
},
+ {
+ "title": "如何阅读本文档",
+ "type": "markdown",
+ "path":"documentation"
+ },
{
"title": "ECMAScript教程",
"type": "catalogue"
@@ -24,16 +29,6 @@
"type": "markdown",
"path":"documentation"
},
- {
- "title": "控制台与输出",
- "type": "markdown",
- "path":"documentation"
- },
- {
- "title": "UI(用户界面)",
- "type": "markdown",
- "path":"documentation"
- },
{
"title": "选择器",
"type": "markdown",
@@ -45,7 +40,12 @@
"path": "documentation"
},
{
- "title": "模块与第三方jar",
+ "title": "图片与图色处理",
+ "type": "markdown",
+ "path":"documentation"
+ },
+ {
+ "title": "控制台与输出",
"type": "markdown",
"path":"documentation"
},
@@ -59,6 +59,21 @@
"type": "markdown",
"path":"documentation"
},
+ {
+ "title": "UI(用户界面)",
+ "type": "markdown",
+ "path":"documentation"
+ },
+ {
+ "title": "文件读写",
+ "type": "markdown",
+ "path":"documentation"
+ },
+ {
+ "title": "模块与第三方jar",
+ "type": "markdown",
+ "path":"documentation"
+ },
{
"title": "调用Java API",
"type": "markdown",
diff --git a/app/src/main/assets/help/documentation/图片与图色处理.md b/app/src/main/assets/help/documentation/图片与图色处理.md
index d2d88e3b..e370f366 100644
--- a/app/src/main/assets/help/documentation/图片与图色处理.md
+++ b/app/src/main/assets/help/documentation/图片与图色处理.md
@@ -1,5 +1,179 @@
+目录:
+* [截图](#截图)
+* [images](#images)
+* [colors](#colors)
+* [Image](#Image)
+* [Point](#Point)
+
+# 截图
+
+截图有关的函数需要安卓5.0以上才支持。
### requestScreenCapture(\[width, height\])
+* width \ 截图宽度
+* height \ 截图高度
-参数width和height用于指定截图的分辨率,默认为屏幕宽高。
+向系统申请屏幕截图权限,返回是否请求成功。
-未完待续。
\ No newline at end of file
+第一次使用该函数会弹出截图权限请求,建议选择“总是允许”。
+
+这个函数只是申请截图权限,并不会真正执行截图,真正的截图函数是[captureScreen](#captureScreen())。
+
+不指定参数时默认为屏幕宽高。指定参数时,并不会严格以width和height为截图宽度和高度,而是以和width, height接近的最适合的宽高为截图宽高。例如在1920\*1080屏幕中requestScreenCapture(600, 1000)请求的截图的高度一般是540\*960。
+
+如果在第一次权限请求时选择"总是允许", 之后的脚本执行该函数通常耗时200毫秒以内(测试机型:小米6)。
+
+建议在本软件界面运行该函数,在其他软件界面运行时容易出现一闪而过的黑屏。
+
+### captureScreen()
+
+截取当前屏幕并返回一个[Image](#Image)对象。该图片的宽高取决于requestScreenCapture所指定的宽高。
+
+没有截图权限时执行该函数会抛出SecurityException。
+
+该函数耗时一毫秒以内(测试机型:小米6)。因此不必担心截图的速度。图色处理的瓶颈通常在找色部分。
+
+### captureScreen(path)
+* path \ 截图保存路径
+
+截取当前屏幕并以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
+
+# images
+
+images是图片与图色处理的工具。包括获取图片某点颜色,保存图片,找色等。
+
+### images.pixel(image, x, y)
+* image \ 图片
+* x \ 要获取的像素的横坐标。坐标系以图片左上角为原点。
+* y \ 要获取的像素的纵坐标。
+
+返回图片image在点(x, y)处的像素的ARGB值。
+该值的格式为0xAARRGGBB。也就是,如果`var argb = images.pixel(image, x, y)`,那么可以通过`(argb & 0xFF000000) >> 24`获取透明度,通过`(argb & 0xFF0000) >> 16`获取R值,通过`(argb & 0xFF000000) >> 24`获取G值等,或者通过`images.alpha(argb)`, `images.red(argb)`等获取。
+
+### images.saveImage(image, path)
+
+* image \ 图片
+* path \ 路径
+
+把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
+
+### images.findColor(image, color, options)
+* image \ 图片
+* color \或\ 要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。
+* options \