diff --git a/Android/app/build.gradle.kts b/Android/app/build.gradle.kts index da47354..3aa618f 100644 --- a/Android/app/build.gradle.kts +++ b/Android/app/build.gradle.kts @@ -73,4 +73,5 @@ dependencies { implementation("com.squareup.okhttp3:okhttp:4.10.0") implementation("com.google.code.gson:gson:2.10.1") implementation("org.mindrot:jbcrypt:0.4") + implementation("androidx.navigation:navigation-compose:2.7.7") } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/AppNavigation.kt b/Android/app/src/main/java/com/example/mathseduc/AppNavigation.kt new file mode 100644 index 0000000..8765f97 --- /dev/null +++ b/Android/app/src/main/java/com/example/mathseduc/AppNavigation.kt @@ -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) } + } +} \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/ConnexionPlayerActivity.kt b/Android/app/src/main/java/com/example/mathseduc/ConnexionPlayerActivity.kt index 5310e85..019d896 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ConnexionPlayerActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ConnexionPlayerActivity.kt @@ -1,5 +1,6 @@ package com.example.mathseduc +import android.app.Activity import android.content.Intent import android.content.res.Configuration import android.os.Bundle @@ -20,6 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardType 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.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController import com.example.mathseduc.controllers.ControllerPlayer @@ -34,17 +38,19 @@ class ConnexionPlayerActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - ConnexionPlayerContent(activity = this@ConnexionPlayerActivity) + val navController = rememberNavController() + ConnexionPlayerContent(navController = navController) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable -fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) { +fun ConnexionPlayerContent(navController: NavController) { var nickname by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") } var showDialog by rememberSaveable { mutableStateOf(false) } + val activity = LocalView.current.context as Activity val context = LocalContext.current val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT @@ -56,7 +62,7 @@ fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) { } // Hide the status bar - windowInsetsController?.hide(WindowInsetsCompat.Type.statusBars()) + windowInsetsController.hide(WindowInsetsCompat.Type.statusBars()) TopAppBar( colors = TopAppBarDefaults.topAppBarColors( @@ -65,7 +71,7 @@ fun ConnexionPlayerContent(activity: ConnexionPlayerActivity) { title = {}, navigationIcon = { IconButton( - onClick = { activity.finish() }, + onClick = { navController.navigate("home") }, modifier = Modifier.size(60.dp) ) { Icon( @@ -232,11 +238,4 @@ fun RegisterDialog(onDismiss: () -> Unit) { } } ) -} - -@Preview(showBackground = true) -@Composable -fun ConnexionPlayerPreview() { - val fakeActivity = ConnexionPlayerActivity() - ConnexionPlayerContent(activity = fakeActivity) } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/CreateLobbyActivity.kt b/Android/app/src/main/java/com/example/mathseduc/CreateLobbyActivity.kt index a9cd453..de6a233 100644 --- a/Android/app/src/main/java/com/example/mathseduc/CreateLobbyActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/CreateLobbyActivity.kt @@ -3,13 +3,15 @@ package com.example.mathseduc import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.navigation.compose.rememberNavController import com.example.mathseduc.ui.CreateLobbyPage class CreateLobbyActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - CreateLobbyPage(activity = this@CreateLobbyActivity) + val navController = rememberNavController() + CreateLobbyPage(navController) } } } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/MainActivity.kt b/Android/app/src/main/java/com/example/mathseduc/MainActivity.kt index 3f03ee3..a401e8b 100644 --- a/Android/app/src/main/java/com/example/mathseduc/MainActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/MainActivity.kt @@ -15,7 +15,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - HomePage() + AppNavigation() } } } diff --git a/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt b/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt index 9ac22b9..54d709f 100644 --- a/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt @@ -3,6 +3,7 @@ package com.example.mathseduc import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.navigation.compose.rememberNavController import com.example.mathseduc.ui.MultiPage @@ -10,7 +11,8 @@ class MultiActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - MultiPage(activity = this@MultiActivity) + val navController = rememberNavController() + MultiPage(navController) } } } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/navigation/NavHost.kt b/Android/app/src/main/java/com/example/mathseduc/navigation/NavHost.kt deleted file mode 100644 index bd4c439..0000000 --- a/Android/app/src/main/java/com/example/mathseduc/navigation/NavHost.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.mathseduc.navigation - -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.ui.Modifier -import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import com.example.mathseduc.ui.HomePage - -@Composable -fun NavHost() { - val navController = rememberNavController() - - NavHost( - modifier = Modifier.fillMaxSize(), - navController = navController, - startDestination = "home" - ) { - - composable(route = "home") { - /*HomePage( - goToConnexion = { - navController.navigate("Connexion") - }, - goToMulti = { - navController.navigate("Multi") - } - )*/ - } - } -} \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/ui/activity_create_lobby.kt b/Android/app/src/main/java/com/example/mathseduc/ui/activity_create_lobby.kt index 20a8731..9003289 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ui/activity_create_lobby.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ui/activity_create_lobby.kt @@ -1,6 +1,7 @@ package com.example.mathseduc.ui +import android.app.Activity import android.content.Intent import android.util.Log 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.LocalDensity 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.PasswordVisualTransformation 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.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat -import com.example.mathseduc.CreateLobbyActivity +import androidx.navigation.NavController import com.example.mathseduc.MainActivity import com.example.mathseduc.ServerDetailsActivity import com.example.mathseduc.controllers.ControllerChapter @@ -50,7 +52,7 @@ import com.example.mathseduc.ui.theme.Colors import okhttp3.MultipartBody @Composable -fun CreateLobbyPage(activity: CreateLobbyActivity) { +fun CreateLobbyPage(navController: NavController) { var lobbyName by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } var nbPlayers by remember { mutableStateOf("") } @@ -63,6 +65,7 @@ fun CreateLobbyPage(activity: CreateLobbyActivity) { val difficultyOptions = listOf("Facile", "Moyen", "Difficile") val context = LocalContext.current + val activity = LocalView.current.context as Activity val keyboardController = LocalSoftwareKeyboardController.current val windowInsetsController = remember { @@ -232,7 +235,7 @@ fun CreateLobbyPage(activity: CreateLobbyActivity) { val selectedChapter = ControllerChapter.getChapters()?.find { it.name == chapter } 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 Toast.makeText(context, "Invalid input. Please check all fields.", Toast.LENGTH_SHORT).show() } else { diff --git a/Android/app/src/main/java/com/example/mathseduc/ui/activity_main.kt b/Android/app/src/main/java/com/example/mathseduc/ui/activity_main.kt index bc30c07..a79c961 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ui/activity_main.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ui/activity_main.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.unit.dp import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.navigation.NavController import com.example.mathseduc.ConnexionPlayerActivity import com.example.mathseduc.MainActivity import com.example.mathseduc.MultiActivity @@ -41,7 +42,7 @@ import com.example.mathseduc.ui.theme.Colors @Composable -fun HomePage() { +fun HomePage(navController: NavController) { val context = LocalContext.current val modifier = Modifier .fillMaxSize() @@ -99,13 +100,11 @@ fun HomePage() { Button( onClick = { if (MainActivity.idPlayerConnected != -1){ - val intent = Intent(context, MultiActivity::class.java) - context.startActivity(intent) + navController.navigate("multiplayer") } else { Toast.makeText(context, "Vous n'êtes pas connecté", Toast.LENGTH_SHORT).show() - val intent = Intent(context, ConnexionPlayerActivity::class.java) - context.startActivity(intent) + navController.navigate("connexion") } }, shape = RoundedCornerShape(15), @@ -124,8 +123,9 @@ fun HomePage() { Spacer(modifier = Modifier.height(16.dp)) Button( - onClick = { val intent = Intent(context, ConnexionPlayerActivity::class.java) - context.startActivity(intent) }, + onClick = { + navController.navigate("connexion") + }, shape = RoundedCornerShape(15), colors = ButtonDefaults.buttonColors(Colors.Grey), modifier = Modifier 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 d6614d4..a65f7e5 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,5 +1,6 @@ package com.example.mathseduc.ui +import android.app.Activity import android.content.Context import android.content.Intent 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.platform.LocalConfiguration 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.PasswordVisualTransformation import androidx.compose.ui.unit.dp @@ -53,9 +55,8 @@ import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.lifecycle.ViewModelProvider -import com.example.mathseduc.CreateLobbyActivity +import androidx.navigation.NavController import com.example.mathseduc.MainActivity -import com.example.mathseduc.MultiActivity import com.example.mathseduc.ServerDetailsActivity import com.example.mathseduc.controllers.ControllerChapter 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.viewModel.MultiPageViewModel import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okhttp3.MultipartBody @OptIn(ExperimentalMaterial3Api::class) @Composable -fun MultiPage(activity: MultiActivity) { +fun MultiPage(navController: NavController) { 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()) var selectedItem : Lobby? = null @@ -122,7 +124,7 @@ fun MultiPage(activity: MultiActivity) { title = {}, navigationIcon = { IconButton( - onClick = { activity.finish() }, + onClick = { navController.navigate("home") }, modifier = Modifier.size(60.dp) ) { Icon( @@ -155,8 +157,7 @@ fun MultiPage(activity: MultiActivity) { ) Button( onClick = { - val intent = Intent(context, CreateLobbyActivity::class.java) - context.startActivity(intent) + navController.navigate("createLobby") }, shape = RoundedCornerShape(15), modifier = Modifier @@ -182,7 +183,7 @@ fun MultiPage(activity: MultiActivity) { // Créer un Utiliser si le lobby n'est pas plein scope.launch { - createUtiliserForLobby(context, selectedItem!!) + createUtiliserForLobby(context, selectedItem!!, navController) } } else { // Afficher un message Toast si le lobby est plein @@ -213,7 +214,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) { val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) @@ -230,6 +231,7 @@ private suspend fun createUtiliserForLobby(context: Context, lobby: Lobby) { intent.putExtra("nbPlayers", lobby.nbplayers) intent.putExtra("lobbyDifficulty", lobby.difficulty) context.startActivity(intent) + //navController.navigate("serverDetails/${lobby.name}/${lobby.id}") } } @@ -268,7 +270,7 @@ fun LobbyItem(lobby: Lobby, isSelected: Boolean, onItemClick: (Lobby) -> Unit) { text = ControllerChapter.getChapterNameById(lobby.idchapter).toString(), fontSize = 18.sp, color = Colors.White, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(3f) ) Text( text = lobby.difficulty.toString(),