From edcf1b786fdc79abaf7c68fd7e43428e1ce9316a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= <86352901+LucasVbr@users.noreply.github.com> Date: Tue, 14 Jan 2025 01:53:22 +0100 Subject: [PATCH] feat: Add custom game --- .../main/java/fr/univpau/queezer/MainActivity.kt | 16 +++++++++++++++- .../univpau/queezer/manager/SettingsManager.kt | 9 +++++---- .../univpau/queezer/view/screens/GameScreen.kt | 13 +++++++++---- .../univpau/queezer/view/screens/HomeScreen.kt | 4 +++- .../queezer/view/screens/SettingsScreen.kt | 8 ++++---- app/src/main/res/values/strings.xml | 1 + 6 files changed, 37 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/fr/univpau/queezer/MainActivity.kt b/app/src/main/java/fr/univpau/queezer/MainActivity.kt index 25d69d6..66d0fd2 100644 --- a/app/src/main/java/fr/univpau/queezer/MainActivity.kt +++ b/app/src/main/java/fr/univpau/queezer/MainActivity.kt @@ -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) } } diff --git a/app/src/main/java/fr/univpau/queezer/manager/SettingsManager.kt b/app/src/main/java/fr/univpau/queezer/manager/SettingsManager.kt index aca596e..b70a710 100644 --- a/app/src/main/java/fr/univpau/queezer/manager/SettingsManager.kt +++ b/app/src/main/java/fr/univpau/queezer/manager/SettingsManager.kt @@ -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) { diff --git a/app/src/main/java/fr/univpau/queezer/view/screens/GameScreen.kt b/app/src/main/java/fr/univpau/queezer/view/screens/GameScreen.kt index 0e994ee..71008dd 100644 --- a/app/src/main/java/fr/univpau/queezer/view/screens/GameScreen.kt +++ b/app/src/main/java/fr/univpau/queezer/view/screens/GameScreen.kt @@ -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(), diff --git a/app/src/main/java/fr/univpau/queezer/view/screens/HomeScreen.kt b/app/src/main/java/fr/univpau/queezer/view/screens/HomeScreen.kt index 86c24a1..a05d858 100644 --- a/app/src/main/java/fr/univpau/queezer/view/screens/HomeScreen.kt +++ b/app/src/main/java/fr/univpau/queezer/view/screens/HomeScreen.kt @@ -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() diff --git a/app/src/main/java/fr/univpau/queezer/view/screens/SettingsScreen.kt b/app/src/main/java/fr/univpau/queezer/view/screens/SettingsScreen.kt index e39beda..e254d51 100644 --- a/app/src/main/java/fr/univpau/queezer/view/screens/SettingsScreen.kt +++ b/app/src/main/java/fr/univpau/queezer/view/screens/SettingsScreen.kt @@ -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) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 55dba8f..8e3c09e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -35,5 +35,6 @@ Date La playlist n\'as pas été trouvée Le nombre de titres et trop grand + La playlist est trop petite pour le nombre de titres demandés \ No newline at end of file