diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8b0376..0ac784e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,9 +15,11 @@ tools:targetApi="31"> + android:theme="@style/Theme.Queezer" + tools:ignore="DiscouragedApi,LockedOrientationActivity"> diff --git a/app/src/main/java/fr/univpau/queezer/data/Filter.kt b/app/src/main/java/fr/univpau/queezer/data/Filter.kt index 70b3afa..392e888 100644 --- a/app/src/main/java/fr/univpau/queezer/data/Filter.kt +++ b/app/src/main/java/fr/univpau/queezer/data/Filter.kt @@ -3,7 +3,8 @@ package fr.univpau.queezer.data import android.util.Log data class Filter( - var dateOrderIsAscending: Boolean = true, + // var dateOrderIsAscending: Boolean = true, + val orderByNbTitle : Boolean = false, val mode : Map = mapOf( GameMode.TITLE to true, @@ -11,7 +12,6 @@ data class Filter( GameMode.ALL to true ), - val nbTitleIsAscending : Boolean = true, ) fun filterGames(filter: Filter, games: List): List { @@ -19,14 +19,14 @@ fun filterGames(filter: Filter, games: List): List { return games .filter { game -> - // Filtrer uniquement par les modes de jeu activés filter.mode.filter { it.value }.keys.contains(game.settings.gameMode) } .sortedWith(compareBy { game -> // Tri par date - if (filter.dateOrderIsAscending) -game.date.time else game.date.time - }.thenBy { game -> - // Tri par nombre de titres - if (filter.nbTitleIsAscending) game.settings.numberOfTitles ?: 0 else -(game.settings.numberOfTitles ?: 0) + if (filter.orderByNbTitle) { + -game.settings.numberOfTitles!! + } else { + -game.date.time + } }) } \ No newline at end of file diff --git a/app/src/main/java/fr/univpau/queezer/view/components/GameCardItemList.kt b/app/src/main/java/fr/univpau/queezer/view/components/GameCardItemList.kt index af86f9a..705062e 100644 --- a/app/src/main/java/fr/univpau/queezer/view/components/GameCardItemList.kt +++ b/app/src/main/java/fr/univpau/queezer/view/components/GameCardItemList.kt @@ -4,6 +4,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable @@ -13,14 +15,10 @@ import fr.univpau.queezer.data.Game @Composable fun GameCardItemList(games: List) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - .verticalScroll(rememberScrollState()), - + LazyColumn( + modifier = Modifier.padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(16.dp), ) { - for (game in games) GameCardItem(game) + items(games) { game -> GameCardItem(game) } } } \ No newline at end of file diff --git a/app/src/main/java/fr/univpau/queezer/view/components/TrackCardItemList.kt b/app/src/main/java/fr/univpau/queezer/view/components/TrackCardItemList.kt index 8e75f00..d34801a 100644 --- a/app/src/main/java/fr/univpau/queezer/view/components/TrackCardItemList.kt +++ b/app/src/main/java/fr/univpau/queezer/view/components/TrackCardItemList.kt @@ -4,6 +4,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -12,10 +14,10 @@ import fr.univpau.queezer.data.Track @Composable fun TrackCardItemList(tracks: List) { - Column( + LazyColumn( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(16.dp) ) { - for (track in tracks) TrackCardItem(track) + items(tracks) { track -> TrackCardItem(track) } } } \ No newline at end of file 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 71008dd..d4ac489 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 @@ -46,6 +46,7 @@ import fr.univpau.queezer.data.Playlist import fr.univpau.queezer.manager.GameManager import fr.univpau.queezer.manager.fetchPlaylist import fr.univpau.queezer.service.DatabaseService +import fr.univpau.queezer.view.components.TrackCardItemList import kotlinx.coroutines.CoroutineScope @Composable @@ -258,17 +259,39 @@ fun LoadingScreen() { @Composable fun FinishScreen(gameManager: GameManager, context: Context, navController: NavHostController) { - Column( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text("Partie terminée !", fontSize = 24.sp) - Text("Score : ${gameManager.score}", fontSize = 20.sp) - Button(onClick = { - gameManager.save(context) - gameManager.stop() - navController.popBackStack() - }) { Text(context.resources.getString(R.string.back)) } + Scaffold( + bottomBar = { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Button( + modifier = Modifier.fillMaxWidth(), + onClick = { + gameManager.save(context) + gameManager.stop() + navController.popBackStack() + }) { Text(context.resources.getString(R.string.back)) } + } + } + ) { innerPadding -> + Column( + modifier = Modifier.padding(innerPadding), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ){ + Text("Partie terminée !", fontSize = 24.sp) + Text("Score : ${gameManager.score}", fontSize = 20.sp) + + TrackCardItemList(gameManager.playlist.tracks) + } + } } } 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 a05d858..a03d0b5 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 @@ -58,7 +58,10 @@ fun HomeScreen(navController: NavHostController) { .fillMaxWidth() .padding(vertical = 8.dp) ) { - Text("Partie rapide") + Text( + "Partie rapide", + fontSize = 18.sp + ) } Button( @@ -70,7 +73,7 @@ fun HomeScreen(navController: NavHostController) { .fillMaxWidth() .padding(vertical = 8.dp) ) { - Text("Partie personnalisée") + Text("Partie personnalisée", fontSize = 18.sp) } Button( @@ -80,7 +83,7 @@ fun HomeScreen(navController: NavHostController) { .fillMaxWidth() .padding(vertical = 8.dp) ) { - Text("Paramètres") + Text("Paramètres", fontSize = 18.sp) } Button( @@ -88,9 +91,8 @@ fun HomeScreen(navController: NavHostController) { shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() - .padding(vertical = 8.dp) ) { - Text("Scores") + Text("Scores", fontSize = 18.sp) } } } \ No newline at end of file diff --git a/app/src/main/java/fr/univpau/queezer/view/screens/ScoreScreen.kt b/app/src/main/java/fr/univpau/queezer/view/screens/ScoreScreen.kt index ae470fb..ca63fae 100644 --- a/app/src/main/java/fr/univpau/queezer/view/screens/ScoreScreen.kt +++ b/app/src/main/java/fr/univpau/queezer/view/screens/ScoreScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable @@ -47,7 +48,7 @@ import fr.univpau.queezer.data.filterGames import fr.univpau.queezer.view.components.GameCardItemList import fr.univpau.queezer.viewmodel.GameViewModel import java.util.Locale -import kotlin.math.round +import java.util.concurrent.Flow @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -86,8 +87,7 @@ fun ScoreScreen(navController: NavHostController, gameViewModel: GameViewModel) }, ) { innerPadding -> Column( - modifier = Modifier - .padding(innerPadding), + modifier = Modifier.padding(innerPadding), verticalArrangement = Arrangement.spacedBy(16.dp), ) { Row( @@ -108,89 +108,71 @@ fun ScoreScreen(navController: NavHostController, gameViewModel: GameViewModel) HorizontalDivider() - // Todo add filters - - FlowRow( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), + Column( + modifier = Modifier.fillMaxWidth() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), ) { - FilterChip( - selected = true, - onClick = { - // Inverser l'ordre de tri - filter = filter.copy(dateOrderIsAscending = !filter.dateOrderIsAscending) - }, - label = { Text("Date") }, - leadingIcon = { - if (filter.dateOrderIsAscending) { - Icon( - imageVector = Icons.Filled.KeyboardArrowUp, - contentDescription = "Tri Ascendant", - modifier = Modifier.size(FilterChipDefaults.IconSize) - ) - } else { - Icon( - imageVector = Icons.Filled.KeyboardArrowDown, - contentDescription = "Tri Descendant", - modifier = Modifier.size(FilterChipDefaults.IconSize) + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text("Mode de jeu", fontSize = 16.sp) + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + val gameModesLabels = context.resources.getStringArray(R.array.game_modes) + filter.mode.entries.forEachIndexed { index, entry -> + FilterChip( + selected = entry.value, + onClick = { + filter = filter.copy(mode = filter.mode.toMutableMap().apply { + this[entry.key] = !entry.value + }) + }, + + leadingIcon = { + if (entry.value) { + Icon( + imageVector = Icons.Filled.Check, + contentDescription = "Filtre activé", + modifier = Modifier.size(FilterChipDefaults.IconSize) + ) + } + }, + + label = { Text( + gameModesLabels[index], + maxLines = 1, + ) }, ) } - }, - ) - - val gameModesLabels = context.resources.getStringArray(R.array.game_modes) - filter.mode.entries.forEachIndexed { index, entry -> - FilterChip( - selected = entry.value, - onClick = { - filter = filter.copy(mode = filter.mode.toMutableMap().apply { - this[entry.key] = !entry.value - }) - }, - - leadingIcon = { - if (entry.value) { - Icon( - imageVector = Icons.Filled.Check, - contentDescription = "Filtre activé", - modifier = Modifier.size(FilterChipDefaults.IconSize) - ) - } - }, - - label = { Text( - gameModesLabels[index], - maxLines = 1, - ) }, - ) + } } - // Filtrer par nombre de titres - FilterChip( - selected = true, - onClick = { - // Inverser l'ordre de tri - filter = filter.copy(nbTitleIsAscending = !filter.nbTitleIsAscending) - }, - label = { Text("Nombre de titres") }, - leadingIcon = { - if (filter.nbTitleIsAscending) { - Icon( - imageVector = Icons.Filled.KeyboardArrowUp, - contentDescription = "Tri Ascendant", - modifier = Modifier.size(FilterChipDefaults.IconSize) - ) - } else { - Icon( - imageVector = Icons.Filled.KeyboardArrowDown, - contentDescription = "Tri Descendant", - modifier = Modifier.size(FilterChipDefaults.IconSize) - ) - } - }, - ) + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text("Filtrer par", fontSize = 16.sp) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text("Date") + + Switch( + checked = filter.orderByNbTitle, + onCheckedChange = { + filter = filter.copy(orderByNbTitle = it) + } + ) + + Text("Nombre de titres") + } + } } if (filteredGames.isEmpty()) {