@@ -16,30 +16,21 @@ import android.provider.Settings
1616import android.text.TextUtils
1717import android.util.Log
1818import android.view.accessibility.AccessibilityNodeInfo
19- import androidx.annotation.RequiresApi
2019import androidx.core.os.bundleOf
2120import com.blankj.utilcode.util.ActivityUtils
2221import com.blankj.utilcode.util.LogUtils
2322import com.blankj.utilcode.util.ScreenUtils
23+ import com.ven.assists.service.AssistsService
2424import com.ven.assists.utils.CoroutineWrapper
25+ import com.ven.assists.utils.NodeClassValue
2526import com.ven.assists.utils.runMain
27+ import com.ven.assists.window.AssistsWindowManager
2628import kotlinx.coroutines.CompletableDeferred
27- import kotlinx.coroutines.CoroutineScope
28- import kotlinx.coroutines.Dispatchers
29- import kotlinx.coroutines.Job
3029import kotlinx.coroutines.delay
31- import kotlinx.coroutines.launch
3230
3331object 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 }
0 commit comments