Skip to content

Commit 1a1e240

Browse files
committed
完善api、文档
1 parent 13fab53 commit 1a1e240

File tree

27 files changed

+704
-223
lines changed

27 files changed

+704
-223
lines changed

assists-mp/src/main/java/com/ven/assists_mp/MPManager.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import android.graphics.PixelFormat
1010
import android.hardware.display.DisplayManager
1111
import android.media.Image
1212
import android.media.ImageReader
13-
import android.media.projection.MediaProjection
1413
import android.media.projection.MediaProjectionManager
1514
import android.os.Build
1615
import android.os.Bundle
@@ -28,15 +27,12 @@ import com.ven.assists.Assists
2827
import com.ven.assists.Assists.click
2928
import com.ven.assists.Assists.getBoundsInScreen
3029
import com.ven.assists.Assists.nodeGestureClick
30+
import com.ven.assists.service.AssistsService
3131
import com.ven.assists.utils.CoroutineWrapper
3232
import kotlinx.coroutines.CompletableDeferred
33-
import kotlinx.coroutines.Dispatchers
34-
import kotlinx.coroutines.GlobalScope
3533
import kotlinx.coroutines.Job
3634
import kotlinx.coroutines.delay
37-
import kotlinx.coroutines.launch
3835
import java.io.File
39-
import java.nio.ByteBuffer
4036

4137
object MPManager {
4238
const val REQUEST_CODE = "request_code_media_projection"
@@ -139,7 +135,7 @@ object MPManager {
139135

140136
suspend fun request(autoAllow: Boolean = true, timeOut: Long = 5000): Boolean {
141137
var projectionManager: MediaProjectionManager? = null
142-
Assists.service?.let {
138+
AssistsService.instance?.let {
143139
projectionManager = it.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
144140
} ?: let {
145141
projectionManager = ActivityUtils.getTopActivity()?.getSystemService(Context.MEDIA_PROJECTION_SERVICE)?.let {

assists-opcv/src/main/java/com/ven/assists_opcv/OpencvWrapper.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ import com.blankj.utilcode.util.ActivityUtils
77
import com.blankj.utilcode.util.LogUtils
88
import com.ven.assists.Assists
99
import com.ven.assists.Assists.getBoundsInScreen
10-
import com.ven.assists.AssistsWindowManager
10+
import com.ven.assists.window.AssistsWindowManager
1111
import com.ven.assists.utils.CoroutineWrapper
1212
import com.ven.assists_mp.MPManager
1313
import kotlinx.coroutines.delay
14-
import kotlinx.coroutines.launch
1514
import org.opencv.android.OpenCVLoader
1615
import org.opencv.android.Utils
1716
import org.opencv.core.Core

assists/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<application>
55
<provider
6-
android:name="com.ven.assists.AssistsFileProvider"
6+
android:name="com.ven.assists.utils.AssistsFileProvider"
77
android:authorities="${applicationId}.assists.fileprovider"
88
android:exported="false"
99
android:grantUriPermissions="true">

assists/src/main/java/com/ven/assists/Assists.kt

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,21 @@ import android.provider.Settings
1616
import android.text.TextUtils
1717
import android.util.Log
1818
import android.view.accessibility.AccessibilityNodeInfo
19-
import androidx.annotation.RequiresApi
2019
import androidx.core.os.bundleOf
2120
import com.blankj.utilcode.util.ActivityUtils
2221
import com.blankj.utilcode.util.LogUtils
2322
import com.blankj.utilcode.util.ScreenUtils
23+
import com.ven.assists.service.AssistsService
2424
import com.ven.assists.utils.CoroutineWrapper
25+
import com.ven.assists.utils.NodeClassValue
2526
import com.ven.assists.utils.runMain
27+
import com.ven.assists.window.AssistsWindowManager
2628
import kotlinx.coroutines.CompletableDeferred
27-
import kotlinx.coroutines.CoroutineScope
28-
import kotlinx.coroutines.Dispatchers
29-
import kotlinx.coroutines.Job
3029
import kotlinx.coroutines.delay
31-
import kotlinx.coroutines.launch
3230

3331
object Assists {
3432
var LOG_TAG = "assists_log"
3533

36-
/**
37-
* 无障碍服务,未开启前为null,使用注意判空
38-
*/
39-
var service: AssistsService? = null
40-
41-
val serviceListeners: ArrayList<AssistsServiceListener> = arrayListOf()
42-
4334
private var appRectInScreen: Rect? = null
4435

4536
/**
@@ -102,7 +93,6 @@ object Assists {
10293
/**
10394
* 打开无障碍服务设置
10495
*/
105-
@JvmStatic
10696
fun openAccessibilitySetting() {
10797
val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
10898
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
@@ -113,22 +103,22 @@ object Assists {
113103
*检查无障碍服务是否开启
114104
*/
115105
fun isAccessibilityServiceEnabled(): Boolean {
116-
return service != null
106+
return AssistsService.instance != null
117107
}
118108

119109
/**
120110
* 获取当前窗口所属包名
121111
*/
122112
fun getPackageName(): String {
123-
return service?.rootInActiveWindow?.packageName?.toString() ?: ""
113+
return AssistsService.instance?.rootInActiveWindow?.packageName?.toString() ?: ""
124114
}
125115

126116
/**
127117
* 通过id查找所有符合条件元素
128118
* @param text 筛选返回符合指定文本的元素
129119
*/
130120
fun findById(id: String, text: String? = null): List<AccessibilityNodeInfo> {
131-
var nodeInfos = service?.rootInActiveWindow?.findById(id) ?: arrayListOf()
121+
var nodeInfos = AssistsService.instance?.rootInActiveWindow?.findById(id) ?: arrayListOf()
132122

133123
nodeInfos = text?.let {
134124
nodeInfos.filter {
@@ -146,7 +136,7 @@ object Assists {
146136
}
147137

148138
/**
149-
* 在当前元素范围下,通过id查找所有符合条件元素
139+
* 通过id查找当前元素范围下所有符合条件元素
150140
*/
151141
fun AccessibilityNodeInfo?.findById(id: String): List<AccessibilityNodeInfo> {
152142
if (this == null) return arrayListOf()
@@ -160,15 +150,15 @@ object Assists {
160150
* 通过文本查找所有符合条件元素
161151
*/
162152
fun findByText(text: String): List<AccessibilityNodeInfo> {
163-
return service?.rootInActiveWindow?.findByText(text) ?: arrayListOf()
153+
return AssistsService.instance?.rootInActiveWindow?.findByText(text) ?: arrayListOf()
164154
}
165155

166156
/**
167157
* 根据文本查找所有文本相同的元素
168158
*/
169159
fun findByTextAllMatch(text: String): List<AccessibilityNodeInfo> {
170160
val listResult = arrayListOf<AccessibilityNodeInfo>()
171-
val list = service?.rootInActiveWindow?.findByText(text)
161+
val list = AssistsService.instance?.rootInActiveWindow?.findByText(text)
172162
list?.let {
173163
it.forEach {
174164
if (TextUtils.equals(it.text, text)) {
@@ -228,7 +218,12 @@ object Assists {
228218
* @param des 筛选返回符合指定描述文本的元素
229219
* @return 所有符合条件的元素
230220
*/
231-
fun findByTags(className: String, viewId: String? = null, text: String? = null, des: String? = null): List<AccessibilityNodeInfo> {
221+
fun findByTags(
222+
className: String,
223+
viewId: String? = null,
224+
text: String? = null,
225+
des: String? = null
226+
): List<AccessibilityNodeInfo> {
232227
var nodeList = arrayListOf<AccessibilityNodeInfo>()
233228
getAllNodes().forEach {
234229
if (TextUtils.equals(className, it.className)) {
@@ -341,7 +336,7 @@ object Assists {
341336
*/
342337
fun getAllNodes(): ArrayList<AccessibilityNodeInfo> {
343338
val nodeList = arrayListOf<AccessibilityNodeInfo>()
344-
service?.rootInActiveWindow?.getNodes(nodeList)
339+
AssistsService.instance?.rootInActiveWindow?.getNodes(nodeList)
345340
return nodeList
346341
}
347342

@@ -401,12 +396,11 @@ object Assists {
401396

402397
/**
403398
* 分发手势
404-
* @param untouchableWindowDelay 切换窗口不可触摸后延长执行的时间
399+
* @param nonTouchableWindowDelay 切换窗口不可触摸后延长执行的时间
405400
*/
406401
suspend fun dispatchGesture(
407402
gesture: GestureDescription,
408-
handler: Handler? = null,
409-
untouchableWindowDelay: Long = 100,
403+
nonTouchableWindowDelay: Long = 100,
410404
): Boolean {
411405
val completableDeferred = CompletableDeferred<Boolean>()
412406

@@ -421,10 +415,10 @@ object Assists {
421415
completableDeferred.complete(false)
422416
}
423417
}
424-
val runResult = service?.let {
425-
AssistsWindowManager.untouchableByAll()
426-
delay(untouchableWindowDelay)
427-
runMain { it.dispatchGesture(gesture, gestureResultCallback, handler) }
418+
val runResult = AssistsService.instance?.let {
419+
AssistsWindowManager.nonTouchableByAll()
420+
delay(nonTouchableWindowDelay)
421+
runMain { it.dispatchGesture(gesture, gestureResultCallback, null) }
428422
} ?: let {
429423
return false
430424
}
@@ -466,11 +460,15 @@ object Assists {
466460
duration: Long,
467461
): Boolean {
468462
val builder = GestureDescription.Builder()
469-
val strokeDescription = GestureDescription.StrokeDescription(path, startTime, duration)
463+
val strokeDescription = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
464+
GestureDescription.StrokeDescription(path, startTime, duration, true)
465+
} else {
466+
TODO("VERSION.SDK_INT < O")
467+
}
470468
val gestureDescription = builder.addStroke(strokeDescription).build()
471469
val deferred = CompletableDeferred<Boolean>()
472470
val runResult = runMain {
473-
return@runMain service?.dispatchGesture(gestureDescription, object : AccessibilityService.GestureResultCallback() {
471+
return@runMain AssistsService.instance?.dispatchGesture(gestureDescription, object : AccessibilityService.GestureResultCallback() {
474472
override fun onCompleted(gestureDescription: GestureDescription) {
475473
deferred.complete(true)
476474
}
@@ -543,7 +541,7 @@ object Assists {
543541
switchWindowIntervalDelay: Long = 250,
544542
duration: Long = 25
545543
): Boolean {
546-
runMain { AssistsWindowManager.untouchableByAll() }
544+
runMain { AssistsWindowManager.nonTouchableByAll() }
547545
delay(switchWindowIntervalDelay)
548546
val rect = getBoundsInScreen()
549547
val result = gesture(
@@ -562,7 +560,7 @@ object Assists {
562560
* @return 执行结果,true成功,false失败
563561
*/
564562
fun back(): Boolean {
565-
return service?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK) ?: false
563+
return AssistsService.instance?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK) ?: false
566564
}
567565

568566

@@ -571,23 +569,23 @@ object Assists {
571569
* @return 执行结果,true成功,false失败
572570
*/
573571
fun home(): Boolean {
574-
return service?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME) ?: false
572+
return AssistsService.instance?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME) ?: false
575573
}
576574

577575
/**
578576
* 显示通知栏
579577
* @return 执行结果,true成功,false失败
580578
*/
581579
fun notifications(): Boolean {
582-
return service?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS) ?: false
580+
return AssistsService.instance?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS) ?: false
583581
}
584582

585583
/**
586584
* 最近任务
587585
* @return 执行结果,true成功,false失败
588586
*/
589-
fun tasks(): Boolean {
590-
return service?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS) ?: false
587+
fun recentApps(): Boolean {
588+
return AssistsService.instance?.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS) ?: false
591589
}
592590

593591
/**
@@ -596,7 +594,7 @@ object Assists {
596594
*/
597595
fun AccessibilityNodeInfo.paste(text: String?): Boolean {
598596
performAction(AccessibilityNodeInfo.ACTION_FOCUS)
599-
service?.let {
597+
AssistsService.instance?.let {
600598
val clip = ClipData.newPlainText("${System.currentTimeMillis()}", text)
601599
val clipboardManager = (it.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager)
602600
clipboardManager.setPrimaryClip(clip)
@@ -657,7 +655,7 @@ object Assists {
657655
* 获取当前app在屏幕中的位置,如果找不到android:id/content节点则为空
658656
*/
659657
fun getAppBoundsInScreen(): Rect? {
660-
return service?.let {
658+
return AssistsService.instance?.let {
661659
return@let findById("android:id/content").firstOrNull()?.getBoundsInScreen()
662660
}
663661
}
Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,20 @@
1-
package com.ven.assists
1+
package com.ven.assists.service
22

3-
import android.accessibilityservice.AccessibilityGestureEvent
43
import android.accessibilityservice.AccessibilityService
54
import android.content.Intent
6-
import android.util.Log
7-
import android.view.KeyEvent
8-
import android.view.MotionEvent
95
import android.view.accessibility.AccessibilityEvent
10-
import com.blankj.utilcode.util.ActivityUtils
116
import com.blankj.utilcode.util.LogUtils
12-
import com.ven.assists.utils.CoroutineWrapper
13-
import kotlinx.coroutines.flow.MutableSharedFlow
7+
import com.ven.assists.Assists
8+
import com.ven.assists.window.AssistsWindowManager
9+
import java.util.Collections
1410

1511
class AssistsService : AccessibilityService() {
1612
companion object {
17-
18-
val event = MutableSharedFlow<Int>()
19-
20-
/**
21-
* 无障碍服务,未开启前为null,使用注意判空
22-
*/
2313
var instance: AssistsService? = null
2414
private set
25-
}
26-
2715

16+
val listeners: MutableList<AssistsServiceListener> = Collections.synchronizedList(arrayListOf<AssistsServiceListener>())
17+
}
2818

2919
override fun onCreate() {
3020
super.onCreate()
@@ -35,23 +25,22 @@ class AssistsService : AccessibilityService() {
3525
super.onServiceConnected()
3626
instance = this
3727
AssistsWindowManager.init(this)
38-
Assists.serviceListeners.forEach { it.onServiceConnected(this) }
39-
CoroutineWrapper.launch { event.emit(1) }
28+
runCatching { listeners.forEach { it.onServiceConnected(this) } }
4029
LogUtils.d(Assists.LOG_TAG, "assists service on service connected")
4130
}
4231

4332
override fun onAccessibilityEvent(event: AccessibilityEvent) {
4433
instance = this
45-
Assists.serviceListeners.forEach { it.onAccessibilityEvent(event) }
34+
runCatching { listeners.forEach { it.onAccessibilityEvent(event) } }
4635
}
4736

4837
override fun onUnbind(intent: Intent?): Boolean {
4938
instance = null
50-
Assists.serviceListeners.forEach { it.onUnbind() }
39+
runCatching { listeners.forEach { it.onUnbind() } }
5140
return super.onUnbind(intent)
5241
}
5342

5443
override fun onInterrupt() {
55-
Assists.serviceListeners.forEach { it.onInterrupt() }
44+
runCatching { listeners.forEach { it.onInterrupt() } }
5645
}
5746
}

assists/src/main/java/com/ven/assists/service/AssistsServiceListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.ven.assists
1+
package com.ven.assists.service
22

33
import android.view.accessibility.AccessibilityEvent
44

assists/src/main/java/com/ven/assists/utils/AssistsFileProvider.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
1-
package com.ven.assists
1+
package com.ven.assists.utils
22

3-
import android.app.Activity
4-
import android.app.Activity.RESULT_OK
53
import android.app.Application
6-
import android.content.Intent
7-
import android.os.Bundle
8-
import androidx.activity.ComponentActivity
9-
import androidx.activity.result.ActivityResultLauncher
10-
import androidx.activity.result.contract.ActivityResultContracts
114
import androidx.core.content.FileProvider
12-
import com.blankj.utilcode.util.LogUtils
5+
import com.ven.assists.Assists
136

147
class AssistsFileProvider : FileProvider() {
158
override fun onCreate(): Boolean {

assists/src/main/java/com/ven/assists/utils/NodeClassValue.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.ven.assists
1+
package com.ven.assists.utils
22

33
object NodeClassValue {
44
val ImageView="android.widget.ImageView"

0 commit comments

Comments
 (0)