feat : option deletePlayer, Disconnected and ChangeInfosPlayer
continuous-integration/drone/push Build is passing Details

androidCompose
Maxence GUITARD 1 year ago
parent 1019af52d0
commit 4776e5ae0d

@ -147,6 +147,8 @@ fun ConnexionPlayerContent(navController: NavController) {
navController.navigate("home") navController.navigate("home")
} else { } else {
Toast.makeText(context, "Connexion échouée. Veuillez réessayer.", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Connexion échouée. Veuillez réessayer.", Toast.LENGTH_SHORT).show()
nickname = ""
password = ""
} }
}, },
modifier = Modifier modifier = Modifier
@ -183,6 +185,9 @@ fun RegisterDialog(onDismiss: () -> Unit) {
var nickname by remember { mutableStateOf("") } var nickname by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
var nicknameError by remember { mutableStateOf(false) }
var passwordError by remember { mutableStateOf(false) }
AlertDialog( AlertDialog(
onDismissRequest = { onDismissRequest = {
onDismiss() onDismiss()
@ -191,8 +196,13 @@ fun RegisterDialog(onDismiss: () -> Unit) {
confirmButton = { confirmButton = {
Button( Button(
onClick = { onClick = {
if (nickname.isNotBlank() && password.isNotBlank()) {
val playerId = ControllerPlayer.createPlayer(nickname, password) val playerId = ControllerPlayer.createPlayer(nickname, password)
onDismiss() onDismiss()
} else {
if (nickname.isBlank()) nicknameError = true
if (password.isBlank()) passwordError = true
}
} }
) { ) {
Text("Save") Text("Save")
@ -215,16 +225,23 @@ fun RegisterDialog(onDismiss: () -> Unit) {
) { ) {
OutlinedTextField( OutlinedTextField(
value = nickname, value = nickname,
onValueChange = { nickname = it }, onValueChange = {
nickname = it
nicknameError = false
},
label = { Text("Nickname") }, label = { Text("Nickname") },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
isError = nicknameError
) )
OutlinedTextField( OutlinedTextField(
value = password, value = password,
onValueChange = { password = it }, onValueChange = {
password = it
passwordError = false
},
label = { Text("Password") }, label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(), visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy( keyboardOptions = KeyboardOptions.Default.copy(
@ -232,8 +249,17 @@ fun RegisterDialog(onDismiss: () -> Unit) {
), ),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
isError = passwordError
) )
if (nicknameError || passwordError) {
Text(
text = "Please fill in all fields",
color = Color.Red,
modifier = Modifier.padding(start = 8.dp)
)
}
} }
} }
) )

@ -6,6 +6,7 @@ import com.example.mathseduc.models.*
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.MultipartBody
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -96,34 +97,55 @@ class ControllerPlayer {
} }
} }
} }
/*
fun updatePlayer(playerId: String,nickname: String, password: String) { fun deletePlayer(playerId: String) {
try { try {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy) StrictMode.setThreadPolicy(policy)
// Client HTTP API
val client = OkHttpClient() val client = OkHttpClient()
val hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt()) // API Access - Suppression du player
val deleteRequest = Request.Builder()
val requestBody = FormBody.Builder() .url("https://trusting-panini.87-106-126-109.plesk.page/api/delete/player/$playerId/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
.add("nickname", nickname) .delete()
.add("password", hashedPassword)
.build() .build()
// API Response
val deleteResponse: Response = client.newCall(deleteRequest).execute()
// Vérifier si la suppression a réussi
if (!deleteResponse.isSuccessful) {
Log.e("deletePlayer", "Error deleting player")
}
} catch (e: Exception) {
// Log en cas d'erreur
Log.e("deletePlayer", "Error deleting player", e)
}
}
fun updatePlayer(playerId: String,lobbyData: MultipartBody.Builder) {
try {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
val client = OkHttpClient()
val updateRequest = Request.Builder() val updateRequest = Request.Builder()
.url("https://trusting-panini.87-106-126-109.plesk.page/api/update/player/${playerId}/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO") .url("https://trusting-panini.87-106-126-109.plesk.page/api/update/player/${playerId}/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
.post(requestBody) .post(lobbyData.build())
.build() .build()
val updateResponse: Response = client.newCall(updateRequest).execute() val updateResponse: Response = client.newCall(updateRequest).execute()
if (!updateResponse.isSuccessful) { if (!updateResponse.isSuccessful) {
Log.e("updatePlayer", "Error updating player") Log.e("updatePlayer", "Error updating player")
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e("updateLobby", "Error updating lobby", e) Log.e("updatePlayer", "Error updating lobby", e)
}
} }
}*/
fun authenticateUser(nickname: String, password: String): Int { fun authenticateUser(nickname: String, password: String): Int {

@ -2,18 +2,15 @@ package com.example.mathseduc.ui
import android.app.Activity import android.app.Activity
import android.content.res.Configuration import android.content.res.Configuration
import android.widget.Toast
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape 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.Icons
@ -39,7 +36,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
@ -51,9 +47,10 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.NavController import androidx.navigation.NavController
import com.example.mathseduc.MainActivity import com.example.mathseduc.MainActivity
import com.example.mathseduc.RegisterDialog
import com.example.mathseduc.controllers.ControllerPlayer import com.example.mathseduc.controllers.ControllerPlayer
import com.example.mathseduc.ui.theme.Colors import com.example.mathseduc.ui.theme.Colors
import okhttp3.MultipartBody
import org.mindrot.jbcrypt.BCrypt
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -62,6 +59,7 @@ fun ProfilePlayerPage(navController: NavController) {
val player = ControllerPlayer.getPlayerInfoById(MainActivity.idPlayerConnected.toString()) val player = ControllerPlayer.getPlayerInfoById(MainActivity.idPlayerConnected.toString())
var showDialog by rememberSaveable { mutableStateOf(false) } var showDialog by rememberSaveable { mutableStateOf(false) }
var confirmDialog by rememberSaveable { mutableStateOf(false) }
val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT
@ -153,7 +151,23 @@ fun ProfilePlayerPage(navController: NavController) {
Spacer(modifier = Modifier.height(10.dp)) Spacer(modifier = Modifier.height(10.dp))
Button( Button(
onClick = { }, onClick = { MainActivity.idPlayerConnected = -1
navController.navigate("home") },
shape = RoundedCornerShape(15),
colors = ButtonDefaults.buttonColors(Colors.Blue),
modifier = Modifier
.height(48.dp)
.padding(horizontal = 6.dp)
) {
Text(
text = "disconnection",
color = Color.White
)
}
Spacer(modifier = Modifier.height(10.dp))
Button(
onClick = { confirmDialog = true },
shape = RoundedCornerShape(15), shape = RoundedCornerShape(15),
colors = ButtonDefaults.buttonColors(Colors.Red), colors = ButtonDefaults.buttonColors(Colors.Red),
modifier = Modifier modifier = Modifier
@ -167,7 +181,15 @@ fun ProfilePlayerPage(navController: NavController) {
} }
if (showDialog) { if (showDialog) {
if (player != null) { if (player != null) {
ChangeDialog(player.id.toString(),onDismiss = { showDialog = false }) ChangeDialog(player.id.toString(),player.nickname,onDismiss = { showDialog = false })
}
}
if (confirmDialog) {
if (player != null) {
DeleteConfirmDialog(onConfirmDelete = { ControllerPlayer.deletePlayer(player.id.toString())
MainActivity.idPlayerConnected = -1
navController.navigate("home")
confirmDialog = false},onDismiss = { confirmDialog = false })
} }
} }
} }
@ -175,12 +197,14 @@ fun ProfilePlayerPage(navController: NavController) {
} }
@Composable @Composable
fun ChangeDialog(playerId: String,onDismiss: () -> Unit) { fun ChangeDialog(playerId: String, currentNickname: String, onDismiss: () -> Unit) {
val context = LocalContext.current
var nickname by rememberSaveable { mutableStateOf("") } var nickname by rememberSaveable { mutableStateOf(currentNickname) }
var password by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") }
var nicknameError by remember { mutableStateOf(false) }
var passwordError by remember { mutableStateOf(false) }
AlertDialog( AlertDialog(
onDismissRequest = { onDismissRequest = {
onDismiss() onDismiss()
@ -191,10 +215,15 @@ fun ChangeDialog(playerId: String,onDismiss: () -> Unit) {
colors = ButtonDefaults.buttonColors(Colors.Cyan), colors = ButtonDefaults.buttonColors(Colors.Cyan),
onClick = { onClick = {
if (nickname.isNotBlank() && password.isNotBlank()) { if (nickname.isNotBlank() && password.isNotBlank()) {
/*ControllerPlayer.updatePlayer(playerId,nickname,password)*/ val hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt())
val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("nickname", nickname)
formDataBuilder.addFormDataPart("password", hashedPassword)
ControllerPlayer.updatePlayer(playerId, formDataBuilder)
onDismiss() onDismiss()
} else { } else {
Toast.makeText(context, "Please fill in all fields", Toast.LENGTH_SHORT).show() if (nickname.isBlank()) nicknameError = true
if (password.isBlank()) passwordError = true
} }
} }
) { ) {
@ -219,15 +248,22 @@ fun ChangeDialog(playerId: String,onDismiss: () -> Unit) {
) { ) {
OutlinedTextField( OutlinedTextField(
value = nickname, value = nickname,
onValueChange = { nickname = it }, onValueChange = {
nickname = it
nicknameError = false
},
label = { Text("Nickname") }, label = { Text("Nickname") },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
isError = nicknameError
) )
OutlinedTextField( OutlinedTextField(
value = password, value = password,
onValueChange = { password = it }, onValueChange = {
password = it
passwordError = false
},
label = { Text("Password") }, label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(), visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy( keyboardOptions = KeyboardOptions.Default.copy(
@ -235,9 +271,50 @@ fun ChangeDialog(playerId: String,onDismiss: () -> Unit) {
), ),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp) .padding(8.dp),
isError = passwordError
)
if (nicknameError || passwordError) {
Text(
text = "Please fill in all fields",
color = Color.Red,
modifier = Modifier.padding(start = 8.dp)
) )
} }
} }
}
)
}
@Composable
fun DeleteConfirmDialog(onConfirmDelete: () -> Unit, onDismiss: () -> Unit) {
AlertDialog(
onDismissRequest = onDismiss,
title = { Text("Confirm deleting account") },
confirmButton = {
Button(
onClick = {
onConfirmDelete()
},
colors = ButtonDefaults.buttonColors(Colors.Red)
) {
Text("Delete",color = Color.White)
}
},
dismissButton = {
Button(
onClick = {
onDismiss()
},
colors = ButtonDefaults.buttonColors(Color.LightGray)
) {
Text("Cancel",color = Color.White)
}
},
text = {
Text("Are you sure you want to delete your account?")
}
) )
} }
Loading…
Cancel
Save