From 832ad6a7f14211dcb4e68fd1e3d711590664a16b Mon Sep 17 00:00:00 2001 From: Leandro Schaguhn Date: Tue, 10 Jun 2025 18:26:30 +0200 Subject: [PATCH] add url validation --- .../de/lelehier/keeper/screens/home_screen.kt | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 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 a7d6e07..2fe8a38 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 @@ -2,8 +2,10 @@ package de.lelehier.keeper.screens import KeeperLargeFontFamily import android.print.PrintAttributes.Margins +import android.util.Patterns import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.EaseIn import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn @@ -16,6 +18,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField @@ -31,6 +34,7 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -51,7 +55,7 @@ fun homeScreen(paddingValues: PaddingValues) { .imePadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { - Greeting(); + Greeting(serverURL); AnimatedContent( targetState = currentScreen, transitionSpec = { @@ -75,7 +79,7 @@ fun homeScreen(paddingValues: PaddingValues) { } @Composable -fun Greeting() { +fun Greeting(serverURL: String) { Column (horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = 24.dp)) { Text( text = "Welcome to", @@ -90,6 +94,7 @@ fun Greeting() { brush = Brush.linearGradient(listOf(MaterialTheme.colorScheme.onPrimaryContainer, MaterialTheme.colorScheme.onSecondaryContainer))), textAlign = TextAlign.Center, ) + } } @@ -103,11 +108,29 @@ fun serverDialog(serverURL: String) { value = serverURL, onValueChange = { text -> serverURL = text + }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), + supportingText = { + AnimatedVisibility(!isValidUrl(serverURL)) { + Text( + text = "No valid URL", + color = MaterialTheme.colorScheme.error + ) + } } - ) } +fun isValidUrl(url: String): Boolean { + return try { + // Use Android's Patterns.WEB_URL for robust URL validation + // This handles various URL formats, including those without schemes. + Patterns.WEB_URL.matcher(url).matches() + } catch (e: Exception) { + false + } +} + @Composable fun passwordDialog(username: String, password: String) { var username by remember { mutableStateOf("") }