From cc64745c0fdb356b5e59955c48fcb37fde8798f4 Mon Sep 17 00:00:00 2001 From: yzqzss Date: Wed, 27 Nov 2024 23:46:08 +0800 Subject: [PATCH 1/2] fix: accessbility `isEnabled()` false positive --- .../lock/LauncherAccessibilityService.kt | 28 +++++++++++++------ app/src/main/res/values/strings.xml | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt index 969b493..2a0d6b6 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt @@ -5,6 +5,8 @@ import android.accessibilityservice.AccessibilityServiceInfo import android.content.Context import android.content.Intent import android.os.Build +import android.provider.Settings +import android.util.Log import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityManager import android.widget.Toast @@ -42,15 +44,18 @@ class LauncherAccessibilityService : AccessibilityService() { } fun isEnabled(context: Context): Boolean { - val accessibilityManager = - context.getSystemService() ?: return false - val enabledServices = - accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK) - return enabledServices.any { - it.id.startsWith(BuildConfig.APPLICATION_ID) + val enabledServices = Settings.Secure.getString(context.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES) + for (service in enabledServices.split(":")) { + val pkg = service.split("/")[0] + val serviceClass = service.split("/")[1] + if (pkg == context.packageName && serviceClass == LauncherAccessibilityService::class.java.name) { + Log.d("ServiceEnabled", "true") + return true + } } + Log.d("ServiceEnabled", "false") + return false } - } @@ -87,6 +92,13 @@ class LauncherAccessibilityService : AccessibilityService() { return } - performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN) + val success = performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN) + if (!success) { + Toast.makeText( + this, + getText(R.string.alert_lock_screen_failed), + Toast.LENGTH_LONG + ).show() + } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d0e8dea..aac7246 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -247,7 +247,7 @@ Enable the lock screen action No camera with torch detected. Error: Can\'t access torch. - Error: Failed to lock screen. + Error: Failed to lock screen. (if you just upgraded/reinstalled the app, try to disable and re-enable the accessibility service in phone settings) μLauncher\'s accessibility service is not enabled. Please enable it in settings Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead. µLauncher - lock screen From edc4927f1a8caae8ee650dc61d703d0f0332475b Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Wed, 27 Nov 2024 17:31:42 +0100 Subject: [PATCH 2/2] some refactoring --- .../lock/LauncherAccessibilityService.kt | 37 ++++++++++--------- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt index 2a0d6b6..bdc5882 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LauncherAccessibilityService.kt @@ -23,6 +23,7 @@ class LauncherAccessibilityService : AccessibilityService() { } companion object { + private const val TAG = "Launcher Accessibility" const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN" fun lockScreen(context: Context) { @@ -44,17 +45,14 @@ class LauncherAccessibilityService : AccessibilityService() { } fun isEnabled(context: Context): Boolean { - val enabledServices = Settings.Secure.getString(context.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES) - for (service in enabledServices.split(":")) { - val pkg = service.split("/")[0] - val serviceClass = service.split("/")[1] - if (pkg == context.packageName && serviceClass == LauncherAccessibilityService::class.java.name) { - Log.d("ServiceEnabled", "true") - return true - } - } - Log.d("ServiceEnabled", "false") - return false + val enabledServices = Settings.Secure.getString( + context.contentResolver, + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES + ) ?: return false + + return enabledServices.split(":") + .contains("${context.packageName}/${LauncherAccessibilityService::class.java.name}") + .also { Log.d(TAG, "Accessibility Service enabled: $it") } } } @@ -67,11 +65,7 @@ class LauncherAccessibilityService : AccessibilityService() { getString(R.string.toast_accessibility_service_not_enabled), Toast.LENGTH_LONG ).show() - startActivity( - Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS).addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK - ) - ) + requestEnable() return START_NOT_STICKY } @@ -82,6 +76,14 @@ class LauncherAccessibilityService : AccessibilityService() { return super.onStartCommand(intent, flags, startId) } + private fun requestEnable() { + startActivity( + Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK + ) + ) + } + private fun handleLockScreen() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { Toast.makeText( @@ -98,7 +100,8 @@ class LauncherAccessibilityService : AccessibilityService() { this, getText(R.string.alert_lock_screen_failed), Toast.LENGTH_LONG - ).show() + ).show() + requestEnable() } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aac7246..41009a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -247,7 +247,7 @@ Enable the lock screen action No camera with torch detected. Error: Can\'t access torch. - Error: Failed to lock screen. (if you just upgraded/reinstalled the app, try to disable and re-enable the accessibility service in phone settings) + Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings) μLauncher\'s accessibility service is not enabled. Please enable it in settings Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead. µLauncher - lock screen