app/src/main/java/com/geekorum/ttrss/accounts/LoginScreen.kt
author Da Risk <da_risk@geekorum.com>
Mon, 15 Sep 2025 14:00:07 -0400
changeset 1370 13e39ef920a8
parent 1299 3c3d5d2551f1
child 1371 fd6f3c3ee192
permissions -rw-r--r--
update license headers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     1
/*
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     2
 * Geekttrss is a RSS feed reader application on the Android Platform.
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     3
 *
1370
13e39ef920a8 update license headers
Da Risk <da_risk@geekorum.com>
parents: 1299
diff changeset
     4
 * Copyright (C) 2017-2025 by Frederic-Charles Barthelery.
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     5
 *
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     6
 * This file is part of Geekttrss.
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     7
 *
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     8
 * Geekttrss is free software: you can redistribute it and/or modify
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     9
 * it under the terms of the GNU General Public License as published by
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    10
 * the Free Software Foundation, either version 3 of the License, or
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    11
 * (at your option) any later version.
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    12
 *
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    13
 * Geekttrss is distributed in the hope that it will be useful,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    16
 * GNU General Public License for more details.
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    17
 *
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    18
 * You should have received a copy of the GNU General Public License
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    19
 * along with Geekttrss.  If not, see <http://www.gnu.org/licenses/>.
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    20
 */
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    21
package com.geekorum.ttrss.accounts
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    22
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    23
import android.content.res.Configuration
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    24
import androidx.annotation.StringRes
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    25
import androidx.compose.animation.AnimatedVisibility
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    26
import androidx.compose.animation.Crossfade
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    27
import androidx.compose.foundation.background
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    28
import androidx.compose.foundation.layout.*
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    29
import androidx.compose.foundation.rememberScrollState
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    30
import androidx.compose.foundation.text.KeyboardActions
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    31
import androidx.compose.foundation.text.KeyboardOptions
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    32
import androidx.compose.foundation.verticalScroll
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    33
import androidx.compose.material.icons.Icons
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    34
import androidx.compose.material.icons.filled.Password
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
import androidx.compose.material.icons.filled.Person
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
import androidx.compose.material.icons.filled.Web
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    37
import androidx.compose.material3.*
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    38
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    39
import androidx.compose.material3.windowsizeclass.WindowSizeClass
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    41
import androidx.compose.runtime.*
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    42
import androidx.compose.ui.Alignment
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    43
import androidx.compose.ui.Modifier
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    44
import androidx.compose.ui.input.nestedscroll.nestedScroll
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    45
import androidx.compose.ui.platform.testTag
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    46
import androidx.compose.ui.res.stringResource
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    47
import androidx.compose.ui.text.input.ImeAction
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    48
import androidx.compose.ui.text.input.KeyboardType
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    49
import androidx.compose.ui.text.input.PasswordVisualTransformation
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    50
import androidx.compose.ui.text.input.VisualTransformation
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    51
import androidx.compose.ui.tooling.preview.Devices
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    52
import androidx.compose.ui.tooling.preview.Preview
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    53
import androidx.compose.ui.unit.DpSize
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    54
import androidx.compose.ui.unit.dp
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    55
import androidx.hilt.navigation.compose.hiltViewModel
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    56
import com.geekorum.ttrss.R
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    57
import com.geekorum.ttrss.ui.AppTheme3
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    58
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    59
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    60
internal fun LoginScreen(windowSizeClass: WindowSizeClass, viewModel: LoginViewModel = hiltViewModel()) {
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    61
    val snackbarHostState = remember { SnackbarHostState() }
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    62
    LoginScreen(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    63
        windowSizeClass = windowSizeClass,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    64
        loginInProgress = viewModel.loginInProgress,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    65
        loginFormUiState = viewModel.loginFormUiState,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    66
        onLoginClick = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    67
            viewModel.confirmLogin()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    68
        })
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    69
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    70
    viewModel.snackbarErrorMessageId?.let { messageId ->
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    71
        val message = stringResource(messageId)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    72
        LaunchedEffect(message) {
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    73
            snackbarHostState.showSnackbar(message)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    74
            viewModel.clearSnackbarMessage()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    75
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    76
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    77
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    78
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    79
@OptIn(ExperimentalMaterial3Api::class)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    80
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    81
fun LoginScreen(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    82
    windowSizeClass: WindowSizeClass,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    83
    loginInProgress: Boolean,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    84
    loginFormUiState: LoginFormUiState,
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    85
    snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    86
    onLoginClick: () -> Unit
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    87
) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    88
    val useTabletLayout = windowSizeClass.widthSizeClass >= WindowWidthSizeClass.Medium
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    89
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    90
    Scaffold(
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    91
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    92
        snackbarHost = { SnackbarHost(snackbarHostState)  },
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    93
        topBar = {
1299
3c3d5d2551f1 app: fix a few warnings
Da Risk <da_risk@geekorum.com>
parents: 1174
diff changeset
    94
            val colors = TopAppBarDefaults.topAppBarColors(
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    95
                containerColor = MaterialTheme.colorScheme.primaryContainer,
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    96
                titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    97
            )
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    98
            CenterAlignedTopAppBar(
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
    99
                scrollBehavior = scrollBehavior,
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   100
                colors = colors,
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   101
                title = {
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   102
                    Text(stringResource(R.string.app_name), style = MaterialTheme.typography.headlineSmall)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   103
                })
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   104
        },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   105
    ) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   106
        if (useTabletLayout) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   107
            TabletLayoutContent(Modifier.padding(it)) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   108
                Crossfade(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   109
                    loginInProgress,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   110
                    label = "CircularProgressCrossfade"
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   111
                ) { showLoginProgress ->
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   112
                    if (showLoginProgress) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   113
                        CircularProgressIndicator(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   114
                            Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   115
                                .fillMaxWidth()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   116
                                .wrapContentWidth()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   117
                                .size(64.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   118
                                .padding(top = 56.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   119
                        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   120
                    } else {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   121
                        LoginForm(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   122
                            loginFormUiState,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   123
                            onLoginClick = onLoginClick,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   124
                            Modifier.padding(16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   125
                        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   126
                    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   127
                }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   128
            }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   129
        } else {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   130
            Crossfade(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   131
                loginInProgress, label = "CircularProgressCrossfade",
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   132
                modifier = Modifier.padding(it)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   133
            ) { showLoginProgress ->
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   134
                if (showLoginProgress) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   135
                    CircularProgressIndicator(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   136
                        Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   137
                            .fillMaxWidth()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   138
                            .wrapContentWidth()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   139
                            .size(64.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   140
                            .padding(top = 56.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   141
                    )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   142
                } else {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   143
                    LoginForm(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   144
                        loginFormUiState,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   145
                        onLoginClick = onLoginClick,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   146
                        Modifier.padding(16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   147
                    )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   148
                }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   149
            }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   150
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   151
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   152
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   153
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   154
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   155
private fun TabletLayoutContent(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   156
    modifier: Modifier = Modifier,
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   157
    content: @Composable ColumnScope.() -> Unit
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   158
) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   159
    Box(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   160
        contentAlignment = Alignment.TopCenter,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   161
        modifier = modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   162
    ) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   163
        Box(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   164
            modifier = Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   165
                .height(136.dp) // 192.dp - 56.dp of appbar
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   166
                .fillMaxWidth()
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   167
                .background(MaterialTheme.colorScheme.primaryContainer)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   168
                .testTag("fakeAppBar")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   169
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   170
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   171
        ElevatedCard(
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   172
            Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   173
                .width(560.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   174
                .fillMaxSize()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   175
                .testTag("contentCard"),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   176
            content = content
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   177
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   178
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   179
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   180
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   181
@Stable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   182
interface LoginFormUiState {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   183
    var serverUrl: String
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   184
    var username: String
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   185
    var password: String
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   186
    var useHttpAuthentication: Boolean
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   187
    var httpAuthUsername: String
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   188
    var httpAuthPassword: String
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   189
    val canChangeUsernameOrUrl: Boolean
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   190
    val serverUrlFieldErrorMsg: Int?
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   191
    val usernameFieldErrorMsg: Int?
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   192
    val passwordFieldErrorMsg: Int?
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   193
    val loginButtonEnabled: Boolean
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   194
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   195
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   196
class MutableLoginFormUiState : LoginFormUiState {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   197
    override var serverUrl: String by mutableStateOf("")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   198
    override var username: String  by mutableStateOf("")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   199
    override var password: String by mutableStateOf("")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   200
    override var useHttpAuthentication: Boolean by mutableStateOf(false)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   201
    override var httpAuthUsername: String by mutableStateOf("")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   202
    override var httpAuthPassword: String by mutableStateOf("")
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   203
    override var canChangeUsernameOrUrl: Boolean by mutableStateOf(true)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   204
    override var serverUrlFieldErrorMsg: Int? by mutableStateOf(null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   205
    override var usernameFieldErrorMsg: Int? by mutableStateOf(null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   206
    override var passwordFieldErrorMsg: Int? by mutableStateOf(null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   207
    override var loginButtonEnabled: Boolean by mutableStateOf(false)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   208
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   209
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   210
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   211
private fun LoginForm(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   212
    uiState: LoginFormUiState,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   213
    onLoginClick: () -> Unit,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   214
    modifier: Modifier = Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   215
) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   216
    Column(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   217
        modifier = modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   218
            .fillMaxWidth()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   219
            .verticalScroll(rememberScrollState()),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   220
        horizontalAlignment = Alignment.CenterHorizontally
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   221
    ) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   222
        OutlinedTextFieldWithError(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   223
            value = uiState.serverUrl, onValueChange = uiState::serverUrl::set,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   224
            enabled = uiState.canChangeUsernameOrUrl,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   225
            label = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   226
                Text(stringResource(R.string.prompt_url))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   227
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   228
            leadingIcon = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   229
                Icon(Icons.Default.Web, contentDescription = null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   230
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   231
            errorId = uiState.serverUrlFieldErrorMsg,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   232
            keyboardOptions = KeyboardOptions(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   233
                keyboardType = KeyboardType.Uri,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   234
                imeAction = ImeAction.Next
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   235
            )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   236
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   237
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   238
        OutlinedTextFieldWithError(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   239
            value = uiState.username, onValueChange = uiState::username::set,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   240
            enabled = uiState.canChangeUsernameOrUrl,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   241
            label = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   242
                Text(stringResource(R.string.prompt_username))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   243
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   244
            leadingIcon = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   245
                Icon(Icons.Default.Person, contentDescription = null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   246
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   247
            errorId = uiState.usernameFieldErrorMsg,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   248
            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   249
            modifier = Modifier.padding(top = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   250
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   251
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   252
        OutlinedTextFieldWithError(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   253
            value = uiState.password, onValueChange = uiState::password::set,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   254
            label = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   255
                Text(stringResource(R.string.prompt_password))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   256
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   257
            leadingIcon = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   258
                Icon(Icons.Default.Password, contentDescription = null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   259
            },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   260
            errorId = uiState.passwordFieldErrorMsg,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   261
            visualTransformation = PasswordVisualTransformation(),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   262
            keyboardOptions = KeyboardOptions(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   263
                keyboardType = KeyboardType.Password,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   264
                imeAction = if (uiState.useHttpAuthentication) ImeAction.Next else ImeAction.Done
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   265
            ),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   266
            keyboardActions = KeyboardActions(onDone = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   267
                onLoginClick()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   268
            }),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   269
            modifier = Modifier.padding(top = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   270
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   271
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   272
        Row(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   273
            verticalAlignment = Alignment.CenterVertically, modifier = Modifier
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   274
                .width(280.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   275
                .padding(top = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   276
        ) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   277
            Text(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   278
                stringResource(R.string.lbl_use_http_authentication),
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   279
                style = MaterialTheme.typography.titleMedium,
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   280
                modifier = Modifier.weight(1f)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   281
            )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   282
            Switch(checked = uiState.useHttpAuthentication,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   283
                onCheckedChange = { uiState.useHttpAuthentication = it })
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   284
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   285
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   286
        AnimatedVisibility(uiState.useHttpAuthentication) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   287
            Column {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   288
                OutlinedTextField(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   289
                    value = uiState.httpAuthUsername,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   290
                    onValueChange = uiState::httpAuthUsername::set,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   291
                    placeholder = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   292
                        Text(stringResource(R.string.prompt_username))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   293
                    },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   294
                    leadingIcon = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   295
                        Icon(Icons.Default.Person, contentDescription = null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   296
                    },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   297
                    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   298
                    modifier = Modifier.padding(top = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   299
                )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   300
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   301
                OutlinedTextField(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   302
                    value = uiState.httpAuthPassword,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   303
                    onValueChange = uiState::httpAuthPassword::set,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   304
                    placeholder = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   305
                        Text(stringResource(R.string.prompt_password))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   306
                    },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   307
                    leadingIcon = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   308
                        Icon(Icons.Default.Password, contentDescription = null)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   309
                    },
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   310
                    visualTransformation = PasswordVisualTransformation(),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   311
                    singleLine = true,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   312
                    keyboardOptions = KeyboardOptions(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   313
                        keyboardType = KeyboardType.Password,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   314
                        imeAction = ImeAction.Done
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   315
                    ),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   316
                    keyboardActions = KeyboardActions(onDone = {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   317
                        onLoginClick()
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   318
                    }),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   319
                    modifier = Modifier.padding(top = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   320
                )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   321
            }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   322
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   323
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   324
        Button(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   325
            onClick = onLoginClick,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   326
            enabled = uiState.loginButtonEnabled,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   327
            modifier = Modifier.padding(vertical = 16.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   328
        ) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   329
            Text(stringResource(R.string.action_sign_in))
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   330
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   331
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   332
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   333
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   334
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   335
private fun OutlinedTextFieldWithError(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   336
    value: String,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   337
    onValueChange: (String) -> Unit,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   338
    modifier: Modifier = Modifier,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   339
    enabled: Boolean = true,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   340
    label: @Composable (() -> Unit)? = null,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   341
    placeholder: @Composable (() -> Unit)? = null,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   342
    leadingIcon: @Composable (() -> Unit)? = null,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   343
    @StringRes
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   344
    errorId: Int? = null,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   345
    visualTransformation: VisualTransformation = VisualTransformation.None,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   346
    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   347
    keyboardActions: KeyboardActions = KeyboardActions.Default,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   348
) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   349
    Column(modifier) {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   350
        OutlinedTextField(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   351
            value = value, onValueChange = onValueChange,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   352
            enabled = enabled,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   353
            label = label,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   354
            placeholder = placeholder,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   355
            leadingIcon = leadingIcon,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   356
            isError = errorId != null,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   357
            singleLine = true,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   358
            visualTransformation = visualTransformation,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   359
            keyboardOptions = keyboardOptions,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   360
            keyboardActions = keyboardActions
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   361
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   362
        val errorMsg = errorId?.let { stringResource(id = errorId) } ?: ""
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   363
        Text(
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   364
            errorMsg,
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   365
            style = MaterialTheme.typography.bodySmall,
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   366
            modifier = Modifier.padding(top = 4.dp)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   367
        )
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   368
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   369
}
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   370
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   371
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   372
@Preview
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   373
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   374
@Preview(device = Devices.TABLET)
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   375
@Preview(device = Devices.TABLET,
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   376
    uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   377
)
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   378
@Composable
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   379
fun PreviewLoginScreen() {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   380
    BoxWithConstraints {
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   381
        val windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(maxWidth, maxHeight))
1110
2aad46759ea5 app: convert LoginScreen to m3
Da Risk <da_risk@geekorum.com>
parents: 1026
diff changeset
   382
        AppTheme3 {
1026
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   383
            LoginScreen(windowSizeClass, loginInProgress = false,
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   384
                loginFormUiState = MutableLoginFormUiState(),
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   385
                onLoginClick = {})
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   386
        }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   387
    }
3e7798e59599 app: extract LoginScreen and add tests
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   388
}