|
|
|
@ -38,7 +38,6 @@ import androidx.window.layout.WindowLayoutInfo
|
|
|
|
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
|
|
|
import com.google.android.material.slider.Slider
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.flow.collect
|
|
|
|
|
import kotlinx.coroutines.flow.collectLatest
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
|
|
|
@ -141,7 +140,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
|
|
|
|
|
// So this fragment doesn't restart on configuration changes; i.e. rotation.
|
|
|
|
|
retainInstance = true
|
|
|
|
|
emulationState = EmulationState(game.path)
|
|
|
|
|
emulationState = EmulationState(game.path) {
|
|
|
|
|
return@EmulationState driverViewModel.isInteractionAllowed.value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -370,6 +371,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
launch {
|
|
|
|
|
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
|
|
|
|
driverViewModel.isInteractionAllowed.collect {
|
|
|
|
|
if (it) {
|
|
|
|
|
startEmulation()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
launch {
|
|
|
|
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
|
|
|
|
emulationViewModel.emulationStarted.collectLatest {
|
|
|
|
@ -398,19 +408,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
launch {
|
|
|
|
|
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
|
|
|
|
driverViewModel.isInteractionAllowed.collect {
|
|
|
|
|
if (it) {
|
|
|
|
|
onEmulationStart()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onEmulationStart() {
|
|
|
|
|
private fun startEmulation() {
|
|
|
|
|
if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
|
|
|
|
|
if (!DirectoryInitialization.areDirectoriesReady) {
|
|
|
|
|
DirectoryInitialization.start()
|
|
|
|
@ -810,7 +811,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class EmulationState(private val gamePath: String) {
|
|
|
|
|
private class EmulationState(
|
|
|
|
|
private val gamePath: String,
|
|
|
|
|
private val emulationCanStart: () -> Boolean
|
|
|
|
|
) {
|
|
|
|
|
private var state: State
|
|
|
|
|
private var surface: Surface? = null
|
|
|
|
|
|
|
|
|
@ -904,6 +908,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
State.PAUSED -> Log.warning(
|
|
|
|
|
"[EmulationFragment] Surface cleared while emulation paused."
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
else -> Log.warning(
|
|
|
|
|
"[EmulationFragment] Surface cleared while emulation stopped."
|
|
|
|
|
)
|
|
|
|
@ -913,6 +918,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|
|
|
|
|
|
|
|
|
private fun runWithValidSurface() {
|
|
|
|
|
NativeLibrary.surfaceChanged(surface)
|
|
|
|
|
if (!emulationCanStart.invoke()) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
when (state) {
|
|
|
|
|
State.STOPPED -> {
|
|
|
|
|
val emulationThread = Thread({
|
|
|
|
|