diff options
| author | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-12 12:46:33 +0200 |
|---|---|---|
| committer | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-12 12:46:33 +0200 |
| commit | a63ed91248c842bd6e5a4f7e9c95349cd99027c6 (patch) | |
| tree | 327d6e3b965cf5fdee59057f971328375304490f /app/src | |
| parent | 714f7824947894ac17e35fddb78c5f81b3bdc752 (diff) | |
| download | SidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.tar.gz SidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.tar.bz2 SidePhOnelauncher-a63ed91248c842bd6e5a4f7e9c95349cd99027c6.zip | |
Refine dpad and app drawer navigation
Diffstat (limited to 'app/src')
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. |
