diff --git a/app/src/main/java/de/lelehier/keeper/MainActivity.kt b/app/src/main/java/de/lelehier/keeper/MainActivity.kt index 1c7d63b..6dcc779 100644 --- a/app/src/main/java/de/lelehier/keeper/MainActivity.kt +++ b/app/src/main/java/de/lelehier/keeper/MainActivity.kt @@ -1,39 +1,16 @@ package de.lelehier.keeper -import android.icu.text.StringSearch import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Button -import androidx.compose.material3.ElevatedButton -import androidx.compose.material3.FilledIconButton -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState 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.graphics.painter.Painter -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.Preview import de.lelehier.keeper.ui.theme.KeeperTheme -import de.lelehier.keeper.screens.Greeting -import de.lelehier.keeper.screens.homeScreen +import de.lelehier.keeper.screens.HomeScreen class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -42,14 +19,9 @@ class MainActivity : ComponentActivity() { setContent { KeeperTheme { var currentScreen by remember { mutableStateOf(0) } - var nextScreen by remember { mutableStateOf(1) } - var serverURL = "" - var username by remember { mutableStateOf("") } - var password by remember { mutableStateOf("") } - var apiKey by remember { mutableStateOf("") } Scaffold() { paddingValues -> - homeScreen(paddingValues) + HomeScreen(paddingValues) } } } diff --git a/app/src/main/java/de/lelehier/keeper/screens/home_screen.kt b/app/src/main/java/de/lelehier/keeper/screens/home_screen.kt index 8537d1b..8a8dbc0 100644 --- a/app/src/main/java/de/lelehier/keeper/screens/home_screen.kt +++ b/app/src/main/java/de/lelehier/keeper/screens/home_screen.kt @@ -25,6 +25,7 @@ import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable @@ -41,9 +42,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @Composable -fun homeScreen(paddingValues: PaddingValues) { - var currentScreen by rememberSaveable { mutableStateOf(0) } - var nextScreen by rememberSaveable { mutableStateOf(1) } +fun HomeScreen(paddingValues: PaddingValues) { + var currentScreen by rememberSaveable { mutableIntStateOf(0) } + var nextScreen by rememberSaveable { mutableIntStateOf(1) } var serverURL by rememberSaveable { mutableStateOf("") } var username by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") } @@ -56,7 +57,7 @@ fun homeScreen(paddingValues: PaddingValues) { .imePadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { - Greeting(serverURL); + Greeting(serverURL, currentScreen); AnimatedContent( targetState = currentScreen, transitionSpec = { @@ -66,12 +67,20 @@ fun homeScreen(paddingValues: PaddingValues) { }, ) { targetState -> when(targetState) { - 0 -> serverDialog(serverURL) - 1 -> passwordDialog(username, password) + 0 -> serverDialog(serverURL, {newServerURL -> serverURL = newServerURL }) + 1 -> passwordDialog(username, password, {newUsername -> username = newUsername}, {newPassword -> password = newPassword }) } } - Button(onClick = {currentScreen = nextScreen}, modifier = Modifier.padding(top = 24.dp)) { + Button( + onClick = {currentScreen = nextScreen}, + modifier = Modifier.padding(top = 24.dp), + enabled = when(currentScreen) { + 0 -> isValidUrl(serverURL) + 1 -> username.isNotEmpty() && password.isNotEmpty() + else -> false + }, + ) { Row() { Text(text = "Next") } @@ -80,13 +89,15 @@ fun homeScreen(paddingValues: PaddingValues) { } @Composable -fun Greeting(serverURL: String) { +fun Greeting(serverURL: String, currentScreen: Int) { Column (horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = 24.dp)) { - Text( - text = "Welcome to", - style = MaterialTheme.typography.headlineLarge, - textAlign = TextAlign.Center - ) + AnimatedVisibility (currentScreen == 0) { + Text( + text = "Welcome to", + style = MaterialTheme.typography.headlineLarge, + textAlign = TextAlign.Center + ) + } Text( text = "Keeper", style = TextStyle( @@ -95,13 +106,20 @@ fun Greeting(serverURL: String) { brush = Brush.linearGradient(listOf(MaterialTheme.colorScheme.onPrimaryContainer, MaterialTheme.colorScheme.onSecondaryContainer))), textAlign = TextAlign.Center, ) + AnimatedVisibility(currentScreen != 0) { + Text( + text = "@$serverURL", + style = MaterialTheme.typography.titleSmall, + textAlign = TextAlign.Center + ) + } } } @Composable -fun serverDialog(serverURL: String) { +fun serverDialog(serverURL: String, updateServerURL: (newServerURL: String) -> Unit) { var serverURL by remember { mutableStateOf("") } OutlinedTextField( label = { Text(text = "Server URL") }, @@ -109,10 +127,11 @@ fun serverDialog(serverURL: String) { value = serverURL, onValueChange = { text -> serverURL = text + updateServerURL(serverURL) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), supportingText = { - AnimatedVisibility(!isValidUrl(serverURL)) { + AnimatedVisibility(!isValidUrl(serverURL) && serverURL != "") { Text( text = "No valid URL", color = MaterialTheme.colorScheme.error @@ -133,7 +152,7 @@ fun isValidUrl(url: String): Boolean { } @Composable -fun passwordDialog(username: String, password: String) { +fun passwordDialog(username: String, password: String, updateUsername: (newUsername: String) -> Unit, updatePassword: (newPassword: String) -> Unit) { var username by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } Column { @@ -143,6 +162,7 @@ fun passwordDialog(username: String, password: String) { value = username, onValueChange = { text -> username = text + updateUsername(username) }); OutlinedTextField( label = { Text(text = "Password") }, @@ -150,6 +170,7 @@ fun passwordDialog(username: String, password: String) { value = password, onValueChange = { text -> password = text + updatePassword(password) } )