release 2.0.13 Beta2

This commit is contained in:
hyb1996 committed 2017-07-07 10:56:33 +08:00
1 parent 775d6eca81
commit 8b0fe61c87
16 files changed
+153 -28

No files matched your search

+2 -2
View File
@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid" applicationId "com.stardust.scriptdroid"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 23 targetSdkVersion 23
versionCode 141 versionCode 142
versionName "2.0.13 Beta" versionName "2.0.13 Beta2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {
+2 -2
View File
@@ -6,7 +6,7 @@
"path":"documentation" "path":"documentation"
}, },
{ {
"title": "EMCAScript教程", "title": "ECMAScript教程",
"type": "catalogue" "type": "catalogue"
}, },
{ {
@@ -65,7 +65,7 @@
"path":"documentation" "path":"documentation"
} }
], ],
"EMCAScript教程": [ "ECMAScript教程": [
{ {
"title": "基础", "title": "基础",
"type": "catalogue" "type": "catalogue"
@@ -1,2 +0,0 @@
### text(文件控件)
@@ -0,0 +1,12 @@
"auto";
launchApp("QQ");
toast("在好友列表中点谁删谁");
while(true){
while(!click("更多"));
while(!click("删除好友"));
sleep(300);
while(!click("删除好友"));
}
@@ -0,0 +1,55 @@
"auto";
var liked = {};
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();
}
function isGroupMember(child){
if(child.childCount() != 1){
return false;
}
return child.child(0) && child.child(0).className() == "android.widget.FrameLayout";
}
function isMyself(child){
var l = child.findByText("我");
return l && l.size() > 0;
}
function like(){
var qq = getQQ();
if(liked[qq]){
while(!click("返回"));
return;
}
while(!click("更多"));
while(!click("查看个人资料卡"));
var likeBtn = descEndsWith("点击可赞").findOne();
for(let i = 0; i < 10; i++){
likeBtn.click();
sleep(100);
}
}
function getQQ(){
var qq = textMatches("\\d{5,12}").findOne().text();
return qq;
}
@@ -0,0 +1,32 @@
"auto";
var 延迟 = 200;
function 下滑(){
className("AbsListView").scrollable().scrollForward();
}
function 赞(){
className("ImageView").desc("赞").untilFind()
.each(function(item){
for(var i = 0; i < 10; i++){
item.click();
sleep(延迟);
}
});
}
function 显示更多(){
for(let i = 0; i < 2;i++){
click("显示更多");
}
}
toast("请打开自己的资料页,点击点赞图标");
sleep(1000);
while(notStopped()){
赞();
显示更多();
下滑();
}
@@ -11,6 +11,7 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import io.mattcarroll.hover.HoverMenu; import io.mattcarroll.hover.HoverMenu;
@@ -32,6 +32,7 @@ import java.util.Set;
import io.mattcarroll.hover.NavigatorContent; import io.mattcarroll.hover.NavigatorContent;
/** /**
* Created by Stardust on 2017/3/11. * Created by Stardust on 2017/3/11.
*/ */
@@ -46,7 +47,7 @@ public class HoverMenuAdapter implements io.mattcarroll.hover.HoverMenuAdapter {
private final Context mContext; private final Context mContext;
private final List<String> mTabIds; private final List<String> mTabIds;
private final Map<String, NavigatorContent> mData = new LinkedHashMap<>(); private final Map<String, NavigatorContent> mData = new LinkedHashMap<>();
private final Set<ContentChangeListener> mContentChangeListeners = new HashSet<>(); private final Set<io.mattcarroll.hover.HoverMenuAdapter.ContentChangeListener> mContentChangeListeners = new HashSet<>();
private View[] mViews; private View[] mViews;
public HoverMenuAdapter(@NonNull HoverMenuService context) { public HoverMenuAdapter(@NonNull HoverMenuService context) {
@@ -112,6 +112,7 @@ public class HoverMenuService extends Service {
mWindowHoverMenu.hide(); mWindowHoverMenu.hide();
stopSelf(); stopSelf();
} }
}; };
@Override @Override
@@ -31,7 +31,7 @@ public class FireSettingReceiver extends AbstractPluginSettingReceiver {
@Override @Override
protected void firePluginSetting(@NonNull Context context, @NonNull Bundle bundle) { protected void firePluginSetting(@NonNull Context context, @NonNull Bundle bundle) {
context.startService(new Intent(context, ScriptExecutionIntentService.class) context.startActivity(new Intent(context, RunIntentActivity.class)
.putExtras(bundle)); .putExtras(bundle));
} }
@@ -7,14 +7,10 @@ import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.SwitchCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.app.Fragment;
import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
@@ -82,7 +78,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
mExecutor.execute(new Runnable() { mExecutor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
final boolean checked = AccessibilityService.isEnable(App.getApp()); final boolean checked = AccessibilityService.isEnabled(App.getApp());
mAccessibilityServiceSwitch.post(new Runnable() { mAccessibilityServiceSwitch.post(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -114,7 +110,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment {
@CheckedChange(R.id.sw_auto_operate_service) @CheckedChange(R.id.sw_auto_operate_service)
void setAutoOperateServiceEnable(CompoundButton button, boolean enable) { void setAutoOperateServiceEnable(CompoundButton button, boolean enable) {
boolean isAccessibilityServiceEnabled = AccessibilityService.isEnable(App.getApp()); boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp());
if (enable && !isAccessibilityServiceEnabled) { if (enable && !isAccessibilityServiceEnabled) {
AccessibilityServiceTool.enableAccessibilityService(); AccessibilityServiceTool.enableAccessibilityService();
} else if (!enable && isAccessibilityServiceEnabled) { } else if (!enable && isAccessibilityServiceEnabled) {
@@ -49,8 +49,6 @@ public class MyScriptListFragment extends Fragment {
private MaterialDialog mScriptFileOperationDialog; private MaterialDialog mScriptFileOperationDialog;
private MaterialDialog mDirectoryOperationDialog; private MaterialDialog mDirectoryOperationDialog;
private ScriptFile mSelectedScriptFile; private ScriptFile mSelectedScriptFile;
private MaterialDialog.InputCallback mFileNameInputCallback = new InputCallback(false);
private MaterialDialog.InputCallback mDirectoryNameInputCallback = new InputCallback(true);
private String mFilePathToImport; private String mFilePathToImport;
@Nullable @Nullable
@@ -186,7 +184,7 @@ public class MyScriptListFragment extends Fragment {
public void newDirectory() { public void newDirectory() {
showNameInputDialog("", mDirectoryNameInputCallback, new MaterialDialog.InputCallback() { showNameInputDialog("", new InputCallback(true), new MaterialDialog.InputCallback() {
@Override @Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
if (new ScriptFile(getCurrentDirectory(), input.toString()).mkdirs()) { if (new ScriptFile(getCurrentDirectory(), input.toString()).mkdirs()) {
@@ -204,7 +202,7 @@ public class MyScriptListFragment extends Fragment {
} }
private void showFileNameInputDialog(String prefix, final MaterialDialog.InputCallback callback) { private void showFileNameInputDialog(String prefix, final MaterialDialog.InputCallback callback) {
showNameInputDialog(prefix, mFileNameInputCallback, callback); showNameInputDialog(prefix, new InputCallback(false), callback);
} }
private void showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher, final MaterialDialog.InputCallback callback) { private void showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher, final MaterialDialog.InputCallback callback) {
@@ -334,6 +332,7 @@ public class MyScriptListFragment extends Fragment {
private boolean mIsDirectory = false; private boolean mIsDirectory = false;
private String mExcluded; private String mExcluded;
private boolean mIsFirstTextChanged = true;
InputCallback(boolean isDirectory, String excluded) { InputCallback(boolean isDirectory, String excluded) {
mIsDirectory = isDirectory; mIsDirectory = isDirectory;
@@ -346,6 +345,10 @@ public class MyScriptListFragment extends Fragment {
@Override @Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
if (mIsFirstTextChanged) {
mIsFirstTextChanged = false;
return;
}
EditText editText = dialog.getInputEditText(); EditText editText = dialog.getInputEditText();
if (editText == null) if (editText == null)
return; return;
@@ -2,7 +2,7 @@
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask" android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds|flagRequestEnhancedWebAccessibility|flagRequestFilterKeyEvents" android:accessibilityFlags="flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds|flagRequestEnhancedWebAccessibility|flagRequestFilterKeyEvents"
android:canPerformGestures="true" android:canPerformGestures="true"
android:canRequestEnhancedWebAccessibility="true" android:canRequestEnhancedWebAccessibility="true"
android:canRetrieveWindowContent="true" android:canRetrieveWindowContent="true"
@@ -7,6 +7,7 @@ import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.util.Consumer; import com.stardust.util.Consumer;
import com.stardust.util.Func1;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -203,6 +204,15 @@ public class UiObjectCollection {
return this; return this;
} }
public UiObjectCollection filter(Func1<UiObject, Boolean> func1) {
List<UiObject> list = new ArrayList<>();
for (UiObject uiObject : mNodes) {
if (func1.call(uiObject))
list.add(uiObject);
}
return of(list);
}
public UiObjectCollection find(UiGlobalSelector selector) { public UiObjectCollection find(UiGlobalSelector selector) {
List<UiObject> list = new ArrayList<>(); List<UiObject> list = new ArrayList<>();
for (UiObject object : mNodes) { for (UiObject object : mNodes) {
@@ -8,6 +8,7 @@ import android.view.KeyEvent;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
@@ -16,6 +17,9 @@ import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* Created by Stardust on 2017/5/2. * Created by Stardust on 2017/5/2.
@@ -29,7 +33,8 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
private static final String TAG = "AccessibilityService"; private static final String TAG = "AccessibilityService";
private static final SortedMap<Integer, AccessibilityDelegate> mDelegates = new TreeMap<>(); private static final SortedMap<Integer, AccessibilityDelegate> mDelegates = new TreeMap<>();
private static final Object LOCK = new Object(); private static final ReentrantLock LOCK = new ReentrantLock();
private static final Condition ENABLED = LOCK.newCondition();
private static AccessibilityService instance; private static AccessibilityService instance;
private static boolean containsAllEventTypes = false; private static boolean containsAllEventTypes = false;
private static final Set<Integer> eventTypes = new HashSet<>(); private static final Set<Integer> eventTypes = new HashSet<>();
@@ -43,7 +48,7 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
eventTypes.addAll(set); eventTypes.addAll(set);
} }
public static boolean isEnable(Context context) { public static boolean isEnabled(Context context) {
return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class); return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class);
} }
@@ -54,7 +59,6 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
@Override @Override
public void onAccessibilityEvent(final AccessibilityEvent event) { public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.v(TAG, "onAccessibilityEvent: " + event); Log.v(TAG, "onAccessibilityEvent: " + event);
Log.v(TAG, "getRootInActiveWindow: " + super.getRootInActiveWindow());
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) { || event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
@@ -108,9 +112,9 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
Log.v(TAG, "onServiceConnected: " + getServiceInfo().toString()); Log.v(TAG, "onServiceConnected: " + getServiceInfo().toString());
instance = this; instance = this;
super.onServiceConnected(); super.onServiceConnected();
synchronized (LOCK) { LOCK.lock();
LOCK.notifyAll(); ENABLED.signalAll();
} LOCK.unlock();
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG??? // FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
} }
@@ -123,12 +127,13 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
} }
public static void waitForEnabled(long timeOut) { public static void waitForEnabled(long timeOut) {
synchronized (LOCK) { LOCK.lock();
try { try {
LOCK.wait(timeOut); ENABLED.await(timeOut, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} } finally {
LOCK.unlock();
} }
} }
@@ -0,0 +1,11 @@
package com.stardust.util;
/**
* Created by Stardust on 2017/7/7.
*/
public interface Func1<T, R> {
R call(T t);
}