diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 93f6ce8..a5f8831 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -85,7 +85,7 @@
@@ -97,4 +97,4 @@
-
\ 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 5d2be94..ee9502c 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
@@ -11,7 +11,9 @@ import android.view.KeyEvent
import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import de.jrpie.android.launcher.Application
+import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.R
+import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
import de.jrpie.android.launcher.apps.AppFilter
import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked
import de.jrpie.android.launcher.apps.isPrivateSpaceSupported
@@ -132,6 +134,14 @@ enum class LauncherAction(
R.drawable.baseline_settings_applications_24,
::expandSettingsPanel
),
+ RECENT_APPS(
+ "recent_apps",
+ R.string.list_other_recent_apps,
+ R.drawable.baseline_apps_24,
+ LauncherAccessibilityService::openRecentApps,
+ false,
+ { _ -> BuildConfig.USE_ACCESSIBILITY_SERVICE }
+ ),
LOCK_SCREEN(
"lock_screen",
R.string.list_other_lock_screen,
@@ -142,7 +152,7 @@ enum class LauncherAction(
"toggle_torch",
R.string.list_other_torch,
R.drawable.baseline_flashlight_on_24,
- ::toggleTorch
+ ::toggleTorch,
),
NOP("nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {});
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 a8ef6f2..7cb32d9 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
@@ -22,26 +22,44 @@ class LauncherAccessibilityService : AccessibilityService() {
companion object {
private const val TAG = "Launcher Accessibility"
+ private const val ACTION_REQUEST_ENABLE = "ACTION_REQUEST_ENABLE"
const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN"
+ const val ACTION_RECENT_APPS = "ACTION_RECENT_APPS"
- fun lockScreen(context: Context) {
+ private fun invoke(context: Context, action: String, failureMessageRes: Int) {
try {
context.startService(
Intent(
context,
LauncherAccessibilityService::class.java
).apply {
- action = ACTION_LOCK_SCREEN
+ this.action = action
})
- } catch (e: Exception) {
+ } catch (_: Exception) {
Toast.makeText(
context,
- context.getString(R.string.alert_lock_screen_failed),
+ context.getString(failureMessageRes),
Toast.LENGTH_LONG
).show()
}
}
+ fun lockScreen(context: Context) {
+ if (!isEnabled(context)) {
+ showEnableDialog(context)
+ } else {
+ invoke(context, ACTION_LOCK_SCREEN, R.string.alert_lock_screen_failed)
+ }
+ }
+
+ fun openRecentApps(context: Context) {
+ if (!isEnabled(context)) {
+ showEnableDialog(context)
+ } else {
+ invoke(context, ACTION_RECENT_APPS, R.string.alert_recent_apps_failed)
+ }
+ }
+
fun isEnabled(context: Context): Boolean {
val enabledServices = Settings.Secure.getString(
context.contentResolver,
@@ -58,7 +76,7 @@ class LauncherAccessibilityService : AccessibilityService() {
setView(R.layout.dialog_consent_accessibility)
setTitle(R.string.dialog_consent_accessibility_title)
setPositiveButton(R.string.dialog_consent_accessibility_ok) { _, _ ->
- lockScreen(context)
+ invoke(context, ACTION_REQUEST_ENABLE, R.string.alert_enable_accessibility_failed)
}
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
}.create().also { it.show() }.apply {
@@ -94,7 +112,9 @@ class LauncherAccessibilityService : AccessibilityService() {
}
when (action) {
+ ACTION_REQUEST_ENABLE -> {} // do nothing
ACTION_LOCK_SCREEN -> handleLockScreen()
+ ACTION_RECENT_APPS -> performGlobalAction(GLOBAL_ACTION_RECENTS)
}
}
return super.onStartCommand(intent, flags, startId)
diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt
index 541510a..93b4cbf 100644
--- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt
@@ -6,6 +6,7 @@ import android.widget.Button
import androidx.appcompat.app.AlertDialog
import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.R
+import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
import de.jrpie.android.launcher.preferences.LauncherPreferences
diff --git a/app/src/main/res/drawable/baseline_apps_24.xml b/app/src/main/res/drawable/baseline_apps_24.xml
new file mode 100644
index 0000000..c5a49a0
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_apps_24.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 4b2bcd2..5ee6a46 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -38,7 +38,7 @@
Para baixo (borda esquerda)
Para baixo (borda direita)
Botão de aumentar volume
- Botão de diminuição de volume
+ Botão de diminuir volume
Toque duplo
Toque longo
Data
@@ -98,8 +98,8 @@
Busque
Configurações do μLauncher
Todos os apps
- Aumento de volume
- Diminuição de volume
+ Aumentar volume
+ Diminuir volume
Música: Próximo
Música: Anterior
Não faça nada
@@ -302,7 +302,7 @@
Inferior direito -> superior médio -> inferior esquerdo
Inverter a lista de apps
Doar
- Ajuste de volume
+ Ajustar volume
Ocultar barra de status
Ocultar barra de navegação
Versão
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 3eeaf50..4a7cd64 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -5,36 +5,36 @@
更多选项
设置
外观
- 主题风格
+ 色调风格
显示
其他
- 上
- 下
+ 上滑
+ 下滑
无法打开应用
要更改其设置吗?
打开设置,为该手势绑定一个应用程序
启动器
杂项
左
- 左滑两次
- 上滑两次
- 下滑两次
+ 双指左滑
+ 双指上滑
+ 双指下滑
右
- 右滑两次
- 右(顶部)
- 右(底部)
- 左(底部)
- 左(顶部)
- 上(左边缘)
- 上(右边缘)
- 下(左边缘)
- 下(右边缘)
- 音量加
- 音量减
+ 双指右滑
+ 右滑(顶部)
+ 右滑(底部)
+ 左滑(底部)
+ 左滑(顶部)
+ 上滑(左边缘)
+ 上滑(右边缘)
+ 下滑(左边缘)
+ 下滑(右边缘)
+ 音量增加键
+ 音量降低键
双击
长按
- 日期
- 时间
+ 桌面日期
+ 桌面时钟
选择应用
安装应用
没有找到应用市场
@@ -42,9 +42,9 @@
选择壁纸
保持屏幕常亮
功能
- 边缘滑动动作
- 启动搜索匹配项
- 搜索时呼出键盘
+ 边缘滑动手势
+ 自动启动搜索匹配项
+ 自动激活搜索
灵敏度
应用信息
查看 µLauncher 的使用教程
@@ -61,10 +61,10 @@
概念
这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库!
使用方法
- 您的主屏幕仅包含本地日期和时间,没有多余项目。
+ 您的主屏幕仅包含本地日期和时间,没有多余的项目。
设置
- 我们为您选择了一些默认应用。如果您希望进行更改,现在就可以:
- 您也可以稍后对您的选择进行更改。
+ 我们为您预设了一些快捷操作。如果您不满意,现在就试试点击右侧图标:
+ 您也可以稍后更改您的选择。
开始!
应用
卸载
@@ -79,15 +79,15 @@
啥也不干
教程
μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。
- 您可以通过手势或按键来启动最重要的应用程序。
- 将 μLauncher 设为默认桌面
- 您已经准备好开始使用本启动器了!\n\n希望这对你有帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护)
- 双滑动作
+ 您可以通过手势或按键来启动对您来说最重要的应用程序。
+ 将 μLauncher 设为默认启动器
+ 您已经准备好开始使用本启动器了!\n\n希望本快捷教程能对您有所帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护)
+ 双指滑动手势
使用本地日期格式
显示时间
显示日期
- 翻转日期和时间
- 背景(应用列表和设置)
+ 交换日期和时间位置
+ 背景(应用程序列表和设置页面)
字体
黑白应用图标
显示秒
@@ -100,7 +100,7 @@
错误:无法访问闪光灯。
选择锁屏方法
选择锁屏的方法
- 不要在应用抽屉中显示被绑定到手势的应用
+ 不要在应用程序列表中显示已被绑定到手势操作的应用
此功能需要 Android 6 或更高版本。
应用程序已隐藏。您可在设置中让它再次显示。
µLauncher 需要激活“设备管理应用”权限才能够锁定屏幕。
@@ -114,34 +114,34 @@
撤销
隐藏的应用
隐藏的应用
- 上滑
- 用双指向上滑动
- 下滑
+ 向上滑动
+ 双指向上滑动
+ 向下滑动
双指向下滑动
- 左滑
+ 向左滑动
双指向左滑动
- 右滑
+ 向右滑动
双指向右滑动
- 在屏幕顶部向右滑动
- 在屏幕底部向右滑动
- 在屏幕底部向左滑动
- 在屏幕顶部向左滑动
- 在屏幕左边缘向上滑动
- 在屏幕右边缘向上滑动
- 在屏幕左边缘向下滑动
- 在屏幕右边缘向下滑动
- 按下音量增大按钮
- 按下音量降低按钮
+ 在桌面顶部向右滑动
+ 在桌面底部向右滑动
+ 在桌面底部向左滑动
+ 在桌面顶部向左滑动
+ 在桌面左边缘向上滑动
+ 在桌面右边缘向上滑动
+ 在桌面左边缘向下滑动
+ 在桌面右边缘向下滑动
+ 按下音量增加键
+ 按下音量降低键
双击空白区域
长按空白区域
- 点击日期
- 点击时间
+ 点击桌面日期
+ 点击桌面时钟
查看源代码
加入 μLauncher 的聊天群
收藏的应用
锁屏
文本阴影
- 双指滑动
+ 使用双指进行滑动手势操作
重命名 %1$s
默认
暗色
@@ -165,9 +165,9 @@
亮色
快速设置
错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用“无障碍”服务)
- 在屏幕边缘滑动
+ 在桌面边缘进行滑动手势操作
将 µLauncher 设置为“无障碍”服务以允许其锁定屏幕。请注意,这会使 µLauncher 获得额外的权限。你永远不应该轻易地授予任何应用程序这样的权限。获得授权后“无障碍”服务将仅被用于锁定屏幕。您可以审核我们的源代码。请注意,锁定屏幕也可以通过激活 µLauncher 的“设备管理应用”权限来实现,然而,这种方法无法与于指纹解锁和面部解锁兼容。
- 返回
+ 返回操作
红色
蓝色
透明度
@@ -175,19 +175,19 @@
动态
私人空间
私人空间
- 选择颜色
+ 设置颜色
颜色
错误反馈
]]>
锁定私人空间
V
Λ
- 文本
+ 纯文本
网格
创建报告
解锁私人空间
默认
- 颜色
+ 文本颜色
复制到剪贴板
此功能需要 Android 15 或更高版本。
@@ -210,9 +210,9 @@
返回按键 / 返回手势
先单击然后再下滑
在网络上搜索
- (从)右上 (滑向)中左(滑向)右下
- 通过按回车键在应用列表搜索界面激活网络搜索。
- (从)左下 (滑向)中上(滑向)右下
+ (从)右上(滑向)中左(滑向)右下
+ 输入搜索内容后,按回车键直接在应用列表界面启动网络搜索。
+ (从)左下(滑向)中上(滑向)右下
选择锁定设备的方式
有2种方式可以用来锁定屏幕。
@@ -238,7 +238,7 @@
]]>
搜索(不触发自动启动匹配项)
广泛且重要的权限。
但 μLauncher 仅会在需要锁定屏幕时使用这些权限。µLauncher 绝不会收集任何数据。尤其是,μLauncher 不会使用“无障碍”服务来收集任何数据。]]>
- (从)左上 (滑向)中右(滑向)左下
+ (从)左上(滑向)中右(滑向)左下
单击 + 上滑
单击 + 下滑
单击 + 左滑
@@ -246,16 +246,16 @@
先单击然后再上滑
单击 + 右滑
先单击然后再右滑
- (从)左下 (滑向)中右(滑向)左上
- (从)右下 (滑向)中左(滑向)右上
- (从)左上 (滑向)中下(滑向)右上
- (从)右上 (滑向)中下(滑向)左上
- (从)右下 (滑向)中上(滑向)左下
+ (从)左下(滑向)中右(滑向)左上
+ (从)右下(滑向)中左(滑向)右上
+ (从)左上(滑向)中下(滑向)右上
+ (从)右上(滑向)中下(滑向)左上
+ (从)右下(滑向)中上(滑向)左下
Λ (反向)
V(反向)
(反向)]]>
- 开启后将直接启动匹配搜索内容的应用,可以通过按空格键临时暂停该功能。
+ 开启后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。
应用程序列表样式
绑定到手势
音乐:播放 / 暂停
@@ -268,10 +268,11 @@
调整音量
版本
所有应用
- 您可以在应用程序列表中快速所搜所有应用。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。
- 当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,在查询内容前加上空格即可禁用。
+ 您可以在应用程序列表中快速找到已安装的应用程序。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。
+ 您还可以搜索,当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,可以在搜索内容前加上空格以禁用。
隐藏状态栏
隐藏导航栏
倒序排列应用程序
我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。
+ 快捷操作
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c426a5c..83b963b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -252,6 +252,7 @@
Music: Previous
Music: Play / Pause
Expand notifications panel
+ Recent Apps
Do nothing
Lock Screen
Toggle Torch
@@ -307,6 +308,8 @@
No camera with torch detected.
Error: Can\'t access torch.
Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)
+ Error: Failed to show recent apps. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)
+ Error: Failed to enable the accessibility service.
μLauncher\'s accessibility service is not enabled. Please enable it in settings
Private space locked
Private space unlocked
@@ -315,12 +318,17 @@
Lock private space
Unlock private space
Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead.
- μLauncher - lock screen
+ μLauncher
- Setting μLauncher as an accessibility service allows it to lock the screen.
+ Setting μLauncher as an accessibility service allows it to lock the screen and open the recent apps menu.
Note that excessive permissions are required. You should never grant such permissions lightly to any app.
- μLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure.
+ μLauncher will use the accessibility service only for performing the following actions when requested by the user:
+
+ * lock screen
+ * open recent apps
+
+ μLauncher will never use the accessibility service to collect data. You can check the source code to make sure.
Note that locking the screen can also be accomplished by granting μLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock.
@@ -365,7 +373,12 @@
I am aware that other options exist (using device administrator privileges or the power button).
I consent to μLauncher using the accessibility service to provide functionality unrelated to accessibility.
I consent to μLauncher not collecting any data.
- far-reaching privileges to μLauncher.
μLauncher will use these privileges only to lock the screen. μLauncher will never collect any data. In particular, μLauncher does not use the accessibility service to collect any data.]]>
+ far-reaching privileges to μLauncher.
μLauncher will use these privileges only to perform the following actions:
+
+ - Lock Screen
+ - Recent Apps
+
+ μLauncher will never collect any data. In particular, μLauncher does not use the accessibility service to collect any data.]]>
Activating the Accessibility Service
Activate Accessibility Service
Cancel