diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d97330f..5455b6a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,6 +43,7 @@ android { "SPOTIFY_REFRESH_URI", "\"https://accounts.spotify.com/api/token\"", ) + buildConfigField("String", "API_URL", "\"http://10.0.2.2:3000/api/v1\"") } release { @@ -71,6 +72,7 @@ android { "SPOTIFY_REFRESH_URI", "\"https://accounts.spotify.com/api/token\"", ) + buildConfigField("String", "API_URL", "\"http://localhost:3000/api/v1\"") } } compileOptions { diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/di/AppModule.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/di/AppModule.kt index 28a7f69..55d31be 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/di/AppModule.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/di/AppModule.kt @@ -6,6 +6,8 @@ import com.github.feelbeatapp.androidclient.auth.OauthConfig import com.github.feelbeatapp.androidclient.auth.spotify.SpotifyAuthManager import com.github.feelbeatapp.androidclient.auth.storage.AuthStorage import com.github.feelbeatapp.androidclient.auth.storage.PreferencesAuthStorage +import com.github.feelbeatapp.androidclient.network.api.FeelBeatApi +import com.github.feelbeatapp.androidclient.network.api.KtorFeelBeatApi import com.github.feelbeatapp.androidclient.network.fullduplex.NetworkAgent import com.github.feelbeatapp.androidclient.network.fullduplex.WebsocketClient import com.github.feelbeatapp.androidclient.network.spotify.KtorSpotifyAPI @@ -21,6 +23,7 @@ import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.client.plugins.websocket.WebSockets import io.ktor.http.Url import io.ktor.serialization.kotlinx.json.json +import javax.inject.Named import javax.inject.Singleton import kotlinx.serialization.json.Json @@ -58,6 +61,13 @@ abstract class AppModule { refreshUri = BuildConfig.SPOTIFY_REFRESH_URI, ) } + + @Provides + @Singleton + @Named("API_URL") + fun provideApiUrl(): String { + return BuildConfig.API_URL + } } @Singleton @Binds abstract fun bindAuthManager(authManager: SpotifyAuthManager): AuthManager @@ -65,4 +75,6 @@ abstract class AppModule { @Singleton @Binds abstract fun bindAuthStorage(authStorage: PreferencesAuthStorage): AuthStorage @Singleton @Binds abstract fun bindSpotifyAPI(spotifyAPI: KtorSpotifyAPI): SpotifyAPI + + @Singleton @Binds abstract fun bindFeelBeatAPI(feelBeatApi: KtorFeelBeatApi): FeelBeatApi } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/error/ErrorCode.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/error/ErrorCode.kt index 73e8213..a2d4a8e 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/error/ErrorCode.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/error/ErrorCode.kt @@ -5,4 +5,7 @@ enum class ErrorCode { AUTHORIZATION_ACCESS_TOKEN_ERROR, AUTHORIZATION_REFRESH_TOKEN_ERROR, AUTHENTICATION_LOGOUT_ERROR, + FEELBEAT_SERVER_UNREACHABLE, + FEELBEAT_SERVER_ERROR, + FEELBEAT_SERVER_INCORRECT_RESPONSE_FORMAT, } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Player.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/model/Player.kt deleted file mode 100644 index ea69ee6..0000000 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Player.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.github.feelbeatapp.androidclient.model - -data class Player(val name: String, val image: Int) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/RoomSettings.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/model/RoomSettings.kt deleted file mode 100644 index e9660bb..0000000 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/RoomSettings.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.feelbeatapp.androidclient.model - -data class RoomSettings( - val maxPlayers: Int, - val snippetDuration: Int, - val pointsToWin: Int, - val playlistLink: String, -) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Song.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/model/Song.kt deleted file mode 100644 index 475d2fa..0000000 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Song.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.github.feelbeatapp.androidclient.model - -data class Song(val id: Int, val title: String) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/FeelBeatApi.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/FeelBeatApi.kt new file mode 100644 index 0000000..64dc97b --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/FeelBeatApi.kt @@ -0,0 +1,7 @@ +package com.github.feelbeatapp.androidclient.network.api + +import com.github.feelbeatapp.androidclient.ui.model.RoomSettings + +interface FeelBeatApi { + suspend fun createRoom(settings: RoomSettings): String +} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/KtorFeelBeatApi.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/KtorFeelBeatApi.kt new file mode 100644 index 0000000..c7cc5ae --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/KtorFeelBeatApi.kt @@ -0,0 +1,67 @@ +package com.github.feelbeatapp.androidclient.network.api + +import com.github.feelbeatapp.androidclient.auth.AuthManager +import com.github.feelbeatapp.androidclient.error.ErrorCode +import com.github.feelbeatapp.androidclient.error.FeelBeatException +import com.github.feelbeatapp.androidclient.network.api.payloads.CreateRoomPayload +import com.github.feelbeatapp.androidclient.network.api.responses.CreateRoomResponse +import com.github.feelbeatapp.androidclient.ui.model.RoomSettings +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.headers +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsText +import io.ktor.http.ContentType +import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType +import io.ktor.util.network.UnresolvedAddressException +import java.io.IOException +import javax.inject.Inject +import javax.inject.Named + +class KtorFeelBeatApi +@Inject +constructor( + @Named("API_URL") private val baseUrl: String, + private val httpClient: HttpClient, + private val authManager: AuthManager, +) : FeelBeatApi { + override suspend fun createRoom(settings: RoomSettings): String { + val payload = CreateRoomPayload.fromRoomSettings(settings) + val token = authManager.getAccessToken() + + val res = + try { + httpClient.post("$baseUrl/create") { + headers { set("Authorization", "Bearer $token") } + contentType(ContentType.Application.Json) + setBody(payload) + } + } catch (e: Exception) { + when (e) { + is IOException, + is UnresolvedAddressException -> + throw FeelBeatException(ErrorCode.FEELBEAT_SERVER_UNREACHABLE, e) + else -> throw e + } + } + + if (res.status != HttpStatusCode.OK) { + throw FeelBeatException(ErrorCode.FEELBEAT_SERVER_ERROR, res.bodyAsText()) + } + + val (roomId) = + try { + res.body() + } catch (e: UnsupportedOperationException) { + throw FeelBeatException( + ErrorCode.FEELBEAT_SERVER_INCORRECT_RESPONSE_FORMAT, + "Failed to parse server response", + e, + ) + } + + return roomId + } +} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/payloads/CreateRoomPayload.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/payloads/CreateRoomPayload.kt new file mode 100644 index 0000000..e7d234b --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/payloads/CreateRoomPayload.kt @@ -0,0 +1,28 @@ +package com.github.feelbeatapp.androidclient.network.api.payloads + +import com.github.feelbeatapp.androidclient.ui.model.RoomSettings +import io.ktor.http.Url +import kotlinx.serialization.Serializable + +@Serializable +data class CreateRoomPayload( + val maxPlayers: Int, + val turnCount: Int, + val timePenaltyPerSecond: Int, + val basePoints: Int, + val incorrectGuessPenalty: Int, + val playListId: String, +) { + companion object { + fun fromRoomSettings(settings: RoomSettings): CreateRoomPayload { + return CreateRoomPayload( + maxPlayers = settings.maxPlayers, + turnCount = settings.turnCount, + timePenaltyPerSecond = settings.timePenaltyPerSecond, + basePoints = settings.basePoints, + incorrectGuessPenalty = settings.incorrectGuessPenalty, + playListId = Url(settings.playlistLink).segments.last(), + ) + } + } +} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/responses/CreateRoomResponse.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/responses/CreateRoomResponse.kt new file mode 100644 index 0000000..2f5a0b2 --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/network/api/responses/CreateRoomResponse.kt @@ -0,0 +1,5 @@ +package com.github.feelbeatapp.androidclient.network.api.responses + +import kotlinx.serialization.Serializable + +@Serializable data class CreateRoomResponse(val roomId: String) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatApp.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatApp.kt index fdbc65f..1f27ebb 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatApp.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatApp.kt @@ -1,30 +1,23 @@ package com.github.feelbeatapp.androidclient.ui import androidx.compose.foundation.layout.Box -import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import com.github.feelbeatapp.androidclient.ui.acceptgame.AcceptGameScreen import com.github.feelbeatapp.androidclient.ui.gameresult.GameResultScreen import com.github.feelbeatapp.androidclient.ui.guesssong.GuessResultScreen import com.github.feelbeatapp.androidclient.ui.guesssong.GuessSongScreen import com.github.feelbeatapp.androidclient.ui.home.HomeScreen import com.github.feelbeatapp.androidclient.ui.login.LoginScreen -import com.github.feelbeatapp.androidclient.ui.roomsettings.screens.EditRoomSettingsScreen import com.github.feelbeatapp.androidclient.ui.roomsettings.screens.NewRoomSettingsScreen import com.github.feelbeatapp.androidclient.ui.startgame.StartGameScreen import com.github.feelbeatapp.androidclient.ui.theme.FeelBeatTheme @Composable -fun FeelBeatApp( - @Suppress("UnusedParameter") widthSizeClass: WindowWidthSizeClass, - startScreen: FeelBeatRoute, - modifier: Modifier = Modifier, -) { +fun FeelBeatApp(startScreen: FeelBeatRoute, modifier: Modifier = Modifier) { FeelBeatTheme { val navController = rememberNavController() @@ -35,7 +28,10 @@ fun FeelBeatApp( HomeScreen(navController = navController) } composable(route = FeelBeatRoute.NEW_ROOM_SETTINGS.name) { - NewRoomSettingsScreen(navController = navController) + NewRoomSettingsScreen( + onNavigateTo = { navController.navigate(it) }, + onNavigateBack = { navController.popBackStack() }, + ) } composable(route = FeelBeatRoute.GAME_RESULT.name) { GameResultScreen(navController = navController) @@ -57,5 +53,6 @@ fun FeelBeatApp( @Preview @Composable fun AppPreview() { - FeelBeatApp(WindowWidthSizeClass.Compact, FeelBeatRoute.LOGIN) + FeelBeatApp(FeelBeatRoute.LOGIN) + } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatRoute.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatRoute.kt index 8e05b4e..e99ad70 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatRoute.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/FeelBeatRoute.kt @@ -9,5 +9,12 @@ enum class FeelBeatRoute { GAME_RESULT, GUESS_SONG, GUESS_RESULT, - START_GAME, + START_GAME; + + fun withArgs(vararg args: String): String { + return buildString { + append(name) + args.forEach { append("/$it") } + } + } } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/MainActivity.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/MainActivity.kt index 2a2e3fb..d826ab2 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/MainActivity.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/MainActivity.kt @@ -23,8 +23,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { - val widthSizeClass = calculateWindowSizeClass(this).widthSizeClass - FeelBeatApp(widthSizeClass, startRoute) + FeelBeatApp(startRoute) } } } 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 936ed73..e1a5d4f 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,7 +34,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.Song import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute import com.github.feelbeatapp.androidclient.ui.home.HomeRoute import com.github.feelbeatapp.androidclient.ui.startgame.PlayerCard 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 225c8d8..8390c65 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,8 +3,8 @@ 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.model.Player -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.Player +import com.github.feelbeatapp.androidclient.ui.model.Song 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/acceptgame/GameState.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptgame/GameState.kt index fb82eab..d137a92 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptgame/GameState.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/acceptgame/GameState.kt @@ -1,9 +1,9 @@ package com.github.feelbeatapp.androidclient.ui.acceptgame -import com.github.feelbeatapp.androidclient.model.Player -import com.github.feelbeatapp.androidclient.model.Playlist -import com.github.feelbeatapp.androidclient.model.Room -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.Player +import com.github.feelbeatapp.androidclient.ui.model.Playlist +import com.github.feelbeatapp.androidclient.ui.model.Room +import com.github.feelbeatapp.androidclient.ui.model.Song data class GameState( val players: List = emptyList(), 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 d07a699..b51ba68 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.model.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.model.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 6ddb261..e4dcc2f 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,8 +3,8 @@ 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.model.Player -import com.github.feelbeatapp.androidclient.model.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.model.Player +import com.github.feelbeatapp.androidclient.ui.model.PlayerWithResult import com.github.feelbeatapp.androidclient.ui.guesssong.ResultStatus import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow 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 2b4114a..cbdd39f 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,8 +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.model.PlayerWithResult -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.model.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 d704574..20299a3 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,9 +4,9 @@ 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.model.Player -import com.github.feelbeatapp.androidclient.model.PlayerWithResult -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.Player +import com.github.feelbeatapp.androidclient.ui.model.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.model.Song import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guesssong/GuessState.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guesssong/GuessState.kt index ca5dd29..6ae8024 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guesssong/GuessState.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/guesssong/GuessState.kt @@ -1,10 +1,10 @@ package com.github.feelbeatapp.androidclient.ui.guesssong import androidx.compose.ui.text.input.TextFieldValue -import com.github.feelbeatapp.androidclient.model.PlayerWithResult -import com.github.feelbeatapp.androidclient.model.Playlist -import com.github.feelbeatapp.androidclient.model.Room -import com.github.feelbeatapp.androidclient.model.Song +import com.github.feelbeatapp.androidclient.ui.model.PlayerWithResult +import com.github.feelbeatapp.androidclient.ui.model.Playlist +import com.github.feelbeatapp.androidclient.ui.model.Room +import com.github.feelbeatapp.androidclient.ui.model.Song data class GuessState( val players: List = emptyList(), 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 bba6293..54aaa5d 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 @@ -48,7 +48,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import coil3.compose.AsyncImage import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.model.Room +import com.github.feelbeatapp.androidclient.ui.model.Room import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute import com.github.feelbeatapp.androidclient.ui.acceptgame.AcceptGameScreen import com.github.feelbeatapp.androidclient.ui.roomsettings.screens.EditRoomSettingsScreen 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 e884e2c..06d507d 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 @@ -3,8 +3,8 @@ package com.github.feelbeatapp.androidclient.ui.home import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.feelbeatapp.androidclient.auth.AuthManager -import com.github.feelbeatapp.androidclient.model.Room import com.github.feelbeatapp.androidclient.network.spotify.KtorSpotifyAPI +import com.github.feelbeatapp.androidclient.ui.model.Room import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Player.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Player.kt new file mode 100644 index 0000000..ecd117a --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Player.kt @@ -0,0 +1,3 @@ +package com.github.feelbeatapp.androidclient.ui.model + +data class Player(val name: String, val image: Int) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/PlayerWithResult.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/PlayerWithResult.kt similarity index 75% rename from app/src/main/java/com/github/feelbeatapp/androidclient/model/PlayerWithResult.kt rename to app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/PlayerWithResult.kt index c02418f..4c88e59 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/PlayerWithResult.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/PlayerWithResult.kt @@ -1,4 +1,4 @@ -package com.github.feelbeatapp.androidclient.model +package com.github.feelbeatapp.androidclient.ui.model import com.github.feelbeatapp.androidclient.ui.guesssong.ResultStatus diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Playlist.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Playlist.kt similarity index 53% rename from app/src/main/java/com/github/feelbeatapp/androidclient/model/Playlist.kt rename to app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Playlist.kt index ec96058..9be3eac 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Playlist.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Playlist.kt @@ -1,3 +1,3 @@ -package com.github.feelbeatapp.androidclient.model +package com.github.feelbeatapp.androidclient.ui.model data class Playlist(val name: String, val songs: List) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Room.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Room.kt similarity index 75% rename from app/src/main/java/com/github/feelbeatapp/androidclient/model/Room.kt rename to app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Room.kt index 3937326..079f7cf 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/model/Room.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Room.kt @@ -1,4 +1,4 @@ -package com.github.feelbeatapp.androidclient.model +package com.github.feelbeatapp.androidclient.ui.model data class Room( val id: Int, diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/RoomSettings.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/RoomSettings.kt new file mode 100644 index 0000000..85f36f5 --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/RoomSettings.kt @@ -0,0 +1,10 @@ +package com.github.feelbeatapp.androidclient.ui.model + +data class RoomSettings( + val maxPlayers: Int, + val turnCount: Int, + val timePenaltyPerSecond: Int, + val basePoints: Int, + val incorrectGuessPenalty: Int, + val playlistLink: String, +) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Song.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Song.kt new file mode 100644 index 0000000..189cf0d --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/model/Song.kt @@ -0,0 +1,3 @@ +package com.github.feelbeatapp.androidclient.ui.model + +data class Song(val id: Int, val title: String) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingSliders.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingSliders.kt deleted file mode 100644 index 51228af..0000000 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingSliders.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.feelbeatapp.androidclient.ui.roomsettings.components - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource -import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels.RoomSettingsViewModel - -@Composable -fun SettingSliders(viewModel: RoomSettingsViewModel) { - val roomSettings by viewModel.roomSettings.collectAsState() - - SettingSlider( - label = stringResource(R.string.number_of_players), - value = roomSettings.maxPlayers, - onValueChange = { viewModel.setMaxPlayers(it.toInt()) }, - valueRange = 1..5, - steps = 4, - ) - - SettingSlider( - label = stringResource(R.string.snippet_duration), - value = roomSettings.snippetDuration, - onValueChange = { viewModel.setSnippetDuration(it.toInt()) }, - valueRange = 5..30, - steps = 5, - ) - - SettingSlider( - label = stringResource(R.string.points_to_win), - value = roomSettings.pointsToWin, - onValueChange = { viewModel.setPointsToWin(it.toInt()) }, - valueRange = 3..10, - steps = 6, - ) -} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingsControls.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingsControls.kt new file mode 100644 index 0000000..afe23fa --- /dev/null +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/components/SettingsControls.kt @@ -0,0 +1,81 @@ +package com.github.feelbeatapp.androidclient.ui.roomsettings.components + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import com.github.feelbeatapp.androidclient.R +import com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels.RoomSettingsViewModel + +@Composable +fun SettingsControls(viewModel: RoomSettingsViewModel) { + val roomSettings by viewModel.roomSettings.collectAsState() + + SettingSlider( + label = stringResource(R.string.number_of_players), + value = roomSettings.maxPlayers, + onValueChange = { viewModel.setMaxPlayers(it) }, + valueRange = 1..5, + steps = 4, + ) + + SettingSlider( + label = stringResource(R.string.turn_count), + value = roomSettings.turnCount, + onValueChange = { viewModel.setTurnCount(it) }, + valueRange = 1..10, + steps = 9, + ) + + SettingSlider( + label = stringResource(R.string.time_penalty_per_second), + value = roomSettings.timePenaltyPerSecond, + onValueChange = { viewModel.setTimePenaltyPerSecond(it) }, + valueRange = 1..20, + steps = 19, + ) + + SettingSlider( + label = stringResource(R.string.base_points), + value = roomSettings.basePoints, + onValueChange = { viewModel.setBasePoints(it) }, + valueRange = 100..1000, + steps = 9, + ) + + SettingSlider( + label = stringResource(R.string.incorrectGuessPenalty), + value = roomSettings.incorrectGuessPenalty, + onValueChange = { viewModel.setIncorrectGuessPenalty(it) }, + valueRange = 50..500, + steps = 9, + ) + + Text( + text = stringResource(R.string.playlist_link), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(top = 8.dp), + ) + + TextField( + value = roomSettings.playlistLink, + keyboardOptions = + KeyboardOptions.Default.copy( + keyboardType = KeyboardType.Uri, + imeAction = ImeAction.Done, + ), + onValueChange = { viewModel.setPlaylistLink(it) }, + modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp), + label = { Text(stringResource(R.string.enter_playlist_link)) }, + ) +} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/EditRoomSettingsScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/EditRoomSettingsScreen.kt index 31373ca..eecbb41 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/EditRoomSettingsScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/EditRoomSettingsScreen.kt @@ -3,8 +3,6 @@ package com.github.feelbeatapp.androidclient.ui.roomsettings.screens import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Home @@ -15,9 +13,7 @@ import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -27,7 +23,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.roomsettings.components.SettingSliders +import com.github.feelbeatapp.androidclient.ui.roomsettings.components.SettingsControls import com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels.EditRoomSettingsViewModel import com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels.RoomSettingsViewModel @@ -38,8 +34,6 @@ fun EditRoomSettingsScreen( modifier: Modifier = Modifier, isRoomCreator: Boolean = true, ) { - val roomSettings by viewModel.roomSettings.collectAsState() - Scaffold( bottomBar = { if (isRoomCreator) { @@ -51,20 +45,7 @@ fun EditRoomSettingsScreen( modifier = modifier.fillMaxSize().padding(padding).padding(16.dp), verticalArrangement = Arrangement.spacedBy(24.dp), ) { - SettingSliders(viewModel) - - Text( - text = stringResource(R.string.playlist_link), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(top = 8.dp), - ) - - TextField( - value = roomSettings.playlistLink, - onValueChange = { viewModel.setPlaylistLink(it) }, - modifier = Modifier.fillMaxWidth().height(56.dp).padding(bottom = 16.dp), - label = { Text(stringResource(R.string.enter_playlist_link)) }, - ) + SettingsControls(viewModel) } }, ) diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/NewRoomSettingsScreen.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/NewRoomSettingsScreen.kt index 7c68537..4e4a8ad 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/NewRoomSettingsScreen.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/screens/NewRoomSettingsScreen.kt @@ -2,20 +2,22 @@ package com.github.feelbeatapp.androidclient.ui.roomsettings.screens import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -24,27 +26,34 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController +import androidx.hilt.navigation.compose.hiltViewModel import com.github.feelbeatapp.androidclient.R -import com.github.feelbeatapp.androidclient.ui.roomsettings.components.SettingSliders +import com.github.feelbeatapp.androidclient.ui.FeelBeatRoute +import com.github.feelbeatapp.androidclient.ui.roomsettings.components.SettingsControls import com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels.NewRoomSettingsViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable fun NewRoomSettingsScreen( - viewModel: NewRoomSettingsViewModel = NewRoomSettingsViewModel(), - navController: NavController, + viewModel: NewRoomSettingsViewModel = hiltViewModel(), + onNavigateTo: (String) -> Unit, + onNavigateBack: () -> Unit, modifier: Modifier = Modifier, ) { - val roomSettings by viewModel.roomSettings.collectAsState() + val roomCreationState by viewModel.roomCreationState.collectAsState() + val createdRoomId by viewModel.roomCreated.collectAsState(null) + + val roomId = createdRoomId + if (roomId != null) { + onNavigateTo(FeelBeatRoute.ACCEPT_GAME.withArgs(roomId)) + } Scaffold( topBar = { TopAppBar( title = { Text(stringResource(R.string.new_room)) }, navigationIcon = { - IconButton(onClick = { navController.popBackStack() }) { + IconButton(onClick = onNavigateBack) { Icon( Icons.AutoMirrored.Filled.KeyboardArrowLeft, contentDescription = stringResource(R.string.back), @@ -58,26 +67,29 @@ fun NewRoomSettingsScreen( modifier = modifier.fillMaxSize().padding(padding).padding(16.dp), verticalArrangement = Arrangement.spacedBy(24.dp), ) { - SettingSliders(viewModel = viewModel) - - Text( - text = stringResource(R.string.playlist_link), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(top = 8.dp), - ) + SettingsControls(viewModel = viewModel) - TextField( - value = roomSettings.playlistLink, - onValueChange = { viewModel.setPlaylistLink(it) }, - modifier = Modifier.fillMaxWidth().height(56.dp).padding(bottom = 16.dp), - label = { Text(stringResource(R.string.enter_playlist_link)) }, - ) + Text(roomCreationState.errorMessage ?: "") - Button( - onClick = { navController.popBackStack() }, - modifier = Modifier.fillMaxWidth().height(56.dp), - ) { - Text(stringResource(R.string.create_room)) + if (roomCreationState.loading) { + Row( + horizontalArrangement = Arrangement.Center, + modifier = Modifier.fillMaxWidth(), + ) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + strokeWidth = 4.dp, + modifier = Modifier.width(50.dp).height(50.dp), + ) + } + } else if (createdRoomId == null) { + Button( + onClick = { viewModel.createRoom() }, + modifier = Modifier.fillMaxWidth().height(56.dp), + ) { + Text(stringResource(R.string.create_room)) + } } } }, @@ -87,6 +99,5 @@ fun NewRoomSettingsScreen( @Preview(showBackground = true, widthDp = 360, heightDp = 640) @Composable fun PreviewSettingsScreen() { - val navController = rememberNavController() - NewRoomSettingsScreen(navController = navController) + NewRoomSettingsScreen(onNavigateTo = {}, onNavigateBack = {}) } diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/NewRoomSettingsViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/NewRoomSettingsViewModel.kt index 2fa012e..aeff2f3 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/NewRoomSettingsViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/NewRoomSettingsViewModel.kt @@ -1,3 +1,38 @@ package com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels -class NewRoomSettingsViewModel : RoomSettingsViewModel() +import androidx.lifecycle.viewModelScope +import com.github.feelbeatapp.androidclient.network.api.FeelBeatApi +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +data class RoomCreationState(val errorMessage: String?, val loading: Boolean = false) + +@HiltViewModel +class NewRoomSettingsViewModel @Inject constructor(private val feelBeatApi: FeelBeatApi) : + RoomSettingsViewModel() { + private val _roomCreationState = MutableStateFlow(RoomCreationState(null)) + val roomCreationState = _roomCreationState.asStateFlow() + + private val _roomCreated = MutableSharedFlow() + val roomCreated = _roomCreated.asSharedFlow() + + fun createRoom() { + viewModelScope.launch(Dispatchers.IO) { + _roomCreationState.update { it.copy(loading = true) } + try { + val roomId = feelBeatApi.createRoom(roomSettings.value) + _roomCreated.emit(roomId) + _roomCreationState.update { it.copy(loading = false) } + } catch (e: Throwable) { + _roomCreationState.update { it.copy(errorMessage = e.message, loading = false) } + } + } + } +} diff --git a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/RoomSettingsViewModel.kt b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/RoomSettingsViewModel.kt index b82e3dc..ae662dc 100644 --- a/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/RoomSettingsViewModel.kt +++ b/app/src/main/java/com/github/feelbeatapp/androidclient/ui/roomsettings/viewmodels/RoomSettingsViewModel.kt @@ -1,15 +1,23 @@ package com.github.feelbeatapp.androidclient.ui.roomsettings.viewmodels import androidx.lifecycle.ViewModel -import com.github.feelbeatapp.androidclient.model.RoomSettings +import com.github.feelbeatapp.androidclient.ui.model.RoomSettings +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update -open class RoomSettingsViewModel : ViewModel() { +abstract class RoomSettingsViewModel : ViewModel() { private val _roomSettings = MutableStateFlow( - RoomSettings(maxPlayers = 0, snippetDuration = 0, pointsToWin = 0, playlistLink = "") + RoomSettings( + maxPlayers = 0, + turnCount = 5, + timePenaltyPerSecond = 5, + basePoints = 100, + incorrectGuessPenalty = 20, + playlistLink = "", + ) ) val roomSettings = _roomSettings.asStateFlow() @@ -17,12 +25,20 @@ open class RoomSettingsViewModel : ViewModel() { _roomSettings.update { it.copy(maxPlayers = value) } } - fun setSnippetDuration(value: Int) { - _roomSettings.update { it.copy(snippetDuration = value) } + fun setTurnCount(value: Int) { + _roomSettings.update { it.copy(turnCount = value) } } - fun setPointsToWin(value: Int) { - _roomSettings.update { it.copy(pointsToWin = value) } + fun setTimePenaltyPerSecond(value: Int) { + _roomSettings.update { it.copy(timePenaltyPerSecond = value) } + } + + fun setBasePoints(value: Int) { + _roomSettings.update { it.copy(basePoints = value) } + } + + fun setIncorrectGuessPenalty(value: Int) { + _roomSettings.update { it.copy(incorrectGuessPenalty = value) } } fun setPlaylistLink(value: String) { 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 8a5821d..af1fc11 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,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.model.Player +import com.github.feelbeatapp.androidclient.ui.model.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 e2cef20..ad34c4a 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,7 +3,7 @@ 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.model.Player +import com.github.feelbeatapp.androidclient.ui.model.Player import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..036d09b 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..036d09b 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a4a4b5c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..ed87cee Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..542e984 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-ldpi/ic_launcher.png b/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 0000000..b78106e Binary files /dev/null and b/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..143805a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d6..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..1f0bbef Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..7a9e872 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611d..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..1aeed68 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a307..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c99e13c Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..555f135 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a695..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0e8950 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7bb4ce1 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3ee47f3 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f50..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..aa72d99 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d642..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..b557517 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..7be3a23 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae3..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..dd40e30 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #222222 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f4bda9..83e7531 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,9 +14,9 @@ Points to Win: %1$d Playlist: %1$s New room - Number of players - Snippet Duration - Points to Win + Max number of players + How many turns + How many points per second you loose Playlist link Enter playlist link Create room @@ -32,4 +32,6 @@ Ups, that\'s not correct answer time left Authorization server is unreachable + With how many points you starting to guess + How many points you will loose after incorrect guess \ No newline at end of file