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.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()
|
||||||
@@ -123,7 +123,7 @@ fun SettingsScreen(navController: NavHostController) {
|
|||||||
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
|
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
|
||||||
)
|
)
|
||||||
|
|
||||||
Column (
|
Column(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
) {
|
) {
|
||||||
Text(text = "Mode de jeu", fontSize = 18.sp)
|
Text(text = "Mode de jeu", fontSize = 18.sp)
|
||||||
|
|||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user