From 6043dbd6909e34d9461548617ffa20bb83da51eb Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 9 Mar 2026 10:16:46 -0300 Subject: [PATCH] [android,ui] chore: back action behavior (a16 hypoeros) fix attempt 1 --- .../features/settings/ui/SettingsActivity.kt | 7 +++--- .../yuzu_emu/fragments/EmulationFragment.kt | 2 +- .../org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt index 11be703536..b5e47c5b23 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt @@ -108,9 +108,10 @@ class SettingsActivity : AppCompatActivity() { fun navigateBack() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment - if (navHostFragment.childFragmentManager.backStackEntryCount > 0) { - navHostFragment.navController.popBackStack() - } else { + val navController = navHostFragment.navController + val popped = navController.popBackStack() + + if (!popped) { finishWithFragmentLikeAnimation() } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 435fe5fe2c..8eadfb2678 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -879,7 +879,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { setInsets() requireActivity().onBackPressedDispatcher.addCallback( - requireActivity(), + viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (!NativeLibrary.isRunning()) { 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 74a171cf1f..3106c75a92 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 @@ -12,6 +12,7 @@ import android.view.ViewGroup.MarginLayoutParams import android.view.WindowManager import android.view.animation.PathInterpolator import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -153,6 +154,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment setUpNavigation(navHostFragment.navController) + installBackPressPolicy(navHostFragment.navController) homeViewModel.statusBarShadeVisible.collect(this) { showStatusBarShade(it) } homeViewModel.contentToInstall.collect( @@ -330,6 +332,28 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } } + private fun installBackPressPolicy(navController: NavController) { + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val isOnGamesScreen = navController.currentDestination?.id == R.id.gamesFragment + if (isOnGamesScreen) { + // Allow native OS/app exit behavior only from the games root screen. + isEnabled = false + onBackPressedDispatcher.onBackPressed() + isEnabled = true + return + } + + if (!navController.popBackStack()) { + navController.navigate(R.id.gamesFragment) + } + } + } + ) + } + private fun showStatusBarShade(visible: Boolean) { binding.statusBarShade.animate().apply { if (visible) {