From e7086791c8ff5b0ce12d2029b232898d792909fa Mon Sep 17 00:00:00 2001 From: Leandro Schaguhn Date: Wed, 11 Jun 2025 13:26:15 +0200 Subject: [PATCH 1/4] show domain url on title screen --- .../de/lelehier/keeper/screens/home_screen.kt | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) 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..b00eedd 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 @@ -56,7 +56,7 @@ fun homeScreen(paddingValues: PaddingValues) { .imePadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { - Greeting(serverURL); + Greeting(serverURL, currentScreen); AnimatedContent( targetState = currentScreen, transitionSpec = { @@ -66,7 +66,7 @@ fun homeScreen(paddingValues: PaddingValues) { }, ) { targetState -> when(targetState) { - 0 -> serverDialog(serverURL) + 0 -> serverDialog(serverURL, {newServerURL -> serverURL = newServerURL }) 1 -> passwordDialog(username, password) } } @@ -80,13 +80,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 +97,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,6 +118,7 @@ fun serverDialog(serverURL: String) { value = serverURL, onValueChange = { text -> serverURL = text + updateServerURL(serverURL) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), supportingText = { From 078a1a9efe8ac4796ecfe8d0f5605eacb88bf9b1 Mon Sep 17 00:00:00 2001 From: Leandro Schaguhn Date: Wed, 11 Jun 2025 17:36:52 +0200 Subject: [PATCH 2/4] button enabled/disabled logic --- .../java/de/lelehier/keeper/screens/home_screen.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 b00eedd..ad1531b 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 @@ -71,7 +71,15 @@ fun homeScreen(paddingValues: PaddingValues) { } } - 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") } @@ -122,7 +130,7 @@ fun serverDialog(serverURL: String, updateServerURL: (newServerURL: String) -> U }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), supportingText = { - AnimatedVisibility(!isValidUrl(serverURL)) { + AnimatedVisibility(!isValidUrl(serverURL) && serverURL != "") { Text( text = "No valid URL", color = MaterialTheme.colorScheme.error From 9ac70f0aecaf4ff8ec5ac5cfcf6ebde3ef39fe98 Mon Sep 17 00:00:00 2001 From: Leandro Schaguhn Date: Wed, 11 Jun 2025 15:49:49 +0200 Subject: [PATCH 3/4] callbacks for Login TextFields --- app/src/main/java/de/lelehier/keeper/MainActivity.kt | 5 ----- app/src/main/java/de/lelehier/keeper/screens/home_screen.kt | 6 ++++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/de/lelehier/keeper/MainActivity.kt b/app/src/main/java/de/lelehier/keeper/MainActivity.kt index 1c7d63b..029d5ad 100644 --- a/app/src/main/java/de/lelehier/keeper/MainActivity.kt +++ b/app/src/main/java/de/lelehier/keeper/MainActivity.kt @@ -42,11 +42,6 @@ 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) 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 ad1531b..544e9cf 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 @@ -67,7 +67,7 @@ fun homeScreen(paddingValues: PaddingValues) { ) { targetState -> when(targetState) { 0 -> serverDialog(serverURL, {newServerURL -> serverURL = newServerURL }) - 1 -> passwordDialog(username, password) + 1 -> passwordDialog(username, password, {newUsername -> username = newUsername}, {newPassword -> password = newPassword }) } } @@ -151,7 +151,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 { @@ -161,6 +161,7 @@ fun passwordDialog(username: String, password: String) { value = username, onValueChange = { text -> username = text + updateUsername(username) }); OutlinedTextField( label = { Text(text = "Password") }, @@ -168,6 +169,7 @@ fun passwordDialog(username: String, password: String) { value = password, onValueChange = { text -> password = text + updatePassword(password) } ) From 2056e7f8d4f07e18dc59c2ec472c0c3ff53cec8d Mon Sep 17 00:00:00 2001 From: Leandro Schaguhn Date: Wed, 11 Jun 2025 15:51:41 +0200 Subject: [PATCH 4/4] cleanup --- .../java/de/lelehier/keeper/MainActivity.kt | 27 ++----------------- .../de/lelehier/keeper/screens/home_screen.kt | 7 ++--- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/de/lelehier/keeper/MainActivity.kt b/app/src/main/java/de/lelehier/keeper/MainActivity.kt index 029d5ad..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?) { @@ -44,7 +21,7 @@ class MainActivity : ComponentActivity() { var currentScreen by remember { mutableStateOf(0) } 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 544e9cf..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("") }