PM-14435: Improve accessibility service detection (#4864)

This commit is contained in:
David Perez
2025-03-14 09:16:25 -05:00
committed by GitHub
parent e2779e4edb
commit 47abeb7843
4 changed files with 41 additions and 5 deletions

View File

@@ -6,6 +6,11 @@ package com.x8bit.bitwarden
const val LEGACY_ACCESSIBILITY_SERVICE_NAME: String = const val LEGACY_ACCESSIBILITY_SERVICE_NAME: String =
"com.x8bit.bitwarden.Accessibility.AccessibilityService" "com.x8bit.bitwarden.Accessibility.AccessibilityService"
/**
* The short form legacy name for the accessibility service.
*/
const val LEGACY_SHORT_ACCESSIBILITY_SERVICE_NAME: String = ".Accessibility.AccessibilityService"
/** /**
* The legacy name for the autofill service. * The legacy name for the autofill service.
*/ */

View File

@@ -32,6 +32,11 @@ class BitwardenAccessibilityService : AccessibilityService() {
override fun onInterrupt() = Unit override fun onInterrupt() = Unit
override fun onCreate() {
super.onCreate()
accessibilityEnabledManager.refreshAccessibilityEnabledFromSettings()
}
override fun onUnbind(intent: Intent?): Boolean { override fun onUnbind(intent: Intent?): Boolean {
return super return super
.onUnbind(intent) .onUnbind(intent)

View File

@@ -3,7 +3,9 @@ package com.x8bit.bitwarden.data.autofill.accessibility.util
import android.content.Context import android.content.Context
import android.provider.Settings import android.provider.Settings
import com.x8bit.bitwarden.LEGACY_ACCESSIBILITY_SERVICE_NAME import com.x8bit.bitwarden.LEGACY_ACCESSIBILITY_SERVICE_NAME
import com.x8bit.bitwarden.LEGACY_SHORT_ACCESSIBILITY_SERVICE_NAME
import com.x8bit.bitwarden.data.autofill.accessibility.BitwardenAccessibilityService import com.x8bit.bitwarden.data.autofill.accessibility.BitwardenAccessibilityService
import com.x8bit.bitwarden.data.autofill.util.containsAnyTerms
/** /**
* Helper method to determine if the [BitwardenAccessibilityService] is enabled. * Helper method to determine if the [BitwardenAccessibilityService] is enabled.
@@ -11,16 +13,25 @@ import com.x8bit.bitwarden.data.autofill.accessibility.BitwardenAccessibilitySer
val Context.isAccessibilityServiceEnabled: Boolean val Context.isAccessibilityServiceEnabled: Boolean
get() { get() {
val appContext = this.applicationContext val appContext = this.applicationContext
val accessibilityServiceName = appContext val packageName = appContext.packageName
.packageName val accessibilityServiceName = packageName?.let {
?.let { "$it/$LEGACY_ACCESSIBILITY_SERVICE_NAME" } "$it/$LEGACY_ACCESSIBILITY_SERVICE_NAME"
?: return false }
val shortAccessibilityServiceName = packageName.let {
"$it/$LEGACY_SHORT_ACCESSIBILITY_SERVICE_NAME"
}
return Settings return Settings
.Secure .Secure
.getString( .getString(
appContext.contentResolver, appContext.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
) )
?.contains(accessibilityServiceName) ?.containsAnyTerms(
terms = listOfNotNull(
accessibilityServiceName,
shortAccessibilityServiceName,
),
ignoreCase = true,
)
?: false ?: false
} }

View File

@@ -29,6 +29,7 @@ class ContextExtensionsTest {
val context: Context = mockk { val context: Context = mockk {
every { applicationContext } returns this every { applicationContext } returns this
every { packageName } returns null every { packageName } returns null
every { contentResolver } returns mockk()
} }
assertFalse(context.isAccessibilityServiceEnabled) assertFalse(context.isAccessibilityServiceEnabled)
@@ -75,6 +76,20 @@ class ContextExtensionsTest {
assertTrue(context.isAccessibilityServiceEnabled) assertTrue(context.isAccessibilityServiceEnabled)
} }
@Test
fun `isAccessibilityServiceEnabled with correct abbreviated secure string returns true`() {
val context: Context = mockk {
every { applicationContext } returns this
every { packageName } returns "com.x8bit.bitwarden"
every { contentResolver } returns mockk()
}
mockkSettingsSecureGetString(
value = "com.x8bit.bitwarden/.Accessibility.AccessibilityService",
)
assertTrue(context.isAccessibilityServiceEnabled)
}
private fun mockkSettingsSecureGetString(value: String?) { private fun mockkSettingsSecureGetString(value: String?) {
every { every {
Settings.Secure.getString(any(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES) Settings.Secure.getString(any(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)