[android] fix for intent launch + emulation fragment binding rc barriers (#471)

trial to confirm whether some emulationState related race condition is causing crashes on android

Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/471
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: crueter <crueter@eden-emu.dev>
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
This commit is contained in:
xbzk 2025-09-21 16:06:56 +02:00 committed by crueter
parent 1ca35b7559
commit cbbdfc75cc
Signed by: crueter
GPG key ID: 425ACD2D4830EBC6

View file

@ -810,28 +810,26 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
if (_binding == null) { val b = _binding ?: return
return
}
updateScreenLayout() updateScreenLayout()
val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()
if (emulationActivity?.isInPictureInPictureMode == true) { if (emulationActivity?.isInPictureInPictureMode == true) {
if (binding.drawerLayout.isOpen) { if (b.drawerLayout.isOpen) {
binding.drawerLayout.close() b.drawerLayout.close()
} }
if (showInputOverlay) { if (showInputOverlay) {
binding.surfaceInputOverlay.setVisible(visible = false, gone = false) b.surfaceInputOverlay.setVisible(visible = false, gone = false)
} }
} else { } else {
binding.surfaceInputOverlay.setVisible( b.surfaceInputOverlay.setVisible(
showInputOverlay && emulationViewModel.emulationStarted.value showInputOverlay && emulationViewModel.emulationStarted.value
) )
if (!isInFoldableLayout) { if (!isInFoldableLayout) {
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
binding.surfaceInputOverlay.layout = OverlayLayout.Portrait b.surfaceInputOverlay.layout = OverlayLayout.Portrait
} else { } else {
binding.surfaceInputOverlay.layout = OverlayLayout.Landscape b.surfaceInputOverlay.layout = OverlayLayout.Landscape
} }
} }
} }
@ -847,8 +845,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
private fun updateQuickOverlayMenuEntry(isVisible: Boolean) { private fun updateQuickOverlayMenuEntry(isVisible: Boolean) {
val menu = binding.inGameMenu.menu val b = _binding ?: return
val item = menu.findItem(R.id.menu_quick_overlay) val item = b.inGameMenu.menu.findItem(R.id.menu_quick_overlay) ?: return
if (isVisible) { if (isVisible) {
item.title = getString(R.string.emulation_hide_overlay) item.title = getString(R.string.emulation_hide_overlay)
item.icon = ResourcesCompat.getDrawable( item.icon = ResourcesCompat.getDrawable(
@ -867,8 +866,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
private fun updatePauseMenuEntry(isPaused: Boolean) { private fun updatePauseMenuEntry(isPaused: Boolean) {
val menu = binding.inGameMenu.menu val b = _binding ?: return
val pauseItem = menu.findItem(R.id.menu_pause_emulation) val pauseItem = b.inGameMenu.menu.findItem(R.id.menu_pause_emulation) ?: return
if (isPaused) { if (isPaused) {
pauseItem.title = getString(R.string.emulation_unpause) pauseItem.title = getString(R.string.emulation_unpause)
pauseItem.icon = ResourcesCompat.getDrawable( pauseItem.icon = ResourcesCompat.getDrawable(
@ -887,9 +886,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
override fun onPause() { override fun onPause() {
if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) { if (this::emulationState.isInitialized) {
emulationState.pause() if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) {
updatePauseMenuEntry(true) emulationState.pause()
updatePauseMenuEntry(true)
}
} }
super.onPause() super.onPause()
} }
@ -906,15 +907,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
// If the overlay is enabled, we need to update the position if changed val b = _binding ?: return
val position = IntSetting.PERF_OVERLAY_POSITION.getInt() updateStatsPosition(IntSetting.PERF_OVERLAY_POSITION.getInt())
updateStatsPosition(position) updateSocPosition(IntSetting.SOC_OVERLAY_POSITION.getInt())
val socPosition = IntSetting.SOC_OVERLAY_POSITION.getInt() if (this::emulationState.isInitialized) {
updateSocPosition(socPosition) b.inGameMenu.post {
if (!this::emulationState.isInitialized || _binding == null) return@post
binding.inGameMenu.post { updatePauseMenuEntry(emulationState.isPaused)
emulationState?.isPaused?.let { updatePauseMenuEntry(it) } }
} }
} }
@ -1229,6 +1230,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
private fun updateScreenLayout() { private fun updateScreenLayout() {
val b = _binding ?: return
val verticalAlignment = val verticalAlignment =
EmulationVerticalAlignment.from(IntSetting.VERTICAL_ALIGNMENT.getInt()) EmulationVerticalAlignment.from(IntSetting.VERTICAL_ALIGNMENT.getInt())
val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.getInt()) { val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.getInt()) {
@ -1240,35 +1242,37 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
} }
when (verticalAlignment) { when (verticalAlignment) {
EmulationVerticalAlignment.Top -> { EmulationVerticalAlignment.Top -> {
binding.surfaceEmulation.setAspectRatio(aspectRatio) b.surfaceEmulation.setAspectRatio(aspectRatio)
val params = FrameLayout.LayoutParams( val params = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT
) )
params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
binding.surfaceEmulation.layoutParams = params b.surfaceEmulation.layoutParams = params
} }
EmulationVerticalAlignment.Center -> { EmulationVerticalAlignment.Center -> {
binding.surfaceEmulation.setAspectRatio(null) b.surfaceEmulation.setAspectRatio(null)
binding.surfaceEmulation.updateLayoutParams { b.surfaceEmulation.updateLayoutParams {
width = ViewGroup.LayoutParams.MATCH_PARENT width = ViewGroup.LayoutParams.MATCH_PARENT
height = ViewGroup.LayoutParams.MATCH_PARENT height = ViewGroup.LayoutParams.MATCH_PARENT
} }
} }
EmulationVerticalAlignment.Bottom -> { EmulationVerticalAlignment.Bottom -> {
binding.surfaceEmulation.setAspectRatio(aspectRatio) b.surfaceEmulation.setAspectRatio(aspectRatio)
val params = val params =
FrameLayout.LayoutParams( FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT
) )
params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
binding.surfaceEmulation.layoutParams = params b.surfaceEmulation.layoutParams = params
} }
} }
emulationState.updateSurface() if (this::emulationState.isInitialized) {
emulationState.updateSurface()
}
emulationActivity?.buildPictureInPictureParams() emulationActivity?.buildPictureInPictureParams()
updateOrientation() updateOrientation()
} }