summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-12 12:46:33 +0200
committerDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-12 12:46:33 +0200
commita63ed91248c842bd6e5a4f7e9c95349cd99027c6 (patch)
tree327d6e3b965cf5fdee59057f971328375304490f /app/src
parent714f7824947894ac17e35fddb78c5f81b3bdc752 (diff)
downloadSidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.tar.gz
SidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.tar.bz2
SidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.zip
Refine dpad and app drawer navigation
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/java/app/sidephonelauncher/MainActivity.kt18
-rw-r--r--app/src/main/java/app/sidephonelauncher/data/Constants.kt5
-rw-r--r--app/src/main/java/app/sidephonelauncher/data/Prefs.kt40
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt15
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt124
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerSearchView.kt27
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/HomeFragment.kt128
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/SettingsFragment.kt1
-rw-r--r--app/src/main/res/layout-land/fragment_app_drawer.xml2
-rw-r--r--app/src/main/res/layout-land/fragment_home.xml1
-rw-r--r--app/src/main/res/layout/fragment_app_drawer.xml2
-rw-r--r--app/src/main/res/layout/fragment_home.xml1
-rw-r--r--app/src/main/res/values-ar/strings.xml4
-rw-r--r--app/src/main/res/values-de/strings.xml4
-rw-r--r--app/src/main/res/values-es-rES/strings.xml4
-rw-r--r--app/src/main/res/values-es-rUS/strings.xml4
-rw-r--r--app/src/main/res/values-fr/strings.xml4
-rw-r--r--app/src/main/res/values-he/strings.xml4
-rw-r--r--app/src/main/res/values-hr/strings.xml4
-rw-r--r--app/src/main/res/values-hu/strings.xml4
-rw-r--r--app/src/main/res/values-in/strings.xml4
-rw-r--r--app/src/main/res/values-it/strings.xml4
-rw-r--r--app/src/main/res/values-ja/strings.xml4
-rw-r--r--app/src/main/res/values-nl/strings.xml4
-rw-r--r--app/src/main/res/values-pl/strings.xml4
-rw-r--r--app/src/main/res/values-pt-rBR/strings.xml4
-rw-r--r--app/src/main/res/values-ru-rRU/strings.xml4
-rw-r--r--app/src/main/res/values-sv/strings.xml4
-rw-r--r--app/src/main/res/values-tr/strings.xml4
-rw-r--r--app/src/main/res/values-uk/strings.xml4
-rw-r--r--app/src/main/res/values-zh/strings.xml4
-rw-r--r--app/src/main/res/values/strings.xml5
32 files changed, 349 insertions, 96 deletions
diff --git a/app/src/main/java/app/sidephonelauncher/MainActivity.kt b/app/src/main/java/app/sidephonelauncher/MainActivity.kt
index 632518f..2537dbd 100644
--- a/app/src/main/java/app/sidephonelauncher/MainActivity.kt
+++ b/app/src/main/java/app/sidephonelauncher/MainActivity.kt
@@ -21,9 +21,11 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.findNavController
+import androidx.navigation.fragment.NavHostFragment
import app.sidephonelauncher.data.Constants
import app.sidephonelauncher.data.Prefs
import app.sidephonelauncher.databinding.ActivityMainBinding
+import app.sidephonelauncher.ui.HomeFragment
import app.sidephonelauncher.helper.getColorFromAttr
import app.sidephonelauncher.helper.hasBeenDays
import app.sidephonelauncher.helper.hasBeenHours
@@ -138,9 +140,14 @@ class MainActivity : AppCompatActivity() {
}
if (dpadKey) {
val focusedView = currentFocus
+ val currentFragment = getCurrentNavFragment()
+ if (currentFragment is HomeFragment && currentFragment.handleSideDpadKeyEvent(event)) {
+ return true
+ }
+ if (currentFragment is HomeFragment && currentFragment.shouldHandleUnfocusedDpadKeyEvent()) {
+ if (currentFragment.handleUnfocusedDpadKeyEvent(event)) return true
+ }
if (focusedView == null || focusedView == window.decorView) {
- val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
- val currentFragment = navHost?.childFragmentManager?.fragments?.firstOrNull()
val fragmentView = currentFragment?.view
if (fragmentView != null && fragmentView.dispatchKeyEvent(event)) return true
}
@@ -148,6 +155,13 @@ class MainActivity : AppCompatActivity() {
return super.dispatchKeyEvent(event)
}
+ private fun getCurrentNavFragment() =
+ (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment)
+ ?.childFragmentManager
+ ?.run {
+ primaryNavigationFragment ?: fragments.lastOrNull { it.isVisible }
+ }
+
override fun onStart() {
super.onStart()
restartLauncherOrCheckTheme()
diff --git a/app/src/main/java/app/sidephonelauncher/data/Constants.kt b/app/src/main/java/app/sidephonelauncher/data/Constants.kt
index c4cc261..02b0d90 100644
--- a/app/src/main/java/app/sidephonelauncher/data/Constants.kt
+++ b/app/src/main/java/app/sidephonelauncher/data/Constants.kt
@@ -47,6 +47,11 @@ object Constants {
const val NOTIFICATIONS = 2
}
+ object HomeAction {
+ const val OPEN_APP_DRAWER = "app.sidephonelauncher.action.OPEN_APP_DRAWER"
+ const val OPEN_PHONE = "app.sidephonelauncher.action.OPEN_PHONE"
+ }
+
object CharacterIndicator {
const val SHOW = 102
const val HIDE = 101
diff --git a/app/src/main/java/app/sidephonelauncher/data/Prefs.kt b/app/src/main/java/app/sidephonelauncher/data/Prefs.kt
index 9e0daf5..8252b05 100644
--- a/app/src/main/java/app/sidephonelauncher/data/Prefs.kt
+++ b/app/src/main/java/app/sidephonelauncher/data/Prefs.kt
@@ -27,6 +27,8 @@ class Prefs(context: Context) {
private val DATE_TIME_VISIBILITY = "DATE_TIME_VISIBILITY"
private val SWIPE_LEFT_ENABLED = "SWIPE_LEFT_ENABLED"
private val SWIPE_RIGHT_ENABLED = "SWIPE_RIGHT_ENABLED"
+ private val SWIPE_LEFT_ACTION_INITIALIZED = "SWIPE_LEFT_ACTION_INITIALIZED"
+ private val SWIPE_RIGHT_ACTION_INITIALIZED = "SWIPE_RIGHT_ACTION_INITIALIZED"
private val HIDDEN_APPS = "HIDDEN_APPS"
private val HIDDEN_APPS_UPDATED = "HIDDEN_APPS_UPDATED"
private val SHOW_HINT_COUNTER = "SHOW_HINT_COUNTER"
@@ -386,11 +388,11 @@ class Prefs(context: Context) {
set(value) = prefs.edit { putString(APP_USER_8, value).apply() }
var appNameSwipeLeft: String
- get() = prefs.getString(APP_NAME_SWIPE_LEFT, "Camera").toString()
+ get() = prefs.getString(APP_NAME_SWIPE_LEFT, "").toString()
set(value) = prefs.edit { putString(APP_NAME_SWIPE_LEFT, value).apply() }
var appNameSwipeRight: String
- get() = prefs.getString(APP_NAME_SWIPE_RIGHT, "Phone").toString()
+ get() = prefs.getString(APP_NAME_SWIPE_RIGHT, "").toString()
set(value) = prefs.edit { putString(APP_NAME_SWIPE_RIGHT, value).apply() }
var appPackageSwipeLeft: String
@@ -533,6 +535,40 @@ class Prefs(context: Context) {
get() = prefs.getBoolean(IS_SHORTCUT_SWIPE_RIGHT, false)
set(value) = prefs.edit { putBoolean(IS_SHORTCUT_SWIPE_RIGHT, value) }
+ private var swipeLeftActionInitialized: Boolean
+ get() = prefs.getBoolean(SWIPE_LEFT_ACTION_INITIALIZED, false)
+ set(value) = prefs.edit { putBoolean(SWIPE_LEFT_ACTION_INITIALIZED, value).apply() }
+
+ private var swipeRightActionInitialized: Boolean
+ get() = prefs.getBoolean(SWIPE_RIGHT_ACTION_INITIALIZED, false)
+ set(value) = prefs.edit { putBoolean(SWIPE_RIGHT_ACTION_INITIALIZED, value).apply() }
+
+ fun ensureSwipeActionDefaults() {
+ if (!swipeLeftActionInitialized) {
+ if (appPackageSwipeLeft.isEmpty() && shortcutIdSwipeLeft.isEmpty() && !isShortcutSwipeLeft) {
+ appNameSwipeLeft = "Open app drawer"
+ appPackageSwipeLeft = Constants.HomeAction.OPEN_APP_DRAWER
+ appActivityClassNameSwipeLeft = ""
+ appUserSwipeLeft = ""
+ isShortcutSwipeLeft = false
+ shortcutIdSwipeLeft = ""
+ }
+ swipeLeftActionInitialized = true
+ }
+
+ if (!swipeRightActionInitialized) {
+ if (appPackageSwipeRight.isEmpty() && shortcutIdSwipeRight.isEmpty() && !isShortcutSwipeRight) {
+ appNameSwipeRight = "Phone"
+ appPackageSwipeRight = Constants.HomeAction.OPEN_PHONE
+ appActivityClassNameRight = ""
+ appUserSwipeRight = ""
+ isShortcutSwipeRight = false
+ shortcutIdSwipeRight = ""
+ }
+ swipeRightActionInitialized = true
+ }
+ }
+
fun getAppName(location: Int): String {
return when (location) {
1 -> prefs.getString(APP_NAME_1, "").toString()
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
index 71314d9..bedf0e9 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
@@ -36,6 +36,7 @@ class AppDrawerAdapter(
private val appHideListener: (AppModel, Int) -> Unit,
private val appRenameListener: (AppModel, String) -> Unit,
private val appLeftListener: () -> Boolean = { false },
+ private val appBackListener: () -> Boolean = { false },
private val privateSpaceToggleListener: () -> Unit = {},
private val privateSpaceSettingsListener: () -> Unit = {},
) : ListAdapter<AppModel, RecyclerView.ViewHolder>(DIFF_CALLBACK), Filterable {
@@ -132,6 +133,7 @@ class AppDrawerAdapter(
appHideListener,
appRenameListener,
appLeftListener,
+ appBackListener,
)
is SpacerViewHolder -> Unit
}
@@ -262,20 +264,24 @@ class AppDrawerAdapter(
appHideListener: (AppModel, Int) -> Unit,
appRenameListener: (AppModel, String) -> Unit,
appLeftListener: () -> Boolean,
+ appBackListener: () -> Boolean,
) = with(binding) {
appHideLayout.visibility = View.GONE
renameLayout.visibility = View.GONE
appTitle.visibility = View.VISIBLE
+ val isSpecialActionItem = appModel.appPackage == Constants.HomeAction.OPEN_APP_DRAWER
+
appTitle.text = buildString {
append(appModel.appLabel)
if (appModel.isNew) append(" ✦")
}
appTitle.gravity = appLabelGravity
- otherProfileIndicator.isVisible = appModel.user != myUserHandle
+ otherProfileIndicator.isVisible = appModel.user != myUserHandle && !isSpecialActionItem
appRow.setOnClickListener { clickListener(appModel) }
appRow.setOnLongClickListener {
+ if (isSpecialActionItem) return@setOnLongClickListener true
if (appModel.appPackage.isNotEmpty()) {
appDelete.alpha = when (
appModel is AppModel.PinnedShortcut || !root.context.isSystemApp(appModel.appPackage, appModel.user)
@@ -319,6 +325,13 @@ class AppDrawerAdapter(
KeyEvent.KEYCODE_DPAD_LEFT -> {
if (event.action == KeyEvent.ACTION_DOWN) appLeftListener() else false
}
+ KeyEvent.KEYCODE_BACK -> {
+ when (event.action) {
+ KeyEvent.ACTION_DOWN -> true
+ KeyEvent.ACTION_UP -> appBackListener()
+ else -> false
+ }
+ }
else -> false
}
}
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
index 1565170..fec7eeb 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
@@ -16,6 +16,7 @@ import android.view.inputmethod.BaseInputConnection
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
+import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
@@ -82,55 +83,88 @@ class AppDrawerFragment : Fragment() {
initObservers()
initClickListeners()
initKeyNavigation()
+ requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ when {
+ isDrawerListFocused() -> focusSearchInput()
+ binding.search.hasFocus() || searchTextView?.hasFocus() == true -> findNavController().popBackStack()
+ else -> {
+ isEnabled = false
+ requireActivity().onBackPressedDispatcher.onBackPressed()
+ }
+ }
+ }
+ })
}
private fun initKeyNavigation() {
binding.recyclerView.setOnKeyListener { _, keyCode, event ->
- if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
when (keyCode) {
- KeyEvent.KEYCODE_DPAD_UP -> {
- if (!binding.recyclerView.canScrollVertically(-1)) {
- val firstVisible = (binding.recyclerView.layoutManager as? LinearLayoutManager)
- ?.findFirstVisibleItemPosition() ?: -1
- if (firstVisible <= 0) {
- binding.search.requestFocus()
- return@setOnKeyListener true
+ KeyEvent.KEYCODE_BACK -> {
+ if (event.action == KeyEvent.ACTION_UP) focusSearchInput()
+ true
+ }
+ else -> {
+ if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
+ when (keyCode) {
+ KeyEvent.KEYCODE_DPAD_UP -> {
+ if (!binding.recyclerView.canScrollVertically(-1)) {
+ val firstVisible = (binding.recyclerView.layoutManager as? LinearLayoutManager)
+ ?.findFirstVisibleItemPosition() ?: -1
+ if (firstVisible <= 0) {
+ focusSearchInput()
+ return@setOnKeyListener true
+ }
+ }
+ false
+ }
+ KeyEvent.KEYCODE_DEL -> {
+ focusSearchInput()
+ true
}
+ else -> false
}
- false
}
- KeyEvent.KEYCODE_DEL -> {
- val query = binding.search.query
- if (query.isNullOrEmpty()) {
- findNavController().popBackStack()
- true
- } else false
- }
- else -> false
}
}
binding.search.setOnKeyListener { _, keyCode, event ->
- if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
when (keyCode) {
- KeyEvent.KEYCODE_DPAD_DOWN -> {
- focusFirstLaunchableItem()
+ KeyEvent.KEYCODE_BACK -> {
+ if (event.action == KeyEvent.ACTION_UP) findNavController().popBackStack()
true
}
- KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey()
- else -> false
+ else -> {
+ if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
+ when (keyCode) {
+ KeyEvent.KEYCODE_DPAD_DOWN -> {
+ focusFirstLaunchableItem()
+ true
+ }
+ KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey()
+ else -> false
+ }
+ }
}
}
searchTextView?.setOnKeyListener { _, keyCode, event ->
- if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
when (keyCode) {
- KeyEvent.KEYCODE_DPAD_DOWN -> {
- focusFirstLaunchableItem()
+ KeyEvent.KEYCODE_BACK -> {
+ if (event.action == KeyEvent.ACTION_UP) findNavController().popBackStack()
true
}
- KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey()
- else -> false
+ else -> {
+ if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false
+ when (keyCode) {
+ KeyEvent.KEYCODE_DPAD_DOWN -> {
+ focusFirstLaunchableItem()
+ true
+ }
+ KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey()
+ else -> false
+ }
+ }
}
}
}
@@ -140,6 +174,20 @@ class AppDrawerFragment : Fragment() {
return true
}
+ private fun isDrawerListFocused(): Boolean {
+ return binding.recyclerView.hasFocus() || binding.recyclerView.findFocus() != null
+ }
+
+ private fun focusSearchInput() {
+ binding.search.isIconified = false
+ binding.search.requestFocus()
+ searchTextView?.apply {
+ requestFocus()
+ setSelection(text?.length ?: 0)
+ }
+ binding.search.showKeyboard(prefs.autoShowKeyboard)
+ }
+
private fun initViews() {
if (flag == Constants.FLAG_HIDDEN_APPS)
binding.search.queryHint = getString(R.string.hidden_apps)
@@ -159,6 +207,10 @@ class AppDrawerFragment : Fragment() {
}
private fun initSearch() {
+ binding.search.onBackPressed = {
+ findNavController().popBackStack()
+ true
+ }
binding.search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
if (query?.startsWith("!") == true)
@@ -294,6 +346,10 @@ class AppDrawerFragment : Fragment() {
viewModel.getAppList()
},
appLeftListener = ::handleSearchLeftKey,
+ appBackListener = {
+ focusSearchInput()
+ true
+ },
privateSpaceToggleListener = {
viewModel.togglePrivateSpaceLock()
},
@@ -360,6 +416,20 @@ class AppDrawerFragment : Fragment() {
val apps = currentAppList ?: return
val combined = apps.toMutableList()
+ if (flag == Constants.FLAG_SET_SWIPE_LEFT_APP || flag == Constants.FLAG_SET_SWIPE_RIGHT_APP) {
+ combined.add(
+ 0,
+ AppModel.App(
+ appLabel = getString(R.string.open_app_drawer),
+ key = null,
+ appPackage = Constants.HomeAction.OPEN_APP_DRAWER,
+ activityClassName = null,
+ isNew = false,
+ user = Process.myUserHandle(),
+ )
+ )
+ }
+
if (flag == Constants.FLAG_LAUNCH_APP && currentPrivateSpaceAvailable) {
combined.add(AppModel.PrivateSpaceHeader(isLocked = currentPrivateSpaceLocked))
if (!currentPrivateSpaceLocked) {
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerSearchView.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerSearchView.kt
new file mode 100644
index 0000000..dc6ae46
--- /dev/null
+++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerSearchView.kt
@@ -0,0 +1,27 @@
+package app.sidephonelauncher.ui
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.KeyEvent
+import androidx.appcompat.widget.SearchView
+
+class AppDrawerSearchView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = androidx.appcompat.R.attr.searchViewStyle,
+) : SearchView(context, attrs, defStyleAttr) {
+
+ var onBackPressed: (() -> Boolean)? = null
+
+ override fun dispatchKeyEventPreIme(event: KeyEvent): Boolean {
+ if (event.keyCode == KeyEvent.KEYCODE_BACK) {
+ val handled = when (event.action) {
+ KeyEvent.ACTION_DOWN -> true
+ KeyEvent.ACTION_UP -> onBackPressed?.invoke() == true
+ else -> false
+ }
+ if (handled) return true
+ }
+ return super.dispatchKeyEventPreIme(event)
+ }
+}
diff --git a/app/src/main/java/app/sidephonelauncher/ui/HomeFragment.kt b/app/src/main/java/app/sidephonelauncher/ui/HomeFragment.kt
index fa3696b..15b967a 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/HomeFragment.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/HomeFragment.kt
@@ -61,7 +61,6 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
- private var dpadLeftKeyDownTime = 0L
private val notificationDotListener: () -> Unit = {
activity?.runOnUiThread {
updateHomeNotificationDotsSafely()
@@ -76,6 +75,7 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
prefs = Prefs(requireContext())
+ prefs.ensureSwipeActionDefaults()
viewModel = activity?.run {
ViewModelProvider(this)[MainViewModel::class.java]
} ?: throw Exception("Invalid Activity")
@@ -92,7 +92,6 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
override fun onResume() {
super.onResume()
NotificationDotRepository.addListener(notificationDotListener)
- dpadLeftKeyDownTime = 0L
populateHomeScreen(false)
viewModel.isSidePhOnelauncherDefault()
if (prefs.showStatusBar) showStatusBar()
@@ -228,6 +227,61 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
}
}
+ fun handleSideDpadKeyEvent(event: KeyEvent): Boolean {
+ return when (event.keyCode) {
+ KeyEvent.KEYCODE_DPAD_LEFT -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ openSwipeRightApp()
+ }
+ event.action == KeyEvent.ACTION_DOWN || event.action == KeyEvent.ACTION_UP
+ }
+ KeyEvent.KEYCODE_DPAD_RIGHT -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ openSwipeLeftApp()
+ }
+ event.action == KeyEvent.ACTION_DOWN || event.action == KeyEvent.ACTION_UP
+ }
+ else -> false
+ }
+ }
+
+ fun shouldHandleUnfocusedDpadKeyEvent(): Boolean {
+ val focusedView = activity?.currentFocus
+ return focusedView == null
+ || focusedView == binding.mainLayout
+ || getVisibleHomeApps().none { it == focusedView }
+ }
+
+ fun handleUnfocusedDpadKeyEvent(event: KeyEvent): Boolean {
+ val visibleApps = getVisibleHomeApps()
+ if (visibleApps.isEmpty()) return false
+ return when (event.keyCode) {
+ KeyEvent.KEYCODE_DPAD_LEFT -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ openSwipeRightApp()
+ }
+ true
+ }
+ KeyEvent.KEYCODE_DPAD_RIGHT -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ openSwipeLeftApp()
+ }
+ true
+ }
+ KeyEvent.KEYCODE_DPAD_UP,
+ KeyEvent.KEYCODE_DPAD_DOWN,
+ KeyEvent.KEYCODE_DPAD_CENTER,
+ KeyEvent.KEYCODE_ENTER,
+ KeyEvent.KEYCODE_NUMPAD_ENTER -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ redirectRootFocusToHomeAppSafely()
+ }
+ true
+ }
+ else -> false
+ }
+ }
+
private fun handleHomeKeyEvent(keyCode: Int, event: KeyEvent): Boolean {
val visibleApps = getVisibleHomeApps()
if (visibleApps.isEmpty()) return false
@@ -236,7 +290,6 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
when (keyCode) {
KeyEvent.KEYCODE_DPAD_UP,
KeyEvent.KEYCODE_DPAD_DOWN,
- KeyEvent.KEYCODE_DPAD_LEFT,
KeyEvent.KEYCODE_DPAD_CENTER,
KeyEvent.KEYCODE_ENTER,
KeyEvent.KEYCODE_NUMPAD_ENTER -> {
@@ -245,9 +298,15 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
}
return true
}
+ KeyEvent.KEYCODE_DPAD_LEFT -> {
+ if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
+ openSwipeRightApp()
+ }
+ return true
+ }
KeyEvent.KEYCODE_DPAD_RIGHT -> {
if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
- showAppList(Constants.FLAG_LAUNCH_APP)
+ openSwipeLeftApp()
}
return true
}
@@ -276,19 +335,13 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
return true
}
KeyEvent.KEYCODE_DPAD_LEFT -> {
- if (dpadLeftKeyDownTime == 0L) dpadLeftKeyDownTime = System.currentTimeMillis()
- if (event.repeatCount > 0) {
- val elapsed = System.currentTimeMillis() - dpadLeftKeyDownTime
- if (elapsed >= Constants.LONG_PRESS_DELAY_MS) {
- dpadLeftKeyDownTime = 0L
- openSwipeLeftApp()
- }
- }
+ if (event.repeatCount > 0) return true
+ openSwipeRightApp()
return true
}
KeyEvent.KEYCODE_DPAD_RIGHT -> {
if (event.repeatCount > 0) return true
- showAppList(Constants.FLAG_LAUNCH_APP)
+ openSwipeLeftApp()
return true
}
KeyEvent.KEYCODE_DPAD_CENTER,
@@ -299,10 +352,7 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
KeyEvent.ACTION_UP -> {
when (keyCode) {
KeyEvent.KEYCODE_DPAD_DOWN -> return true
- KeyEvent.KEYCODE_DPAD_LEFT -> {
- dpadLeftKeyDownTime = 0L
- return true
- }
+ KeyEvent.KEYCODE_DPAD_LEFT -> return true
KeyEvent.KEYCODE_DPAD_RIGHT -> return true
KeyEvent.KEYCODE_DPAD_CENTER,
KeyEvent.KEYCODE_ENTER,
@@ -394,10 +444,16 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
}
true
}
+ KeyEvent.KEYCODE_DPAD_LEFT -> {
+ if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener true
+ if (event.repeatCount > 0) return@setOnKeyListener true
+ openSwipeRightApp()
+ true
+ }
KeyEvent.KEYCODE_DPAD_RIGHT -> {
if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener true
if (event.repeatCount > 0) return@setOnKeyListener true
- showAppList(Constants.FLAG_LAUNCH_APP)
+ openSwipeLeftApp()
true
}
KeyEvent.KEYCODE_ENTER,
@@ -719,27 +775,55 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
private fun openSwipeRightApp() {
if (!prefs.swipeRightEnabled) return
- launchAppOrShortcut(
+ launchHomeSideAction(
appName = prefs.appNameSwipeRight,
packageName = prefs.appPackageSwipeRight,
activityClassName = prefs.appActivityClassNameRight,
shortcutId = prefs.shortcutIdSwipeRight,
isShortcut = prefs.isShortcutSwipeRight,
userString = prefs.appUserSwipeRight,
- fallback = { openDialerApp(requireContext()) }
)
}
private fun openSwipeLeftApp() {
if (!prefs.swipeLeftEnabled) return
- launchAppOrShortcut(
+ launchHomeSideAction(
appName = prefs.appNameSwipeLeft,
packageName = prefs.appPackageSwipeLeft,
activityClassName = prefs.appActivityClassNameSwipeLeft,
shortcutId = prefs.shortcutIdSwipeLeft,
isShortcut = prefs.isShortcutSwipeLeft,
userString = prefs.appUserSwipeLeft,
- fallback = { openCameraApp(requireContext()) }
+ )
+ }
+
+ private fun launchHomeSideAction(
+ appName: String,
+ packageName: String,
+ activityClassName: String?,
+ shortcutId: String?,
+ isShortcut: Boolean,
+ userString: String,
+ fallback: (() -> Unit)? = null,
+ ) {
+ when (packageName) {
+ Constants.HomeAction.OPEN_APP_DRAWER -> {
+ showAppList(Constants.FLAG_LAUNCH_APP)
+ return
+ }
+ Constants.HomeAction.OPEN_PHONE -> {
+ openDialerApp(requireContext())
+ return
+ }
+ }
+ launchAppOrShortcut(
+ appName = appName,
+ packageName = packageName,
+ activityClassName = activityClassName,
+ shortcutId = shortcutId,
+ isShortcut = isShortcut,
+ userString = userString,
+ fallback = fallback,
)
}
diff --git a/app/src/main/java/app/sidephonelauncher/ui/SettingsFragment.kt b/app/src/main/java/app/sidephonelauncher/ui/SettingsFragment.kt
index 4168b1e..b4adaea 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/SettingsFragment.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/SettingsFragment.kt
@@ -64,6 +64,7 @@ class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListe
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
prefs = Prefs(requireContext())
+ prefs.ensureSwipeActionDefaults()
viewModel = activity?.run {
ViewModelProvider(this)[MainViewModel::class.java]
} ?: throw Exception("Invalid Activity")
diff --git a/app/src/main/res/layout-land/fragment_app_drawer.xml b/app/src/main/res/layout-land/fragment_app_drawer.xml
index 2bf46f9..b8bbda9 100644
--- a/app/src/main/res/layout-land/fragment_app_drawer.xml
+++ b/app/src/main/res/layout-land/fragment_app_drawer.xml
@@ -20,7 +20,7 @@
android:animateLayoutChanges="true"
android:orientation="horizontal">
- <androidx.appcompat.widget.SearchView
+ <app.sidephonelauncher.ui.AppDrawerSearchView
android:id="@+id/search"
android:layout_width="0dp"
android:layout_height="wrap_content"
diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml
index f7a7b64..cf6e388 100644
--- a/app/src/main/res/layout-land/fragment_home.xml
+++ b/app/src/main/res/layout-land/fragment_home.xml
@@ -53,6 +53,7 @@
style="@style/TextDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:nextFocusUp="@id/clock"
android:format12Hour="EEE, dd MMM"
android:format24Hour="EEE, dd MMM"
android:paddingHorizontal="3dp"
diff --git a/app/src/main/res/layout/fragment_app_drawer.xml b/app/src/main/res/layout/fragment_app_drawer.xml
index 665a01a..2e81c29 100644
--- a/app/src/main/res/layout/fragment_app_drawer.xml
+++ b/app/src/main/res/layout/fragment_app_drawer.xml
@@ -19,7 +19,7 @@
android:animateLayoutChanges="true"
android:orientation="horizontal">
- <androidx.appcompat.widget.SearchView
+ <app.sidephonelauncher.ui.AppDrawerSearchView
android:id="@+id/search"
android:layout_width="0dp"
android:layout_height="wrap_content"
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index ca1f3ab..296cb4f 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -44,6 +44,7 @@
style="@style/TextDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:nextFocusUp="@id/clock"
android:format12Hour="EEE, dd MMM"
android:format24Hour="EEE, dd MMM"
android:paddingStart="7dp"
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index f316a3b..634f239 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -75,8 +75,8 @@
<string name="right">يمين</string>
<string name="center">مركز</string>
<string name="home_layout_alignment">محاذاة التطبيق</string>
- <string name="swipe_left_app">افتح عند التمرير لليسار</string>
- <string name="swipe_right_app">افتح عند التمرير لليمين</string>
+ <string name="swipe_left_app">التمرير لليسار / يمين لوحة الاتجاهات</string>
+ <string name="swipe_right_app">التمرير لليمين / يسار لوحة الاتجاهات</string>
<string name="auto_show_keyboard">العرض التلقائي للوحة المفاتيح</string>
<string name="hide">يخفي</string>
<string name="status_bar">أظهر شريط الحالة</string>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 312f1df..1500e8d 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -74,8 +74,8 @@
<string name="right">Rechts</string>
<string name="center">Mitte</string>
<string name="home_layout_alignment">App-Ausrichtung</string>
- <string name="swipe_left_app">Wischen Sie nach links über die App</string>
- <string name="swipe_right_app">Wischen Sie nach rechts über die App</string>
+ <string name="swipe_left_app">Nach links wischen / Steuerkreuz rechts</string>
+ <string name="swipe_right_app">Nach rechts wischen / Steuerkreuz links</string>
<string name="auto_show_keyboard">Tastatur automatisch anzeigen</string>
<string name="hide">Verstecken</string>
<string name="status_bar">Zeige Statusleiste</string>
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 03d7453..614fc61 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Derecha</string>
<string name="center">Centrado</string>
<string name="home_layout_alignment">Posición de aplicaciones</string>
- <string name="swipe_left_app">Deslizar a la izquierda para abrir</string>
- <string name="swipe_right_app">Deslizar a la derecha para abrir</string>
+ <string name="swipe_left_app">Deslizar a la izquierda / cruceta derecha</string>
+ <string name="swipe_right_app">Deslizar a la derecha / cruceta izquierda</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml
index 86d44cb..c633afb 100644
--- a/app/src/main/res/values-es-rUS/strings.xml
+++ b/app/src/main/res/values-es-rUS/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Derecha</string>
<string name="center">Centro</string>
<string name="home_layout_alignment">Alineación de aplicaciones</string>
- <string name="swipe_left_app">Deslizar a la izquierda para abrir</string>
- <string name="swipe_right_app">Deslizar a la derecha para abrir</string>
+ <string name="swipe_left_app">Deslizar a la izquierda / cruceta derecha</string>
+ <string name="swipe_right_app">Deslizar a la derecha / cruceta izquierda</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 164e70b..1c718c9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Droite</string>
<string name="center">Centre</string>
<string name="home_layout_alignment">Alignement des applications</string>
- <string name="swipe_left_app">Balayer vers la gauche</string>
- <string name="swipe_right_app">Balayer vers la droite</string>
+ <string name="swipe_left_app">Balayer à gauche / pavé directionnel droite</string>
+ <string name="swipe_right_app">Balayer à droite / pavé directionnel gauche</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index bac8e86..7b34b41 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -27,8 +27,8 @@
<string name="right">שמאל</string>
<string name="center">מרכז</string>
<string name="home_layout_alignment">יישור היישומים</string>
- <string name="swipe_left_app">יישום לפתיחה בהחלקה שמאלה</string>
- <string name="swipe_right_app">יישום לפתיחה בהחלקה ימינה</string>
+ <string name="swipe_left_app">החלקה שמאלה / ימינה ב-D-pad</string>
+ <string name="swipe_right_app">החלקה ימינה / שמאלה ב-D-pad</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 648ded6..a28e444 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -28,8 +28,8 @@
<string name="right">Desno</string>
<string name="center">Sredina</string>
<string name="home_layout_alignment">Poravnanje aplikacija</string>
- <string name="swipe_left_app">Aplikacija za lijevi potez</string>
- <string name="swipe_right_app">Aplikacija za desni potez</string>
+ <string name="swipe_left_app">Povuci lijevo / desno na D-padu</string>
+ <string name="swipe_right_app">Povuci desno / lijevo na D-padu</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index b3fd0c9..57e70c4 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -28,8 +28,8 @@
<string name="right">Jobb</string>
<string name="center">Közép</string>
<string name="home_layout_alignment">Ikonok elhelyezkedése</string>
- <string name="swipe_left_app">Balra simítva indítható alkalmazás</string>
- <string name="swipe_right_app">Jobbra simítva indítható alkalmazás</string>
+ <string name="swipe_left_app">Balra húzás / d-pad jobbra</string>
+ <string name="swipe_right_app">Jobbra húzás / d-pad balra</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 965615e..6047e9f 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -29,8 +29,8 @@
<string name="right">kanan</string>
<string name="center">Tengah</string>
<string name="home_layout_alignment">Penyelarasan aplikasi</string>
- <string name="swipe_left_app">Geser aplikasi ke kiri</string>
- <string name="swipe_right_app">Geser aplikasi ke kanan</string>
+ <string name="swipe_left_app">Geser ke kiri / d-pad kanan</string>
+ <string name="swipe_right_app">Geser ke kanan / d-pad kiri</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 059f3b2..c997469 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Destra</string>
<string name="center">Centrato</string>
<string name="home_layout_alignment">Allineamento app in Home screen</string>
- <string name="swipe_left_app">Scorri verso sinistra</string>
- <string name="swipe_right_app">Scorri verso destra l\'app</string>
+ <string name="swipe_left_app">Scorri a sinistra / d-pad destro</string>
+ <string name="swipe_right_app">Scorri a destra / d-pad sinistro</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 3d39030..4399ecc 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -75,8 +75,8 @@
<string name="right">右</string>
<string name="center">中心</string>
<string name="home_layout_alignment">アプリの調整</string>
- <string name="swipe_left_app">アプリを左にスワイプ</string>
- <string name="swipe_right_app">アプリを右にスワイプ</string>
+ <string name="swipe_left_app">左にスワイプ / 右Dパッド</string>
+ <string name="swipe_right_app">右にスワイプ / 左Dパッド</string>
<string name="auto_show_keyboard">キーボードの自動表示</string>
<string name="hide">隠れる</string>
<string name="status_bar">ステータスバーを表示する</string>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 3eb638c..bb58f1a 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -28,8 +28,8 @@
<string name="right">Rechts</string>
<string name="center">Midden</string>
<string name="home_layout_alignment">App uitlijning</string>
- <string name="swipe_left_app">Veeg naar links app</string>
- <string name="swipe_right_app">Veeg naar rechts app</string>
+ <string name="swipe_left_app">Veeg naar links / d-pad rechts</string>
+ <string name="swipe_right_app">Veeg naar rechts / d-pad links</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index dee3341..beff082 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -74,8 +74,8 @@
<string name="right">Prawo</string>
<string name="center">Środek</string>
<string name="home_layout_alignment">Wyrównanie aplikacji</string>
- <string name="swipe_left_app">Przesuń w lewo aplikację</string>
- <string name="swipe_right_app">Przesuń w prawo aplikację</string>
+ <string name="swipe_left_app">Przesuń w lewo / prawy d-pad</string>
+ <string name="swipe_right_app">Przesuń w prawo / lewy d-pad</string>
<string name="auto_show_keyboard">Automatyczne wyświetlanie klawiatury</string>
<string name="hide">Ukryj</string>
<string name="status_bar">Pokaż pasek stanu</string>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 0edebdf..2090d35 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Direita</string>
<string name="center">Centro</string>
<string name="home_layout_alignment">Alinhamento de aplicativos</string>
- <string name="swipe_left_app">Aplicativo deslize para a esquerda</string>
- <string name="swipe_right_app">Aplicativo deslize para a direita</string>
+ <string name="swipe_left_app">Deslizar para a esquerda / direcional direito</string>
+ <string name="swipe_right_app">Deslizar para a direita / direcional esquerdo</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml
index 03d82b9..0238cb0 100644
--- a/app/src/main/res/values-ru-rRU/strings.xml
+++ b/app/src/main/res/values-ru-rRU/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Справа</string>
<string name="center">Центр</string>
<string name="home_layout_alignment">Расположение приложений</string>
- <string name="swipe_left_app">Свайп влево</string>
- <string name="swipe_right_app">Свайп вправо</string>
+ <string name="swipe_left_app">Свайп влево / d-pad вправо</string>
+ <string name="swipe_right_app">Свайп вправо / d-pad влево</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 5b8d34b..a85d7de 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -28,8 +28,8 @@
<string name="right">Höger</string>
<string name="center">Mitten</string>
<string name="home_layout_alignment">App-placering</string>
- <string name="swipe_left_app">Vänstersvepsapp</string>
- <string name="swipe_right_app">Högersvepsapp</string>
+ <string name="swipe_left_app">Svep vänster / styrkors höger</string>
+ <string name="swipe_right_app">Svep höger / styrkors vänster</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 7d5ed81..6bd8fb5 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -74,8 +74,8 @@
<string name="right">Sağ</string>
<string name="center">Merkez</string>
<string name="home_layout_alignment">Uygulama hizalaması</string>
- <string name="swipe_left_app">Sola kaydırma uygulaması</string>
- <string name="swipe_right_app">Sağa kaydırma uygulaması</string>
+ <string name="swipe_left_app">Sola kaydır / sağ d-pad</string>
+ <string name="swipe_right_app">Sağa kaydır / sol d-pad</string>
<string name="auto_show_keyboard">Klavyeyi otomatik göster</string>
<string name="hide">Sakla</string>
<string name="status_bar">Durum çubuğunu göster</string>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index d259c69..5ab9458 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -29,8 +29,8 @@
<string name="right">Праворуч</string>
<string name="center">По центру</string>
<string name="home_layout_alignment">Вирівнювання додатків</string>
- <string name="swipe_left_app">Проведіть вліво для</string>
- <string name="swipe_right_app">Проведіть вправо для</string>
+ <string name="swipe_left_app">Провести вліво / d-pad праворуч</string>
+ <string name="swipe_right_app">Провести вправо / d-pad ліворуч</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 237c969..1e11d5b 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -66,8 +66,8 @@
<string name="right">右对齐</string>
<string name="center">居中</string>
<string name="home_layout_alignment">应用对齐方式</string>
- <string name="swipe_left_app">向左滑动应用程序</string>
- <string name="swipe_right_app">向右滑动应用程序</string>
+ <string name="swipe_left_app">左滑 / 方向键右</string>
+ <string name="swipe_right_app">右滑 / 方向键左</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e982c8a..461cb09 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -53,8 +53,8 @@
<string name="right">Right</string>
<string name="center">Center</string>
<string name="home_layout_alignment">App alignment</string>
- <string name="swipe_left_app">Swipe left app</string>
- <string name="swipe_right_app">Swipe right app</string>
+ <string name="swipe_left_app">Swipe left / d-pad right</string>
+ <string name="swipe_right_app">Swipe right / d-pad left</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
@@ -115,6 +115,7 @@
<string name="swipe_down_for">Swipe down for</string>
<string name="search">Search</string>
<string name="notifications">Notifications</string>
+ <string name="open_app_drawer">Open app drawer</string>
<string name="notification_dots">Notification dots</string>
<string name="notification_dots_message">To show/hide notification dots on the home screen, please allow or disallow notification access for SidePhOnelauncher.