-
Notifications
You must be signed in to change notification settings - Fork 9
/
AccessibilityServiceUtils.kt
113 lines (99 loc) · 4.23 KB
/
AccessibilityServiceUtils.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.carlos.cutils.util
import android.graphics.Rect
import android.view.accessibility.AccessibilityNodeInfo
import com.carlos.cutils.CUtils
/**
* Github: https://github.com/xbdcc/.
* Created by Carlos on 2019/2/20.
*/
object AccessibilityServiceUtils {
fun findAndClickFirstNodeInfoByText(
text: String,
isReverse: Boolean = false,
accessibilityNodeInfo: AccessibilityNodeInfo?
) {
val node = accessibilityNodeInfo?.findAccessibilityNodeInfosByText(text)
clickFirstNodeInfo(node, isReverse)
}
fun findAndClickFirstNodeInfoByViewId(
viewId: String,
isReverse: Boolean = false,
accessibilityNodeInfo: AccessibilityNodeInfo?
) {
val accessibilityNodeInfos =
accessibilityNodeInfo?.findAccessibilityNodeInfosByViewId(viewId)
clickFirstNodeInfo(accessibilityNodeInfos, isReverse)
}
fun clickFirstNodeInfo(
accessibilityNodeInfos: MutableList<AccessibilityNodeInfo>?,
isReverse: Boolean = false
) {
if (accessibilityNodeInfos.isNullOrEmpty()) {
return
}
if (isReverse) {
accessibilityNodeInfos.last().performAction(AccessibilityNodeInfo.ACTION_CLICK)
} else {
accessibilityNodeInfos.first().performAction(AccessibilityNodeInfo.ACTION_CLICK)
}
}
fun isExistNodeInfosByText(text: String, accessibilityNodeInfo: AccessibilityNodeInfo?) =
accessibilityNodeInfo?.findAccessibilityNodeInfosByText(text)?.isNotEmpty() ?: false
fun isExistNodeInfosByViewId(viewId: String, accessibilityNodeInfo: AccessibilityNodeInfo?) =
accessibilityNodeInfo?.findAccessibilityNodeInfosByViewId(viewId)?.isNotEmpty() ?: false
fun getNodeInfosByText(text: String, accessibilityNodeInfo: AccessibilityNodeInfo?) =
accessibilityNodeInfo?.findAccessibilityNodeInfosByText(text)
fun getNodeInfosByViewId(viewId: String, accessibilityNodeInfo: AccessibilityNodeInfo?) =
accessibilityNodeInfo?.findAccessibilityNodeInfosByViewId(viewId)
fun findAndClickFirstNodeInfoByViewId(
viewId: String,
childExistId: String,
childNotExistIds: String,
isJustClickLeft: Boolean = false,
isReverse: Boolean = false,
accessibilityNodeInfo: AccessibilityNodeInfo?
): Boolean {
var accessibilityNodeInfos =
accessibilityNodeInfo?.findAccessibilityNodeInfosByViewId(viewId) ?: return false
if (isReverse) accessibilityNodeInfos = accessibilityNodeInfos.reversed()
for (accessibilityNodeInfo in accessibilityNodeInfos) {
if (isExistNodeInfosByViewId(childNotExistIds, accessibilityNodeInfo))
continue
if (!isExistNodeInfosByViewId(childExistId, accessibilityNodeInfo))
continue
if (isJustClickLeft && !isLeft(accessibilityNodeInfo))
continue
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)
return true
}
return false
}
private fun isLeft(accessibilityNodeInfo: AccessibilityNodeInfo): Boolean {
val rect = Rect()
accessibilityNodeInfo.getBoundsInScreen(rect)
val width = CUtils.cContext.resources.displayMetrics.widthPixels
return rect.centerX() < width / 2
}
fun findAndClickFirstNodeInfoByViewIdContainsText(
viewId: String,
childId: String,
childIdContainsText: String,
isReverse: Boolean = false,
accessibilityNodeInfo: AccessibilityNodeInfo?
): Boolean {
var accessibilityNodeInfos =
accessibilityNodeInfo?.findAccessibilityNodeInfosByViewId(viewId) ?: return false
if (isReverse) accessibilityNodeInfos = accessibilityNodeInfos.reversed()
for (accessibilityNodeInfo in accessibilityNodeInfos) {
val childNodeInfo = getNodeInfosByViewId(childId, accessibilityNodeInfo)
if (childNodeInfo.isNullOrEmpty()) {
return false
}
if (childNodeInfo.first().text.contains(childIdContainsText)) {
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)
return true
}
}
return false
}
}