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+