From af47d92cbcd49eb607e405d5154f503d60e60b48 Mon Sep 17 00:00:00 2001 From: Ash Svitan Date: Thu, 16 Apr 2026 15:51:56 +0200 Subject: [PATCH] :bug: Fixes checking token at backend --- frontend/app/build.gradle.kts | 6 +- .../src/main/java/dev/svitan/antifed/API.kt | 4 +- .../java/dev/svitan/antifed/AuthActivity.kt | 66 ++++++++++++++++--- .../app/src/main/res/values-sk/strings.xml | 2 + frontend/app/src/main/res/values/strings.xml | 2 + frontend/build.gradle.kts | 1 + frontend/gradle/libs.versions.toml | 3 + 7 files changed, 71 insertions(+), 13 deletions(-) diff --git a/frontend/app/build.gradle.kts b/frontend/app/build.gradle.kts index 0116533..4192495 100644 --- a/frontend/app/build.gradle.kts +++ b/frontend/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) + alias(libs.plugins.kotlin.serialization) } android { @@ -48,12 +49,13 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.androidx.compose.material.icons.extended) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.ktor.client.core) - implementation(libs.ktor.client.android) implementation(libs.ktor.client.content.negotiation) + implementation(libs.ktor.client.cio) implementation(libs.ktor.serialization.kotlinx.json) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) @@ -62,4 +64,4 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) -} \ No newline at end of file +} diff --git a/frontend/app/src/main/java/dev/svitan/antifed/API.kt b/frontend/app/src/main/java/dev/svitan/antifed/API.kt index d939321..08f782c 100644 --- a/frontend/app/src/main/java/dev/svitan/antifed/API.kt +++ b/frontend/app/src/main/java/dev/svitan/antifed/API.kt @@ -1,12 +1,12 @@ package dev.svitan.antifed import io.ktor.client.HttpClient -import io.ktor.client.engine.android.Android import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.engine.cio.CIO import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.Serializable -val client = HttpClient(Android) { +val client = HttpClient(CIO) { install(ContentNegotiation) { json() } diff --git a/frontend/app/src/main/java/dev/svitan/antifed/AuthActivity.kt b/frontend/app/src/main/java/dev/svitan/antifed/AuthActivity.kt index 6321e15..22fc232 100644 --- a/frontend/app/src/main/java/dev/svitan/antifed/AuthActivity.kt +++ b/frontend/app/src/main/java/dev/svitan/antifed/AuthActivity.kt @@ -1,22 +1,46 @@ package dev.svitan.antifed import android.os.Bundle +import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.Add -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +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.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.edit @@ -40,6 +64,7 @@ class AuthActivity : ComponentActivity() { var serverUrl by remember { mutableStateOf("") } var token by remember { mutableStateOf("") } + var showToken by remember { mutableStateOf(false) } var authId by remember { mutableStateOf("") } var authIndex by remember { mutableIntStateOf(-1) } @@ -116,12 +141,13 @@ class AuthActivity : ComponentActivity() { } if (response.status == HttpStatusCode.OK) { - auths = response.body() + auths = response.body>() authIndex = auths.indexOfFirst { it.id == authId } isTokenOk = true } - } catch (_: Exception) { + } catch (e: Exception) { isTokenOk = false + Log.e("AuthActivity", "Error checking token", e) } checkingToken = false @@ -134,7 +160,7 @@ class AuthActivity : ComponentActivity() { navigationIcon = { IconButton(onClick = { finish() }) { Icon( - ( Icons.AutoMirrored.Outlined.ArrowBack, + (Icons.AutoMirrored.Outlined.ArrowBack), contentDescription = stringResource(R.string.go_back) ) } @@ -189,17 +215,39 @@ class AuthActivity : ComponentActivity() { singleLine = true, enabled = isServerUrlOk, isError = !isTokenOk && token.isNotBlank(), - visualTransformation = PasswordVisualTransformation(), + visualTransformation = (if (showToken) { + VisualTransformation.None + } else { + PasswordVisualTransformation() + }), keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Password ), trailingIcon = { if (checkingToken) { CircularProgressIndicator( - modifier = Modifier.size(24.dp) + modifier = Modifier.size(36.dp) ) } - }) + Icon( + if (showToken) { + Icons.Default.VisibilityOff + } else { + Icons.Default.Visibility + }, + contentDescription = stringResource( + if (showToken) { + R.string.hide_token + } else { + R.string.show_token + } + ), + modifier = Modifier + .align(Alignment.End) + .clickable { showToken = !showToken } + ) + } + ) Spacer(modifier = Modifier.height(12.dp)) diff --git a/frontend/app/src/main/res/values-sk/strings.xml b/frontend/app/src/main/res/values-sk/strings.xml index 90e3d43..dd11a7b 100644 --- a/frontend/app/src/main/res/values-sk/strings.xml +++ b/frontend/app/src/main/res/values-sk/strings.xml @@ -8,4 +8,6 @@ Token Vytvoriť novú auth Biometrika + Ukázať token + Skryť token \ No newline at end of file diff --git a/frontend/app/src/main/res/values/strings.xml b/frontend/app/src/main/res/values/strings.xml index a9cd420..bc07465 100644 --- a/frontend/app/src/main/res/values/strings.xml +++ b/frontend/app/src/main/res/values/strings.xml @@ -13,6 +13,8 @@ auth_id Create new auth Biometrics + Show token + Hide token \ No newline at end of file diff --git a/frontend/build.gradle.kts b/frontend/build.gradle.kts index 952b930..5ba8ae0 100644 --- a/frontend/build.gradle.kts +++ b/frontend/build.gradle.kts @@ -3,4 +3,5 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false + alias(libs.plugins.kotlin.serialization) apply false } \ No newline at end of file diff --git a/frontend/gradle/libs.versions.toml b/frontend/gradle/libs.versions.toml index 7e1dc6c..4e69c2b 100644 --- a/frontend/gradle/libs.versions.toml +++ b/frontend/gradle/libs.versions.toml @@ -18,6 +18,7 @@ ktorClientContentNegotiation = "3.1.3" ktorSerializationKotlinxJson = "3.1.3" [libraries] +androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version = "1.16.0" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version = "1.2.1" } @@ -33,6 +34,7 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp" } material = { group = "com.google.android.material", name = "material", version = "1.12.0" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktorClientCore" } @@ -45,4 +47,5 @@ ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serializatio android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }