[android,ui] chore: back action behavior (a16 hypoeros) fix attempt 1

This commit is contained in:
xbzk 2026-03-09 10:16:46 -03:00
parent a1b50e9339
commit 6043dbd690
3 changed files with 29 additions and 4 deletions

View file

@ -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()
}
}

View file

@ -879,7 +879,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
setInsets()
requireActivity().onBackPressedDispatcher.addCallback(
requireActivity(),
viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!NativeLibrary.isRunning()) {

View file

@ -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) {