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.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController 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.GameScreen
import fr.univpau.queezer.view.screens.HomeScreen import fr.univpau.queezer.view.screens.HomeScreen
import fr.univpau.queezer.view.screens.ScoreScreen import fr.univpau.queezer.view.screens.ScoreScreen
@@ -32,7 +35,18 @@ fun QueezerApp(database: DatabaseService) {
NavHost(navController = navController, startDestination = "home") { NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) } 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("settings") { SettingsScreen(navController) }
composable("score") { ScoreScreen(navController, gameViewModel) } composable("score") { ScoreScreen(navController, gameViewModel) }
} }
@@ -4,7 +4,7 @@ import android.content.Context
import com.google.gson.Gson import com.google.gson.Gson
import fr.univpau.queezer.data.Settings 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 sharedPreferences = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit() val editor = sharedPreferences.edit()
@@ -13,15 +13,16 @@ fun saveSettings(context: Context, settings: Settings) {
val json = Gson().toJson(settings) val json = Gson().toJson(settings)
// Sauvegarder le JSON dans les SharedPreferences // Sauvegarder le JSON dans les SharedPreferences
editor.putString("settings", json) editor.putString(saveLocation, json)
editor.apply() editor.apply()
} }
fun loadSettings(context: Context): Settings {
fun loadSettings(context: Context, saveLocation : String = "settings"): Settings {
val sharedPreferences = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val sharedPreferences = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE)
// Récupérer le JSON depuis SharedPreferences // 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 // Si le JSON n'est pas null, le convertir en objet Settings
return if (json != null) { return if (json != null) {
@@ -1,6 +1,7 @@
package fr.univpau.queezer.view.screens package fr.univpau.queezer.view.screens
import android.content.Context import android.content.Context
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.Row import androidx.compose.foundation.layout.Row
@@ -39,7 +40,6 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import fr.univpau.queezer.R import fr.univpau.queezer.R
import fr.univpau.queezer.data.Settings import fr.univpau.queezer.data.Settings
import fr.univpau.queezer.manager.loadSettings
import coil.compose.AsyncImage import coil.compose.AsyncImage
import fr.univpau.queezer.data.Answer import fr.univpau.queezer.data.Answer
import fr.univpau.queezer.data.Playlist import fr.univpau.queezer.data.Playlist
@@ -49,10 +49,9 @@ import fr.univpau.queezer.service.DatabaseService
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@Composable @Composable
fun GameScreen(navController: NavHostController, database: DatabaseService) { fun GameScreen(navController: NavHostController, settings: Settings, database: DatabaseService) {
val coroutineScope = rememberCoroutineScope()
val context = LocalContext.current val context = LocalContext.current
val settings: Settings = loadSettings(context) val coroutineScope = rememberCoroutineScope()
var gameManager by remember { mutableStateOf(GameManager()) } var gameManager by remember { mutableStateOf(GameManager()) }
var countdown by remember { mutableIntStateOf(30) } var countdown by remember { mutableIntStateOf(30) }
@@ -63,6 +62,12 @@ fun GameScreen(navController: NavHostController, database: DatabaseService) {
LaunchedEffect(settings.playlistUrl) { LaunchedEffect(settings.playlistUrl) {
val playlist = fetchPlaylist(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( gameManager = GameManager(
settings = settings, settings = settings,
playlist = playlist ?: Playlist(), playlist = playlist ?: Playlist(),
@@ -62,7 +62,9 @@ fun HomeScreen(navController: NavHostController) {
} }
Button( Button(
onClick = { /* TODO: Partie personnalisée */ }, onClick = {
navController.navigate("custom_settings")
},
shape = RoundedCornerShape(8.dp), shape = RoundedCornerShape(8.dp),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -41,9 +41,9 @@ import fr.univpau.queezer.manager.saveSettings
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SettingsScreen(navController: NavHostController) { fun SettingsScreen(navController: NavHostController, saveLocation: String = "settings") {
val context = LocalContext.current val context = LocalContext.current
val settings = remember { mutableStateOf(loadSettings(context)) } val settings = remember { mutableStateOf(loadSettings(context, saveLocation)) }
Scaffold( Scaffold(
topBar = { topBar = {
@@ -80,7 +80,7 @@ fun SettingsScreen(navController: NavHostController) {
onClick = { onClick = {
try { try {
settings.value.validate(context) settings.value.validate(context)
saveSettings(context, settings.value) saveSettings(context, settings.value, saveLocation)
navController.popBackStack() navController.popBackStack()
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText(context, e.message, Toast.LENGTH_LONG).show() Toast.makeText(context, e.message, Toast.LENGTH_LONG).show()
+1
View File
@@ -35,5 +35,6 @@
<string name="date">Date</string> <string name="date">Date</string>
<string name="error_playlist_not_found">La playlist n\'as pas été trouvée</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="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> </resources>