feat : debut Navigation ( home, createLobby, Connexion, Multiplayer)
continuous-integration/drone/push Build is passing Details

androidCompose
Yvan CALATAYUD 1 year ago
parent a1665f119c
commit 59c657877d

@ -71,4 +71,5 @@ dependencies {
implementation("com.squareup.okhttp3:okhttp:4.10.0") implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.code.gson:gson:2.10.1")
implementation("org.mindrot:jbcrypt:0.4") implementation("org.mindrot:jbcrypt:0.4")
implementation("androidx.navigation:navigation-compose:2.7.7")
} }

@ -0,0 +1,22 @@
package com.example.mathseduc
import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.mathseduc.ui.CreateLobbyPage
import com.example.mathseduc.ui.HomePage
import com.example.mathseduc.ui.MultiPage
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomePage(navController) }
composable("connexion") { ConnexionPlayerContent(navController) }
composable("multiplayer") { MultiPage(navController) }
composable("createLobby") { CreateLobbyPage(navController) }
//composable("serverDetails/{serverName}/{lobbyId}") { ServerDetailPage(navController) }
}
}

@ -1,5 +1,6 @@
package com.example.mathseduc package com.example.mathseduc
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
@ -20,6 +21,7 @@ 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.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
@ -27,6 +29,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.example.mathseduc.controllers.ControllerPlayer import com.example.mathseduc.controllers.ControllerPlayer
@ -34,17 +38,19 @@ class ConnexionPlayerActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
ConnexionPlayerContent(activity = this@ConnexionPlayerActivity) val navController = rememberNavController()
ConnexionPlayerContent(navController = navController)
} }
} }
} }
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) { fun ConnexionPlayerContent(navController: NavController) {
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 activity = LocalView.current.context as Activity
val context = LocalContext.current val context = LocalContext.current
val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT
@ -56,7 +62,7 @@ fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) {
} }
// Hide the status bar // Hide the status bar
windowInsetsController?.hide(WindowInsetsCompat.Type.statusBars()) windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
TopAppBar( TopAppBar(
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
@ -65,7 +71,7 @@ fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) {
title = {}, title = {},
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = { activity.finish() }, onClick = { navController.navigate("home") },
modifier = Modifier.size(60.dp) modifier = Modifier.size(60.dp)
) { ) {
Icon( Icon(
@ -232,11 +238,4 @@ fun RegisterDialog(onDismiss: () -> Unit) {
} }
} }
) )
}
@Preview(showBackground = true)
@Composable
fun ConnexionPlayerPreview() {
val fakeActivity = ConnexionPlayerActivity()
ConnexionPlayerContent(activity = fakeActivity)
} }

@ -3,13 +3,15 @@ package com.example.mathseduc
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.navigation.compose.rememberNavController
import com.example.mathseduc.ui.CreateLobbyPage import com.example.mathseduc.ui.CreateLobbyPage
class CreateLobbyActivity : ComponentActivity() { class CreateLobbyActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
CreateLobbyPage(activity = this@CreateLobbyActivity) val navController = rememberNavController()
CreateLobbyPage(navController)
} }
} }
} }

@ -16,7 +16,7 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
HomePage() AppNavigation()
} }
} }
} }

@ -3,6 +3,7 @@ package com.example.mathseduc
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.navigation.compose.rememberNavController
import com.example.mathseduc.ui.MultiPage import com.example.mathseduc.ui.MultiPage
@ -10,7 +11,8 @@ class MultiActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
MultiPage(activity = this@MultiActivity) val navController = rememberNavController()
MultiPage(navController)
} }
} }
} }

@ -1,6 +1,7 @@
package com.example.mathseduc.ui package com.example.mathseduc.ui
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
@ -33,6 +34,7 @@ import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
@ -40,7 +42,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import com.example.mathseduc.CreateLobbyActivity import androidx.navigation.NavController
import com.example.mathseduc.MainActivity import com.example.mathseduc.MainActivity
import com.example.mathseduc.ServerDetailsActivity import com.example.mathseduc.ServerDetailsActivity
import com.example.mathseduc.controllers.ControllerChapter import com.example.mathseduc.controllers.ControllerChapter
@ -50,7 +52,7 @@ import com.example.mathseduc.ui.theme.Colors
import okhttp3.MultipartBody import okhttp3.MultipartBody
@Composable @Composable
fun CreateLobbyPage(activity: CreateLobbyActivity) { fun CreateLobbyPage(navController: NavController) {
var lobbyName by remember { mutableStateOf("") } var lobbyName by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
var nbPlayers by remember { mutableStateOf("") } var nbPlayers by remember { mutableStateOf("") }
@ -63,6 +65,7 @@ fun CreateLobbyPage(activity: CreateLobbyActivity) {
val difficultyOptions = listOf("Facile", "Moyen", "Difficile") val difficultyOptions = listOf("Facile", "Moyen", "Difficile")
val context = LocalContext.current val context = LocalContext.current
val activity = LocalView.current.context as Activity
val keyboardController = LocalSoftwareKeyboardController.current val keyboardController = LocalSoftwareKeyboardController.current
val windowInsetsController = remember { val windowInsetsController = remember {
@ -232,7 +235,7 @@ fun CreateLobbyPage(activity: CreateLobbyActivity) {
val selectedChapter = ControllerChapter.getChapters()?.find { it.name == chapter } val selectedChapter = ControllerChapter.getChapters()?.find { it.name == chapter }
val difficultyNum = difficultyOptions.indexOf(difficulty) + 1 val difficultyNum = difficultyOptions.indexOf(difficulty) + 1
if (lobbyName.isBlank() || password.isBlank() || nbPlayers.isBlank() || nbPlayers.toInt() <= 0 || difficulty.isBlank() || selectedChapter == null) { if (lobbyName.isBlank() || nbPlayers.isBlank() || nbPlayers.toInt() <= 0 || difficulty.isBlank() || selectedChapter == null) {
// Show error message if any field is invalid // Show error message if any field is invalid
Toast.makeText(context, "Invalid input. Please check all fields.", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Invalid input. Please check all fields.", Toast.LENGTH_SHORT).show()
} else { } else {

@ -32,6 +32,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.NavController
import com.example.mathseduc.ConnexionPlayerActivity import com.example.mathseduc.ConnexionPlayerActivity
import com.example.mathseduc.MainActivity import com.example.mathseduc.MainActivity
import com.example.mathseduc.MultiActivity import com.example.mathseduc.MultiActivity
@ -41,7 +42,7 @@ import com.example.mathseduc.ui.theme.Colors
@Composable @Composable
fun HomePage() { fun HomePage(navController: NavController) {
val context = LocalContext.current val context = LocalContext.current
val modifier = Modifier val modifier = Modifier
.fillMaxSize() .fillMaxSize()
@ -99,13 +100,11 @@ fun HomePage() {
Button( Button(
onClick = { onClick = {
if (MainActivity.idPlayerConnected != -1){ if (MainActivity.idPlayerConnected != -1){
val intent = Intent(context, MultiActivity::class.java) navController.navigate("multiplayer")
context.startActivity(intent)
} }
else { else {
Toast.makeText(context, "Vous n'êtes pas connecté", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Vous n'êtes pas connecté", Toast.LENGTH_SHORT).show()
val intent = Intent(context, ConnexionPlayerActivity::class.java) navController.navigate("connexion")
context.startActivity(intent)
} }
}, },
shape = RoundedCornerShape(15), shape = RoundedCornerShape(15),
@ -124,8 +123,9 @@ fun HomePage() {
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
Button( Button(
onClick = { val intent = Intent(context, ConnexionPlayerActivity::class.java) onClick = {
context.startActivity(intent) }, navController.navigate("connexion")
},
shape = RoundedCornerShape(15), shape = RoundedCornerShape(15),
colors = ButtonDefaults.buttonColors(Colors.Grey), colors = ButtonDefaults.buttonColors(Colors.Grey),
modifier = Modifier modifier = Modifier

@ -1,5 +1,6 @@
package com.example.mathseduc.ui package com.example.mathseduc.ui
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
@ -45,6 +46,7 @@ import androidx.compose.ui.draw.clip
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.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -53,9 +55,8 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.mathseduc.CreateLobbyActivity import androidx.navigation.NavController
import com.example.mathseduc.MainActivity import com.example.mathseduc.MainActivity
import com.example.mathseduc.MultiActivity
import com.example.mathseduc.ServerDetailsActivity import com.example.mathseduc.ServerDetailsActivity
import com.example.mathseduc.controllers.ControllerChapter import com.example.mathseduc.controllers.ControllerChapter
import com.example.mathseduc.controllers.ControllerLobby import com.example.mathseduc.controllers.ControllerLobby
@ -64,16 +65,17 @@ import com.example.mathseduc.models.Lobby
import com.example.mathseduc.ui.theme.Colors import com.example.mathseduc.ui.theme.Colors
import com.example.mathseduc.viewModel.MultiPageViewModel import com.example.mathseduc.viewModel.MultiPageViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okhttp3.MultipartBody import okhttp3.MultipartBody
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun MultiPage(activity: MultiActivity) { fun MultiPage(navController: NavController) {
val context = LocalContext.current val context = LocalContext.current
val viewModel = ViewModelProvider(activity).get(MultiPageViewModel::class.java) val activity = LocalView.current.context as Activity
val viewModel = ViewModelProvider(navController.getViewModelStoreOwner(navController.graph.id)).get(MultiPageViewModel::class.java)
val lobbyList by viewModel.lobbyList.collectAsState(initial = emptyList()) val lobbyList by viewModel.lobbyList.collectAsState(initial = emptyList())
var selectedItem : Lobby? = null var selectedItem : Lobby? = null
@ -89,7 +91,6 @@ fun MultiPage(activity: MultiActivity) {
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Hide the status bar and navigation bar ET OU MAXENCE Y'A UNE OPTION POUR FAIRE LES DEUX DIRECTEMENT REGARDE LA DOC FDP !!!
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
@ -122,7 +123,7 @@ fun MultiPage(activity: MultiActivity) {
title = {}, title = {},
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = { activity.finish() }, onClick = { navController.navigate("home") },
modifier = Modifier.size(60.dp) modifier = Modifier.size(60.dp)
) { ) {
Icon( Icon(
@ -155,8 +156,7 @@ fun MultiPage(activity: MultiActivity) {
) )
Button( Button(
onClick = { onClick = {
val intent = Intent(context, CreateLobbyActivity::class.java) navController.navigate("createLobby")
context.startActivity(intent)
}, },
shape = RoundedCornerShape(15), shape = RoundedCornerShape(15),
modifier = Modifier modifier = Modifier
@ -182,7 +182,7 @@ fun MultiPage(activity: MultiActivity) {
// Créer un Utiliser si le lobby n'est pas plein // Créer un Utiliser si le lobby n'est pas plein
scope.launch { scope.launch {
createUtiliserForLobby(context, selectedItem!!) createUtiliserForLobby(context, selectedItem!!, navController)
} }
} else { } else {
// Afficher un message Toast si le lobby est plein // Afficher un message Toast si le lobby est plein
@ -213,7 +213,7 @@ fun MultiPage(activity: MultiActivity) {
} }
private suspend fun createUtiliserForLobby(context: Context, lobby: Lobby) { private suspend fun createUtiliserForLobby(context: Context, lobby: Lobby, navController: NavController) {
withContext(Dispatchers.IO) { 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())
@ -223,10 +223,7 @@ private suspend fun createUtiliserForLobby(context: Context, lobby: Lobby) {
ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder) ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder)
// Naviguer vers l'activité ServerDetails avec les détails du lobby // Naviguer vers l'activité ServerDetails avec les détails du lobby
val intent = Intent(context, ServerDetailsActivity::class.java) navController.navigate("serverDetails/${lobby.name}/${lobby.id}")
intent.putExtra("serverName", lobby.name)
intent.putExtra("lobbyId", lobby.id)
context.startActivity(intent)
} }
} }
@ -265,7 +262,7 @@ fun LobbyItem(lobby: Lobby, isSelected: Boolean, onItemClick: (Lobby) -> Unit) {
text = ControllerChapter.getChapterNameById(lobby.idchapter).toString(), text = ControllerChapter.getChapterNameById(lobby.idchapter).toString(),
fontSize = 18.sp, fontSize = 18.sp,
color = Colors.White, color = Colors.White,
modifier = Modifier.weight(1f) modifier = Modifier.weight(3f)
) )
Text( Text(
text = lobby.difficulty.toString(), text = lobby.difficulty.toString(),

Loading…
Cancel
Save