From 0d1680544501d9655341618ed007c3acfcd8de5a Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Fri, 28 Apr 2023 19:50:58 -0400 Subject: [PATCH] android: Scroll shortcut for games list If you reselect the "Games" menu item in the bottom navigation menu, the list smoothly scrolls to the top. --- .../java/org/yuzu/yuzu_emu/model/GamesViewModel.kt | 7 +++++++ .../java/org/yuzu/yuzu_emu/ui/GamesFragment.kt | 14 ++++++++++++++ .../java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 14 +++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt index 709a5b976..95bad38c6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt @@ -26,6 +26,9 @@ class GamesViewModel : ViewModel() { private val _shouldSwapData = MutableLiveData(false) val shouldSwapData: LiveData get() = _shouldSwapData + private val _shouldScrollToTop = MutableLiveData(false) + val shouldScrollToTop: LiveData get() = _shouldScrollToTop + init { reloadGames(false) } @@ -38,6 +41,10 @@ class GamesViewModel : ViewModel() { _shouldSwapData.postValue(shouldSwap) } + fun setShouldScrollToTop(shouldScroll: Boolean) { + _shouldScrollToTop.postValue(shouldScroll) + } + fun reloadGames(directoryChanged: Boolean) { if (isReloading.value == true) return diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt index 3ca529b20..227ca1afc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt @@ -138,6 +138,14 @@ class GamesFragment : Fragment() { searchHidden() } + // Check if the user reselected the games menu item and then scroll to top of the list + gamesViewModel.shouldScrollToTop.observe(viewLifecycleOwner) { shouldScroll -> + if (shouldScroll) { + scrollToTop() + gamesViewModel.setShouldScrollToTop(false) + } + } + setInsets() // Make sure the loading indicator appears even if the layout is told to refresh before being fully drawn @@ -191,6 +199,12 @@ class GamesFragment : Fragment() { } } + fun scrollToTop() { + if (_binding != null) { + binding.gridGames.smoothScrollToPosition(0) + } + } + private fun setInsets() = ViewCompat.setOnApplyWindowInsetsListener(binding.gridGames) { view: View, windowInsets: WindowInsetsCompat -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index e8284471a..473d38a29 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -25,6 +25,7 @@ import androidx.preference.PreferenceManager import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.elevation.ElevationOverlayProvider +import com.google.android.material.navigation.NavigationBarView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -73,6 +74,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment setUpNavigation(navHostFragment.navController) + (binding.navigationBar as NavigationBarView).setOnItemReselectedListener { + if (it.itemId == R.id.gamesFragment) { + gamesViewModel.setShouldScrollToTop(true) + } + } binding.statusBarShade.setBackgroundColor( MaterialColors.getColor( @@ -243,7 +249,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider { ) val dstPath = DirectoryInitialization.userDirectory + "/keys/" - if (FileUtil.copyUriToInternalStorage(applicationContext, result, dstPath, "prod.keys")) { + if (FileUtil.copyUriToInternalStorage( + applicationContext, + result, + dstPath, + "prod.keys" + ) + ) { if (NativeLibrary.reloadKeys()) { Toast.makeText( applicationContext,