Change the way of action pefrom(no longer wait for event), add loading jar file support, fix simple action memory leak

This commit is contained in:
hyb1996
2017-04-05 22:35:31 +08:00
parent b762ceb60b
commit 6844eb9841
88 changed files with 1797 additions and 832 deletions

View File

@@ -1,37 +0,0 @@
package com.stardust.view.accessibility;
import android.view.accessibility.AccessibilityNodeInfo;
import java.util.List;
import java.util.Vector;
/**
* Created by Stardust on 2017/3/22.
*/
public class AccessibilityAllocator {
private List<AccessibilityNodeInfo> mAccessibilityNodeInfoList = new Vector<>();
public AccessibilityNodeInfo getChild(AccessibilityNodeInfo parent, int i) {
return add(parent.getChild(i));
}
private AccessibilityNodeInfo add(AccessibilityNodeInfo nodeInfo) {
mAccessibilityNodeInfoList.add(nodeInfo);
return nodeInfo;
}
public int recycleAll() {
int recycled = 0;
for (AccessibilityNodeInfo nodeInfo : mAccessibilityNodeInfoList) {
try {
nodeInfo.recycle();
recycled++;
} catch (IllegalStateException ignored) {
}
}
return recycled;
}
}

View File

@@ -2,6 +2,7 @@ package com.stardust.view.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
/**
* Created by Stardust on 2017/2/14.

View File

@@ -6,6 +6,7 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.view.accessibility.AccessibilityDelegate;

View File

@@ -0,0 +1,196 @@
package com.stardust.view.accessibility;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.automator.BuildConfig;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Stardust on 2017/3/22.
*/
public class AccessibilityNodeInfoAllocator {
public static final AccessibilityNodeInfoAllocator NONE = new NoOpAllocator();
private static final String TAG = "AccessibilityAllocator";
private static final boolean DEBUG = BuildConfig.DEBUG;
private static final AccessibilityNodeInfoAllocator GLOBAL = new AccessibilityNodeInfoAllocator();
public static AccessibilityNodeInfoAllocator getGlobal() {
return GLOBAL;
}
private Map<AccessibilityNodeInfo, String> mAccessibilityNodeInfoList = new HashMap<>();
public AccessibilityNodeInfo getChild(AccessibilityNodeInfo parent, int i) {
return add(parent.getChild(i));
}
public AccessibilityNodeInfoCompat getChild(AccessibilityNodeInfoCompat parent, int i) {
AccessibilityNodeInfoCompat compat = parent.getChild(i);
add((AccessibilityNodeInfo) compat.getInfo());
return compat;
}
public AccessibilityNodeInfo getParent(AccessibilityNodeInfo n) {
return add(n.getParent());
}
public AccessibilityNodeInfoCompat getParent(AccessibilityNodeInfoCompat n) {
AccessibilityNodeInfoCompat compat = n.getParent();
add((AccessibilityNodeInfo) compat.getInfo());
return compat;
}
public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(AccessibilityNodeInfo root, String text) {
List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByText(text);
addAll(list);
return list;
}
public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(AccessibilityNodeInfoCompat root, String text) {
List<AccessibilityNodeInfoCompat> list = root.findAccessibilityNodeInfosByText(text);
addAll(list);
return list;
}
public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(AccessibilityNodeInfo root, String id) {
List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByViewId(id);
addAll(list);
return list;
}
public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(AccessibilityNodeInfoCompat root, String id) {
List<AccessibilityNodeInfoCompat> list = root.findAccessibilityNodeInfosByViewId(id);
addAll(list);
return list;
}
public void recycle(AccessibilityNodeInfo nodeInfo) {
nodeInfo.recycle();
mAccessibilityNodeInfoList.remove(nodeInfo);
}
public void recycle(AccessibilityNodeInfoCompat nodeInfo) {
recycle((AccessibilityNodeInfo) nodeInfo.getInfo());
}
public int recycleAll() {
int notRecycledCount = 0;
int size = mAccessibilityNodeInfoList.size();
for (Map.Entry<AccessibilityNodeInfo, String> pair : mAccessibilityNodeInfoList.entrySet()) {
try {
pair.getKey().recycle();
notRecycledCount++;
if (DEBUG)
Log.w(TAG, pair.getValue());
} catch (IllegalStateException ignored) {
}
}
Log.i(TAG, "Total: " + size + " Not recycled: " + notRecycledCount);
return notRecycledCount;
}
private AccessibilityNodeInfo add(AccessibilityNodeInfo nodeInfo) {
String stackTrace = DEBUG ? Arrays.toString(Thread.currentThread().getStackTrace()) : null;
mAccessibilityNodeInfoList.put(nodeInfo, stackTrace);
return nodeInfo;
}
private void addAll(Collection<?> nodeInfos) {
String stackTrace = DEBUG ? Arrays.toString(Thread.currentThread().getStackTrace()) : null;
for (Object nodeInfo : nodeInfos) {
if (nodeInfo instanceof AccessibilityNodeInfo) {
mAccessibilityNodeInfoList.put((AccessibilityNodeInfo) nodeInfo, stackTrace);
} else if (nodeInfo instanceof AccessibilityNodeInfoCompat) {
mAccessibilityNodeInfoList.put((AccessibilityNodeInfo) ((AccessibilityNodeInfoCompat) nodeInfo).getInfo(), stackTrace);
} else {
throw new IllegalArgumentException("nodeInfo: " + nodeInfo + " nodeInfos:" + nodeInfos);
}
}
}
public static void recycleList(AccessibilityNodeInfo root, List<AccessibilityNodeInfo> list) {
for (AccessibilityNodeInfo nodeInfo : list) {
if (nodeInfo != root) {
nodeInfo.recycle();
}
}
}
private static class NoOpAllocator extends AccessibilityNodeInfoAllocator {
@Override
public AccessibilityNodeInfoCompat getParent(AccessibilityNodeInfoCompat n) {
return n.getParent();
}
@Override
public AccessibilityNodeInfo getParent(AccessibilityNodeInfo n) {
return n.getParent();
}
@Override
public AccessibilityNodeInfoCompat getChild(AccessibilityNodeInfoCompat parent, int i) {
return parent.getChild(i);
}
@Override
public AccessibilityNodeInfo getChild(AccessibilityNodeInfo parent, int i) {
return parent.getChild(i);
}
@Override
public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(AccessibilityNodeInfoCompat root, String id) {
return root.findAccessibilityNodeInfosByViewId(id);
}
@Override
public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(AccessibilityNodeInfo root, String id) {
return root.findAccessibilityNodeInfosByViewId(id);
}
@Override
public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(AccessibilityNodeInfo root, String text) {
return root.findAccessibilityNodeInfosByText(text);
}
@Override
public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(AccessibilityNodeInfoCompat root, String text) {
return root.findAccessibilityNodeInfosByText(text);
}
@Override
public void recycle(AccessibilityNodeInfo nodeInfo) {
super.recycle(nodeInfo);
}
@Override
public void recycle(AccessibilityNodeInfoCompat nodeInfo) {
super.recycle(nodeInfo);
}
@Override
public int recycleAll() {
return -1;
}
}
}

View File

@@ -1,8 +1,11 @@
package com.stardust.view.accessibility;
import android.graphics.Rect;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.automator.UiObject;
/**
* Created by Stardust on 2017/3/6.
*/
@@ -45,4 +48,16 @@ public class AccessibilityNodeInfoHelper {
nodeInfo.getBoundsInScreen(rect);
return rect;
}
public static Rect getBoundsInScreen(AccessibilityNodeInfoCompat nodeInfo) {
Rect rect = new Rect();
nodeInfo.getBoundsInScreen(rect);
return rect;
}
public static Rect getBoundsInParent(AccessibilityNodeInfoCompat nodeInfo) {
Rect rect = new Rect();
nodeInfo.getBoundsInParent(rect);
return rect;
}
}