diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8cbc7ed..984d31a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -52,6 +52,17 @@
+
+
+
+
+
+
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
new file mode 100644
index 0000000..58da7a8
--- /dev/null
+++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAccessibilityService.kt
@@ -0,0 +1,51 @@
+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 4d5c8f4..ed7f003 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,6 +10,7 @@ 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
@@ -71,6 +72,12 @@ enum class LauncherAction(
R.drawable.baseline_settings_applications_24,
::expandSettingsPanel
),
+ LOCK_SCREEN(
+ "launcher:lockScreen",
+ R.string.list_other_lock_screen,
+ R.drawable.baseline_lock_24px,
+ ::lockScreen
+ ),
NOP("launcher:nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {});
override fun invoke(context: Context, rect: Rect?): Boolean {
@@ -199,6 +206,19 @@ 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/res/drawable/baseline_lock_24px.xml b/app/src/main/res/drawable/baseline_lock_24px.xml
new file mode 100644
index 0000000..11d93f2
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_lock_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c17d4e3..fd7b221 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,13 +1,18 @@
-
+ Enable lock screen action
+
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+