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+