From 6879012cf5a42396b056c02e3f1a3c9717661e0b Mon Sep 17 00:00:00 2001 From: "Z. Charles Dziura" Date: Tue, 8 Oct 2024 14:14:42 -0400 Subject: [PATCH] Update login screen to prompt for regular credentials --- app/app/build.gradle.kts | 2 + .../debtpirate/screens/auth/AuthScreen.kt | 68 +++++++++---------- .../screens/auth/AuthScreenViewModel.kt | 14 ++++ app/app/src/main/res/values/strings.xml | 8 +-- app/gradle/libs.versions.toml | 23 ++++--- app/gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 66 insertions(+), 51 deletions(-) diff --git a/app/app/build.gradle.kts b/app/app/build.gradle.kts index 32681a4..6f8dbd3 100644 --- a/app/app/build.gradle.kts +++ b/app/app/build.gradle.kts @@ -75,6 +75,8 @@ dependencies { implementation(libs.retrofit) implementation(libs.retrofit.gson) implementation(platform(libs.androidx.compose.bom)) + implementation(libs.okhttp) +// implementation(libs.okhttp.logging) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreen.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreen.kt index a02faad..948b69b 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreen.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreen.kt @@ -14,9 +14,9 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Key -import androidx.compose.material.icons.outlined.Mail +import androidx.compose.material.icons.outlined.Password import androidx.compose.material.icons.outlined.Person +import androidx.compose.material.icons.outlined.PersonAdd import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedButton @@ -58,18 +58,18 @@ fun AuthScreen( .weight(3f) .padding(16.dp) ) { - val displayName = viewModel.displayName.collectAsState() - val emailAddress = viewModel.emailAddress.collectAsState() - RegistrationScreen( - displayName, - onDisplayNameUpdate = viewModel::updateDisplayName, - emailAddress, - onEmailAddressUpdate = viewModel::updateEmailAddress + val username = viewModel.username.collectAsState() + val password = viewModel.password.collectAsState() + LoginComponent( + username, + onUpdateUsername = viewModel::updateUsername, + password, + onUpdatePassword = viewModel::updatePassword ) Separator(modifier = Modifier.padding(PaddingValues(top = 24.dp, bottom = 24.dp))) - PassKeyButton() + RegisterButton() } } } @@ -114,19 +114,18 @@ private fun Separator(modifier: Modifier = Modifier) { } @Composable -private fun RegistrationScreen( - displayName: State, - onDisplayNameUpdate: (String) -> Unit, - emailAddress: State, - onEmailAddressUpdate: (String) -> Unit, +private fun LoginComponent( + username: State, + onUpdateUsername: (String) -> Unit, + password: State, + onUpdatePassword: (String) -> Unit, modifier: Modifier = Modifier ) { - Column(modifier.verticalScroll(rememberScrollState())) - { + Column(modifier.verticalScroll(rememberScrollState())) { OutlinedTextField( - value = displayName.value, - label = { Text(stringResource(id = R.string.auth_screen__display_name)) }, - placeholder = { Text(stringResource(id = R.string.auth_screen__display_name)) }, + value = username.value, + label = { Text(stringResource(id = R.string.auth_screen__username)) }, + placeholder = { Text(stringResource(id = R.string.auth_screen__username)) }, leadingIcon = { Icon(Icons.Outlined.Person, "person") }, singleLine = true, keyboardOptions = KeyboardOptions( @@ -134,25 +133,22 @@ private fun RegistrationScreen( keyboardType = KeyboardType.Text, imeAction = ImeAction.Next ), - onValueChange = onDisplayNameUpdate, + onValueChange = onUpdateUsername, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( - value = emailAddress.value, - label = { Text(stringResource(id = R.string.auth_screen__email)) }, - placeholder = { Text(stringResource(id = R.string.auth_screen__email)) }, - leadingIcon = { Icon(Icons.Outlined.Mail, "email") }, + value = username.value, + label = { Text(stringResource(id = R.string.auth_screen__password)) }, + placeholder = { Text(stringResource(id = R.string.auth_screen__password)) }, + leadingIcon = { Icon(Icons.Outlined.Password, "password") }, singleLine = true, keyboardOptions = KeyboardOptions( - capitalization = KeyboardCapitalization.Unspecified, - keyboardType = KeyboardType.Email, - imeAction = ImeAction.Next + keyboardType = KeyboardType.Password, + imeAction = ImeAction.Go ), - onValueChange = onEmailAddressUpdate, - modifier = Modifier - .fillMaxWidth() - .padding(PaddingValues(top = 8.dp)) + onValueChange = onUpdatePassword, + modifier = Modifier.fillMaxWidth() ) Button( @@ -161,22 +157,22 @@ private fun RegistrationScreen( .padding(PaddingValues(top = 16.dp)) .fillMaxWidth() ) { - Text(stringResource(id = R.string.auth_screen__register)) + Text(stringResource(id = R.string.auth_screen__login)) } } } @Composable -private fun PassKeyButton() { +private fun RegisterButton() { OutlinedButton( onClick = { /*TODO*/ }, modifier = Modifier .fillMaxWidth() ) { Box(modifier = Modifier.fillMaxWidth()) { - Icon(Icons.Outlined.Key, "passkey") + Icon(Icons.Outlined.PersonAdd, "register") Text( - stringResource(id = R.string.auth_screen__sign_in), + stringResource(id = R.string.auth_screen__register), textAlign = TextAlign.Center, modifier = Modifier .fillMaxWidth() diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreenViewModel.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreenViewModel.kt index 8d14293..b4aab56 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreenViewModel.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/screens/auth/AuthScreenViewModel.kt @@ -5,6 +5,20 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow class AuthScreenViewModel : ViewModel() { + private val _username = MutableStateFlow("") + val username = _username.asStateFlow() + + private val _password = MutableStateFlow("") + val password = _password.asStateFlow() + + fun updateUsername(username: String) { + _username.value = username + } + + fun updatePassword(password: String) { + _password.value = password + } + private val _displayName = MutableStateFlow("") val displayName = _displayName.asStateFlow() diff --git a/app/app/src/main/res/values/strings.xml b/app/app/src/main/res/values/strings.xml index aac59a8..e3ce1a3 100644 --- a/app/app/src/main/res/values/strings.xml +++ b/app/app/src/main/res/values/strings.xml @@ -2,9 +2,9 @@ Debt Pirate - Register - Sign in with a Passkey - Email Address - Display Name + Username + Password + Login + Register a New Account \ No newline at end of file diff --git a/app/gradle/libs.versions.toml b/app/gradle/libs.versions.toml index aad7c72..bd80622 100644 --- a/app/gradle/libs.versions.toml +++ b/app/gradle/libs.versions.toml @@ -1,24 +1,25 @@ [versions] -activityCompose = "1.9.1" -agp = "8.6.0" +activityCompose = "1.9.2" +agp = "8.7.0" appcompat = "1.7.0" -composeBom = "2024.08.00" +composeBom = "2024.09.03" coreKtx = "1.13.1" datastore = "1.1.1" espressoCore = "3.6.1" -iconsExtended = "1.7.0-rc01" +iconsExtended = "1.7.3" junit = "4.13.2" junitVersion = "1.2.1" kotlin = "2.0.10" kotlinxSerializationJson = "1.7.1" -lifecycleRuntimeCompose = "2.8.4" -lifecycleRuntimeKtx = "2.8.4" -lifecycleViewModelKtx = "2.8.4" -lifecycleViewmodelCompose = "2.8.4" +lifecycleRuntimeCompose = "2.8.6" +lifecycleRuntimeKtx = "2.8.6" +lifecycleViewModelKtx = "2.8.6" +lifecycleViewmodelCompose = "2.8.6" material = "1.12.0" -material3 = "1.3.0-rc01" -navigation = "2.8.0-rc01" +material3 = "1.3.0" +navigation = "2.8.2" retrofit = "2.9.0" +okhttp = "4.10.0" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -47,6 +48,8 @@ material = { group = "com.google.android.material", name = "material", version.r material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" } retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } retrofit-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } +okttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/app/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties index 41172ed..6ab54da 100644 --- a/app/gradle/wrapper/gradle-wrapper.properties +++ b/app/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Aug 16 10:33:36 EDT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists