Merge remote-tracking branch 'origin/androidCompose' into androidCompose

androidCompose
Jeremy DUCOURTHIAL 1 year ago
commit 14d05c7dd1

@ -6,9 +6,11 @@ import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@ -30,33 +32,55 @@ class ConnexionPlayerActivity : ComponentActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
MathsEducTheme { MathsEducTheme {
ConnexionPlayerContent() ConnexionPlayerContent(activity = this@ConnexionPlayerActivity)
} }
} }
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ConnexionPlayerContent() { fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) {
var nickname by rememberSaveable { mutableStateOf("") } var nickname by rememberSaveable { mutableStateOf("") }
var password by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") }
var showDialog by rememberSaveable { mutableStateOf(false) } var showDialog by rememberSaveable { mutableStateOf(false) }
val context = LocalContext.current val context = LocalContext.current
Column(modifier = Modifier.fillMaxSize()) {
TopAppBar(
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Transparent,
),
title = {},
navigationIcon = {
IconButton(
onClick = { activity.finish() },
modifier = Modifier.size(60.dp)
) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = "Retour",
modifier = Modifier.size(36.dp),
tint = Color.White
)
}
},
)
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxWidth()
.padding(16.dp), .padding(16.dp)
.weight(1f),
verticalArrangement = Arrangement.Center, verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Image( Image(
painter = painterResource(id = R.drawable.logo), painter = painterResource(id = R.drawable.logo),
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
.size(160.dp, 130.dp) .size(160.dp, 130.dp)
.background(Color.Gray) // Replace with your background color
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
@ -67,7 +91,14 @@ fun ConnexionPlayerContent() {
label = { Text("Nickname") }, label = { Text("Nickname") },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
colors = OutlinedTextFieldDefaults.colors(
focusedContainerColor = Color.White,
unfocusedContainerColor = Color.White,
disabledContainerColor = Color.White,
focusedBorderColor = Color.Blue,
),
shape = RoundedCornerShape(8.dp)
) )
OutlinedTextField( OutlinedTextField(
@ -80,7 +111,14 @@ fun ConnexionPlayerContent() {
), ),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
colors = OutlinedTextFieldDefaults.colors(
focusedContainerColor = Color.White,
unfocusedContainerColor = Color.White,
disabledContainerColor = Color.White,
focusedBorderColor = Color.Blue,
),
shape = RoundedCornerShape(8.dp)
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
@ -89,9 +127,6 @@ fun ConnexionPlayerContent() {
onClick = { onClick = {
val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password) val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password)
if (isAuthenticated != -1) { if (isAuthenticated != -1) {
val intent = Intent(context, MainActivity::class.java)
context.startActivity(intent)
MainActivity.idPlayerConnected = isAuthenticated MainActivity.idPlayerConnected = isAuthenticated
Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show()
} else { } else {
@ -111,7 +146,9 @@ fun ConnexionPlayerContent() {
onClick = { showDialog = true }, onClick = { showDialog = true },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.height(48.dp) .height(48.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFF40E0D0))
) { ) {
Text("Register") Text("Register")
} }
@ -121,6 +158,7 @@ fun ConnexionPlayerContent() {
} }
} }
} }
}
@Composable @Composable
fun RegisterDialog(onDismiss: () -> Unit) { fun RegisterDialog(onDismiss: () -> Unit) {
@ -137,7 +175,7 @@ fun RegisterDialog(onDismiss: () -> Unit) {
confirmButton = { confirmButton = {
Button( Button(
onClick = { onClick = {
// Save the user information or perform registration val playerId = ControllerPlayer.createPlayer(nickname, password)
onDismiss() onDismiss()
} }
) { ) {
@ -188,7 +226,8 @@ fun RegisterDialog(onDismiss: () -> Unit) {
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
fun ConnexionPlayerPreview() { fun ConnexionPlayerPreview() {
val fakeActivity = ConnexionPlayerActivity()
MathsEducTheme { MathsEducTheme {
ConnexionPlayerContent() ConnexionPlayerContent(activity = fakeActivity)
} }
} }

@ -62,6 +62,39 @@ class ControllerPlayer {
return null return null
} }
fun createPlayer(nickname: String, password: String): Int {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
val client = OkHttpClient()
val hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt())
val requestBody = FormBody.Builder()
.add("nickname", nickname)
.add("password", hashedPassword)
.build()
val request = Request.Builder()
.url("https://trusting-panini.87-106-126-109.plesk.page/api/add/player/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
.post(requestBody)
.build()
client.newCall(request).execute().use { response ->
if (response.isSuccessful) {
val responseData = response.body?.string()
val gson = Gson()
val player: Player = gson.fromJson(responseData, Player::class.java)
return player.id
} else {
throw IOException("Failed to create player: ${response.code}")
}
}
}
fun authenticateUser(nickname: String, password: String): Int { fun authenticateUser(nickname: String, password: String): Int {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()

@ -103,7 +103,8 @@ fun HomePage() {
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
Button( Button(
onClick = { /* Handle connexion button click */ }, onClick = { val intent = Intent(context, ConnexionPlayerActivity::class.java)
context.startActivity(intent) },
shape = RoundedCornerShape(15), shape = RoundedCornerShape(15),
colors = ButtonDefaults.buttonColors(Colors.Grey), colors = ButtonDefaults.buttonColors(Colors.Grey),
modifier = Modifier modifier = Modifier

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

Loading…
Cancel
Save