From ad59bc552a85e6f0aa91fad21033bd421ebd4992 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 13:57:01 +0200 Subject: [PATCH 01/10] #59 Added username field composable --- .../studeez/screens/sign_up/SignUpScreen.kt | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt index 9eb9dea..19ff103 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt @@ -6,6 +6,8 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Person import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment @@ -36,9 +38,30 @@ fun SignUpScreen( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { - EmailField(uiState.email, viewModel::onEmailChange, fieldModifier) - PasswordField(uiState.password, viewModel::onPasswordChange, fieldModifier) - RepeatPasswordField(uiState.repeatPassword, viewModel::onRepeatPasswordChange, fieldModifier) + + UsernameField( + uiState.username, + viewModel::onUsernameChange, + fieldModifier + ) + + EmailField( + uiState.email, + viewModel::onEmailChange, + fieldModifier + ) + + PasswordField( + uiState.password, + viewModel::onPasswordChange, + fieldModifier + ) + + RepeatPasswordField( + uiState.repeatPassword, + viewModel::onRepeatPasswordChange, + fieldModifier + ) BasicButton(AppText.create_account, Modifier.basicButton()) { viewModel.onSignUpClick(openAndPopUp) From 182b8e22134630a11268480a145a4240d726124c Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 13:57:17 +0200 Subject: [PATCH 02/10] #59 Added username in ui state --- .../java/be/ugent/sel/studeez/screens/sign_up/SignUpUiState.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpUiState.kt index 081eb42..48a5178 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpUiState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpUiState.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.screens.sign_up data class SignUpUiState( + val username: String = "", val email: String = "", val password: String = "", val repeatPassword: String = "" From 57d959a5107b21ca335e46d267c54ded97a3d80b Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 13:57:48 +0200 Subject: [PATCH 03/10] #59 Added onUsernameChange --- .../be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt index a22fe68..fe14749 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt @@ -27,6 +27,9 @@ class SignUpViewModel @Inject constructor( private val password get() = uiState.value.password + fun onUsernameChange(newValue: String) { + uiState.value = uiState.value.copy(username = newValue) + } fun onEmailChange(newValue: String) { uiState.value = uiState.value.copy(email = newValue) } From e7ab3aadc1abac8776385d922fe12d461728c3cd Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:16:23 +0200 Subject: [PATCH 04/10] #59 username is now saved to user document on register --- .../be/ugent/sel/studeez/di/DatabaseModule.kt | 4 ++++ .../java/be/ugent/sel/studeez/domain/UserDAO.kt | 4 ++++ .../domain/implementation/FirebaseUserDAO.kt | 2 ++ .../studeez/screens/sign_up/SignUpViewModel.kt | 16 +++++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt b/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt index ffad868..c82696e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt +++ b/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt @@ -2,7 +2,9 @@ package be.ugent.sel.studeez.di import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.UserDAO import be.ugent.sel.studeez.domain.implementation.FirebaseAccountDAO +import be.ugent.sel.studeez.domain.implementation.FirebaseUserDAO import be.ugent.sel.studeez.domain.implementation.LogServiceImpl import dagger.Binds import dagger.Module @@ -14,6 +16,8 @@ import dagger.hilt.components.SingletonComponent abstract class DatabaseModule { @Binds abstract fun provideAccountDAO(impl: FirebaseAccountDAO): AccountDAO + @Binds abstract fun provideUserDAO(impl: FirebaseUserDAO): UserDAO + @Binds abstract fun provideLogService(impl: LogServiceImpl): LogService } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt new file mode 100644 index 0000000..7a731f3 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.domain + +interface UserDAO { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt new file mode 100644 index 0000000..d460762 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.domain.implementation + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt index fe14749..dacb7db 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt @@ -7,21 +7,29 @@ import be.ugent.sel.studeez.common.ext.passwordMatches import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.UserDAO +import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SIGN_UP_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.FlowCollector +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.take import be.ugent.sel.studeez.R.string as AppText import javax.inject.Inject @HiltViewModel class SignUpViewModel @Inject constructor( - private val accountService: AccountDAO, + private val accountDAO: AccountDAO, + private val userDAO: UserDAO, logService: LogService ) : StudeezViewModel(logService) { var uiState = mutableStateOf(SignUpUiState()) private set + private val username + get() = uiState.value.username private val email get() = uiState.value.email private val password @@ -59,8 +67,10 @@ class SignUpViewModel @Inject constructor( } launchCatching { - accountService.signUpWithEmailAndPassword(email, password) - openAndPopUp(LOGIN_SCREEN, SIGN_UP_SCREEN) + accountDAO.signUpWithEmailAndPassword(email, password) + accountDAO.signInWithEmailAndPassword(email, password) + userDAO.save(username) + openAndPopUp(HOME_SCREEN, SIGN_UP_SCREEN) } } From b3de23dc5402bd99f46166b9abd695f4ab506d44 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:20:31 +0200 Subject: [PATCH 05/10] #59 implementation of UserDAO --- .../domain/implementation/FirebaseUserDAO.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt index d460762..ac8f455 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt @@ -1,2 +1,29 @@ package be.ugent.sel.studeez.domain.implementation +import be.ugent.sel.studeez.domain.AccountDAO +import be.ugent.sel.studeez.domain.UserDAO +import com.google.firebase.firestore.DocumentReference +import com.google.firebase.firestore.FirebaseFirestore +import kotlinx.coroutines.tasks.await +import javax.inject.Inject + +class FirebaseUserDAO @Inject constructor( + private val firestore: FirebaseFirestore, + private val auth: AccountDAO + ) : UserDAO { + + override suspend fun getUserName(): String? { + return currentUserDocument().get().await().getString("username") + } + + override suspend fun save(newUsername: String) { + currentUserDocument().set(mapOf("username" to newUsername)) + } + + private fun currentUserDocument(): DocumentReference = + firestore.collection(USER_COLLECTION).document(auth.currentUserId) + + companion object { + private const val USER_COLLECTION = "users" + } +} \ No newline at end of file From 927b99c32ab920c2f6fda5da900c2da95c887a5d Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:20:50 +0200 Subject: [PATCH 06/10] #59 UserDAO interface --- .../main/java/be/ugent/sel/studeez/domain/UserDAO.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt index 7a731f3..b3e3bfc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -1,4 +1,14 @@ package be.ugent.sel.studeez.domain +import kotlinx.coroutines.flow.Flow + interface UserDAO { + + suspend fun getUserName(): String? + + suspend fun save(newUsername: String) + +// suspend fun update(task: Task) +// suspend fun delete(taskId: String) +// suspend fun deleteAllForUser(userId: String) } \ No newline at end of file From 6ca65ba8b39788f31ac287bda48364436518979a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:21:45 +0200 Subject: [PATCH 07/10] #59 username textfield added --- .../common/composable/TextFieldComposable.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt index 0b39a24..5766607 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt @@ -9,6 +9,7 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Lock +import androidx.compose.material.icons.filled.Person import androidx.compose.runtime.* import be.ugent.sel.studeez.R.string as AppText import be.ugent.sel.studeez.R.drawable as AppIcon @@ -35,6 +36,22 @@ fun BasicField( ) } +@Composable +fun UsernameField( + value: String, + onNewValue: (String) -> Unit, + modifier: Modifier = Modifier +) { + OutlinedTextField( + singleLine = true, + modifier = modifier, + value = value, + onValueChange = { onNewValue(it) }, + placeholder = { Text(stringResource(AppText.username)) }, + leadingIcon = { Icon(imageVector = Icons.Default.Person, contentDescription = "Username") } + ) +} + @Composable fun EmailField( value: String, From 03acb3781edafb4efd9d7ac8a7dfd15664287f62 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:22:10 +0200 Subject: [PATCH 08/10] #59 added username strings --- app/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 672586e..d070672 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Studeez + Username Email Password Repeat password @@ -17,6 +18,7 @@ Passwords do not match. Already have an account? Log in. + Don\'t have an account yet? Sign up. Sign in From 00b5ab8d165cf7b501d8f5d48a2262c60e8cf735 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:46:58 +0200 Subject: [PATCH 09/10] update comments Co-authored-by: Tibo De Peuter --- app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt index b3e3bfc..d007dc2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -8,7 +8,7 @@ interface UserDAO { suspend fun save(newUsername: String) -// suspend fun update(task: Task) -// suspend fun delete(taskId: String) -// suspend fun deleteAllForUser(userId: String) +// suspend fun updateTask(task: Task) +// suspend fun deleteTask(taskId: String) +// suspend fun deleteAllTasksOfUser(userId: String) } \ No newline at end of file From 9c908033eb673127e64f807fb95198ac9e8086fe Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 17:48:13 +0200 Subject: [PATCH 10/10] #59 removed comments --- app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt index d007dc2..28999e6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -7,8 +7,4 @@ interface UserDAO { suspend fun getUserName(): String? suspend fun save(newUsername: String) - -// suspend fun updateTask(task: Task) -// suspend fun deleteTask(taskId: String) -// suspend fun deleteAllTasksOfUser(userId: String) } \ No newline at end of file