Skip to content

Commit 112256a

Browse files
committed
increase accuracy of activity events
1 parent 3d089fe commit 112256a

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

app/src/main/java/io/github/ratul/topactivity/extensions/GenericExtensions.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717
package io.github.ratul.topactivity.extensions
1818

19+
import android.content.ComponentName
1920
import android.content.Context
21+
import android.content.pm.PackageManager
2022
import android.os.Build
2123
import android.util.DisplayMetrics
2224
import android.util.TypedValue
@@ -60,4 +62,18 @@ fun WindowManager.getScreenSize(): Pair<Int, Int> {
6062
defaultDisplay.getMetrics(displayMetrics)
6163
Pair(displayMetrics.widthPixels, displayMetrics.heightPixels)
6264
}
65+
}
66+
67+
fun PackageManager.isActivity(pkg: String, cls: String): Boolean {
68+
return try {
69+
val component = ComponentName(pkg, cls)
70+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
71+
getActivityInfo(component, 0)
72+
} else {
73+
getActivityInfo(component, PackageManager.ComponentInfoFlags.of(0))
74+
}
75+
true
76+
} catch (_: PackageManager.NameNotFoundException) {
77+
false
78+
}
6379
}

app/src/main/java/io/github/ratul/topactivity/services/AccessibilityMonitoringService.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,33 @@ package io.github.ratul.topactivity.services
1919
import android.accessibilityservice.AccessibilityService
2020
import android.annotation.SuppressLint
2121
import android.content.Intent
22+
import android.util.LruCache
2223
import android.view.accessibility.AccessibilityEvent
24+
import io.github.ratul.topactivity.extensions.isActivity
2325
import io.github.ratul.topactivity.repository.DataRepository
2426

2527
@SuppressLint("AccessibilityPolicy")
2628
class AccessibilityMonitoringService : AccessibilityService() {
2729

30+
private val activityCache = LruCache<String, Boolean>(500)
31+
2832
override fun onAccessibilityEvent(event: AccessibilityEvent) {
2933
if (!DataRepository.appState.value.running) return
3034

31-
val pkgName = event.packageName?.toString() ?: return
32-
val className = event.className?.toString() ?: return
35+
val pkg = event.packageName?.toString() ?: return
36+
val cls = event.className?.toString() ?: return
37+
val cacheKey = "$pkg/$cls"
38+
39+
val isCachedActivity = activityCache[cacheKey]
40+
if (isCachedActivity != null) {
41+
if (isCachedActivity) DataRepository.updateData(pkg, cls)
42+
return
43+
}
44+
45+
val isActivity = packageManager.isActivity(pkg, cls)
46+
activityCache.put(cacheKey, isActivity)
3347

34-
DataRepository.updateData(pkgName, className)
48+
if (isActivity) DataRepository.updateData(pkg, cls)
3549
}
3650

3751
override fun onInterrupt() {}
@@ -51,6 +65,11 @@ class AccessibilityMonitoringService : AccessibilityService() {
5165
return true
5266
}
5367

68+
override fun onDestroy() {
69+
instance = null
70+
super.onDestroy()
71+
}
72+
5473
companion object {
5574
var instance: AccessibilityMonitoringService? = null
5675
private set

0 commit comments

Comments
 (0)