From 747153cbaf1dd4516566524b5901d44903b5a79e Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Wed, 27 Sep 2023 22:08:11 +0700 Subject: [PATCH 01/27] Create composables --- .../presentation/authentication/composables/IconTextInput.kt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt new file mode 100644 index 00000000..97cfa268 --- /dev/null +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt @@ -0,0 +1,2 @@ +package com.hieuwu.groceriesstore.presentation.authentication.composables + From 17464ae1fca631552581f2ce5daea096181baad1 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Wed, 27 Sep 2023 22:08:18 +0700 Subject: [PATCH 02/27] Implement icon text input --- .../composables/IconTextInput.kt | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt index 97cfa268..76c915f1 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/composables/IconTextInput.kt @@ -1,2 +1,76 @@ package com.hieuwu.groceriesstore.presentation.authentication.composables +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.material.TextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.rounded.Backspace +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hieuwu.groceriesstore.R + +@Composable +fun IconTextInput( + leadingIcon: ImageVector, + trailingIcon: ImageVector, + modifier: Modifier = Modifier, + value: String, + placeholder: String, + onValueChange: (String) -> Unit, + onTrailingIconClick: () -> Unit +) { + TextField( + modifier = modifier.border( + border = BorderStroke( + width = 1.dp, + color = colorResource(id = R.color.colorPrimary), + + ), + shape = RoundedCornerShape(6.dp) + ), + value = value, + onValueChange = { text -> onValueChange(text) }, + leadingIcon = { + Icon( + imageVector = leadingIcon, + contentDescription = null, + tint = colorResource(id = R.color.primary_button) + ) + }, + trailingIcon = { + Icon( + modifier = modifier.clickable { + onTrailingIconClick() + }, + imageVector = trailingIcon, + contentDescription = null, + tint = Color.DarkGray + ) + }, + placeholder = { + Text(text = placeholder, color = colorResource(id = R.color.colorPrimary)) + }) +} + +@Preview +@Composable +fun IconTextInputPreview() { + IconTextInput( + leadingIcon = Icons.Filled.Email, + trailingIcon = Icons.Rounded.Backspace, + value = "Please input your email", + placeholder = "", + onTrailingIconClick = {}, + onValueChange = {} + ) +} From f71ead40c09262bd939acc4fa6cf9d1ed03c4cf0 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Wed, 27 Sep 2023 23:01:15 +0700 Subject: [PATCH 03/27] Create composable --- .../groceriesstore/presentation/authentication/SignInScreen.kt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt new file mode 100644 index 00000000..25d5a219 --- /dev/null +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt @@ -0,0 +1,2 @@ +package com.hieuwu.groceriesstore.presentation.authentication + From 14c2cc3cea0ea71257f0da2d0dce009fc62742db Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Wed, 27 Sep 2023 23:01:42 +0700 Subject: [PATCH 04/27] Refactor view model --- .../authentication/SignInViewModel.kt | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInViewModel.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInViewModel.kt index 1e3d8889..a8315991 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInViewModel.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInViewModel.kt @@ -1,5 +1,6 @@ package com.hieuwu.groceriesstore.presentation.authentication +import androidx.compose.runtime.MutableState import androidx.databinding.Bindable import androidx.lifecycle.viewModelScope import com.hieuwu.groceriesstore.BR @@ -7,7 +8,9 @@ import com.hieuwu.groceriesstore.domain.usecases.SignInUseCase import com.hieuwu.groceriesstore.presentation.utils.ObservableViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -22,34 +25,30 @@ class SignInViewModel @Inject constructor( private val _showAccountNotExistedError = MutableSharedFlow() val showAccountNotExistedError: SharedFlow = _showAccountNotExistedError - private var _email: String? = null - var email: String? - @Bindable - get() { - return _email - } - set(value) { - _email = value - notifyPropertyChanged(BR.email) - } - private var _password: String? = null - var password: String? - @Bindable - get() { - return _password - } - set(value) { - _password = value - notifyPropertyChanged(BR.password) - } + private val _email = MutableStateFlow("") + val email: StateFlow = _email + + private val _password = MutableStateFlow("") + val password: StateFlow = _password + fun onEmailChange(newEmail: String) { + _email.value = newEmail + } + + fun onRemoveText() { + _email.value = "" + } + + fun onPasswordChange(newPassword: String) { + _password.value = newPassword + } fun signIn() { viewModelScope.launch { val res = signInUseCase.execute( SignInUseCase.Input( - email = _email!!, - password = _password!! + email = _email.value, + password = _password.value ) ) From 46a12f27c1ae568ffebebd3947169bfcbd5a73a6 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Wed, 27 Sep 2023 23:01:53 +0700 Subject: [PATCH 05/27] Implement sign in screen with events --- .../authentication/SignInScreen.kt | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt index 25d5a219..2114b651 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt @@ -1,2 +1,47 @@ package com.hieuwu.groceriesstore.presentation.authentication +import androidx.compose.foundation.layout.Column +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Backspace +import androidx.compose.material.icons.filled.Email +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import com.hieuwu.groceriesstore.presentation.authentication.composables.IconTextInput + +@Composable +fun SignInScreen( + modifier: Modifier = Modifier, + viewModel: SignInViewModel = hiltViewModel() +) { + val email = viewModel.email.collectAsState() + val password = viewModel.password.collectAsState() + Column { + Text(text = "Sign In") + IconTextInput( + leadingIcon = Icons.Filled.Email, + trailingIcon = Icons.Filled.Backspace, + value = email.value, + placeholder = "Email", + onValueChange = { + viewModel.onEmailChange(it) + }, + onTrailingIconClick = { + viewModel.onRemoveText() + }, + ) + + IconTextInput( + leadingIcon = Icons.Filled.Email, + trailingIcon = Icons.Filled.Backspace, + value = password.value, + placeholder = "Password", + onValueChange = { + viewModel.onPasswordChange(it) + }, + onTrailingIconClick = {}, + ) + } +} \ No newline at end of file From ab8c95a623726b6a60cfbca867e71d2583a76f54 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Thu, 28 Sep 2023 22:21:33 +0700 Subject: [PATCH 06/27] Update spacing --- .../presentation/authentication/SignInScreen.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt index 2114b651..df2e0f3c 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/authentication/SignInScreen.kt @@ -1,6 +1,8 @@ package com.hieuwu.groceriesstore.presentation.authentication import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Backspace import androidx.compose.material.icons.filled.Email @@ -8,6 +10,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.hieuwu.groceriesstore.presentation.authentication.composables.IconTextInput @@ -32,7 +36,7 @@ fun SignInScreen( viewModel.onRemoveText() }, ) - + Spacer(modifier = modifier.height(12.dp)) IconTextInput( leadingIcon = Icons.Filled.Email, trailingIcon = Icons.Filled.Backspace, @@ -44,4 +48,4 @@ fun SignInScreen( onTrailingIconClick = {}, ) } -} \ No newline at end of file +} From c113a4199c990dc3ab934680af90e2c2f18a4e4c Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Thu, 28 Sep 2023 22:21:40 +0700 Subject: [PATCH 07/27] Remove unused properties --- app/src/main/res/layout/fragment_signin.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/fragment_signin.xml b/app/src/main/res/layout/fragment_signin.xml index 51bcd67a..68e0ae55 100644 --- a/app/src/main/res/layout/fragment_signin.xml +++ b/app/src/main/res/layout/fragment_signin.xml @@ -65,8 +65,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="monospace" - android:hint="@string/email" - android:text="@={signInViewModel.email}"/> + android:hint="@string/email"/> @@ -93,7 +92,7 @@ android:fontFamily="monospace" android:hint="@string/password" android:inputType="textPassword" - android:text="@={signInViewModel.password}"/> + /> From e3814eafb7f5752ab4d95b5bc865375e2fa6c405 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Thu, 28 Sep 2023 22:21:50 +0700 Subject: [PATCH 08/27] Update project config --- .idea/codeStyles/Project.xml | 2 -- .idea/kotlinc.xml | 6 ++++++ .idea/misc.xml | 3 +-- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 .idea/kotlinc.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 9b1c4b11..088f3dd7 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -9,8 +9,6 @@ -