Compare commits

..

No commits in common. "2056e7f8d4f07e18dc59c2ec472c0c3ff53cec8d" and "ac695e31090cec3db8f03a7fbd6c749a15ec02d0" have entirely different histories.

2 changed files with 46 additions and 39 deletions

View file

@ -1,16 +1,39 @@
package de.lelehier.keeper package de.lelehier.keeper
import android.icu.text.StringSearch
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge 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.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.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue 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.ui.theme.KeeperTheme
import de.lelehier.keeper.screens.HomeScreen import de.lelehier.keeper.screens.Greeting
import de.lelehier.keeper.screens.homeScreen
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -19,9 +42,14 @@ class MainActivity : ComponentActivity() {
setContent { setContent {
KeeperTheme { KeeperTheme {
var currentScreen by remember { mutableStateOf(0) } 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 -> Scaffold() { paddingValues ->
HomeScreen(paddingValues) homeScreen(paddingValues)
} }
} }
} }

View file

@ -25,7 +25,6 @@ import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@ -42,9 +41,9 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
@Composable @Composable
fun HomeScreen(paddingValues: PaddingValues) { fun homeScreen(paddingValues: PaddingValues) {
var currentScreen by rememberSaveable { mutableIntStateOf(0) } var currentScreen by rememberSaveable { mutableStateOf(0) }
var nextScreen by rememberSaveable { mutableIntStateOf(1) } var nextScreen by rememberSaveable { mutableStateOf(1) }
var serverURL by rememberSaveable { mutableStateOf("") } var serverURL by rememberSaveable { mutableStateOf("") }
var username by rememberSaveable { mutableStateOf("") } var username by rememberSaveable { mutableStateOf("") }
var password by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") }
@ -57,7 +56,7 @@ fun HomeScreen(paddingValues: PaddingValues) {
.imePadding(), .imePadding(),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center) { verticalArrangement = Arrangement.Center) {
Greeting(serverURL, currentScreen); Greeting(serverURL);
AnimatedContent( AnimatedContent(
targetState = currentScreen, targetState = currentScreen,
transitionSpec = { transitionSpec = {
@ -67,20 +66,12 @@ fun HomeScreen(paddingValues: PaddingValues) {
}, },
) { targetState -> when(targetState) { ) { targetState -> when(targetState) {
0 -> serverDialog(serverURL, {newServerURL -> serverURL = newServerURL }) 0 -> serverDialog(serverURL)
1 -> passwordDialog(username, password, {newUsername -> username = newUsername}, {newPassword -> password = newPassword }) 1 -> passwordDialog(username, password)
} }
} }
Button( Button(onClick = {currentScreen = nextScreen}, modifier = Modifier.padding(top = 24.dp)) {
onClick = {currentScreen = nextScreen},
modifier = Modifier.padding(top = 24.dp),
enabled = when(currentScreen) {
0 -> isValidUrl(serverURL)
1 -> username.isNotEmpty() && password.isNotEmpty()
else -> false
},
) {
Row() { Row() {
Text(text = "Next") Text(text = "Next")
} }
@ -89,15 +80,13 @@ fun HomeScreen(paddingValues: PaddingValues) {
} }
@Composable @Composable
fun Greeting(serverURL: String, currentScreen: Int) { fun Greeting(serverURL: String) {
Column (horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = 24.dp)) { Column (horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = 24.dp)) {
AnimatedVisibility (currentScreen == 0) { Text(
Text( text = "Welcome to",
text = "Welcome to", style = MaterialTheme.typography.headlineLarge,
style = MaterialTheme.typography.headlineLarge, textAlign = TextAlign.Center
textAlign = TextAlign.Center )
)
}
Text( Text(
text = "Keeper", text = "Keeper",
style = TextStyle( style = TextStyle(
@ -106,20 +95,13 @@ fun Greeting(serverURL: String, currentScreen: Int) {
brush = Brush.linearGradient(listOf(MaterialTheme.colorScheme.onPrimaryContainer, MaterialTheme.colorScheme.onSecondaryContainer))), brush = Brush.linearGradient(listOf(MaterialTheme.colorScheme.onPrimaryContainer, MaterialTheme.colorScheme.onSecondaryContainer))),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
) )
AnimatedVisibility(currentScreen != 0) {
Text(
text = "@$serverURL",
style = MaterialTheme.typography.titleSmall,
textAlign = TextAlign.Center
)
}
} }
} }
@Composable @Composable
fun serverDialog(serverURL: String, updateServerURL: (newServerURL: String) -> Unit) { fun serverDialog(serverURL: String) {
var serverURL by remember { mutableStateOf("") } var serverURL by remember { mutableStateOf("") }
OutlinedTextField( OutlinedTextField(
label = { Text(text = "Server URL") }, label = { Text(text = "Server URL") },
@ -127,11 +109,10 @@ fun serverDialog(serverURL: String, updateServerURL: (newServerURL: String) -> U
value = serverURL, value = serverURL,
onValueChange = { text -> onValueChange = { text ->
serverURL = text serverURL = text
updateServerURL(serverURL)
}, },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri),
supportingText = { supportingText = {
AnimatedVisibility(!isValidUrl(serverURL) && serverURL != "") { AnimatedVisibility(!isValidUrl(serverURL)) {
Text( Text(
text = "No valid URL", text = "No valid URL",
color = MaterialTheme.colorScheme.error color = MaterialTheme.colorScheme.error
@ -152,7 +133,7 @@ fun isValidUrl(url: String): Boolean {
} }
@Composable @Composable
fun passwordDialog(username: String, password: String, updateUsername: (newUsername: String) -> Unit, updatePassword: (newPassword: String) -> Unit) { fun passwordDialog(username: String, password: String) {
var username by remember { mutableStateOf("") } var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
Column { Column {
@ -162,7 +143,6 @@ fun passwordDialog(username: String, password: String, updateUsername: (newUsern
value = username, value = username,
onValueChange = { text -> onValueChange = { text ->
username = text username = text
updateUsername(username)
}); });
OutlinedTextField( OutlinedTextField(
label = { Text(text = "Password") }, label = { Text(text = "Password") },
@ -170,7 +150,6 @@ fun passwordDialog(username: String, password: String, updateUsername: (newUsern
value = password, value = password,
onValueChange = { text -> onValueChange = { text ->
password = text password = text
updatePassword(password)
} }
) )