From f2f662753b9f539b9a993f6d39b623d8fad412b1 Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Sat, 22 Nov 2025 19:33:13 -0600 Subject: [PATCH 1/2] add jellyfin compose dialog --- .../MediaProviderSelectionScreen.kt | 3 +- .../jellyfin/JellyfinAuthenticationState.kt | 7 + .../jellyfin/JellyfinConfigurationDialog.kt | 388 ++++++++++++++++++ .../JellyfinConfigurationViewModel.kt | 102 +++++ .../JellyfinConfigurationViewState.kt | 21 + ...igurationDialogKt_Error_ColorScheme_0].png | 3 + ...gurationDialogKt_Error_ColorScheme_10].png | 3 + ...gurationDialogKt_Error_ColorScheme_11].png | 3 + ...igurationDialogKt_Error_ColorScheme_1].png | 3 + ...igurationDialogKt_Error_ColorScheme_2].png | 3 + ...igurationDialogKt_Error_ColorScheme_3].png | 3 + ...igurationDialogKt_Error_ColorScheme_4].png | 3 + ...igurationDialogKt_Error_ColorScheme_5].png | 3 + ...igurationDialogKt_Error_ColorScheme_6].png | 3 + ...igurationDialogKt_Error_ColorScheme_7].png | 3 + ...igurationDialogKt_Error_ColorScheme_8].png | 3 + ...igurationDialogKt_Error_ColorScheme_9].png | 3 + ...urationDialogKt_Loading_ColorScheme_0].png | 3 + ...rationDialogKt_Loading_ColorScheme_10].png | 3 + ...rationDialogKt_Loading_ColorScheme_11].png | 3 + ...urationDialogKt_Loading_ColorScheme_1].png | 3 + ...urationDialogKt_Loading_ColorScheme_2].png | 3 + ...urationDialogKt_Loading_ColorScheme_3].png | 3 + ...urationDialogKt_Loading_ColorScheme_4].png | 3 + ...urationDialogKt_Loading_ColorScheme_5].png | 3 + ...urationDialogKt_Loading_ColorScheme_6].png | 3 + ...urationDialogKt_Loading_ColorScheme_7].png | 3 + ...urationDialogKt_Loading_ColorScheme_8].png | 3 + ...urationDialogKt_Loading_ColorScheme_9].png | 3 + ...urationDialogKt_Success_ColorScheme_0].png | 3 + ...rationDialogKt_Success_ColorScheme_10].png | 3 + ...rationDialogKt_Success_ColorScheme_11].png | 3 + ...urationDialogKt_Success_ColorScheme_1].png | 3 + ...urationDialogKt_Success_ColorScheme_2].png | 3 + ...urationDialogKt_Success_ColorScheme_3].png | 3 + ...urationDialogKt_Success_ColorScheme_4].png | 3 + ...urationDialogKt_Success_ColorScheme_5].png | 3 + ...urationDialogKt_Success_ColorScheme_6].png | 3 + ...urationDialogKt_Success_ColorScheme_7].png | 3 + ...urationDialogKt_Success_ColorScheme_8].png | 3 + ...urationDialogKt_Success_ColorScheme_9].png | 3 + .../jellyfin/http/LoginCredentials.kt | 11 +- 42 files changed, 636 insertions(+), 4 deletions(-) create mode 100644 android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinAuthenticationState.kt create mode 100644 android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationDialog.kt create mode 100644 android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewModel.kt create mode 100644 android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewState.kt create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_0].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_10].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_11].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_1].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_2].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_3].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_4].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_5].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_6].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_7].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_8].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_9].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_0].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_10].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_11].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_1].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_2].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_3].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_4].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_5].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_6].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_7].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_8].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_9].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_0].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_10].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_11].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_1].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_2].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_3].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_4].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_5].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_6].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_7].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_8].png create mode 100644 android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_9].png 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 ba39b8f16..28194c9e3 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,7 +54,6 @@ 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 @@ -108,7 +107,7 @@ private fun MediaProviderSelectionScreen( MediaProviderType.Shuttle -> TODO() MediaProviderType.MediaStore -> TODO() MediaProviderType.Emby -> EmbyConfigurationDialog(onDismissRequest = viewModel::onConsumeConfigureMediaProvider) - MediaProviderType.Jellyfin -> TODO() + MediaProviderType.Jellyfin -> JellyfinConfigurationDialog(onDismissRequest = viewModel::onConsumeConfigureMediaProvider) MediaProviderType.Plex -> PlexConfigurationDialog(onDismissRequest = viewModel::onConsumeConfigureMediaProvider) } } diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinAuthenticationState.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinAuthenticationState.kt new file mode 100644 index 000000000..aca6f051c --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinAuthenticationState.kt @@ -0,0 +1,7 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin + +sealed interface JellyfinAuthenticationState { + data object Loading : JellyfinAuthenticationState + data object Success : JellyfinAuthenticationState + data class Error(val error: Throwable?) : JellyfinAuthenticationState +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationDialog.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationDialog.kt new file mode 100644 index 000000000..8972842f5 --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationDialog.kt @@ -0,0 +1,388 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin + +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.jellyfin.http.LoginCredentials +import com.simplecityapps.shuttle.R +import com.simplecityapps.shuttle.ui.snapshot.Snapshot +import com.simplecityapps.shuttle.ui.theme.ColorSchemePreviewParameterProvider + +@Composable +fun JellyfinConfigurationDialog( + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + viewModel: JellyfinConfigurationViewModel = hiltViewModel() +) { + val viewState by viewModel.viewState.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + viewModel.onInitializeConfiguration() + } + JellyfinConfigurationDialog( + 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 JellyfinConfigurationDialog( + viewState: JellyfinConfigurationViewState, + 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_jellyfin)) + }, + text = { + AnimatedContent( + targetState = viewState.authenticationState, + transitionSpec = { EnterTransition.None togetherWith ExitTransition.None } + ) { state -> + when (state) { + JellyfinAuthenticationState.Success -> { + LaunchedEffect(Unit) { + onDismissRequest() + } + } + + JellyfinAuthenticationState.Loading -> JellyfinAuthenticationLoading() + is JellyfinAuthenticationState.Error -> JellyfinAuthenticationError(state = state) + null -> JellyfinAuthenticationInputForm( + address = viewState.address, + rememberPassword = viewState.rememberPassword, + loginCredentials = viewState.loginCredentials, + onAddressChange = onAddressChange, + onUsernameChange = onUsernameChange, + onPasswordChange = onPasswordChange, + onRememberPasswordChange = onRememberPasswordChange + ) + } + } + }, + dismissButton = { + AnimatedVisibility(visible = viewState.authenticationState != JellyfinAuthenticationState.Loading) { + TextButton(onClick = onDismissRequest) { + Text(text = stringResource(R.string.dialog_button_close)) + } + } + }, + confirmButton = { + AnimatedVisibility(visible = viewState.authenticationState != JellyfinAuthenticationState.Loading) { + TextButton( + onClick = onAuthenticateClick, + enabled = viewState.canAuthenticate + ) { + Text(text = stringResource(R.string.media_provider_button_authenticate)) + } + } + } + ) +} + +@Composable +private fun JellyfinAuthenticationInputForm( + 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 JellyfinAuthenticationLoading() { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + CircularProgressIndicator() + Text(text = stringResource(R.string.media_provider_authenticating)) + } +} + +@Composable +private fun JellyfinAuthenticationError( + state: JellyfinAuthenticationState.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 Jellyfin 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) { + JellyfinConfigurationDialog( + onDismissRequest = {}, + viewState = JellyfinConfigurationViewState.Companion.Empty.copy( + authenticationState = JellyfinAuthenticationState.Loading + ), + onAddressChange = {}, + onUsernameChange = {}, + onPasswordChange = {}, + onAuthenticateClick = {}, + onRememberPasswordChange = {} + ) + } +} + +@Snapshot +@Preview +@Composable +private fun Success(@PreviewParameter(ColorSchemePreviewParameterProvider::class) colorScheme: ColorScheme) { + MaterialTheme(colorScheme = colorScheme) { + JellyfinConfigurationDialog( + onDismissRequest = {}, + viewState = JellyfinConfigurationViewState( + 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) { + JellyfinConfigurationDialog( + onDismissRequest = {}, + viewState = JellyfinConfigurationViewState.Companion.Empty.copy( + authenticationState = JellyfinAuthenticationState.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/jellyfin/JellyfinConfigurationViewModel.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewModel.kt new file mode 100644 index 000000000..f5fdd6b12 --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewModel.kt @@ -0,0 +1,102 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.simplecityapps.provider.jellyfin.JellyfinAuthenticationManager +import com.simplecityapps.provider.jellyfin.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 JellyfinConfigurationViewModel @Inject constructor( + private val jellyfinAuthenticationManager: JellyfinAuthenticationManager +) : ViewModel() { + + private val _viewState = MutableStateFlow(JellyfinConfigurationViewState.Empty) + val viewState = _viewState.map { state -> + JellyfinConfigurationViewState( + 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 { + JellyfinConfigurationViewState.Empty.copy( + address = jellyfinAuthenticationManager.getAddress() ?: "", + rememberPassword = jellyfinAuthenticationManager.getLoginCredentials() != null, + loginCredentials = jellyfinAuthenticationManager.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) { + jellyfinAuthenticationManager.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 = JellyfinAuthenticationState.Loading) + } + jellyfinAuthenticationManager.authenticate( + address = address, + loginCredentials = loginCredentials + ).onSuccess { + jellyfinAuthenticationManager.setAddress(address) + if (rememberPassword) { + jellyfinAuthenticationManager.setLoginCredentials(loginCredentials) + } + _viewState.update { state -> + state.copy(authenticationState = JellyfinAuthenticationState.Success) + } + }.onFailure { error -> + _viewState.update { state -> + state.copy(authenticationState = JellyfinAuthenticationState.Error(error)) + } + } + } + } +} diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewState.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewState.kt new file mode 100644 index 000000000..9e368a429 --- /dev/null +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/onboarding/mediaprovider/jellyfin/JellyfinConfigurationViewState.kt @@ -0,0 +1,21 @@ +package com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin + +import com.simplecityapps.provider.jellyfin.http.LoginCredentials + +data class JellyfinConfigurationViewState( + val address: String, + val canAuthenticate: Boolean, + val rememberPassword: Boolean, + val loginCredentials: LoginCredentials, + val authenticationState: JellyfinAuthenticationState? +) { + companion object { + val Empty = JellyfinConfigurationViewState( + address = "", + canAuthenticate = false, + rememberPassword = false, + authenticationState = null, + loginCredentials = LoginCredentials.Empty + ) + } +} diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_0].png new file mode 100644 index 000000000..48c4fe7a0 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da0fca7330a4e6b7418a65b403dbbd5d3c0997e3b08c96cf56ae97875e4448f0 +size 26643 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_10].png new file mode 100644 index 000000000..d5bb2ef5c --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f03c1d70a526abcff7252973d42f2b35c32e6ab41c6d813b8c3d1411df7c12 +size 26815 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_11].png new file mode 100644 index 000000000..1c7a2b0ed --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a52b37ce68a784221075a3d0de5618c0d1cd75f00e6f3b3f90781a809f483b62 +size 26413 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_1].png new file mode 100644 index 000000000..cfb876487 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b1b2e7a053a39ecb5b8436d91bbf102e807d14db36b985b931d0b8375259ff3 +size 26211 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_2].png new file mode 100644 index 000000000..16f0b0c15 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da27f26b417bcb768ff451e8beeff46a0a0dbfbea63792104f574bdf50ac14d1 +size 26650 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_3].png new file mode 100644 index 000000000..483ac22b4 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c1172c9952fd590793d1b8873bb1d2cefafb68f555dd628a603472e5fe4d334 +size 25966 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_4].png new file mode 100644 index 000000000..e0f1c2457 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89b56b2b1c2dbe70b23462eed524dce8be6aae04bc3272bc246aead972847e0e +size 25473 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_5].png new file mode 100644 index 000000000..3d03bc96e --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0488a5d0c9d5b7add2c4e4a1584c4fa24d5eb9f85da3967f7f1c8012e447a896 +size 25753 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_6].png new file mode 100644 index 000000000..13c23ce32 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df14cb12ad95f3452596f18764667dcb5bc20e3ff772de5045f8e4768c150369 +size 26759 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_7].png new file mode 100644 index 000000000..5ed933c04 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ff6a7b14934cf7c318f5b35389c8d3b1b0a948f7b7a9897136d9da4e8616faf +size 26298 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_8].png new file mode 100644 index 000000000..eb823f63f --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e82df613d1b60a4a4414e334b94060cfb7188e62ca6ed424927d740e329950a +size 26513 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_9].png new file mode 100644 index 000000000..8b412968d --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Error_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c2ed02927fd3a7aa3d92aa1a3c170fed8f00b5fb1849f875258ce8176d261de +size 25769 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_0].png new file mode 100644 index 000000000..a0b847e0f --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50d48e048a6dde1f52624dc481448e73dd9e135887e530bbd64d1d50bb849abd +size 8941 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_10].png new file mode 100644 index 000000000..d7e035f37 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fe9ad238a64043485e56dfced89534326d36ef4b1a7dc567fa79c4c20f44327 +size 8997 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_11].png new file mode 100644 index 000000000..3fd70261e --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2269cf868607050e962e3221df7a20082b8a27946f359ee7e736af7fe59d80c +size 8752 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_1].png new file mode 100644 index 000000000..278253421 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45aad27f13869a95523377a3cd9f631f7eaf68dfae136b86ca9e19990df2090f +size 8752 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_2].png new file mode 100644 index 000000000..2b025f3ab --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0512ab2730d20d1423f1424a30833eaa47edb9382d11759c5bedb4b79d8459f4 +size 8960 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_3].png new file mode 100644 index 000000000..57ff44451 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33011a848f91b00fbcddcd51d562ed574c07e99592deeea0e36f456db8a0cb32 +size 8639 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_4].png new file mode 100644 index 000000000..2ed99d8de --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a443ea8c676b6212b6ba8ee67d9a04b085bfeaa1183e0a2042568e42ac0a2021 +size 8856 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_5].png new file mode 100644 index 000000000..f4e6a7a6e --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbd3b2c97bdc48ee30618e6cea8a8c08a4d57dc4b83a48ffb05b89779337400b +size 8600 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_6].png new file mode 100644 index 000000000..c0e7d602c --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ef475d243aa756fae89067a95dbd00b267c54d57c85e795d7a44ecbd0f1d5ae +size 8951 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_7].png new file mode 100644 index 000000000..d4a99c264 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0747b095c01d0bc5e782840f0be3a9de0cc832c6e477712197011abf73af7f5 +size 8716 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_8].png new file mode 100644 index 000000000..d72470b03 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ecde33fa7c5313975a61432d494368f0910407513ab024431b1ac50da1edfd6 +size 8858 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_9].png new file mode 100644 index 000000000..2e1af3712 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Loading_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c43c7fc29af4cf9df46fab3b22bd4994880aee0e818c9632f6d82f2180f2591 +size 8640 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_0].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_0].png new file mode 100644 index 000000000..6b57a5d58 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_0].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fddebbf062bd55c3fd4d8d16f66371788be024d6d1f16799c59c02452130ce5b +size 23861 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_10].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_10].png new file mode 100644 index 000000000..86e87fd61 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_10].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf6e677c4156e4e642a1ac89f3d38dcb8a5ef7c15829fc3b66768a206494f751 +size 24004 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_11].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_11].png new file mode 100644 index 000000000..1fa1e9443 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_11].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2bd95c6f95a4a3cb754884ce3f240f7b9ff242086d24a395fc1f988efb3c03f +size 23732 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_1].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_1].png new file mode 100644 index 000000000..ff693dced --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_1].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34f21b2b39068ed65f4cf1062604d09dd1e32a75e131b1049ec3fe37708ccf0f +size 23908 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_2].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_2].png new file mode 100644 index 000000000..4cfad1dc8 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_2].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab611de9cade1176be03df2d1c309214d3e8bedf86f61cd7301188b7a4a678bd +size 23911 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_3].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_3].png new file mode 100644 index 000000000..1cc5c2a78 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_3].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8722195b51bc9ed0d6408942887561b7ad54bc91379e9b25e81dc4b673d44655 +size 23505 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_4].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_4].png new file mode 100644 index 000000000..2d9e2556b --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_4].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4108f5afaf9568ee6b16b66438fcd250af02ffef744c8da5c758f288df226afb +size 23483 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_5].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_5].png new file mode 100644 index 000000000..e4441fa30 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_5].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40df34425ef32a8341455bb895e1a73951016332950642a05c3be34a7b4653e1 +size 23465 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_6].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_6].png new file mode 100644 index 000000000..8f0981ebe --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_6].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5d1286e175e9cf92b620835b5c36ffdb4f786811c09f39a08be18f227dd4dcd +size 23868 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_7].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_7].png new file mode 100644 index 000000000..10539eaf8 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_7].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20039d4c6ef17f92501a26a2fb3d36ccd8f2ff14deb0ce63d80e5045dde245bb +size 23720 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_8].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_8].png new file mode 100644 index 000000000..a1feef4a5 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_8].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c72e9f456b9b01cc0ab424ce45bfe955c2396e2e375c8c43c597d15c4e2a47f9 +size 23774 diff --git a/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_9].png b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_9].png new file mode 100644 index 000000000..a459d9d60 --- /dev/null +++ b/android/app/src/test/snapshots/images/com.simplecityapps.snapshot_SnapshotComposePreviewTests_previewTests[com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.jellyfin.JellyfinConfigurationDialogKt_Success_ColorScheme_9].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66aa5886b679e7750b2ccc290529fbe9d77644a77965334d1fa84ea7a452b64e +size 23222 diff --git a/android/mediaprovider/jellyfin/src/main/java/com/simplecityapps/provider/jellyfin/http/LoginCredentials.kt b/android/mediaprovider/jellyfin/src/main/java/com/simplecityapps/provider/jellyfin/http/LoginCredentials.kt index 9c024a7f7..786a54d44 100644 --- a/android/mediaprovider/jellyfin/src/main/java/com/simplecityapps/provider/jellyfin/http/LoginCredentials.kt +++ b/android/mediaprovider/jellyfin/src/main/java/com/simplecityapps/provider/jellyfin/http/LoginCredentials.kt @@ -1,9 +1,16 @@ package com.simplecityapps.provider.jellyfin.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, From 8a930acd10759c2f22440670e8daf276d31d38af Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Sun, 23 Nov 2025 12:00:07 -0600 Subject: [PATCH 2/2] fix imports --- .../onboarding/mediaprovider/MediaProviderSelectionScreen.kt | 2 ++ 1 file changed, 2 insertions(+) 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 28194c9e3..8b1938b61 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,8 @@ 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.jellyfin.JellyfinConfigurationDialog import com.simplecityapps.shuttle.ui.screens.onboarding.mediaprovider.plex.PlexConfigurationDialog import com.simplecityapps.shuttle.ui.snapshot.Snapshot import com.simplecityapps.shuttle.ui.theme.AppTheme