From bbc03d891a26e1c60dc1121ae8496803368fda82 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 14:13:02 +0100 Subject: [PATCH 01/12] [ADD] Coeurs pour vie dans pendu --- .../java/fr/iut/sciencequest/view/games/Pendu.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index f9157c2..6e1f57f 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -3,6 +3,7 @@ package fr.iut.sciencequest.view.games import android.content.Context import android.widget.Toast import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button @@ -43,6 +44,7 @@ fun PenduScreen(viewModel: PenduViewModel = viewModel(), } }}, modifier = Modifier.padding(20.dp)) + afficherVies(state.value.nbViesRestantes) Button(onClick = { viewModel.InitPartie() }) { Text(text = stringResource(id = R.string.reset_game)) } @@ -50,6 +52,16 @@ fun PenduScreen(viewModel: PenduViewModel = viewModel(), } } +@Preview +@Composable +fun afficherVies(nbVies : Int = 10) { + Row { + for (i in 1..nbVies) { + Text("\u2665 ") + } + } +} + @Preview @Composable fun PenduPreview(){ From 12988cb4a92c4c13e35703a14ea105c62770e083 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 14:47:59 +0100 Subject: [PATCH 02/12] [ADD] View model basique pour la page de login --- .../sciencequest/ViewModels/LoginViewModel.kt | 17 ++++++++++ .../ViewModels/UiStates/LoginUIState.kt | 6 ++++ .../fr/iut/sciencequest/navigation/NavHost.kt | 2 +- .../java/fr/iut/sciencequest/view/Login.kt | 34 +++++++++---------- 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt new file mode 100644 index 0000000..2f99c5a --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt @@ -0,0 +1,17 @@ +package fr.iut.sciencequest.ViewModels + +import androidx.lifecycle.ViewModel +import fr.iut.sciencequest.ViewModels.UiStates.LoginUIState +import kotlinx.coroutines.flow.MutableStateFlow + +class LoginViewModel: ViewModel() { + var uiState = MutableStateFlow(LoginUIState()) + + fun setPseudo(pseudo: String) { + uiState.value = LoginUIState(pseudo, uiState.value.mdp) + } + + fun setMdp(mdp: String) { + uiState.value = LoginUIState(uiState.value.pseudo, mdp) + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt new file mode 100644 index 0000000..bf2161f --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.ViewModels.UiStates + +data class LoginUIState ( + val pseudo: String = "Pseudo", + val mdp: String = "Mot de passe" +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index b7d2f9c..376ff10 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -24,7 +24,7 @@ fun NavHost(context: Context) { NavHost( modifier = Modifier.fillMaxSize(), navController = navController, - startDestination = "pendu" + startDestination = "login" ) { composable(route = "home") { HomeScreen( diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt index be32308..2661008 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt @@ -13,6 +13,7 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -27,44 +28,41 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R +import fr.iut.sciencequest.ViewModels.LoginViewModel @Composable -fun LoginScreen(goToAccount: () -> Unit, goToHome: () -> Unit) { +fun LoginScreen(viewModel: LoginViewModel = viewModel(), + goToAccount: () -> Unit, + goToHome: () -> Unit) { Scaffold( topBar = { TopBar(goToAccount, goToHome, stringResource(id = R.string.connection)) }, ) { innerPadding -> - LoginContainer(Modifier.padding(innerPadding)) + LoginContainer(viewModel, Modifier.padding(innerPadding)) } } @Composable -fun LoginContainer(modifier: Modifier) { +fun LoginContainer(viewModel: LoginViewModel, + modifier: Modifier) { + val state = viewModel.uiState.collectAsState() Column( modifier = modifier.fillMaxHeight(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - val defaultPseudo = stringResource(id = R.string.Pseudo) - var pseudo by remember { - mutableStateOf(defaultPseudo) - } - val defaultMdp = stringResource(id = R.string.mdp) - var mdp by remember { - mutableStateOf(defaultMdp) - } - //Text(text = stringResource(id = R.string.connection)) - TextField(value = pseudo , - onValueChange = { pseudo = it }, + TextField(value = state.value.pseudo, + onValueChange = { viewModel.setPseudo(it) }, modifier = Modifier .padding(20.dp) - .fillMaxWidth() + .fillMaxWidth(), ) - TextField(value = mdp, - onValueChange = { mdp = it }, + TextField(value = state.value.mdp, + onValueChange = { viewModel.setMdp(it) }, modifier = Modifier .padding(20.dp) .fillMaxWidth() @@ -82,7 +80,7 @@ fun LoginContainer(modifier: Modifier) { textDecoration = TextDecoration.Underline, color = colorResource(id = R.color.purple_200) ), - onClick = registerPopup() + onClick = { }/*TODO*/ //registerPopup() ) } From 506c1df396f0c0ac53b18623930871a9c78c0a87 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 15:24:16 +0100 Subject: [PATCH 03/12] [ADD] View Model pour le kahoot --- .../iut/sciencequest/ViewModels/KahootViewModel.kt | 9 +++++++++ .../ViewModels/UiStates/KahootUIState.kt | 9 +++++++++ .../java/fr/iut/sciencequest/navigation/NavHost.kt | 5 ++--- .../src/main/java/fr/iut/sciencequest/view/Login.kt | 4 ---- .../java/fr/iut/sciencequest/view/games/Kahoot.kt | 12 +++++++++--- 5 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt new file mode 100644 index 0000000..84a8a17 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.ViewModels + +import androidx.lifecycle.ViewModel +import fr.iut.sciencequest.ViewModels.UiStates.KahootUIState +import kotlinx.coroutines.flow.MutableStateFlow + +class KahootViewModel: ViewModel() { + var uiState = MutableStateFlow(KahootUIState()) +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt new file mode 100644 index 0000000..72ebffa --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.ViewModels.UiStates + +import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO +import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO +import fr.iut.sciencequest.stub.StubQuestionWithReponses + +data class KahootUIState ( + val question: QuestionWithSimpleResponseDTO = StubQuestionWithReponses +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index 376ff10..4968078 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -24,7 +24,7 @@ fun NavHost(context: Context) { NavHost( modifier = Modifier.fillMaxSize(), navController = navController, - startDestination = "login" + startDestination = "kahoot" ) { composable(route = "home") { HomeScreen( @@ -83,8 +83,7 @@ fun NavHost(context: Context) { }, goToHome = { navController.navigate("home") - }, - StubQuestionWithReponses) + }) } composable(route = "listeScientifiques") { diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt index 2661008..82cd26f 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt @@ -14,10 +14,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt index e281464..2c8efbe 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -17,24 +18,29 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R +import fr.iut.sciencequest.ViewModels.KahootViewModel import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO import fr.iut.sciencequest.stub.StubQuestionWithReponses import fr.iut.sciencequest.view.TopBar @Composable -fun KahootScreen(goToAccount: () -> Unit, goToHome: () -> Unit, question: QuestionWithSimpleResponseDTO) { +fun KahootScreen(viewModel: KahootViewModel = viewModel(), + goToAccount: () -> Unit, + goToHome: () -> Unit) { + val state = viewModel.uiState.collectAsState() Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) - KahootPlayer(question) + KahootPlayer(state.value.question) } } @Preview @Composable fun KahootScreenPreview(){ - KahootScreen(goToAccount = {}, goToHome = {}, StubQuestionWithReponses) + KahootScreen(goToAccount = {}, goToHome = {}) } From a3972b743f914dd2d64bd4cb6dc45e1cc3dede06 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 08:47:41 +0100 Subject: [PATCH 04/12] [ADD] Partie/Joueur/MAJ DTOs --- .../main/java/fr/iut/sciencequest/model/dto/JeuDTO.kt | 7 +++++++ .../java/fr/iut/sciencequest/model/dto/PartieDTO.kt | 11 +++++++++++ .../model/dto/ScientifiqueDTOs/ScientifiqueDTO.kt | 2 +- .../fr/iut/sciencequest/model/dto/ThematiqueDTO.kt | 2 +- .../model/dto/{ => difficulte}/DifficulteDTO.kt | 2 +- .../model/dto/difficulte/DifficulteSimpleDTO.kt | 6 ++++++ .../model/dto/extensions/DifficulteExtension.kt | 2 +- .../fr/iut/sciencequest/model/dto/joueur/JoueurDTO.kt | 9 +++++++++ .../sciencequest/model/dto/joueur/JoueurSimpleDTO.kt | 6 ++++++ .../fr/iut/sciencequest/model/metier/Scientifique.kt | 2 -- .../java/fr/iut/sciencequest/stub/StubScientifique.kt | 2 +- 11 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/dto/JeuDTO.kt create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt rename android/app/src/main/java/fr/iut/sciencequest/model/dto/{ => difficulte}/DifficulteDTO.kt (70%) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteSimpleDTO.kt create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurDTO.kt create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurSimpleDTO.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/JeuDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/JeuDTO.kt new file mode 100644 index 0000000..72865a2 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/JeuDTO.kt @@ -0,0 +1,7 @@ +package fr.iut.sciencequest.model.dto + +class JeuDTO ( + val id: Int, + val nom: String, + val nbrParties: UInt +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt new file mode 100644 index 0000000..c551b59 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt @@ -0,0 +1,11 @@ +package fr.iut.sciencequest.model.dto + +import fr.iut.sciencequest.model.dto.joueur.JoueurSimpleDTO + +class PartieDTO ( + val id: Int, + val codeInvitation: String, + val joueurs: List, + val jeu: JeuDTO, + val thematiques: List +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/ScientifiqueDTOs/ScientifiqueDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/ScientifiqueDTOs/ScientifiqueDTO.kt index f62c147..c24f817 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/dto/ScientifiqueDTOs/ScientifiqueDTO.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/ScientifiqueDTOs/ScientifiqueDTO.kt @@ -1,6 +1,6 @@ package fr.iut.sciencequest.model.dto.ScientifiqueDTOs -import fr.iut.sciencequest.model.dto.DifficulteDTO +import fr.iut.sciencequest.model.dto.difficulte.DifficulteDTO import fr.iut.sciencequest.model.dto.ThematiqueDTO import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/ThematiqueDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/ThematiqueDTO.kt index f41e9ff..a1deae5 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/dto/ThematiqueDTO.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/ThematiqueDTO.kt @@ -3,7 +3,7 @@ package fr.iut.sciencequest.model.dto import kotlinx.serialization.Serializable @Serializable -class ThematiqueDTO ( +data class ThematiqueDTO ( val id: Int, val libelle: String ) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/DifficulteDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteDTO.kt similarity index 70% rename from android/app/src/main/java/fr/iut/sciencequest/model/dto/DifficulteDTO.kt rename to android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteDTO.kt index 29a9db8..b651d43 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/dto/DifficulteDTO.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteDTO.kt @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.model.dto +package fr.iut.sciencequest.model.dto.difficulte import kotlinx.serialization.Serializable diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteSimpleDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteSimpleDTO.kt new file mode 100644 index 0000000..8cbe8ee --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/difficulte/DifficulteSimpleDTO.kt @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.model.dto.difficulte + +class DifficulteSimpleDTO ( + val id: Int, + val libelle: String +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/DifficulteExtension.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/DifficulteExtension.kt index 9a8da14..a05a4e5 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/DifficulteExtension.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/DifficulteExtension.kt @@ -1,6 +1,6 @@ package fr.iut.sciencequest.model.dto.extensions -import fr.iut.sciencequest.model.dto.DifficulteDTO +import fr.iut.sciencequest.model.dto.difficulte.DifficulteDTO import fr.iut.sciencequest.model.metier.Difficulte fun DifficulteDTO.ToModel(): Difficulte { diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurDTO.kt new file mode 100644 index 0000000..65c1d24 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurDTO.kt @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.model.dto.joueur + +import fr.iut.sciencequest.model.dto.PartieDTO + +class JoueurDTO ( + val id: Int, + val pseudo: String, + val partie: PartieDTO +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurSimpleDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurSimpleDTO.kt new file mode 100644 index 0000000..6fb3857 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/joueur/JoueurSimpleDTO.kt @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.model.dto.joueur + +class JoueurSimpleDTO ( + val id: Int, + val pseudo: String, +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Scientifique.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/Scientifique.kt index 9968af2..381edc1 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Scientifique.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/metier/Scientifique.kt @@ -1,7 +1,5 @@ package fr.iut.sciencequest.model.metier -import fr.iut.sciencequest.model.dto.DifficulteDTO - class Scientifique { val id: Int val nom: String diff --git a/android/app/src/main/java/fr/iut/sciencequest/stub/StubScientifique.kt b/android/app/src/main/java/fr/iut/sciencequest/stub/StubScientifique.kt index 9e8ff2b..a994beb 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/stub/StubScientifique.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/stub/StubScientifique.kt @@ -1,6 +1,6 @@ package fr.iut.sciencequest.stub -import fr.iut.sciencequest.model.dto.DifficulteDTO +import fr.iut.sciencequest.model.dto.difficulte.DifficulteDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO import fr.iut.sciencequest.model.dto.ThematiqueDTO From b306915e68de89223482d51c6906a42f51119638 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 09:21:50 +0100 Subject: [PATCH 05/12] [ADD] Kahoot change de question au bout de 10 secondes --- .../ViewModels/KahootViewModel.kt | 26 +++++++++++++++++++ .../ViewModels/UiStates/KahootUIState.kt | 6 ++++- .../iut/sciencequest/model/dto/PartieDTO.kt | 2 +- .../sciencequest/stub/QuestionWithReponses.kt | 17 +++++++++--- .../fr/iut/sciencequest/view/games/Kahoot.kt | 1 + 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt index 84a8a17..d7d92cd 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -1,9 +1,35 @@ package fr.iut.sciencequest.ViewModels +import android.os.Handler +import android.os.Looper +import android.util.Log import androidx.lifecycle.ViewModel import fr.iut.sciencequest.ViewModels.UiStates.KahootUIState +import fr.iut.sciencequest.stub.StubQuestionWithReponses2 import kotlinx.coroutines.flow.MutableStateFlow class KahootViewModel: ViewModel() { var uiState = MutableStateFlow(KahootUIState()) + + private val handler = Handler(Looper.getMainLooper()) + + fun lancerPartie() { + var nbPoints: Int + var tpsReponse = 10_000 + handler.postDelayed( + { + Log.d("KahootViewModel","J'actualise les questions") + nbPoints = if(uiState.value.reponseChoisie) { + 10_000 - tpsReponse + } else { + 0 + } + uiState.value = KahootUIState(StubQuestionWithReponses2, + duréePartie = uiState.value.duréePartie, + nbPoints = uiState.value.nbPoints + nbPoints, + reponseChoisie = false) + }, + uiState.value.duréePartie * 1000 + ) + } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt index 72ebffa..06d7332 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt @@ -5,5 +5,9 @@ import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO import fr.iut.sciencequest.stub.StubQuestionWithReponses data class KahootUIState ( - val question: QuestionWithSimpleResponseDTO = StubQuestionWithReponses + val question: QuestionWithSimpleResponseDTO = StubQuestionWithReponses, + val reponseChoisie: Boolean = false, + // NOTE : Supposé en secondes, à changer si besoins + val duréePartie: Long = 10, + val nbPoints: Int = 0 ) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt index c551b59..64df64c 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/PartieDTO.kt @@ -7,5 +7,5 @@ class PartieDTO ( val codeInvitation: String, val joueurs: List, val jeu: JeuDTO, - val thematiques: List + val thematiques: List ) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/stub/QuestionWithReponses.kt b/android/app/src/main/java/fr/iut/sciencequest/stub/QuestionWithReponses.kt index 6bb7c56..e2cae06 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/stub/QuestionWithReponses.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/stub/QuestionWithReponses.kt @@ -9,8 +9,19 @@ object StubQuestionWithReponses: QuestionWithSimpleResponseDTO( reponses = listOf( ReponseSimpleDTO(id=0, "Reponse 1"), ReponseSimpleDTO(id=1, "Reponse 2"), - ReponseSimpleDTO(id=1, "Reponse 3"), - ReponseSimpleDTO(id=1, "Reponse 4"), + ReponseSimpleDTO(id=2, "Reponse 3"), + ReponseSimpleDTO(id=3, "Reponse 4"), ) ) -{} \ No newline at end of file +{} + +object StubQuestionWithReponses2: QuestionWithSimpleResponseDTO( + id = 1, + question = "Ceci est une autre question ?", + reponses = listOf( + ReponseSimpleDTO(id = 4, "Moi une reponse?"), + ReponseSimpleDTO(id = 5, "La réponse A"), + ReponseSimpleDTO(id = 6, "Je suis faux"), + ReponseSimpleDTO(id = 5, "Toutes les réponses") + ) +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt index 2c8efbe..06ae77f 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt @@ -31,6 +31,7 @@ fun KahootScreen(viewModel: KahootViewModel = viewModel(), goToAccount: () -> Unit, goToHome: () -> Unit) { val state = viewModel.uiState.collectAsState() + viewModel.lancerPartie() Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) KahootPlayer(state.value.question) From 50d4a03973421678c5d59bcd23a2504234f3f5c6 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 09:39:42 +0100 Subject: [PATCH 06/12] [FIX] Context recup dans composant --- .../ViewModels/KahootViewModel.kt | 24 ++++++++++++------- .../fr/iut/sciencequest/navigation/NavHost.kt | 5 ++-- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt index d7d92cd..5a1cc93 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -14,22 +14,30 @@ class KahootViewModel: ViewModel() { private val handler = Handler(Looper.getMainLooper()) fun lancerPartie() { - var nbPoints: Int - var tpsReponse = 10_000 handler.postDelayed( { Log.d("KahootViewModel","J'actualise les questions") - nbPoints = if(uiState.value.reponseChoisie) { - 10_000 - tpsReponse - } else { - 0 - } uiState.value = KahootUIState(StubQuestionWithReponses2, duréePartie = uiState.value.duréePartie, - nbPoints = uiState.value.nbPoints + nbPoints, + nbPoints = uiState.value.nbPoints, reponseChoisie = false) }, uiState.value.duréePartie * 1000 ) } + + // NOTE : tpsReponse en ms + fun ajouterPoints(tpsReponse: Int) { + + val nbPoints = if(uiState.value.reponseChoisie) { + 10_000 - tpsReponse + } else { + 0 + } + uiState.value = KahootUIState(uiState.value.question, + duréePartie = uiState.value.duréePartie, + nbPoints = uiState.value.nbPoints + nbPoints, + reponseChoisie = false) + Log.d("KahootViewModel","Le joueur à ${uiState.value.reponseChoisie}") + } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index 4968078..95743d3 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -19,7 +19,7 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen @Composable -fun NavHost(context: Context) { +fun NavHost() { val navController = rememberNavController() NavHost( modifier = Modifier.fillMaxSize(), @@ -72,8 +72,7 @@ fun NavHost(context: Context) { }, goToHome = { navController.navigate("home") - }, - context = context + } ) } From a9fd6dbe7414288256c2dac38e4b42e1c93744a0 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 09:57:40 +0100 Subject: [PATCH 07/12] =?UTF-8?q?[ADD]=20D=C3=A9but=20logique=20Kahoot=20(?= =?UTF-8?q?points=20fonctionnent=20pas)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/iut/sciencequest/MainActivity.kt | 2 +- .../sciencequest/ViewModels/KahootViewModel.kt | 8 ++++---- .../ViewModels/UiStates/KahootUIState.kt | 4 ++-- .../fr/iut/sciencequest/view/games/Kahoot.kt | 17 +++++++++++++---- .../fr/iut/sciencequest/view/games/Pendu.kt | 3 ++- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt index ad6c327..3ea7785 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt @@ -25,7 +25,7 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - NavHost(this) + NavHost() } } } diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt index 5a1cc93..f9a9df3 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -27,10 +27,10 @@ class KahootViewModel: ViewModel() { } // NOTE : tpsReponse en ms - fun ajouterPoints(tpsReponse: Int) { + fun ajouterPoints(tpsReponse: Long) { - val nbPoints = if(uiState.value.reponseChoisie) { - 10_000 - tpsReponse + val nbPoints: Int = if(uiState.value.reponseChoisie) { + (10_000 - tpsReponse).toInt() } else { 0 } @@ -38,6 +38,6 @@ class KahootViewModel: ViewModel() { duréePartie = uiState.value.duréePartie, nbPoints = uiState.value.nbPoints + nbPoints, reponseChoisie = false) - Log.d("KahootViewModel","Le joueur à ${uiState.value.reponseChoisie}") + Log.d("KahootViewModel","Le joueur à ${uiState.value.nbPoints}") } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt index 06d7332..3048aa3 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt @@ -7,7 +7,7 @@ import fr.iut.sciencequest.stub.StubQuestionWithReponses data class KahootUIState ( val question: QuestionWithSimpleResponseDTO = StubQuestionWithReponses, val reponseChoisie: Boolean = false, - // NOTE : Supposé en secondes, à changer si besoins - val duréePartie: Long = 10, + // NOTE : Supposé en millisecondes + val duréePartie: Long = 10_000, val nbPoints: Int = 0 ) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt index 06ae77f..24f874a 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt @@ -25,6 +25,7 @@ import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO import fr.iut.sciencequest.stub.StubQuestionWithReponses import fr.iut.sciencequest.view.TopBar +import java.util.Timer @Composable fun KahootScreen(viewModel: KahootViewModel = viewModel(), @@ -34,7 +35,9 @@ fun KahootScreen(viewModel: KahootViewModel = viewModel(), viewModel.lancerPartie() Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) - KahootPlayer(state.value.question) + KahootPlayer(state.value.question) { + viewModel.ajouterPoints(it) + } } } @@ -48,16 +51,22 @@ fun KahootScreenPreview(){ @Preview @Composable fun KahootPlayerPreview(){ - KahootPlayer(question = StubQuestionWithReponses) + val i = 0 + KahootPlayer(question = StubQuestionWithReponses) {} } @Composable -fun KahootPlayer(question: QuestionWithSimpleResponseDTO){ +fun KahootPlayer(question: QuestionWithSimpleResponseDTO, + sendReponse: (Long) -> Unit){ val context = LocalContext.current; + val currTime = System.currentTimeMillis() Column (horizontalAlignment = Alignment.CenterHorizontally){ KahootQuestion(question = question.question) - KahootReponses(reponses = question.reponses) {Toast.makeText(context, it.reponse, Toast.LENGTH_SHORT).show()} + KahootReponses(reponses = question.reponses) { + sendReponse(currTime - System.currentTimeMillis()) + Toast.makeText(context, it.reponse, Toast.LENGTH_SHORT).show() + } } } diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index 6e1f57f..265d7e1 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -23,10 +24,10 @@ import fr.iut.sciencequest.view.TopBar @Composable fun PenduScreen(viewModel: PenduViewModel = viewModel(), - context: Context, goToAccount: () -> Unit, goToHome: () -> Unit) { val state = viewModel.uiState.collectAsState() + val context = LocalContext.current; Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.pendu)) //Text(text = stringResource(id = R.string.pendu), modifier = Modifier.padding(top=10.dp)) From a093d38820f272c3e16cd393102f2df9a0b08afd Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 14:08:27 +0100 Subject: [PATCH 08/12] =?UTF-8?q?[FIX]=20Ajoute=20les=20point,=20cependant?= =?UTF-8?q?=20recompose=20et=20relance=20une=20partie=20=C3=A0=20chaque=20?= =?UTF-8?q?fois?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iut/sciencequest/ViewModels/KahootViewModel.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt index f9a9df3..092f018 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -22,22 +22,22 @@ class KahootViewModel: ViewModel() { nbPoints = uiState.value.nbPoints, reponseChoisie = false) }, - uiState.value.duréePartie * 1000 + uiState.value.duréePartie ) } // NOTE : tpsReponse en ms fun ajouterPoints(tpsReponse: Long) { - - val nbPoints: Int = if(uiState.value.reponseChoisie) { - (10_000 - tpsReponse).toInt() - } else { - 0 + Log.d("KahootViewModel","Je reçois une réponse") + if (uiState.value.reponseChoisie) { + Log.d("KahootViewModel","Le joueur a déjà répondu") + return } + val nbPoints: Int = (10_000 - tpsReponse).toInt() uiState.value = KahootUIState(uiState.value.question, duréePartie = uiState.value.duréePartie, nbPoints = uiState.value.nbPoints + nbPoints, - reponseChoisie = false) + reponseChoisie = true) Log.d("KahootViewModel","Le joueur à ${uiState.value.nbPoints}") } } \ No newline at end of file From 5bf379ad610dadccaf4bc975ba91063dbde5f2ad Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 14:24:06 +0100 Subject: [PATCH 09/12] [ADD] Lancer kahoot depuis home fonctionne --- .../java/fr/iut/sciencequest/navigation/NavHost.kt | 10 +++++++--- .../main/java/fr/iut/sciencequest/view/HomeScreen.kt | 7 ++++++- .../main/java/fr/iut/sciencequest/view/games/Kahoot.kt | 1 - 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index 95743d3..6e266a8 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -4,9 +4,11 @@ import android.content.Context import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import fr.iut.sciencequest.ViewModels.KahootViewModel import fr.iut.sciencequest.ViewModels.PenduViewModel import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM import fr.iut.sciencequest.stub.StubQuestionWithReponses @@ -19,12 +21,12 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen @Composable -fun NavHost() { +fun NavHost(kahotVM: KahootViewModel = viewModel()) { val navController = rememberNavController() NavHost( modifier = Modifier.fillMaxSize(), navController = navController, - startDestination = "kahoot" + startDestination = "home" ) { composable(route = "home") { HomeScreen( @@ -38,6 +40,7 @@ fun NavHost() { navController.navigate("pendu") }, goToKahoot = { + kahotVM.lancerPartie() navController.navigate("kahoot") } ) @@ -82,7 +85,8 @@ fun NavHost() { }, goToHome = { navController.navigate("home") - }) + }, + viewModel = kahotVM) } composable(route = "listeScientifiques") { diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt b/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt index aa2dc2a..b4555d0 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt @@ -14,9 +14,14 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import fr.iut.sciencequest.ViewModels.KahootViewModel @Composable -fun HomeScreen(goToHome: () -> Unit, goToAccount: () -> Unit, goToPendu: () -> Unit, goToKahoot: () -> Unit) { +fun HomeScreen(goToHome: () -> Unit, + goToAccount: () -> Unit, + goToPendu: () -> Unit, + goToKahoot: () -> Unit) { Column (modifier = Modifier.fillMaxWidth()){ TopBar(goToAccount, goToHome) MainContent(goToPendu, goToKahoot) diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt index 24f874a..8632270 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt @@ -32,7 +32,6 @@ fun KahootScreen(viewModel: KahootViewModel = viewModel(), goToAccount: () -> Unit, goToHome: () -> Unit) { val state = viewModel.uiState.collectAsState() - viewModel.lancerPartie() Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) KahootPlayer(state.value.question) { From d9ccdad5cb61133d2cc78f1a9c878d3450d2299f Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 15:19:13 +0100 Subject: [PATCH 10/12] =?UTF-8?q?[FIX]=20Refactor=20entr=C3=A9e=20dans=20p?= =?UTF-8?q?endu=20pour=20code=20+=20lisible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/iut/sciencequest/view/games/Pendu.kt | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index 265d7e1..8112688 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -35,15 +35,7 @@ fun PenduScreen(viewModel: PenduViewModel = viewModel(), { Text(text = state.value.motATrou) TextField(value = "", - onValueChange = { - if (it.isNotEmpty()) { - viewModel.PlayAction(it[0]) - if ((!state.value.isWon) && (state.value.nbViesRestantes == 0)) { - goToHome() - } else if (state.value.isWon) { - Toast.makeText(context,"Vous avez gagné !",Toast.LENGTH_LONG).show() - } - }}, + onValueChange = { onLetterEntered(it, viewModel, context, goToHome) }, modifier = Modifier.padding(20.dp)) afficherVies(state.value.nbViesRestantes) Button(onClick = { viewModel.InitPartie() }) { @@ -53,6 +45,21 @@ fun PenduScreen(viewModel: PenduViewModel = viewModel(), } } +fun onLetterEntered(entered: String, + vm: PenduViewModel, + context: Context, + goToHome: () -> Unit) { + val state = vm.uiState + if (entered.isNotEmpty()) { + vm.PlayAction(entered[0]) + if ((!state.value.isWon) && (state.value.nbViesRestantes == 0)) { + goToHome() + } else if (state.value.isWon) { + Toast.makeText(context,"Vous avez gagné !",Toast.LENGTH_LONG).show() + } + } +} + @Preview @Composable fun afficherVies(nbVies : Int = 10) { From a8a59250098e4ed0d2fd1d98727327f434a97f0b Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 16:02:30 +0100 Subject: [PATCH 11/12] [FIX] Jouer majuscule = Jouer minuscule --- .../sciencequest/ViewModels/PenduViewModel.kt | 20 ++++++++++++------- .../ViewModels/UiStates/PenduUIState.kt | 3 ++- .../fr/iut/sciencequest/view/games/Pendu.kt | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt index a54f7e1..a13413b 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt @@ -39,21 +39,25 @@ class PenduViewModel : ViewModel() { // mot : mot à trouver // motAct : état actuel du mot trouvé par l'utilisateur fun PlayAction(lettre: Char) { + val lowerCaseLetter = lettre.lowercaseChar() Log.d("PenduViewModel","Un utilisateur joue une action") - if (lettre == ' ' || uiState.value.motATrou.contains(lettre)) { + if (lettre == ' ' || uiState.value.lettresUtilises.contains(lowerCaseLetter)) { Log.d("PenduViewModel","L'utilisateur a fait une action invalide") uiState.value = PenduUIState(false, false, uiState.value.nbViesRestantes, uiState.value.motATrouver, - uiState.value.motATrou + uiState.value.motATrou, + uiState.value.lettresUtilises ) - } else if (uiState.value.motATrouver.contains(lettre)) { + return + } else if (uiState.value.motATrouver.lowercase().contains(lowerCaseLetter)) { Log.d("PenduViewModel","L'utilisateur a trouvé une lettre") var nvMotATrou = uiState.value.motATrou for (index in uiState.value.motATrouver.indices) { - if (uiState.value.motATrouver[index] == lettre) { - nvMotATrou = nvMotATrou.replaceRange(index,index + 1, lettre.toString()) + val letterToCheck = uiState.value.motATrouver[index] + if (letterToCheck.lowercaseChar() == lowerCaseLetter) { + nvMotATrou = nvMotATrou.replaceRange(index,index + 1, letterToCheck.toString()) } } var isWon = false @@ -64,7 +68,8 @@ class PenduViewModel : ViewModel() { true, uiState.value.nbViesRestantes, uiState.value.motATrouver, - nvMotATrou + nvMotATrou, + uiState.value.lettresUtilises.plus(lowerCaseLetter) ) } else { Log.d("PenduViewModel","L'utilisateur s'est trompé de lettre") @@ -72,7 +77,8 @@ class PenduViewModel : ViewModel() { true, uiState.value.nbViesRestantes - 1, uiState.value.motATrouver, - uiState.value.motATrou + uiState.value.motATrou, + uiState.value.lettresUtilises.plus(lowerCaseLetter) ) } } diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt index 9a5f6e6..369fbed 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt @@ -5,5 +5,6 @@ data class PenduUIState( val isActionGood: Boolean = false, val nbViesRestantes: Int = 10, val motATrouver: String = "Mot", - val motATrou: String = "___" + val motATrou: String = "___", + val lettresUtilises: String = "" ) diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index 8112688..0ead09d 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -41,6 +41,7 @@ fun PenduScreen(viewModel: PenduViewModel = viewModel(), Button(onClick = { viewModel.InitPartie() }) { Text(text = stringResource(id = R.string.reset_game)) } + Text("Lettres utilisées: " + state.value.lettresUtilises) } } } From 15a6829ee8856870c6ec0cd0864282185a4deb66 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Fri, 29 Mar 2024 17:07:46 +0100 Subject: [PATCH 12/12] [ADD] Va chercher une liste de question sur l'API (index en dur) --- .../ViewModels/KahootViewModel.kt | 29 +++++++----- .../Question/QuestionRequestService.kt | 2 +- .../buisness/Question/QuestionRequestor.kt | 45 +++++-------------- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt index 092f018..eea6a93 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt @@ -4,9 +4,12 @@ import android.os.Handler import android.os.Looper import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import fr.iut.sciencequest.ViewModels.UiStates.KahootUIState +import fr.iut.sciencequest.model.buisness.Question.fetchQuestions import fr.iut.sciencequest.stub.StubQuestionWithReponses2 import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch class KahootViewModel: ViewModel() { var uiState = MutableStateFlow(KahootUIState()) @@ -14,16 +17,22 @@ class KahootViewModel: ViewModel() { private val handler = Handler(Looper.getMainLooper()) fun lancerPartie() { - handler.postDelayed( - { - Log.d("KahootViewModel","J'actualise les questions") - uiState.value = KahootUIState(StubQuestionWithReponses2, - duréePartie = uiState.value.duréePartie, - nbPoints = uiState.value.nbPoints, - reponseChoisie = false) - }, - uiState.value.duréePartie - ) + viewModelScope.launch { + fetchQuestions(2).collect() { + for (question in it.questions) { + handler.postDelayed( + { + Log.d("KahootViewModel","J'actualise les questions") + uiState.value = KahootUIState(question, + duréePartie = uiState.value.duréePartie, + nbPoints = uiState.value.nbPoints, + reponseChoisie = false) + }, + uiState.value.duréePartie + ) + } + } + } } // NOTE : tpsReponse en ms diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestService.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestService.kt index 7e4f1b9..06cb39f 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestService.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestService.kt @@ -7,5 +7,5 @@ import retrofit2.http.Query interface QuestionRequestService { @GET("questions?page") - fun getQuestions(@Query("page") index: Int): Call + suspend fun getQuestions(@Query("page") index: Int): QuestionListDTO } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt index e0c0468..3a0652c 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt @@ -1,45 +1,22 @@ package fr.iut.sciencequest.model.buisness.Question import android.util.Log +import fr.iut.sciencequest.model.buisness.Scientifique.ScientifiqueRequestService import fr.iut.sciencequest.model.buisness.createRequestService import fr.iut.sciencequest.model.dto.question.QuestionListDTO +import kotlinx.coroutines.flow.flow import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.create import java.lang.IllegalArgumentException -fun fetchQuestions(index: Int) { - //val serviceClient = createRequestService().create() - //Log.d("Requete API","Fetch un scientifique") - //serviceClient.getQuestion(index).enqueue( - // object: Callback { - // override fun onResponse( - // call: Call, - // response: Response - // ) { - // // NOTE : il faudrait probablement utiliser une autre exception - // // exception personnalisée ? - // val data = response.body() ?: - // throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") - // // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien - // // Pour le moment des print pour vérifier que la requêtre fonctionne - // // sans avoir besoin des vues. - // for (question in data.questions) { - // Log.d("Requete Question", "id question: " + question.id.toString()) - // Log.d("Requete Question","Libelle: " + question.question) - // Log.d("Requete Question","Reponses: ") - // for (reponse in question.reponses) { - // Log.d("Requete Question","id: " + reponse.id) - // Log.d("Requete Question","Libelle: " + reponse.reponse) - // } - // } - // } -// - // override fun onFailure(call: Call, t: Throwable) { - // Log.e("Requete API","Erreur lors d'une requete api") - // throw t - // } - // } - //) -} \ No newline at end of file +suspend fun fetchQuestions(index: Int) = flow { + val serviceClient = createRequestService().create() + try { + val response = serviceClient.getQuestions(index) + emit(response) + } catch (e: Exception) { + Log.e("Requete API Question",e.message.toString()) + } +}