From c0ad43c98287c07ab84c02e2693ad373fa51c29c Mon Sep 17 00:00:00 2001 From: vltkv <119106723+vltkv@users.noreply.github.com> Date: Sat, 28 Dec 2024 02:58:43 +0100 Subject: [PATCH 1/4] Add fuzzy search --- app/build.gradle.kts | 1 + .../ui/guessSong/GuessSongViewModel.kt | 44 +++++++++++++------ app/src/main/res/values/strings.xml | 2 +- gradle/libs.versions.toml | 2 + 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index efdced9..cbc7fbf 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -112,6 +112,7 @@ dependencies { implementation(libs.io.ktor.client) implementation(libs.io.ktor.content.negotiation) implementation(libs.io.ktor.json.serialization) + implementation(libs.fuzzywuzzy) // hilt implementation(libs.hilt) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt index e7a49ce..49cb47c 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt @@ -12,12 +12,14 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import me.xdrop.fuzzywuzzy.FuzzySearch data class PlayerWithResult(val player: Player, val resultStatus: ResultStatus, val points: Int) data class GuessState( val players: List = emptyList(), val songs: List = emptyList(), + val filteredSongs: List = emptyList(), val selectedRoom: Room? = null, val playlist: Playlist = Playlist(name = "Playlist #1", songs = emptyList()), val snippetDuration: Int = 30, @@ -62,22 +64,38 @@ class GuessSongViewModel : ViewModel() { @SuppressWarnings("MagicNumber") private fun loadPlaylist() { viewModelScope.launch { - val examplePlaylist = - listOf( - Song(1, "Song 1"), - Song(2, "Song 2"), - Song(3, "Song 3"), - Song(4, "Song 4"), - Song(5, "Song 5"), - Song(6, "Song 6"), - ) - _guessState.value = - _guessState.value.copy(songs = examplePlaylist, currentSong = examplePlaylist[0]) + val examplePlaylist = listOf( + Song(1, "Hello"), + Song(2, "Highway to Hell"), + Song(3, "Hell's Comin' with Me"), + Song(4, "Riptide"), + Song(5, "Rozmowa"), + Song(6, "Rower"), + Song(7, "Rozmowa"), + Song(8, "Róż"), + Song(9, "Rota"), + Song(9, "Szarość i Róż") + ) + _guessState.value = _guessState.value.copy( + songs = examplePlaylist, currentSong = examplePlaylist[0]) } } - fun updateSearchQuery(newQuery: TextFieldValue) { - _guessState.value = _guessState.value.copy(searchQuery = newQuery) + fun updateSearchQuery(query: TextFieldValue) { + _guessState.value = _guessState.value.copy(searchQuery = query) + performSearch(query.text) + } + + @SuppressWarnings("MagicNumber") + private fun performSearch(query: String) { + if (query.isBlank()) { + _guessState.value = _guessState.value.copy(filteredSongs = _guessState.value.songs) + } else { + val filteredList = _guessState.value.songs.filter { song -> + FuzzySearch.ratio(song.title.lowercase(), query.lowercase()) > 70 + } + _guessState.value = _guessState.value.copy(filteredSongs = filteredList) + } } fun submitAnswer(playerName: String, isCorrect: Boolean) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f06b46e..6f4bda9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,7 +29,7 @@ Save Settings Room Settings You guessed song correctly! - Ups, that\'s not correct + Ups, that\'s not correct answer time left Authorization server is unreachable \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 75c874b..3697e18 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] agp = "8.7.3" +fuzzywuzzy = "1.4.0" kotlin = "2.0.21" coreKtx = "1.15.0" junit = "4.13.2" @@ -23,6 +24,7 @@ coil = "3.0.4" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +fuzzywuzzy = { module = "me.xdrop:fuzzywuzzy", version.ref = "fuzzywuzzy" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" } From 08be74cc50cb02c475f121cfff29cc18ffa24fca Mon Sep 17 00:00:00 2001 From: vltkv <119106723+vltkv@users.noreply.github.com> Date: Sun, 29 Dec 2024 00:18:57 +0100 Subject: [PATCH 2/4] sorting searches by most relevant --- .../ui/guessSong/GuessResultScreen.kt | 2 +- .../ui/guessSong/GuessSongScreen.kt | 21 ++---- .../ui/guessSong/GuessSongViewModel.kt | 67 +++++++++++++------ 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessResultScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessResultScreen.kt index 087ea07..7012e75 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessResultScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessResultScreen.kt @@ -72,7 +72,7 @@ fun GuessResultScreen( if (guessState.players.any { it.resultStatus == ResultStatus.CORRECT }) { stringResource(R.string.you_guessed_song_correctly) } else { - stringResource(R.string.ups_that_s_not_correct) + stringResource(R.string.ups_that_s_not_correct_answer) }, style = MaterialTheme.typography.headlineLarge, fontWeight = FontWeight.Bold, diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt index 3c75008..365ff1f 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt @@ -26,12 +26,8 @@ import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -46,7 +42,6 @@ import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute import com.github.feelbeatapp.androidclient.ui.acceptGame.Song -import kotlinx.coroutines.delay @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -55,15 +50,11 @@ fun GuessSongScreen( viewModel: GuessSongViewModel = GuessSongViewModel(), ) { val guessState by viewModel.guessState.collectAsState() - var timeLeft by remember { mutableIntStateOf(guessState.snippetDuration) } + val timeLeft by viewModel.timeLeft.collectAsState() + val gameEnded by viewModel.gameEnded.collectAsState() - LaunchedEffect(key1 = timeLeft) { - if (timeLeft > 0) { - delay(timeMillis = 1000) - timeLeft -= 1 - } else { - navController.navigate(FeelBeatRoute.GUESS_RESULT.name) - } + if (gameEnded) { + navController.navigate(FeelBeatRoute.GUESS_RESULT.name) } Scaffold( @@ -111,9 +102,9 @@ fun GuessSongScreen( verticalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxSize(), ) { - items(guessState.songs.size) { index -> + items(guessState.filteredSongs.size) { index -> SongItem( - song = guessState.songs[index], + song = guessState.filteredSongs[index], onClick = { navController.navigate(FeelBeatRoute.GUESS_RESULT.name) }, ) } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt index 49cb47c..def4aee 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt @@ -8,6 +8,7 @@ import com.github.feelbeatapp.androidclient.ui.acceptGame.Playlist import com.github.feelbeatapp.androidclient.ui.acceptGame.Song import com.github.feelbeatapp.androidclient.ui.home.Room import com.github.feelbeatapp.androidclient.ui.startGame.Player +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -32,9 +33,16 @@ class GuessSongViewModel : ViewModel() { private val _guessState = MutableStateFlow(GuessState()) val guessState: StateFlow = _guessState.asStateFlow() + private val _timeLeft = MutableStateFlow(_guessState.value.snippetDuration) + val timeLeft: StateFlow = _timeLeft.asStateFlow() + + private val _gameEnded = MutableStateFlow(false) + val gameEnded: StateFlow = _gameEnded.asStateFlow() + init { loadPlayers() loadPlaylist() + startTimer() } private fun loadPlayers() { @@ -64,20 +72,36 @@ class GuessSongViewModel : ViewModel() { @SuppressWarnings("MagicNumber") private fun loadPlaylist() { viewModelScope.launch { - val examplePlaylist = listOf( - Song(1, "Hello"), - Song(2, "Highway to Hell"), - Song(3, "Hell's Comin' with Me"), - Song(4, "Riptide"), - Song(5, "Rozmowa"), - Song(6, "Rower"), - Song(7, "Rozmowa"), - Song(8, "Róż"), - Song(9, "Rota"), - Song(9, "Szarość i Róż") - ) - _guessState.value = _guessState.value.copy( - songs = examplePlaylist, currentSong = examplePlaylist[0]) + val examplePlaylist = + listOf( + Song(1, "Hello"), + Song(2, "Highway to Hell"), + Song(3, "Hell's Comin' with Me"), + Song(4, "Riptide"), + Song(5, "Rozmowa"), + Song(6, "Rower"), + Song(7, "R"), + Song(8, "Róż"), + Song(9, "Rota"), + Song(10, "Szarość i Róż"), + ) + _guessState.value = + _guessState.value.copy( + songs = examplePlaylist, + filteredSongs = examplePlaylist, + currentSong = examplePlaylist[0], + ) + } + } + + @SuppressWarnings("MagicNumber") + private fun startTimer() { + viewModelScope.launch { + while (_timeLeft.value > 0) { + delay(1000L) + _timeLeft.emit(_timeLeft.value - 1) + } + _gameEnded.value = true } } @@ -88,14 +112,15 @@ class GuessSongViewModel : ViewModel() { @SuppressWarnings("MagicNumber") private fun performSearch(query: String) { - if (query.isBlank()) { - _guessState.value = _guessState.value.copy(filteredSongs = _guessState.value.songs) - } else { - val filteredList = _guessState.value.songs.filter { song -> - FuzzySearch.ratio(song.title.lowercase(), query.lowercase()) > 70 + val sortedList = + if (query.isBlank()) { + _guessState.value.songs + } else { + _guessState.value.songs.sortedByDescending { song -> + FuzzySearch.ratio(song.title.lowercase(), query.lowercase()) + } } - _guessState.value = _guessState.value.copy(filteredSongs = filteredList) - } + _guessState.value = _guessState.value.copy(filteredSongs = sortedList) } fun submitAnswer(playerName: String, isCorrect: Boolean) { From b4db6e9ea8a72e41ffc0d7b4361bd54130bcee80 Mon Sep 17 00:00:00 2001 From: vltkv <119106723+vltkv@users.noreply.github.com> Date: Sun, 29 Dec 2024 21:49:43 +0100 Subject: [PATCH 3/4] Game state classes separation --- .../ui/acceptGame/AcceptGameScreen.kt | 1 + .../ui/acceptGame/AcceptGameViewModel.kt | 18 +++------------ .../ui/gameResult/GameResultScreen.kt | 2 +- .../ui/gameResult/GameResultViewModel.kt | 4 ++-- .../ui/guessSong/GuessSongScreen.kt | 3 ++- .../ui/guessSong/GuessSongViewModel.kt | 22 ++++--------------- .../androidclient/ui/home/HomeScreen.kt | 1 + .../androidclient/ui/home/HomeViewModel.kt | 10 +-------- .../ui/roomSettings/RoomSettingsViewModel.kt | 2 +- .../ui/startGame/StartGameScreen.kt | 1 + .../ui/startGame/StartGameViewModel.kt | 3 +-- .../androidclient/ui/state/GameState.kt | 10 +++++++++ .../androidclient/ui/state/GuessState.kt | 15 +++++++++++++ .../androidclient/ui/state/Player.kt | 3 +++ .../ui/state/PlayerWithResult.kt | 5 +++++ .../androidclient/ui/state/Playlist.kt | 3 +++ .../androidclient/ui/state/Room.kt | 10 +++++++++ .../androidclient/ui/state/Song.kt | 3 +++ 18 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GameState.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GuessState.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Player.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/PlayerWithResult.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Playlist.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt create mode 100644 app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameScreen.kt index aa67308..4bde89d 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameScreen.kt @@ -34,6 +34,7 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute +import com.github.feelbeatapp.androidclient.ui.state.Song import com.github.feelbeatapp.androidclient.ui.startGame.PlayerCard @Composable diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameViewModel.kt index fd8fed5..b7465df 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptGame/AcceptGameViewModel.kt @@ -3,27 +3,15 @@ package com.github.feelbeatapp.androidclient.ui.acceptGame import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.ui.home.Room -import com.github.feelbeatapp.androidclient.ui.startGame.Player +import com.github.feelbeatapp.androidclient.ui.state.GameState +import com.github.feelbeatapp.androidclient.ui.state.Player +import com.github.feelbeatapp.androidclient.ui.state.Song import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -data class Song(val id: Int, val title: String) - -data class Playlist(val name: String, val songs: List) - -data class GameState( - val players: List = emptyList(), - val songs: List = emptyList(), - val selectedRoom: Room? = null, - val playlist: Playlist = Playlist(name = "Playlist #1", songs = emptyList()), - val snippetDuration: Int = 30, - val pointsToWin: Int = 10, -) - class AcceptGameViewModel : ViewModel() { private val _gameState = MutableStateFlow(GameState()) val gameState: StateFlow = _gameState.asStateFlow() diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultScreen.kt index 7f9f12f..f441f02 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultScreen.kt @@ -31,7 +31,7 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute -import com.github.feelbeatapp.androidclient.ui.guessSong.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.state.PlayerWithResult @Composable fun GameResultScreen( diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultViewModel.kt index 911df3c..f3111d2 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/gameResult/GameResultViewModel.kt @@ -3,9 +3,9 @@ package com.github.feelbeatapp.androidclient.ui.gameResult import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.ui.guessSong.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.state.Player +import com.github.feelbeatapp.androidclient.ui.state.PlayerWithResult import com.github.feelbeatapp.androidclient.ui.guessSong.ResultStatus -import com.github.feelbeatapp.androidclient.ui.startGame.Player import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt index 365ff1f..1cc55e9 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongScreen.kt @@ -41,7 +41,8 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute -import com.github.feelbeatapp.androidclient.ui.acceptGame.Song +import com.github.feelbeatapp.androidclient.ui.state.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.state.Song @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt index def4aee..e9880d9 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guessSong/GuessSongViewModel.kt @@ -4,10 +4,10 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.ui.acceptGame.Playlist -import com.github.feelbeatapp.androidclient.ui.acceptGame.Song -import com.github.feelbeatapp.androidclient.ui.home.Room -import com.github.feelbeatapp.androidclient.ui.startGame.Player +import com.github.feelbeatapp.androidclient.ui.state.GuessState +import com.github.feelbeatapp.androidclient.ui.state.Player +import com.github.feelbeatapp.androidclient.ui.state.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.state.Song import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -15,20 +15,6 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import me.xdrop.fuzzywuzzy.FuzzySearch -data class PlayerWithResult(val player: Player, val resultStatus: ResultStatus, val points: Int) - -data class GuessState( - val players: List = emptyList(), - val songs: List = emptyList(), - val filteredSongs: List = emptyList(), - val selectedRoom: Room? = null, - val playlist: Playlist = Playlist(name = "Playlist #1", songs = emptyList()), - val snippetDuration: Int = 30, - val pointsToWin: Int = 10, - val searchQuery: TextFieldValue = TextFieldValue(""), - val currentSong: Song? = null, -) - class GuessSongViewModel : ViewModel() { private val _guessState = MutableStateFlow(GuessState()) val guessState: StateFlow = _guessState.asStateFlow() diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeScreen.kt index a02ebf4..b111f24 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeScreen.kt @@ -38,6 +38,7 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute +import com.github.feelbeatapp.androidclient.ui.state.Room @Composable fun HomeScreen( diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeViewModel.kt index 840eee0..e0d403f 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/home/HomeViewModel.kt @@ -2,20 +2,12 @@ package com.github.feelbeatapp.androidclient.ui.home import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.github.feelbeatapp.androidclient.ui.state.Room import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -data class Room( - val id: Int, - val name: String, - val maxPlayers: Int, - val snippetDuration: Int, - val pointsToWin: Int, - val playlistLink: String, -) - class HomeViewModel : ViewModel() { private val _rooms = MutableStateFlow>(emptyList()) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomSettings/RoomSettingsViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomSettings/RoomSettingsViewModel.kt index 0e2b276..e95fc52 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomSettings/RoomSettingsViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomSettings/RoomSettingsViewModel.kt @@ -1,7 +1,7 @@ package com.github.feelbeatapp.androidclient.ui.roomSettings import androidx.lifecycle.ViewModel -import com.github.feelbeatapp.androidclient.ui.home.Room +import com.github.feelbeatapp.androidclient.ui.state.Room import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameScreen.kt index 55972db..90430fa 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameScreen.kt @@ -31,6 +31,7 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute +import com.github.feelbeatapp.androidclient.ui.state.Player @Composable fun StartGameScreen( diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameViewModel.kt index 3b2fcd1..6d1768e 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/startGame/StartGameViewModel.kt @@ -3,13 +3,12 @@ package com.github.feelbeatapp.androidclient.ui.startGame import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.feelbeatapp.androidclient.R +import com.github.feelbeatapp.androidclient.ui.state.Player import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -data class Player(val name: String, val image: Int) - class StartGameViewModel : ViewModel() { private val _players = MutableStateFlow>(emptyList()) val players: StateFlow> = _players.asStateFlow() diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GameState.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GameState.kt new file mode 100644 index 0000000..d324a12 --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GameState.kt @@ -0,0 +1,10 @@ +package com.github.feelbeatapp.androidclient.ui.state + +data class GameState( + val players: List = emptyList(), + val songs: List = emptyList(), + val selectedRoom: Room? = null, + val playlist: Playlist = Playlist(name = "Playlist #1", songs = emptyList()), + val snippetDuration: Int = 30, + val pointsToWin: Int = 10, +) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GuessState.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GuessState.kt new file mode 100644 index 0000000..c809000 --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/GuessState.kt @@ -0,0 +1,15 @@ +package com.github.feelbeatapp.androidclient.ui.state + +import androidx.compose.ui.text.input.TextFieldValue + +data class GuessState( + val players: List = emptyList(), + val songs: List = emptyList(), + val filteredSongs: List = emptyList(), + val selectedRoom: Room? = null, + val playlist: Playlist = Playlist(name = "Playlist #1", songs = emptyList()), + val snippetDuration: Int = 30, + val pointsToWin: Int = 10, + val searchQuery: TextFieldValue = TextFieldValue(""), + val currentSong: Song? = null, +) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Player.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Player.kt new file mode 100644 index 0000000..bdadede --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Player.kt @@ -0,0 +1,3 @@ +package com.github.feelbeatapp.androidclient.ui.state + +data class Player(val name: String, val image: Int) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/PlayerWithResult.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/PlayerWithResult.kt new file mode 100644 index 0000000..8ba6b7a --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/PlayerWithResult.kt @@ -0,0 +1,5 @@ +package com.github.feelbeatapp.androidclient.ui.state + +import com.github.feelbeatapp.androidclient.ui.guessSong.ResultStatus + +data class PlayerWithResult(val player: Player, val resultStatus: ResultStatus, val points: Int) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Playlist.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Playlist.kt new file mode 100644 index 0000000..71d492b --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Playlist.kt @@ -0,0 +1,3 @@ +package com.github.feelbeatapp.androidclient.ui.state + +data class Playlist(val name: String, val songs: List) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt new file mode 100644 index 0000000..98e3e4a --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt @@ -0,0 +1,10 @@ +package com.github.feelbeatapp.androidclient.ui.state + +data class Room( + val id: Int, + val name: String, + val maxPlayers: Int, + val snippetDuration: Int, + val pointsToWin: Int, + val playlistLink: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt new file mode 100644 index 0000000..ce8abf6 --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt @@ -0,0 +1,3 @@ +package com.github.feelbeatapp.androidclient.ui.state + +data class Song(val id: Int, val title: String) \ No newline at end of file From 1ec9c7163f4e76f9b6b14ec7ac233d58e9b74a8c Mon Sep 17 00:00:00 2001 From: vltkv <119106723+vltkv@users.noreply.github.com> Date: Sun, 29 Dec 2024 21:56:34 +0100 Subject: [PATCH 4/4] Add two new lines :) --- .../java/com/github/feelbeatapp/androidclient/ui/state/Room.kt | 2 +- .../java/com/github/feelbeatapp/androidclient/ui/state/Song.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt index 98e3e4a..a8ff9f7 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Room.kt @@ -7,4 +7,4 @@ data class Room( val snippetDuration: Int, val pointsToWin: Int, val playlistLink: String, -) \ No newline at end of file +) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt index ce8abf6..aede2b5 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/state/Song.kt @@ -1,3 +1,3 @@ package com.github.feelbeatapp.androidclient.ui.state -data class Song(val id: Int, val title: String) \ No newline at end of file +data class Song(val id: Int, val title: String)