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