feat : button retour et createPlayer (register)

androidCompose
Maxence GUITARD 1 year ago
parent fb17127303
commit b3fa0d740d

@ -5,9 +5,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.ui.Alignment import androidx.compose.ui.Alignment
@ -28,91 +30,130 @@ 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 remember { mutableStateOf("") } var nickname by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
var showDialog by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) }
val context = LocalContext.current val context = LocalContext.current
Column( Column(modifier = Modifier.fillMaxSize()) {
modifier = Modifier TopAppBar(
.fillMaxSize() colors = TopAppBarDefaults.topAppBarColors(
.padding(16.dp), containerColor = Color.Transparent,
verticalArrangement = Arrangement.Center, ),
horizontalAlignment = Alignment.CenterHorizontally title = {},
) { navigationIcon = {
Image( IconButton(
painter = painterResource(id = R.drawable.logo), onClick = { activity.finish() },
contentDescription = null, modifier = Modifier.size(60.dp)
modifier = Modifier ) {
.size(160.dp, 130.dp) Icon(
.background(Color.Gray) // Replace with your background color imageVector = Icons.Filled.ArrowBack,
contentDescription = "Retour",
modifier = Modifier.size(36.dp),
tint = Color.White
)
}
},
) )
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.weight(1f),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(16.dp)) Image(
painter = painterResource(id = R.drawable.logo),
contentDescription = null,
modifier = Modifier
.size(160.dp, 130.dp)
)
OutlinedTextField( Spacer(modifier = Modifier.height(16.dp))
value = nickname,
onValueChange = { nickname = it },
label = { Text("Nickname") },
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
OutlinedTextField( OutlinedTextField(
value = password, value = nickname,
onValueChange = { password = it }, onValueChange = { nickname = it },
label = { Text("Password") }, label = { Text("Nickname") },
visualTransformation = PasswordVisualTransformation(), modifier = Modifier
keyboardOptions = KeyboardOptions.Default.copy( .fillMaxWidth()
keyboardType = KeyboardType.Password .padding(8.dp),
), colors = OutlinedTextFieldDefaults.colors(
modifier = Modifier focusedContainerColor = Color.White,
.fillMaxWidth() unfocusedContainerColor = Color.White,
.padding(8.dp) disabledContainerColor = Color.White,
) focusedBorderColor = Color.Blue,
),
shape = RoundedCornerShape(8.dp)
)
Spacer(modifier = Modifier.height(16.dp)) OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy(
keyboardType = KeyboardType.Password
),
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
colors = OutlinedTextFieldDefaults.colors(
focusedContainerColor = Color.White,
unfocusedContainerColor = Color.White,
disabledContainerColor = Color.White,
focusedBorderColor = Color.Blue,
),
shape = RoundedCornerShape(8.dp)
)
Button( Spacer(modifier = Modifier.height(16.dp))
onClick = {
val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password)
if (isAuthenticated != -1) {
MainActivity.idPlayerConnected = isAuthenticated
Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "Connexion échouée. Veuillez réessayer.", Toast.LENGTH_SHORT).show()
}
},
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
) {
Text("Login")
}
Spacer(modifier = Modifier.height(16.dp)) Button(
onClick = {
val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password)
if (isAuthenticated != -1) {
MainActivity.idPlayerConnected = isAuthenticated
Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "Connexion échouée. Veuillez réessayer.", Toast.LENGTH_SHORT).show()
}
},
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
) {
Text("Login")
}
Button( Spacer(modifier = Modifier.height(16.dp))
onClick = { showDialog = true },
modifier = Modifier Button(
.fillMaxWidth() onClick = { showDialog = true },
.height(48.dp) modifier = Modifier
) { .fillMaxWidth()
Text("Register") .height(48.dp),
} colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFF40E0D0))
) {
Text("Register")
}
if (showDialog) { if (showDialog) {
RegisterDialog(onDismiss = { showDialog = false }) RegisterDialog(onDismiss = { showDialog = false })
}
} }
} }
} }
@ -125,65 +166,66 @@ fun RegisterDialog(onDismiss: () -> Unit) {
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
AlertDialog( AlertDialog(
onDismissRequest = { onDismissRequest = {
onDismiss() onDismiss()
}, },
title = { Text("Register") }, title = { Text("Register") },
confirmButton = { confirmButton = {
Button( Button(
onClick = { onClick = {
// Save the user information or perform registration val playerId = ControllerPlayer.createPlayer(nickname, password)
onDismiss() onDismiss()
}
) {
Text("Save")
} }
) { },
Text("Save") dismissButton = {
} Button(
}, onClick = {
dismissButton = { onDismiss()
Button( }
onClick = { ) {
onDismiss() Text("Dismiss")
}
},
text = {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
) {
OutlinedTextField(
value = nickname,
onValueChange = { nickname = it },
label = { Text("Nickname") },
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy(
keyboardType = KeyboardType.Password
),
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
} }
) {
Text("Dismiss")
}
},
text = {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
) {
OutlinedTextField(
value = nickname,
onValueChange = { nickname = it },
label = { Text("Nickname") },
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy(
keyboardType = KeyboardType.Password
),
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
} }
}
) )
} }
@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()

@ -1,6 +1,7 @@
package com.example.mathseduc.ui package com.example.mathseduc.ui
import android.content.Intent import android.content.Intent
import android.widget.Toast
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -23,6 +24,8 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mathseduc.ConnexionPlayerActivity
import com.example.mathseduc.MainActivity
import com.example.mathseduc.MultiActivity import com.example.mathseduc.MultiActivity
import com.example.mathseduc.R import com.example.mathseduc.R
import com.example.mathseduc.ui.theme.Colors import com.example.mathseduc.ui.theme.Colors
@ -96,7 +99,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

Loading…
Cancel
Save