mirror of
https://github.com/LucasVbr/Queezer.git
synced 2026-05-13 17:11:55 +00:00
feat: Add custom game
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user