Skip to content

Commit 0464588

Browse files
committed
fix issue of accessibility service not being shown as enabled
1 parent 5e73bfe commit 0464588

2 files changed

Lines changed: 55 additions & 8 deletions

File tree

app/src/main/java/com/ah/taplock/MainActivity.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,19 @@ import android.appwidget.AppWidgetManager
55
import android.content.ComponentName
66
import android.content.Context
77
import android.content.Intent
8+
import android.database.ContentObserver
89
import android.graphics.Bitmap
910
import android.graphics.BitmapFactory
1011
import android.graphics.drawable.Icon
1112
import android.os.Build
1213
import android.os.Bundle
14+
import android.os.Handler
15+
import android.os.Looper
1316
import android.os.PowerManager
1417
import android.provider.Settings
1518
import android.util.Log
1619
import android.widget.Toast
20+
import android.view.accessibility.AccessibilityManager
1721
import androidx.activity.ComponentActivity
1822
import androidx.activity.compose.rememberLauncherForActivityResult
1923
import androidx.activity.compose.setContent
@@ -530,6 +534,36 @@ fun TapLockScreen() {
530534

531535
DisposableEffect(Unit) {
532536
val lifecycleOwner = context as ComponentActivity
537+
val accessibilityManager =
538+
context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
539+
540+
val refreshAccessibilityState = {
541+
isAccessibilityEnabled = isAccessibilityEnabled(context)
542+
}
543+
544+
val accessibilityObserver =
545+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
546+
val listener =
547+
AccessibilityManager.AccessibilityServicesStateChangeListener {
548+
refreshAccessibilityState()
549+
}
550+
accessibilityManager.addAccessibilityServicesStateChangeListener(listener)
551+
listener
552+
} else {
553+
val observer = object : ContentObserver(Handler(Looper.getMainLooper())) {
554+
override fun onChange(selfChange: Boolean) {
555+
refreshAccessibilityState()
556+
}
557+
}
558+
context.contentResolver.registerContentObserver(
559+
Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES),
560+
false,
561+
observer
562+
)
563+
observer
564+
}
565+
refreshAccessibilityState()
566+
533567
val observer = LifecycleEventObserver { _, event ->
534568
if (event == Lifecycle.Event.ON_RESUME) {
535569
isAccessibilityEnabled = isAccessibilityEnabled(context)
@@ -600,6 +634,13 @@ fun TapLockScreen() {
600634
}
601635
lifecycleOwner.lifecycle.addObserver(observer)
602636
onDispose {
637+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
638+
accessibilityManager.removeAccessibilityServicesStateChangeListener(
639+
accessibilityObserver as AccessibilityManager.AccessibilityServicesStateChangeListener
640+
)
641+
} else {
642+
context.contentResolver.unregisterContentObserver(accessibilityObserver as ContentObserver)
643+
}
603644
lifecycleOwner.lifecycle.removeObserver(observer)
604645
}
605646
}
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.ah.taplock
22

3+
import android.accessibilityservice.AccessibilityServiceInfo
4+
import android.content.ComponentName
35
import android.content.Context
4-
import android.provider.Settings
6+
import android.view.accessibility.AccessibilityManager
57

68
fun isAccessibilityEnabled(context: Context): Boolean {
7-
val enabledServices = Settings.Secure.getString(
8-
context.contentResolver,
9-
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
10-
)
11-
val serviceName = "${context.packageName}/${TapLockAccessibilityService::class.java.name}"
12-
return enabledServices?.contains(serviceName) == true
13-
}
9+
val accessibilityManager =
10+
context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
11+
val serviceComponent = ComponentName(context, TapLockAccessibilityService::class.java)
12+
13+
return accessibilityManager
14+
.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK)
15+
.any { serviceInfo ->
16+
val resolveInfo = serviceInfo.resolveInfo.serviceInfo
17+
ComponentName(resolveInfo.packageName, resolveInfo.name) == serviceComponent
18+
}
19+
}

0 commit comments

Comments
 (0)