diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionScreen.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionScreen.kt index a4f0796ea..ba39b8f16 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionScreen.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionScreen.kt @@ -54,6 +54,7 @@ import com.simplecityapps.shuttle.model.MediaProviderType import com.simplecityapps.shuttle.ui.screens.onboarding.OnboardingChild import com.simplecityapps.shuttle.ui.screens.onboarding.OnboardingPage import com.simplecityapps.shuttle.ui.screens.onboarding.OnboardingParent +import com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialog import com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.plex.PlexConfigurationDialog import com.simplecityapps.shuttle.ui.snapshot.Snapshot import com.simplecityapps.shuttle.ui.theme.AppTheme @@ -94,7 +95,7 @@ class MediaProviderSelectionScreenFragment : @Composable private fun MediaProviderSelectionScreen( modifier: Modifier = Modifier, - viewModel: MediaProviderViewModel = hiltViewModel() + viewModel: MediaProviderSelectionViewModel = hiltViewModel() ) { val mediaProviders by viewModel.mediaProviders.collectAsStateWithLifecycle() val unAddedMediaProviders by viewModel.unAddedMediaProviders.collectAsStateWithLifecycle() @@ -106,7 +107,7 @@ private fun MediaProviderSelectionScreen( when (configureMediaProvider!!) { MediaProviderType.Shuttle -> TODO() MediaProviderType.MediaStore -> TODO() - MediaProviderType.Emby -> TODO() + MediaProviderType.Emby -> EmbyConfigurationDialog(onDismissRequest = viewModel::onConsumeConfigureMediaProvider) MediaProviderType.Jellyfin -> TODO() MediaProviderType.Plex -> PlexConfigurationDialog(onDismissRequest = viewModel::onConsumeConfigureMediaProvider) } diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderViewModel.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionViewModel.kt similarity index 98% rename from android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderViewModel.kt rename to android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionViewModel.kt index 68846f150..7b914ac9b 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderViewModel.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/MediaProviderSelectionViewModel.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update @HiltViewModel -class MediaProviderViewModel @Inject constructor( +class MediaProviderSelectionViewModel @Inject constructor( playbackPreferenceManager: PlaybackPreferenceManager, private val mediaImporter: MediaImporter, private val plexMediaProvider: PlexMediaProvider, @@ -87,11 +87,11 @@ class MediaProviderViewModel @Inject constructor( fun onConfigureProviderClick(provider: MediaProviderType) { _configureMediaProvider.update { provider } - _showProviderOverflowMenu.update { null } } fun onConsumeConfigureMediaProvider() { _configureMediaProvider.update { null } + _showProviderOverflowMenu.update { null } } private fun MediaProviderType.toMediaProvider(): MediaProvider = when (this) { diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyAuthenticationState.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyAuthenticationState.kt new file mode 100644 index 000000000..8da1b639a --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyAuthenticationState.kt @@ -0,0 +1,7 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby + +sealed interface EmbyAuthenticationState { + data object Loading : EmbyAuthenticationState + data object Success : EmbyAuthenticationState + data class Error(val error: Throwable?) : EmbyAuthenticationState +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationDialog.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationDialog.kt new file mode 100644 index 000000000..58b59c4e1 --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationDialog.kt @@ -0,0 +1,388 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.simplecityapps.provider.emby.http.LoginCredentials +import com.simplecityapps.shuttle.R +import com.simplecityapps.shuttle.ui.snapshot.Snapshot +import com.simplecityapps.shuttle.ui.theme.ColorSchemePreviewParameterProvider + +@Composable +fun EmbyConfigurationDialog( + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + viewModel: EmbyConfigurationViewModel = hiltViewModel() +) { + val viewState by viewModel.viewState.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + viewModel.onInitializeConfiguration() + } + EmbyConfigurationDialog( + modifier = modifier, + viewState = viewState, + onDismissRequest = onDismissRequest, + onAddressChange = viewModel::onAddressChange, + onUsernameChange = viewModel::onUsernameChange, + onPasswordChange = viewModel::onPasswordChange, + onRememberPasswordChange = viewModel::onRememberPasswordChange, + onAuthenticateClick = { + viewModel.onAuthenticateClick( + address = viewState.address, + rememberPassword = viewState.rememberPassword, + loginCredentials = viewState.loginCredentials + ) + } + ) +} + +@Composable +private fun EmbyConfigurationDialog( + viewState: EmbyConfigurationViewState, + onDismissRequest: () -> Unit, + onAuthenticateClick: () -> Unit, + onAddressChange: (String) -> Unit, + onUsernameChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onRememberPasswordChange: (Boolean) -> Unit, + modifier: Modifier = Modifier +) { + AlertDialog( + modifier = modifier, + onDismissRequest = onDismissRequest, + title = { + Text(text = stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_title_long_emby)) + }, + text = { + AnimatedContent( + targetState = viewState.authenticationState, + transitionSpec = { EnterTransition.None togetherWith ExitTransition.None } + ) { state -> + when (state) { + EmbyAuthenticationState.Success -> { + LaunchedEffect(Unit) { + onDismissRequest() + } + } + + EmbyAuthenticationState.Loading -> EmbyAuthenticationLoading() + is EmbyAuthenticationState.Error -> EmbyAuthenticationError(state = state) + null -> EmbyAuthenticationInputForm( + address = viewState.address, + rememberPassword = viewState.rememberPassword, + loginCredentials = viewState.loginCredentials, + onAddressChange = onAddressChange, + onUsernameChange = onUsernameChange, + onPasswordChange = onPasswordChange, + onRememberPasswordChange = onRememberPasswordChange + ) + } + } + }, + dismissButton = { + AnimatedVisibility(visible = viewState.authenticationState != EmbyAuthenticationState.Loading) { + TextButton(onClick = onDismissRequest) { + Text(text = stringResource(R.string.dialog_button_close)) + } + } + }, + confirmButton = { + AnimatedVisibility(visible = viewState.authenticationState != EmbyAuthenticationState.Loading) { + TextButton( + onClick = onAuthenticateClick, + enabled = viewState.canAuthenticate + ) { + Text(text = stringResource(R.string.media_provider_button_authenticate)) + } + } + } + ) +} + +@Composable +private fun EmbyAuthenticationInputForm( + address: String, + rememberPassword: Boolean, + loginCredentials: LoginCredentials, + onAddressChange: (String) -> Unit, + onUsernameChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onRememberPasswordChange: (Boolean) -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + AddressInputField( + address = address, + onAddressChange = onAddressChange + ) + UsernameInputField( + username = loginCredentials.username, + onUsernameChange = onUsernameChange + ) + PasswordInputField( + password = loginCredentials.password, + onPasswordChange = onPasswordChange + ) + RememberPasswordSwitch( + rememberPassword = rememberPassword, + onRememberPasswordChange = onRememberPasswordChange + ) + } +} + +@Composable +private fun EmbyAuthenticationLoading() { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + CircularProgressIndicator() + Text(text = stringResource(R.string.media_provider_authenticating)) + } +} + +@Composable +private fun EmbyAuthenticationError( + state: EmbyAuthenticationState.Error, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text( + text = "Connection failed", + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.headlineSmall + ) + Text( + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodyLarge, + text = "Unable to authenticate with your Emby server." + ) + } + Column( + modifier = Modifier + .fillMaxWidth() + .heightIn(min = 96.dp) + .background( + shape = RoundedCornerShape(8.dp), + color = MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.3f) + ) + .border( + width = 1.dp, + shape = RoundedCornerShape(8.dp), + color = MaterialTheme.colorScheme.error + ) + .padding(16.dp), + verticalArrangement = Arrangement.Center + ) { + Text( + text = "Error: ${state.error}", + color = MaterialTheme.colorScheme.tertiaryFixedDim + ) + } + } +} + +@Composable +private fun RememberPasswordSwitch( + rememberPassword: Boolean, + onRememberPasswordChange: (Boolean) -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .fillMaxWidth() + .wrapContentWidth(Alignment.End), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Text( + color = MaterialTheme.colorScheme.tertiary, + style = MaterialTheme.typography.bodySmall, + text = stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_config_switch_remember_password) + ) + Switch( + checked = rememberPassword, + onCheckedChange = onRememberPasswordChange + ) + } +} + +@Composable +private fun PasswordInputField( + password: String?, + onPasswordChange: (String) -> Unit, + modifier: Modifier = Modifier +) { + var showPassword by remember { mutableStateOf(false) } + OutlinedTextField( + singleLine = true, + modifier = modifier, + value = password ?: "", + onValueChange = onPasswordChange, + visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), + label = { Text(stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_config_hint_password)) }, + trailingIcon = { + IconButton(onClick = { showPassword = !showPassword }) { + Icon( + contentDescription = null, + imageVector = if (showPassword) Icons.Default.VisibilityOff else Icons.Default.Visibility + ) + } + } + ) +} + +@Composable +private fun UsernameInputField( + username: String?, + onUsernameChange: (String) -> Unit, + modifier: Modifier = Modifier +) { + OutlinedTextField( + singleLine = true, + modifier = modifier, + value = username ?: "", + onValueChange = onUsernameChange, + label = { Text(stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_config_hint_username)) } + ) +} + +@Composable +private fun AddressInputField( + address: String, + onAddressChange: (String) -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + OutlinedTextField( + value = address, + singleLine = true, + onValueChange = onAddressChange, + placeholder = { Text(text = "http://") }, + label = { Text(stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_config_hint_address)) } + ) + Text( + color = MaterialTheme.colorScheme.tertiary, + style = MaterialTheme.typography.labelSmall, + text = "e.g. http://my.server.com:8080" + ) + } +} + +@Snapshot +@Preview +@Composable +private fun Loading(@PreviewParameter(ColorSchemePreviewParameterProvider::class) colorScheme: ColorScheme) { + MaterialTheme(colorScheme = colorScheme) { + EmbyConfigurationDialog( + onDismissRequest = {}, + viewState = EmbyConfigurationViewState.Empty.copy( + authenticationState = EmbyAuthenticationState.Loading + ), + onAddressChange = {}, + onUsernameChange = {}, + onPasswordChange = {}, + onAuthenticateClick = {}, + onRememberPasswordChange = {} + ) + } +} + +@Snapshot +@Preview +@Composable +private fun Success(@PreviewParameter(ColorSchemePreviewParameterProvider::class) colorScheme: ColorScheme) { + MaterialTheme(colorScheme = colorScheme) { + EmbyConfigurationDialog( + onDismissRequest = {}, + viewState = EmbyConfigurationViewState( + address = "http://", + loginCredentials = LoginCredentials( + username = "shuttle", + password = "musicplayer" + ), + canAuthenticate = true, + rememberPassword = false, + authenticationState = null + ), + onAddressChange = {}, + onUsernameChange = {}, + onPasswordChange = {}, + onAuthenticateClick = {}, + onRememberPasswordChange = {} + ) + } +} + +@Snapshot +@Preview +@Composable +private fun Error(@PreviewParameter(ColorSchemePreviewParameterProvider::class) colorScheme: ColorScheme) { + MaterialTheme(colorScheme = colorScheme) { + EmbyConfigurationDialog( + onDismissRequest = {}, + viewState = EmbyConfigurationViewState.Empty.copy( + authenticationState = EmbyAuthenticationState.Error( + error = RuntimeException("Unable to connect to server") + ) + ), + onAddressChange = {}, + onUsernameChange = {}, + onPasswordChange = {}, + onAuthenticateClick = {}, + onRememberPasswordChange = {} + ) + } +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewModel.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewModel.kt new file mode 100644 index 000000000..f7ee09d7e --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewModel.kt @@ -0,0 +1,102 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.simplecityapps.provider.emby.EmbyAuthenticationManager +import com.simplecityapps.provider.emby.http.LoginCredentials +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +@HiltViewModel +class EmbyConfigurationViewModel @Inject constructor( + private val embyAuthenticationManager: EmbyAuthenticationManager +) : ViewModel() { + + private val _viewState = MutableStateFlow(EmbyConfigurationViewState.Empty) + val viewState = _viewState.map { state -> + EmbyConfigurationViewState( + address = state.address, + loginCredentials = state.loginCredentials, + rememberPassword = state.rememberPassword, + authenticationState = state.authenticationState, + canAuthenticate = state.address.isNotBlank() && + state.loginCredentials.username.isNotBlank() && + state.loginCredentials.password.isNotBlank() + ) + }.stateIn( + scope = viewModelScope, + initialValue = _viewState.value, + started = SharingStarted.WhileSubscribed() + ) + + fun onInitializeConfiguration() { + _viewState.update { + EmbyConfigurationViewState.Empty.copy( + address = embyAuthenticationManager.getAddress() ?: "", + rememberPassword = embyAuthenticationManager.getLoginCredentials() != null, + loginCredentials = embyAuthenticationManager.getLoginCredentials() ?: LoginCredentials.Empty + ) + } + } + + fun onAddressChange(address: String) { + _viewState.update { state -> + state.copy(address = address) + } + } + + fun onUsernameChange(username: String) { + _viewState.update { state -> + state.copy(loginCredentials = state.loginCredentials.copy(username = username)) + } + } + + fun onPasswordChange(password: String) { + _viewState.update { state -> + state.copy(loginCredentials = state.loginCredentials.copy(password = password)) + } + } + + fun onRememberPasswordChange(remember: Boolean) { + if (!remember) { + embyAuthenticationManager.setLoginCredentials(null) + } + _viewState.update { state -> + state.copy(rememberPassword = remember) + } + } + + fun onAuthenticateClick( + address: String, + rememberPassword: Boolean, + loginCredentials: LoginCredentials + ) { + viewModelScope.launch { + _viewState.update { state -> + state.copy(authenticationState = EmbyAuthenticationState.Loading) + } + embyAuthenticationManager.authenticate( + address = address, + loginCredentials = loginCredentials + ).onSuccess { + embyAuthenticationManager.setAddress(address) + if (rememberPassword) { + embyAuthenticationManager.setLoginCredentials(loginCredentials) + } + _viewState.update { state -> + state.copy(authenticationState = EmbyAuthenticationState.Success) + } + }.onFailure { error -> + _viewState.update { state -> + state.copy(authenticationState = EmbyAuthenticationState.Error(error)) + } + } + } + } +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewState.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewState.kt new file mode 100644 index 000000000..8710c5784 --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/emby/EmbyConfigurationViewState.kt @@ -0,0 +1,21 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby + +import com.simplecityapps.provider.emby.http.LoginCredentials + +data class EmbyConfigurationViewState( + val address: String, + val canAuthenticate: Boolean, + val rememberPassword: Boolean, + val loginCredentials: LoginCredentials, + val authenticationState: EmbyAuthenticationState? +) { + companion object { + val Empty = EmbyConfigurationViewState( + address = "", + canAuthenticate = false, + rememberPassword = false, + authenticationState = null, + loginCredentials = LoginCredentials.Empty + ) + } +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationDialog.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationDialog.kt index 5e31b6d7a..fd3ecef7a 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationDialog.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationDialog.kt @@ -2,6 +2,9 @@ package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.plex import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.togetherWith import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -27,7 +30,6 @@ import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -44,7 +46,6 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner import com.simplecityapps.provider.plex.http.LoginCredentials import com.simplecityapps.shuttle.R import com.simplecityapps.shuttle.ui.snapshot.Snapshot @@ -56,13 +57,10 @@ fun PlexConfigurationDialog( modifier: Modifier = Modifier, viewModel: PlexConfigurationViewModel = hiltViewModel() ) { - val owner = LocalViewModelStoreOwner.current - DisposableEffect(Unit) { - onDispose { - owner?.viewModelStore?.clear() - } - } val viewState by viewModel.viewState.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + viewModel.onInitializeConfiguration() + } PlexConfigurationDialog( modifier = modifier, viewState = viewState, @@ -72,7 +70,6 @@ fun PlexConfigurationDialog( onPasswordChange = viewModel::onPasswordChange, onAuthCodeChange = viewModel::onAuthCodeChange, onRememberPasswordChange = viewModel::onRememberPasswordChange, - onAuthenticationSuccess = viewModel::onConsumeAuthenticationSuccess, onAuthenticateClick = { viewModel.onAuthenticateClick( address = viewState.address, @@ -92,7 +89,6 @@ private fun PlexConfigurationDialog( onAuthCodeChange: (String) -> Unit, onUsernameChange: (String) -> Unit, onPasswordChange: (String) -> Unit, - onAuthenticationSuccess: () -> Unit, onRememberPasswordChange: (Boolean) -> Unit, modifier: Modifier = Modifier ) { @@ -103,12 +99,14 @@ private fun PlexConfigurationDialog( Text(text = stringResource(com.simplecityapps.mediaprovider.R.string.media_provider_title_long_plex)) }, text = { - AnimatedContent(targetState = viewState.authenticationState) { state -> + AnimatedContent( + targetState = viewState.authenticationState, + transitionSpec = { EnterTransition.None togetherWith ExitTransition.None } + ) { state -> when (state) { PlexAuthenticationState.Success -> { LaunchedEffect(Unit) { onDismissRequest() - onAuthenticationSuccess() } } @@ -375,7 +373,6 @@ private fun Loading(@PreviewParameter(ColorSchemePreviewParameterProvider::class onPasswordChange = {}, onAuthCodeChange = {}, onAuthenticateClick = {}, - onAuthenticationSuccess = {}, onRememberPasswordChange = {} ) } @@ -404,7 +401,6 @@ private fun Success(@PreviewParameter(ColorSchemePreviewParameterProvider::class onPasswordChange = {}, onAuthCodeChange = {}, onAuthenticateClick = {}, - onAuthenticationSuccess = {}, onRememberPasswordChange = {} ) } @@ -427,7 +423,6 @@ private fun Error(@PreviewParameter(ColorSchemePreviewParameterProvider::class) onPasswordChange = {}, onAuthCodeChange = {}, onAuthenticateClick = {}, - onAuthenticationSuccess = {}, onRememberPasswordChange = {} ) } diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationViewModel.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationViewModel.kt index ce64378db..df41b6893 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationViewModel.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/plex/PlexConfigurationViewModel.kt @@ -18,13 +18,7 @@ class PlexConfigurationViewModel @Inject constructor( private val plexAuthenticationManager: PlexAuthenticationManager ) : ViewModel() { - private val _viewState = MutableStateFlow( - PlexConfigurationViewState.Empty.copy( - address = plexAuthenticationManager.getAddress() ?: "", - rememberPassword = plexAuthenticationManager.getLoginCredentials() != null, - loginCredentials = plexAuthenticationManager.getLoginCredentials() ?: LoginCredentials.Empty - ) - ) + private val _viewState = MutableStateFlow(PlexConfigurationViewState.Empty) val viewState = _viewState.map { state -> PlexConfigurationViewState( address = state.address, @@ -37,14 +31,20 @@ class PlexConfigurationViewModel @Inject constructor( ) }.stateIn( scope = viewModelScope, - started = SharingStarted.WhileSubscribed(), - initialValue = PlexConfigurationViewState.Empty.copy( - address = plexAuthenticationManager.getAddress() ?: "", - rememberPassword = plexAuthenticationManager.getLoginCredentials() != null, - loginCredentials = plexAuthenticationManager.getLoginCredentials() ?: LoginCredentials.Empty - ) + initialValue = _viewState.value, + started = SharingStarted.WhileSubscribed() ) + fun onInitializeConfiguration() { + _viewState.update { + PlexConfigurationViewState.Empty.copy( + address = plexAuthenticationManager.getAddress() ?: "", + rememberPassword = plexAuthenticationManager.getLoginCredentials() != null, + loginCredentials = plexAuthenticationManager.getLoginCredentials() ?: LoginCredentials.Empty + ) + } + } + fun onAddressChange(address: String) { _viewState.update { state -> state.copy(address = address) @@ -105,10 +105,4 @@ class PlexConfigurationViewModel @Inject constructor( } } } - - fun onConsumeAuthenticationSuccess() { - _viewState.update { state -> - state.copy(authenticationState = null) - } - } } diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_0].png new file mode 100644 index 000000000..4beeb7068 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7467142b523478efe85d0368022bf63d81f0e24256b19270928cd9f79610119 +size 29164 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_10].png new file mode 100644 index 000000000..b35c0c896 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f9270016b4bfb6ccef16e00d8304fcfdc2ba12ca26e3e99f43dc84d82f3d945 +size 29385 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_11].png new file mode 100644 index 000000000..305a52f74 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d60d5da2dd79aa6fa84993d9ca091209dc574cfb8555af410d0a12cb89afd0b +size 28972 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_1].png new file mode 100644 index 000000000..520021310 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a11f6ce4ac9d0ef38a71de55ef4f6ef71c1ea6785b31c28bda91a93cccbf8cb +size 28726 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_2].png new file mode 100644 index 000000000..eca04fffc --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7040d80561791eb97d70d1c0cdbead9ced10b9dfb1b4a55ee959e47f64d4a5fb +size 29201 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_3].png new file mode 100644 index 000000000..30f88d0b2 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e41cc2258ca97f092d2bdcfdb7e206d54517e5df92dd414017a0b294a837eda8 +size 28606 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_4].png new file mode 100644 index 000000000..eec0fe9bc --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b696f38afec4951e9f38e081fd281df2f6e1c9d605294f509784866692c0d0f8 +size 27949 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_5].png new file mode 100644 index 000000000..4831bc026 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75b47083c2fa7ca5ec7faeeeb59ca5c24c926fc37a3956902b3026bcd05a029e +size 28255 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_6].png new file mode 100644 index 000000000..69fb9bae9 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1152307d56932239806a3e5ac0597bbf2ae8aaa75c80ef1e3649331a6b239c69 +size 29291 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_7].png new file mode 100644 index 000000000..cc96b4077 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7a76bd647ef8c42a85111a813b1ef15f6558cbe37898b5f3ebe0a97eab6dc1 +size 28853 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_8].png new file mode 100644 index 000000000..12b06f8ca --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79dfe233c6aa621bb38cf1cacf898414bdf8c98644e6c02070d64a5e5dc6f867 +size 29059 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_9].png new file mode 100644 index 000000000..fc98d05cb --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Error_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd3861f3063c378d11505ba9a2720fabd3d96fe3567a5e831cf596f4e05c9e0c +size 28309 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_0].png new file mode 100644 index 000000000..26025655b --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acfd9fb6b02823d506e9212d9f20e47f5efd7a2b68e8cc229fce21b911749499 +size 11861 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_10].png new file mode 100644 index 000000000..59f296d38 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd15d48a96b7e73cfb24eba5818e517a583710d817cb3e6f0b97a7a0358471ef +size 11998 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_11].png new file mode 100644 index 000000000..28628faf6 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e92ca639f3f2007a80dcdc91ce4b1a22bdbec156b34ff64a847b72ba046104e3 +size 11711 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_1].png new file mode 100644 index 000000000..92190f847 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06fb8553c5939ebaca4fe45610e854e5e0b28f9c7e5838c41059189e6fdfcc92 +size 11602 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_2].png new file mode 100644 index 000000000..128357b54 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83029f9d0a868ee8e475a2ae10e33722ccf9b8207b9ee4c076cb92b3c8b0a478 +size 11952 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_3].png new file mode 100644 index 000000000..69c97dded --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e3f91a246d70e9c184c29d7d0e90016516780a5ec1b47bade3076a734627267 +size 11493 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_4].png new file mode 100644 index 000000000..6a87f8c6e --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b63fbc50d474949eaad16c3361330e1d5eb28516ed3422edc6a1af3fc840d1b0 +size 11535 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_5].png new file mode 100644 index 000000000..a10d86c34 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d35e6768bc9d243a11a1859f82ed4fcd41a91f622673e05becaf2e649c02a15 +size 11385 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_6].png new file mode 100644 index 000000000..fb11bfbdf --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe63a881f9176f0ea9ac7c28cbad4d604d9a60811f41b034f84738d1bcaa9015 +size 11931 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_7].png new file mode 100644 index 000000000..b75a2199f --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c8ea3b5d8ee83d05db1ebe920841fdc1faa0bd7eedf557f9df6dfc4da4efe0 +size 11642 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_8].png new file mode 100644 index 000000000..48a87171a --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37519d6711d91f3788bebb95e0d3b8b19129e9e12756b29d1ea26115c4b17520 +size 11727 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_9].png new file mode 100644 index 000000000..820e26c15 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Loading_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fe026fb48398397fa654c8927e7e33f1aeedbcf9f5411753f1735a87d4cd171 +size 11447 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_0].png new file mode 100644 index 000000000..b6b04a7a1 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a8d3e76cd742760c98c3d49212460aaeb3e552074e2c46993917579d6bd144c +size 26704 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_10].png new file mode 100644 index 000000000..92fe58885 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dd5c7d0c6b71ee16e843ba19bd2cae0796c8949d783ecdaa67e8e241961eeaa +size 26856 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_11].png new file mode 100644 index 000000000..7d8dfce2e --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0afca35f2ddcfb06702263c60717a7b4d14b99b98d9eeb01304222dbb828d2c +size 26523 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_1].png new file mode 100644 index 000000000..9dbe8a350 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2147ed15eecad778a49337569daff41d93c10d50e3d6cdb0c550f17acc748d27 +size 26676 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_2].png new file mode 100644 index 000000000..318aa29b0 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1a131160fc24a76dbbbe72ac575d0f31518c32512795a49c570b7d3a3ec2bf7 +size 26791 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_3].png new file mode 100644 index 000000000..e144d062c --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80899896bf4e0f77242864afd6c1355df05254d37817f46999d09a6665854fb8 +size 26228 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_4].png new file mode 100644 index 000000000..98b1033d6 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f651f9d8a2cb6d69ff8c91c099a5179eb8c08f3f6c8974d7c6f4ac45247ec7b3 +size 26204 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_5].png new file mode 100644 index 000000000..377d00ef8 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d01a279aa15691f2fa3d18939f58cfedaadf75a448c4843370a45598ce16b1a +size 26143 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_6].png new file mode 100644 index 000000000..1d837a571 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bcd86d54d09ce35c8444ba7859f84c3cb2cc7369abe860e10b01a4915ac20be +size 26803 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_7].png new file mode 100644 index 000000000..39855dfc8 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8c02a4379a979038e30355fb7e4c6551684b502341b29bda327c36f8ee61aec +size 26522 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_8].png new file mode 100644 index 000000000..b212e2cde --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:997d5b895002d7ac78e708201fcc3f09009e7671b74c6dcf0b491c38773dc357 +size 26654 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_9].png new file mode 100644 index 000000000..7a83eb295 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.emby.EmbyConfigurationDialogKt_Success_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4695b9ea594d3e3107afda98cf9f0b4973445fed7af3958f98a221947e0a06df +size 25934 diff --git a/android/mediaprovider/emby/src/main/java/com/simplecityapps/provider/emby/http/LoginCredentials.kt b/android/mediaprovider/emby/src/main/java/com/simplecityapps/provider/emby/http/LoginCredentials.kt index 75ac6a0c4..e16dda7df 100644 --- a/android/mediaprovider/emby/src/main/java/com/simplecityapps/provider/emby/http/LoginCredentials.kt +++ b/android/mediaprovider/emby/src/main/java/com/simplecityapps/provider/emby/http/LoginCredentials.kt @@ -1,9 +1,16 @@ package com.simplecityapps.provider.emby.http -open class LoginCredentials( +data class LoginCredentials( val username: String, val password: String -) +) { + companion object { + val Empty = LoginCredentials( + username = "", + password = "" + ) + } +} class AuthenticatedCredentials( val accessToken: String,