diff --git a/Android/app/src/main/java/com/example/mathseduc/ui/activity_multi.kt b/Android/app/src/main/java/com/example/mathseduc/ui/activity_multi.kt index 7231802..2dce33a 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ui/activity_multi.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ui/activity_multi.kt @@ -1,7 +1,7 @@ package com.example.mathseduc.ui + +import android.content.Context import android.content.Intent -import android.os.Handler -import android.os.Looper import android.util.Log import android.widget.Toast import androidx.compose.foundation.background @@ -26,6 +26,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -42,37 +44,47 @@ import com.example.mathseduc.controllers.ControllerLobby import com.example.mathseduc.controllers.ControllerUtiliser import com.example.mathseduc.models.Lobby import com.example.mathseduc.ui.theme.Colors +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.MultipartBody - @Composable fun MultiPage() { val context = LocalContext.current var selectedItem by rememberSaveable { mutableStateOf(null) } - - var lobbyList by rememberSaveable { mutableStateOf(ControllerLobby.getLobbies() ?: emptyList()) } - var refreshState by rememberSaveable { mutableStateOf(true) } + var lobbyList by remember { mutableStateOf>(emptyList()) } + val scope = rememberCoroutineScope() + var refreshState by remember { mutableStateOf(true) } + + // Fonction pour actualiser la liste des lobbies + suspend fun refreshLobbyList() { + val refreshedLobbyList = withContext(Dispatchers.IO) { + ControllerLobby.getLobbies() ?: emptyList() + } + lobbyList = refreshedLobbyList + Log.e("MainActivity", "Refreshed Lobby List") + } DisposableEffect(refreshState) { - val handler = Handler(Looper.getMainLooper()) - val refreshRunnable = object : Runnable { - override fun run() { - lobbyList = emptyList() - lobbyList = ControllerLobby.getLobbies()!! - selectedItem = null - if (refreshState){ - handler.postDelayed(this,3000) - Log.e("MainActivity", "Refresh Multi") + val refreshRunnable = { + scope.launch(Dispatchers.IO) { + try { + while (refreshState) { + delay(5000) + refreshLobbyList() + } + } catch (e: Exception) { + Log.e("MainActivity", "Error refreshing lobbies: ${e.message}") } } } - - handler.post(refreshRunnable) + refreshRunnable.invoke() onDispose { Toast.makeText(context, "Au REVOIR UwU", Toast.LENGTH_SHORT).show() refreshState = false - handler.removeCallbacks(refreshRunnable) } } @@ -117,7 +129,6 @@ fun MultiPage() { Button( onClick = { refreshState = false - val intent = Intent(context, CreateLobbyActivity::class.java) context.startActivity(intent) }, @@ -136,26 +147,23 @@ fun MultiPage() { .fillMaxSize() .weight(0.85f) ) { - items(lobbyList ?: emptyList()) { lobby -> + items(lobbyList) { lobby -> LobbyItem(lobby, selectedItem == lobby) { selectedItem = it - refreshState = false - if (ControllerLobby.getNbPlayerInLobby(selectedItem!!.id) < selectedItem!!.nbplayers){ - val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) - formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) - formDataBuilder.addFormDataPart("idlobby", selectedItem!!.id.toString()) - formDataBuilder.addFormDataPart("playertime", "0") - - ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder) - - val intent = Intent(context, ServerDetailsActivity::class.java) - intent.putExtra("serverName", selectedItem!!.name) - intent.putExtra("lobbyId", selectedItem!!.id) - context.startActivity(intent) + if (ControllerLobby.getNbPlayerInLobby(selectedItem!!.id) < selectedItem!!.nbplayers) { + // Créer un Utiliser si le lobby n'est pas plein + scope.launch { + createUtiliserForLobby(context, selectedItem!!) + } } else { - Toast.makeText(context, "Oh nan, le serveur est déjà plein ! Réessayer plus tard.", Toast.LENGTH_SHORT).show() + // Afficher un message Toast si le lobby est plein + Toast.makeText( + context, + "Oh nan, le serveur est déjà plein ! Réessayer plus tard.", + Toast.LENGTH_SHORT + ).show() } } } @@ -164,10 +172,26 @@ fun MultiPage() { } } +// Fonction pour créer un Utiliser pour le lobby sélectionné +private suspend fun createUtiliserForLobby(context: Context, lobby: Lobby) { + withContext(Dispatchers.IO) { + val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) + formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) + formDataBuilder.addFormDataPart("idlobby", lobby.id.toString()) + formDataBuilder.addFormDataPart("playertime", "0") + + ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder) + + // Naviguer vers l'activité ServerDetails avec les détails du lobby + val intent = Intent(context, ServerDetailsActivity::class.java) + intent.putExtra("serverName", lobby.name) + intent.putExtra("lobbyId", lobby.id) + context.startActivity(intent) + } +} + @Composable fun LobbyItem(lobby: Lobby, isSelected: Boolean, onItemClick: (Lobby) -> Unit) { - val nbCurrentPlayer = ControllerLobby.getNbPlayerInLobby(lobby.id) - Row( modifier = Modifier .fillMaxWidth() @@ -184,7 +208,6 @@ fun LobbyItem(lobby: Lobby, isSelected: Boolean, onItemClick: (Lobby) -> Unit) { fontSize = 18.sp, color = Colors.White, modifier = Modifier.weight(1f) - ) Text( text = "${ControllerLobby.getNbPlayerInLobby(lobby.id)}/${lobby.nbplayers}", @@ -205,5 +228,4 @@ fun LobbyItem(lobby: Lobby, isSelected: Boolean, onItemClick: (Lobby) -> Unit) { modifier = Modifier.weight(1f) ) } -} - +} \ No newline at end of file