feat: Add custom game

This commit is contained in:
Lucàs
2025-01-14 01:53:22 +01:00
parent 13a95f2d55
commit edcf1b786f
6 changed files with 37 additions and 14 deletions
@@ -4,9 +4,12 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import fr.univpau.queezer.data.Settings
import fr.univpau.queezer.manager.loadSettings
import fr.univpau.queezer.view.screens.GameScreen
import fr.univpau.queezer.view.screens.HomeScreen
import fr.univpau.queezer.view.screens.ScoreScreen
@@ -32,7 +35,18 @@ fun QueezerApp(database: DatabaseService) {
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("game") { GameScreen(navController, database) }
composable("game") {
val context = LocalContext.current
val settings: Settings = loadSettings(context)
GameScreen(navController, settings, database)
}
composable("custom_settings") { SettingsScreen(navController, saveLocation = "custom_settings") }
composable("custom_game") {
val context = LocalContext.current
val settings: Settings = loadSettings(context, "custom_settings")
GameScreen(navController, settings, database)
}
composable("settings") { SettingsScreen(navController) }
composable("score") { ScoreScreen(navController, gameViewModel) }
}
@@ -4,7 +4,7 @@ import android.content.Context
import com.google.gson.Gson
import fr.univpau.queezer.data.Settings
fun saveSettings(context: Context, settings: Settings) {
fun saveSettings(context: Context, settings: Settings, saveLocation : String = "settings") {
val sharedPreferences = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
@@ -13,15 +13,16 @@ fun saveSettings(context: Context, settings: Settings) {
val json = Gson().toJson(settings)
// Sauvegarder le JSON dans les SharedPreferences
editor.putString("settings", json)
editor.putString(saveLocation, json)
editor.apply()
}
fun loadSettings(context: Context): Settings {
fun loadSettings(context: Context, saveLocation : String = "settings"): Settings {
val sharedPreferences = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE)
// Récupérer le JSON depuis SharedPreferences
val json = sharedPreferences.getString("settings", null)
val json = sharedPreferences.getString(saveLocation, null)
// Si le JSON n'est pas null, le convertir en objet Settings
return if (json != null) {
@@ -1,6 +1,7 @@
package fr.univpau.queezer.view.screens
import android.content.Context
import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -39,7 +40,6 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import fr.univpau.queezer.R
import fr.univpau.queezer.data.Settings
import fr.univpau.queezer.manager.loadSettings
import coil.compose.AsyncImage
import fr.univpau.queezer.data.Answer
import fr.univpau.queezer.data.Playlist
@@ -49,10 +49,9 @@ import fr.univpau.queezer.service.DatabaseService
import kotlinx.coroutines.CoroutineScope
@Composable
fun GameScreen(navController: NavHostController, database: DatabaseService) {
val coroutineScope = rememberCoroutineScope()
fun GameScreen(navController: NavHostController, settings: Settings, database: DatabaseService) {
val context = LocalContext.current
val settings: Settings = loadSettings(context)
val coroutineScope = rememberCoroutineScope()
var gameManager by remember { mutableStateOf(GameManager()) }
var countdown by remember { mutableIntStateOf(30) }
@@ -63,6 +62,12 @@ fun GameScreen(navController: NavHostController, database: DatabaseService) {
LaunchedEffect(settings.playlistUrl) {
val playlist = fetchPlaylist(settings.playlistUrl)
if (settings.numberOfTitles!! > (playlist?.tracks?.size ?: 0)) {
navController.popBackStack()
Toast.makeText(context, context.resources.getString(R.string.playlist_too_short), Toast.LENGTH_SHORT).show()
return@LaunchedEffect;
}
gameManager = GameManager(
settings = settings,
playlist = playlist ?: Playlist(),
@@ -62,7 +62,9 @@ fun HomeScreen(navController: NavHostController) {
}
Button(
onClick = { /* TODO: Partie personnalisée */ },
onClick = {
navController.navigate("custom_settings")
},
shape = RoundedCornerShape(8.dp),
modifier = Modifier
.fillMaxWidth()
@@ -41,9 +41,9 @@ import fr.univpau.queezer.manager.saveSettings
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(navController: NavHostController) {
fun SettingsScreen(navController: NavHostController, saveLocation: String = "settings") {
val context = LocalContext.current
val settings = remember { mutableStateOf(loadSettings(context)) }
val settings = remember { mutableStateOf(loadSettings(context, saveLocation)) }
Scaffold(
topBar = {
@@ -80,7 +80,7 @@ fun SettingsScreen(navController: NavHostController) {
onClick = {
try {
settings.value.validate(context)
saveSettings(context, settings.value)
saveSettings(context, settings.value, saveLocation)
navController.popBackStack()
} catch (e: Exception) {
Toast.makeText(context, e.message, Toast.LENGTH_LONG).show()
@@ -123,7 +123,7 @@ fun SettingsScreen(navController: NavHostController) {
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
)
Column (
Column(
modifier = Modifier.fillMaxWidth(),
) {
Text(text = "Mode de jeu", fontSize = 18.sp)
+1
View File
@@ -35,5 +35,6 @@
<string name="date">Date</string>
<string name="error_playlist_not_found">La playlist n\'as pas été trouvée</string>
<string name="error_tracks_count_too_high">Le nombre de titres et trop grand</string>
<string name="playlist_too_short">La playlist est trop petite pour le nombre de titres demandés</string>
</resources>