diff options
| author | Tom Pratt <tom.pratt@outlook.com> | 2026-04-25 17:40:40 +0200 |
|---|---|---|
| committer | Tom Pratt <tompratt@squareup.com> | 2026-05-19 12:02:56 +0200 |
| commit | b1b133b0361d5047b01d60dd492f0d5207921e42 (patch) | |
| tree | b0d20d07d717d3035ad23c654a2285b49e743feb /Source/Android/app/src/main/java | |
| parent | 38b5c7370c47a6760bfce4cb8f9c45ab5d403dbb (diff) | |
Implement OnConnectionLost, show a dialog on the main netplay screen forcing the user to exit
Diffstat (limited to 'Source/Android/app/src/main/java')
4 files changed, 36 insertions, 2 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/Netplay.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/Netplay.kt index a90d1b00d8..7298795d71 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/Netplay.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/Netplay.kt @@ -47,6 +47,9 @@ object Netplay { private val _stopGame = Channel<Unit>(Channel.CONFLATED) val stopGame = _stopGame.receiveAsFlow() + private val _connectionLost = Channel<Unit>(Channel.CONFLATED) + val connectionLost = _connectionLost.receiveAsFlow() + private val _connectionErrors = Channel<String>(Channel.BUFFERED) val connectionErrors = _connectionErrors.receiveAsFlow() @@ -63,7 +66,7 @@ object Netplay { val players = _players.asSharedFlow().distinctUntilChanged() private val _chatMessages = MutableSharedFlow<String>( - replay = 1, + extraBufferCapacity = 32, onBufferOverflow = BufferOverflow.DROP_OLDEST ) val chatMessages = _chatMessages.asSharedFlow() @@ -180,6 +183,12 @@ object Netplay { _stopGame.trySend(Unit) } + @Keep + @JvmStatic + fun onConnectionLost() { + _connectionLost.trySend(Unit) + } + @JvmStatic fun onConnectionError(message: String) { _connectionErrors.trySend(message) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/model/NetplayViewModel.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/model/NetplayViewModel.kt index 217991f40c..955fb876dd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/model/NetplayViewModel.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/model/NetplayViewModel.kt @@ -25,6 +25,8 @@ class NetplayViewModel : ViewModel() { private val _goBack = Channel<Unit>(CONFLATED) val goBack = _goBack.receiveAsFlow() + val connectionLost = Netplay.connectionLost + val players = Netplay.players .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayActivity.kt index fec0823456..463ad31506 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayActivity.kt @@ -44,6 +44,7 @@ class NetplayActivity : AppCompatActivity(), ThemeProvider { DolphinTheme { NetplayScreen( onBackClicked = { finish() }, + connectionLost = viewModel.connectionLost, messages = viewModel.messages.collectAsState().value, onSendMessage = viewModel::sendMessage, game = viewModel.game.collectAsState().value, diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayScreen.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayScreen.kt index 73db806337..80914e952c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayScreen.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Remove +import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -43,6 +44,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -63,6 +65,8 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow import org.dolphinemu.dolphinemu.R import org.dolphinemu.dolphinemu.features.netplay.model.NetplayMessage import org.dolphinemu.dolphinemu.features.netplay.model.Player @@ -75,6 +79,7 @@ import org.dolphinemu.dolphinemu.ui.theme.PreviewTheme @Composable fun NetplayScreen( onBackClicked: () -> Unit, + connectionLost: Flow<Unit>, messages: List<NetplayMessage>, onSendMessage: (String) -> Unit, game: String, @@ -126,6 +131,22 @@ fun NetplayScreen( modifier = modifier ) } + + var showConnectionLostDialog by remember { mutableStateOf(false) } + LaunchedEffect(Unit) { + connectionLost.collect { showConnectionLostDialog = true } + } + if (showConnectionLostDialog) { + AlertDialog( + text = { Text(stringResource(R.string.netplay_connection_lost)) }, + confirmButton = { + TextButton(onClick = onBackClicked) { + Text(stringResource(R.string.ok)) + } + }, + onDismissRequest = onBackClicked, + ) + } } } @@ -246,7 +267,7 @@ private fun PlayersAndSettings( .fillMaxWidth() ) } - + if (hostInputAuthorityEnabled) { MenuSpacer() @@ -539,6 +560,7 @@ private fun LandscapeNetplayScreenDarkPreview() { private fun PreviewNetplayScreen() { NetplayScreen( onBackClicked = {}, + connectionLost = emptyFlow(), players = listOf( Player( pid = 1, |
