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:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user