summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorTom Pratt <tom.pratt@outlook.com>2026-04-25 17:40:40 +0200
committerTom Pratt <tompratt@squareup.com>2026-05-19 12:02:56 +0200
commitb1b133b0361d5047b01d60dd492f0d5207921e42 (patch)
treeb0d20d07d717d3035ad23c654a2285b49e743feb /Source/Android/app/src/main/java
parent38b5c7370c47a6760bfce4cb8f9c45ab5d403dbb (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')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/Netplay.kt11
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/model/NetplayViewModel.kt2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayActivity.kt1
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplayScreen.kt24
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,