From 47abeb7843b93bd6717f2ef5a9f2e328f4edf58a Mon Sep 17 00:00:00 2001 From: David Perez Date: Fri, 14 Mar 2025 09:16:25 -0500 Subject: [PATCH] PM-14435: Improve accessibility service detection (#4864) --- .../bitwarden/BitwardenLegacyAppComponents.kt | 5 +++++ .../BitwardenAccessibilityService.kt | 5 +++++ .../accessibility/util/ContextExtensions.kt | 21 ++++++++++++++----- .../util/ContextExtensionsTest.kt | 15 +++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/BitwardenLegacyAppComponents.kt b/app/src/main/java/com/x8bit/bitwarden/BitwardenLegacyAppComponents.kt index 5c9f112758..8adb4181c2 100644 --- a/app/src/main/java/com/x8bit/bitwarden/BitwardenLegacyAppComponents.kt +++ b/app/src/main/java/com/x8bit/bitwarden/BitwardenLegacyAppComponents.kt @@ -6,6 +6,11 @@ package com.x8bit.bitwarden const val LEGACY_ACCESSIBILITY_SERVICE_NAME: String = "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. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/BitwardenAccessibilityService.kt b/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/BitwardenAccessibilityService.kt index 25271e99ed..d0fc977663 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/BitwardenAccessibilityService.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/BitwardenAccessibilityService.kt @@ -32,6 +32,11 @@ class BitwardenAccessibilityService : AccessibilityService() { override fun onInterrupt() = Unit + override fun onCreate() { + super.onCreate() + accessibilityEnabledManager.refreshAccessibilityEnabledFromSettings() + } + override fun onUnbind(intent: Intent?): Boolean { return super .onUnbind(intent) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensions.kt index 58c1e6615a..b83a26047f 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensions.kt @@ -3,7 +3,9 @@ package com.x8bit.bitwarden.data.autofill.accessibility.util import android.content.Context import android.provider.Settings 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.util.containsAnyTerms /** * 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 get() { val appContext = this.applicationContext - val accessibilityServiceName = appContext - .packageName - ?.let { "$it/$LEGACY_ACCESSIBILITY_SERVICE_NAME" } - ?: return false + val packageName = appContext.packageName + val accessibilityServiceName = packageName?.let { + "$it/$LEGACY_ACCESSIBILITY_SERVICE_NAME" + } + val shortAccessibilityServiceName = packageName.let { + "$it/$LEGACY_SHORT_ACCESSIBILITY_SERVICE_NAME" + } return Settings .Secure .getString( appContext.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ) - ?.contains(accessibilityServiceName) + ?.containsAnyTerms( + terms = listOfNotNull( + accessibilityServiceName, + shortAccessibilityServiceName, + ), + ignoreCase = true, + ) ?: false } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensionsTest.kt index 204998dbca..f0faaa7205 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/autofill/accessibility/util/ContextExtensionsTest.kt @@ -29,6 +29,7 @@ class ContextExtensionsTest { val context: Context = mockk { every { applicationContext } returns this every { packageName } returns null + every { contentResolver } returns mockk() } assertFalse(context.isAccessibilityServiceEnabled) @@ -75,6 +76,20 @@ class ContextExtensionsTest { 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?) { every { Settings.Secure.getString(any(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)