@@ -3,11 +3,23 @@ package com.ven.assists.web
33import android.annotation.SuppressLint
44import android.content.Context
55import android.util.AttributeSet
6+ import android.view.accessibility.AccessibilityEvent
67import android.webkit.WebView
78import android.webkit.WebViewClient
89import android.webkit.WebChromeClient
10+ import com.blankj.utilcode.util.GsonUtils
11+ import com.blankj.utilcode.util.LogUtils
12+ import com.google.gson.JsonArray
13+ import com.google.gson.JsonObject
14+ import com.ven.assists.AssistsCore
15+ import com.ven.assists.service.AssistsService
16+ import com.ven.assists.service.AssistsServiceListener
17+ import com.ven.assists.utils.CoroutineWrapper
18+ import com.ven.assists.utils.runMain
919import kotlinx.coroutines.CoroutineScope
1020import kotlinx.coroutines.Dispatchers
21+ import kotlinx.coroutines.Job
22+ import kotlinx.coroutines.launch
1123
1224@SuppressLint(" SetJavaScriptEnabled" )
1325class ASWebView @JvmOverloads constructor(
@@ -27,6 +39,30 @@ class ASWebView @JvmOverloads constructor(
2739 javascriptInterface.callIntercept = value
2840 }
2941
42+ val assistsServiceListener = object : AssistsServiceListener {
43+ override fun onAccessibilityEvent (event : AccessibilityEvent ) {
44+ runCatching {
45+ val node = event.source?.toNode()
46+ val jsonObject = JsonObject ().apply {
47+ addProperty(" packageName" , event.packageName?.toString() ? : " " )
48+ addProperty(" className" , event.className?.toString() ? : " " )
49+ addProperty(" eventType" , event.eventType)
50+ addProperty(" action" , event.action)
51+ add(" texts" , JsonArray ().apply {
52+ event.text.forEach { text -> this .add(text.toString()) }
53+ })
54+ node?.let {
55+ val element = GsonUtils .getGson().toJsonTree(node)
56+ add(" node" , element.asJsonObject)
57+ }
58+ }
59+ onAccessibilityEvent(CallResponse (code = 0 , data = jsonObject))
60+ }.onFailure {
61+ LogUtils .e(it)
62+ }
63+ }
64+ }
65+
3066
3167 init {
3268 // 初始化WebView设置
@@ -70,5 +106,20 @@ class ASWebView @JvmOverloads constructor(
70106 isFocusableInTouchMode = true
71107 isFocusable = true
72108 addJavascriptInterface(javascriptInterface, " assistsx" )
109+ AssistsService .listeners.add(assistsServiceListener)
110+ }
111+
112+ fun <T > onAccessibilityEvent (result : CallResponse <T >) {
113+ runCatching {
114+ val json = GsonUtils .toJson(result)
115+ evaluateJavascript(" javascript:onAccessibilityEvent('${json} ')" , null )
116+ }.onFailure {
117+ LogUtils .e(it)
118+ }
119+ }
120+
121+ override fun onDetachedFromWindow () {
122+ super .onDetachedFromWindow()
123+ AssistsService .listeners.remove(assistsServiceListener)
73124 }
74125}
0 commit comments