[FIX] Merge

RepositoryAndroid
Renaud BEURET 1 year ago
commit a839310455

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ScienceQuest.iml" filepath="$PROJECT_DIR$/.idea/ScienceQuest.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AppInsightsSettings">
<option name="selectedTabId" value="Android Vitals" />
</component>
</project>

@ -2,24 +2,8 @@
<project version="4"> <project version="4">
<component name="deploymentTargetDropDown"> <component name="deploymentTargetDropDown">
<value> <value>
<entry key="LoginScreen">
<State />
</entry>
<entry key="app"> <entry key="app">
<State> <State />
<targetSelectedWithDropDown>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="$USER_HOME$/.android/avd/Pixel_XL_API_34.avd" />
</Key>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2024-03-12T12:45:20.117863504Z" />
</State>
</entry> </entry>
</value> </value>
</component> </component>

@ -1,13 +1,8 @@
package fr.iut.sciencequest.model.buisness.Scientifique package fr.iut.sciencequest.model.buisness.Scientifique
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO
import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListDTO
import kotlinx.serialization.json.Json import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListInfosDTO
import okhttp3.MediaType
import okhttp3.OkHttpClient
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Path import retrofit2.http.Path
import retrofit2.http.Query import retrofit2.http.Query
@ -16,6 +11,9 @@ interface ScientifiqueRequestService {
@GET("scientifiques?page") @GET("scientifiques?page")
suspend fun getScientifiques(@Query("page") index: Int): ScientifiqueListDTO suspend fun getScientifiques(@Query("page") index: Int): ScientifiqueListDTO
@GET("scientifiques")
suspend fun getScientifiquesListInfos(): ScientifiqueListInfosDTO
@GET("scientifiques/{id}") @GET("scientifiques/{id}")
suspend fun getScientifique(@Path("id") id: Int): ScientifiqueDTO suspend fun getScientifique(@Path("id") id: Int): ScientifiqueDTO
} }

@ -0,0 +1,36 @@
package fr.iut.sciencequest.model.buisness.Scientifique
import android.util.Log
import fr.iut.sciencequest.model.buisness.createRequestService
import kotlinx.coroutines.flow.flow
import retrofit2.create
suspend fun fetchScientifiqueById(id: Int) = flow {
val serviceClient = createRequestService().create<ScientifiqueRequestService>()
try {
val response = serviceClient.getScientifique(id)
emit(response)
} catch (e: Exception) {
Log.e("Requete API",e.message.toString())
}
}
fun fetchScientifiques(index: Int) = flow {
val serviceClient = createRequestService().create<ScientifiqueRequestService>()
try {
val response = serviceClient.getScientifiques(index)
emit(response)
} catch (e: Exception) {
Log.e("Requete API",e.message.toString())
}
}
fun fetchScientifiquesInfos() = flow {
val serviceClient = createRequestService().create<ScientifiqueRequestService>()
try {
val response = serviceClient.getScientifiquesListInfos().page
emit(response)
} catch (e: Exception) {
Log.e("Requete API",e.message.toString())
}
}

@ -6,7 +6,7 @@ import okhttp3.MediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import retrofit2.Retrofit import retrofit2.Retrofit
const val API_BASE_URL = "https://sae-java.alix-jdlm.fr/api/v1/" const val API_BASE_URL = "https://codefirst.iut.uca.fr/containers/tombiard-api/api/v1/"
val httpClient = OkHttpClient() val httpClient = OkHttpClient()

@ -0,0 +1,21 @@
package fr.iut.sciencequest.model.dto.ScientifiqueDTOs
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
open class ScientifiqueListInfosPageDTO(
@SerialName("totalElements")
val nbScientfiques: Int,
@SerialName("totalPages")
val nbPages: Int,
@SerialName("size")
val nbScientifiquesParPage: Int
)
@Serializable
open class ScientifiqueListInfosDTO (
val page: ScientifiqueListInfosPageDTO
)

@ -11,6 +11,7 @@ import fr.iut.sciencequest.view.HomeScreen
import fr.iut.sciencequest.view.LoginScreen import fr.iut.sciencequest.view.LoginScreen
import fr.iut.sciencequest.view.games.KahootScreen import fr.iut.sciencequest.view.games.KahootScreen
import fr.iut.sciencequest.view.games.PenduScreen import fr.iut.sciencequest.view.games.PenduScreen
import fr.iut.sciencequest.view.games.QuiScreen
import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen
@ -35,6 +36,9 @@ fun NavHost() {
}, },
goToKahoot = { goToKahoot = {
navController.navigate("kahoot") navController.navigate("kahoot")
},
goToQui = {
navController.navigate("qui")
} }
) )
} }
@ -73,7 +77,18 @@ fun NavHost() {
} }
composable(route= "kahoot"){ composable(route= "kahoot"){
KahootScreen( goToAccount = { KahootScreen(
goToAccount = {
navController.navigate("account")
},
goToHome = {
navController.navigate("home")
}
)
}
composable(route= "qui"){
QuiScreen(goToAccount = {
navController.navigate("account") navController.navigate("account")
}, },
goToHome = { goToHome = {
@ -82,7 +97,8 @@ fun NavHost() {
} }
composable(route = "listeScientifiques") { composable(route = "listeScientifiques") {
scientifiqueListeScreen(goToAccount = { scientifiqueListeScreen(
goToAccount = {
navController.navigate("account") navController.navigate("account")
}, },
goToHome = { goToHome = {

@ -19,21 +19,22 @@ import androidx.compose.ui.unit.sp
fun HomeScreen(goToHome: () -> Unit, fun HomeScreen(goToHome: () -> Unit,
goToAccount: () -> Unit, goToAccount: () -> Unit,
goToPendu: () -> Unit, goToPendu: () -> Unit,
goToKahoot: () -> Unit) { goToKahoot: () -> Unit,
goToQui: () -> Unit) {
Column (modifier = Modifier.fillMaxWidth()){ Column (modifier = Modifier.fillMaxWidth()){
TopBar(goToAccount, goToHome) TopBar(goToAccount, goToHome)
MainContent(goToPendu, goToKahoot) MainContent(goToPendu, goToKahoot, goToQui)
} }
} }
@Preview @Preview
@Composable @Composable
fun HomeScreenPreview() { fun HomeScreenPreview() {
HomeScreen({},{},{}, {}) HomeScreen({},{},{},{},{})
} }
@Composable @Composable
fun MainContent(goToPendu: () -> Unit, goToKahoot: () -> Unit) { fun MainContent(goToPendu: () -> Unit, goToKahoot: () -> Unit, goToQui: () -> Unit) {
val context = LocalContext.current; val context = LocalContext.current;
val comingSoon = Toast.makeText(context, "Coming soon", Toast.LENGTH_SHORT); val comingSoon = Toast.makeText(context, "Coming soon", Toast.LENGTH_SHORT);
@ -45,7 +46,7 @@ fun MainContent(goToPendu: () -> Unit, goToKahoot: () -> Unit) {
Button(onClick = goToKahoot, Modifier.fillMaxWidth()) { Button(onClick = goToKahoot, Modifier.fillMaxWidth()) {
Text(text = "Kahoot", fontSize = 13.sp) Text(text = "Kahoot", fontSize = 13.sp)
} }
Button(onClick = { comingSoon.show() }, Modifier.fillMaxWidth()) { Button(onClick = goToQui, Modifier.fillMaxWidth()) {
Text(text = "Qui est ce ?", fontSize = 13.sp) Text(text = "Qui est ce ?", fontSize = 13.sp)
} }
} }

@ -4,6 +4,7 @@ import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
@ -19,6 +20,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import fr.iut.sciencequest.R import fr.iut.sciencequest.R
import fr.iut.sciencequest.viewModels.KahootViewModel import fr.iut.sciencequest.viewModels.KahootViewModel
@ -38,6 +40,7 @@ fun KahootScreen(viewModel: KahootViewModel = viewModel(factory = KahootViewMode
} }
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.fillMaxWidth()) {
TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot))
KahootPlayer(state.value.question) { KahootPlayer(state.value.question) {
viewModel.ajouterPoints(it) viewModel.ajouterPoints(it)
} }
@ -62,9 +65,14 @@ fun KahootPlayerPreview(){
@Composable @Composable
fun KahootPlayer(question: QuestionWithSimpleReponse, fun KahootPlayer(question: QuestionWithSimpleReponse,
sendReponse: (Long) -> Unit){ sendReponse: (Long) -> Unit){
val context = LocalContext.current; val context = LocalContext.current;
val currTime = System.currentTimeMillis() val currTime = System.currentTimeMillis()
Column (horizontalAlignment = Alignment.CenterHorizontally){ Column (
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceEvenly,
modifier = Modifier.fillMaxHeight()
) {
KahootQuestion(question = question.question) KahootQuestion(question = question.question)
KahootReponses(reponses = question.reponses) { KahootReponses(reponses = question.reponses) {
sendReponse(currTime - System.currentTimeMillis()) sendReponse(currTime - System.currentTimeMillis())
@ -92,5 +100,5 @@ fun KahootReponses(reponses : List<ReponseSimple>, action: (ReponseSimple)->Unit
@Composable @Composable
fun KahootQuestion(question: String){ fun KahootQuestion(question: String){
Text(question, textAlign = TextAlign.Center) Text(question, textAlign = TextAlign.Center, fontSize = 20.sp)
} }

@ -2,8 +2,10 @@ package fr.iut.sciencequest.view.games
import android.content.Context import android.content.Context
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button import androidx.compose.material3.Button
@ -17,6 +19,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import fr.iut.sciencequest.R import fr.iut.sciencequest.R
import fr.iut.sciencequest.viewModels.PenduViewModel import fr.iut.sciencequest.viewModels.PenduViewModel
@ -25,23 +28,40 @@ import fr.iut.sciencequest.view.TopBar
@Composable @Composable
fun PenduScreen(viewModel: PenduViewModel = viewModel(factory = PenduViewModel.ApiFactory), fun PenduScreen(viewModel: PenduViewModel = viewModel(factory = PenduViewModel.ApiFactory),
goToAccount: () -> Unit, goToAccount: () -> Unit,
goToHome: () -> Unit) { goToHome: () -> Unit
) {
val state = viewModel.uiState.collectAsState() val state = viewModel.uiState.collectAsState()
val context = LocalContext.current; val context = LocalContext.current;
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.fillMaxWidth()) {
TopBar(goToAccount, goToHome, stringResource(id = R.string.pendu)) TopBar(goToAccount, goToHome, stringResource(id = R.string.pendu))
//Text(text = stringResource(id = R.string.pendu), modifier = Modifier.padding(top=10.dp)) //Text(text = stringResource(id = R.string.pendu), modifier = Modifier.padding(top=10.dp))
Column(modifier = Modifier.align(Alignment.CenterHorizontally)) Column(
{ horizontalAlignment = Alignment.CenterHorizontally,
Text(text = state.value.motATrou) verticalArrangement = Arrangement.SpaceAround,
modifier = Modifier.fillMaxSize()
) {
Text(text = state.value.motATrou, fontSize = 20.sp)
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceBetween,
) {
TextField(value = "", TextField(value = "",
onValueChange = { onLetterEntered(it, viewModel, context, goToHome) }, onValueChange = { onLetterEntered(it, viewModel, context, goToHome) },
modifier = Modifier.padding(20.dp)) modifier = Modifier.padding(20.dp),
enabled = !state.value.isWon && state.value.nbViesRestantes > 0,
placeholder = { Text(if(!state.value.isWon) "Entrez une lettre" else "Cliquez sur Nouvelle Partie") }
)
afficherVies(state.value.nbViesRestantes) afficherVies(state.value.nbViesRestantes)
Text("Lettres utilisées: " + state.value.lettresUtilises)
if(state.value.isWon) {
Text(modifier = Modifier.padding(top=10.dp), text = "Vous avez gagné !")
} else if (state.value.nbViesRestantes == 0) {
Text(modifier = Modifier.padding(top=10.dp), text = "Vous avez perdu :(")
}
}
Button(onClick = { viewModel.InitPartie() }) { Button(onClick = { viewModel.InitPartie() }) {
Text(text = stringResource(id = R.string.reset_game)) Text(text = stringResource(id = R.string.reset_game))
} }
Text("Lettres utilisées: " + state.value.lettresUtilises)
} }
} }
} }
@ -54,7 +74,7 @@ fun onLetterEntered(entered: String,
if (entered.isNotEmpty()) { if (entered.isNotEmpty()) {
vm.PlayAction(entered[0]) vm.PlayAction(entered[0])
if ((!state.value.isWon) && (state.value.nbViesRestantes == 0)) { if ((!state.value.isWon) && (state.value.nbViesRestantes == 0)) {
goToHome() Toast.makeText(context,"Vous avez perdu :(",Toast.LENGTH_LONG).show()
} else if (state.value.isWon) { } else if (state.value.isWon) {
Toast.makeText(context,"Vous avez gagné !",Toast.LENGTH_LONG).show() Toast.makeText(context,"Vous avez gagné !",Toast.LENGTH_LONG).show()
} }

@ -0,0 +1,95 @@
package fr.iut.sciencequest.view.games
import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.grid.GridCells
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
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.model.dto.extensions.ToModel
import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO
import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO
import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse
import fr.iut.sciencequest.model.metier.reponse.ReponseSimple
import fr.iut.sciencequest.stub.StubQuestionWithReponses
import fr.iut.sciencequest.view.TopBar
import fr.iut.sciencequest.viewModels.KahootViewModel
import java.util.Timer
@Composable
fun QuiScreen(viewModel: KahootViewModel = viewModel(),
goToAccount: () -> Unit,
goToHome: () -> Unit) {
val state = viewModel.uiState.collectAsState()
Column(modifier = Modifier.fillMaxWidth()) {
TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot))
QuiPlayer(state.value.question) {
viewModel.ajouterPoints(it)
}
}
}
@Preview
@Composable
fun QuiScreenPreview(){
QuiScreen(goToAccount = {}, goToHome = {})
}
@Preview
@Composable
fun QuiPlayerPreview(){
val i = 0
QuiPlayer(question = StubQuestionWithReponses.ToModel()) {}
}
@Composable
fun QuiPlayer(question: QuestionWithSimpleReponse,
sendReponse: (Long) -> Unit){
val context = LocalContext.current;
val currTime = System.currentTimeMillis()
Column (horizontalAlignment = Alignment.CenterHorizontally){
QuiQuestion(question = question.question)
QuiReponses(reponses = question.reponses) {
sendReponse(currTime - System.currentTimeMillis())
Toast.makeText(context, it.reponse, Toast.LENGTH_SHORT).show()
}
}
}
@Composable
fun QuiReponses(reponses : List<ReponseSimple>, action: (ReponseSimple)->Unit) {
LazyVerticalGrid(columns = GridCells.Fixed(2),
contentPadding = PaddingValues(12.dp),
verticalArrangement = Arrangement.spacedBy(10.dp),
horizontalArrangement = Arrangement.spacedBy(10.dp)) {
reponses.forEach {
item() {
Button(onClick = {action(it)}){
Text(it.reponse)
}
}
}
}
}
@Composable
fun QuiQuestion(question: String){
Text(question, textAlign = TextAlign.Center)
}

@ -29,7 +29,6 @@ class PenduViewModel(
} else { } else {
'_' '_'
} }
}
uiState.value = PenduUIState( uiState.value = PenduUIState(
isActionGood = true, isActionGood = true,
motATrouver = nomComplet, motATrouver = nomComplet,
@ -38,6 +37,8 @@ class PenduViewModel(
} }
} }
}
// mot : mot à trouver // mot : mot à trouver
// motAct : état actuel du mot trouvé par l'utilisateur // motAct : état actuel du mot trouvé par l'utilisateur
fun PlayAction(lettre: Char) { fun PlayAction(lettre: Char) {
@ -62,10 +63,9 @@ class PenduViewModel(
nvMotATrou = nvMotATrou.replaceRange(index,index + 1, letterToCheck.toString()) nvMotATrou = nvMotATrou.replaceRange(index,index + 1, letterToCheck.toString())
} }
} }
var isWon = false
if (nvMotATrou.equals(uiState.value.motATrouver)) { val isWon = nvMotATrou == uiState.value.motATrouver
isWon = true
}
uiState.value = PenduUIState(isWon, uiState.value = PenduUIState(isWon,
true, true,
uiState.value.nbViesRestantes, uiState.value.nbViesRestantes,

@ -0,0 +1,8 @@
Description dérive Qui-est-ce:
- Image flou du scientifique à trouver
- 1 seul indice au début en dessous de la photo exemple: femme - 1967
- 4 réponse possible comme kahoot, 1 seul essai
- maximum de point si la personne trouve du premier coup
- possibilité d'avoir + d'indice / diminution du flou mais gagne moins de points au fur et à mesure
- Plus simple à implémenter qu'un réel qui-est-ce.
Loading…
Cancel
Save