From 3423534085c88907df8826f97920bfa4ae5d0474 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Fri, 1 Nov 2024 21:35:31 +0100 Subject: [PATCH] lock screen: use device admin instead of accessibility service --- app/src/main/AndroidManifest.xml | 25 ++++----- .../actions/LauncherAccessibilityService.kt | 51 ------------------ .../launcher/actions/LauncherAction.kt | 17 +----- .../launcher/actions/LauncherDeviceAdmin.kt | 53 +++++++++++++++++++ app/src/main/res/values/strings.xml | 17 +++--- .../res/xml/accessibility_service_config.xml | 7 --- app/src/main/res/xml/device_admin_config.xml | 6 +++ 7 files changed, 80 insertions(+), 96 deletions(-) delete mode 100644 app/src/main/java/de/jrpie/android/launcher/actions/LauncherAccessibilityService.kt create mode 100644 app/src/main/java/de/jrpie/android/launcher/actions/LauncherDeviceAdmin.kt delete mode 100644 app/src/main/res/xml/accessibility_service_config.xml create mode 100644 app/src/main/res/xml/device_admin_config.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 984d31a..b06b1ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,17 +52,18 @@ - - - - - - - + + + + + + + + diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAccessibilityService.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAccessibilityService.kt deleted file mode 100644 index 58da7a8..0000000 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAccessibilityService.kt +++ /dev/null @@ -1,51 +0,0 @@ -package de.jrpie.android.launcher.actions - -import android.accessibilityservice.AccessibilityService -import android.accessibilityservice.AccessibilityServiceInfo -import android.content.Intent -import android.os.Build -import android.view.accessibility.AccessibilityEvent -import android.view.accessibility.AccessibilityManager -import android.widget.Toast -import androidx.core.content.getSystemService -import de.jrpie.android.launcher.R - -class LauncherAccessibilityService : AccessibilityService() { - override fun onInterrupt() { - } - override fun onAccessibilityEvent(event: AccessibilityEvent?) { - } - - companion object { - const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN" - } - - private fun isServiceEnabled(): Boolean { - val accessibilityManager = getSystemService() ?: return false - val enabledServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK) - return enabledServices.any { it.id.contains(packageName) } - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - intent?.action?.let { action -> - if (!isServiceEnabled()) { - Toast.makeText(this, 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)) - return START_NOT_STICKY - } - - when (action) { - ACTION_LOCK_SCREEN -> handleLockScreen() - } - } - return super.onStartCommand(intent, flags, startId) - } - - private fun handleLockScreen(){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN) - } else { - Toast.makeText(this, getText(R.string.toast_lock_screen_not_supported), Toast.LENGTH_SHORT).show() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index ed7f003..03ca088 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -10,7 +10,6 @@ import android.os.SystemClock import android.view.KeyEvent import android.widget.Toast import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.actions.LauncherAccessibilityService.Companion.ACTION_LOCK_SCREEN import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.AppInfo.Companion.INVALID_USER import de.jrpie.android.launcher.ui.list.ListActivity @@ -76,7 +75,7 @@ enum class LauncherAction( "launcher:lockScreen", R.string.list_other_lock_screen, R.drawable.baseline_lock_24px, - ::lockScreen + LauncherDeviceAdmin::lockScreen ), NOP("launcher:nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {}); @@ -206,20 +205,6 @@ private fun expandSettingsPanel(context: Context) { } } -private fun lockScreen(context: Context){ - try { - context.startService(Intent(context, LauncherAccessibilityService::class.java).apply { - action = ACTION_LOCK_SCREEN - }) - } catch (e: Exception) { - Toast.makeText( - context, - context.getString(R.string.alert_lock_screen_failed), - Toast.LENGTH_LONG - ).show() - } -} - private fun openSettings(context: Context) { context.startActivity(Intent(context, SettingsActivity::class.java)) } diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherDeviceAdmin.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherDeviceAdmin.kt new file mode 100644 index 0000000..22ba2f1 --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherDeviceAdmin.kt @@ -0,0 +1,53 @@ +package de.jrpie.android.launcher.actions + +import android.app.Activity +import android.app.admin.DeviceAdminReceiver +import android.app.admin.DevicePolicyManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.widget.Toast +import de.jrpie.android.launcher.R + +class LauncherDeviceAdmin : DeviceAdminReceiver() { + companion object { + private fun getComponentName(context: Context): ComponentName { + return ComponentName(context, LauncherDeviceAdmin::class.java) + } + + private fun requestDeviceAdmin(context: Context) { + + val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply { + putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, getComponentName(context)) + putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, + context.getString(R.string.device_admin_explanation)) + } + context.startActivity(intent) + + } + + private fun assertDeviceAdmin(context: Context): Boolean { + val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager + if (!dpm.isAdminActive(getComponentName(context))) { + Toast.makeText( + context, + context.getString(R.string.toast_device_admin_not_enabled), + Toast.LENGTH_LONG + ).show() + requestDeviceAdmin(context) + return false + } + + return true + } + + fun lockScreen(context: Context) { + assertDeviceAdmin(context) || return + + val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager + dpm.lockNow() + } + } + + +} \ 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 fd7b221..09ecd60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,18 +1,13 @@ - Enable lock screen action + - + - Home + - + --> Can\'t open app Want to change its settings? - Failed to lock screen - Open settings to choose an action for this gesture - μLauncher\'s accessibility service is not enabled. Please enable it in settings - Sorry, lock screen is available on Android 9+