Skip to content

Commit

Permalink
perf: 过滤无关无障碍事件
Browse files Browse the repository at this point in the history
perf: 快速过滤掉不感兴趣的事件,避免不必要的函数调用。(在 VIEW_SCROLL 这种场景下开销会很明显)
  • Loading branch information
lisonge authored Dec 26, 2023
2 parents 396a914 + e5d96dc commit a8ad0c9
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ package li.songe.gkd.composition
import android.view.accessibility.AccessibilityEvent

interface CanOnAccessibilityEvent {
fun onAccessibilityEvent(f: (AccessibilityEvent?) -> Unit):Boolean
fun onAccessibilityEvent(f: (AccessibilityEvent) -> Unit): Boolean
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,17 @@ open class CompositionAbService(
destroyHooks.forEach { f -> f() }
}

private val onAccessibilityEventHooks by lazy { linkedSetOf<(AccessibilityEvent?) -> Unit>() }
override fun onAccessibilityEvent(f: (AccessibilityEvent?) -> Unit) =
private val onAccessibilityEventHooks by lazy { linkedSetOf<(AccessibilityEvent) -> Unit>() }
private val interestedEvents =
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED or AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED

override fun onAccessibilityEvent(f: (AccessibilityEvent) -> Unit) =
onAccessibilityEventHooks.add(f)

override fun onAccessibilityEvent(event: AccessibilityEvent?) {
onAccessibilityEventHooks.forEach { f -> f(event) }
if (event != null && event.eventType.and(interestedEvents) != 0) {
onAccessibilityEventHooks.forEach { f -> f(event) }
}
}


Expand Down
13 changes: 4 additions & 9 deletions app/src/main/kotlin/li/songe/gkd/service/GkdAbService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class GkdAbService : CompositionAbService({
val shizukuGrantFlow = MutableStateFlow(false)
var lastCheckShizukuTime = 0L
onAccessibilityEvent { // 借助无障碍轮询校验 shizuku 权限
if (storeFlow.value.enableService && it?.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// 筛选降低判断频率
if (storeFlow.value.enableService && it.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// 筛选降低判断频率
val t = System.currentTimeMillis()
if (t - lastCheckShizukuTime > 5000L) {
lastCheckShizukuTime = t
Expand Down Expand Up @@ -181,12 +181,8 @@ class GkdAbService : CompositionAbService({

val skipAppIds = listOf("com.android.systemui")
onAccessibilityEvent { event ->
if (event?.packageName == null) return@onAccessibilityEvent
if (!(event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)) return@onAccessibilityEvent

if (event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && skipAppIds.contains(
event.packageName.toString()
)
if (event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED &&
skipAppIds.contains(event.packageName.toString())
) {
return@onAccessibilityEvent
}
Expand Down Expand Up @@ -302,7 +298,7 @@ class GkdAbService : CompositionAbService({

var lastUpdateSubsTime = 0L
onAccessibilityEvent {
if (it?.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// 筛选降低判断频率
if (it.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// 筛选降低判断频率
// 借助 无障碍事件 触发自动检测更新
val i = storeFlow.value.updateSubsInterval
val t = System.currentTimeMillis()
Expand Down Expand Up @@ -421,7 +417,6 @@ class GkdAbService : CompositionAbService({

onAccessibilityEvent { e ->
if (!storeFlow.value.captureScreenshot) return@onAccessibilityEvent
e ?: return@onAccessibilityEvent
val appId = e.packageName ?: return@onAccessibilityEvent
val appCls = e.className ?: return@onAccessibilityEvent
if (appId.contentEquals("com.miui.screenshot") && e.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !e.isFullScreen && appCls.contentEquals(
Expand Down

0 comments on commit a8ad0c9

Please sign in to comment.