From a39de5718ffc1053b8849054d6dae67aa60d4d12 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 26 Oct 2025 14:32:23 +0530 Subject: [PATCH 01/11] fix: delete button color on view password screen --- .../res/layout/activity_load_password.xml | 30 +++++++++---------- .../res/layout/activity_view_password.xml | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/layout/activity_load_password.xml b/app/src/main/res/layout/activity_load_password.xml index e86a016c..f1205acc 100644 --- a/app/src/main/res/layout/activity_load_password.xml +++ b/app/src/main/res/layout/activity_load_password.xml @@ -4,23 +4,23 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:orientation="vertical" + android:orientation="vertical" tools:context=".ui.LoadPasswordActivity" - android:padding="4sp" > + android:padding="4sp" > - + - + diff --git a/app/src/main/res/layout/activity_view_password.xml b/app/src/main/res/layout/activity_view_password.xml index 17f7650e..acab5923 100644 --- a/app/src/main/res/layout/activity_view_password.xml +++ b/app/src/main/res/layout/activity_view_password.xml @@ -91,7 +91,7 @@ Date: Sat, 8 Nov 2025 23:04:28 +0530 Subject: [PATCH 02/11] feat: add a state for save password screen --- .../passcodes/ui/SavePasswordActivity.kt | 2 +- .../passcodes/ui/SavePasswordState.kt | 9 ++++ .../passcodes/ui/SavePasswordViewModel.kt | 43 +++++-------------- 3 files changed, 21 insertions(+), 33 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt index 7b9c85fb..e1f5e181 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt @@ -60,7 +60,7 @@ class SavePasswordActivity : AppCompatActivity() { viewModel.onChangeNotesText(binding.inputNotes.text.toString()) viewModel.onSavePasswordButtonClick() - if (!viewModel.isErrorState.value) { + if (!viewModel.state.value.isError) { finish() } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt new file mode 100644 index 00000000..30a9292a --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt @@ -0,0 +1,9 @@ +package com.jeeldobariya.passcodes.ui + +data class SavePasswordState( + val domain: String, + val username: String, + val password: String, + val notes: String, + val isError: Boolean +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt index 793d648a..d841cd77 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt @@ -11,58 +11,37 @@ import kotlinx.coroutines.launch class SavePasswordViewModel( val controller: Controller ) : ViewModel() { - private val _domainState = MutableStateFlow("") - // val domainState = _domainState.asStateFlow() - private val _usernameState = MutableStateFlow("") - // val usernameState = _usernameState.asStateFlow() - - private val _passwordState = MutableStateFlow("") - // val passwordState = _passwordState.asStateFlow() - - private val _notesState = MutableStateFlow("") - // val notesState = _notesState.asStateFlow() - - private val _isErrorState = MutableStateFlow(false) - val isErrorState = _isErrorState.asStateFlow() + private val _state = MutableStateFlow(SavePasswordState("", "", "", "", false)) + val state = _state.asStateFlow() fun onChangeDomainText(text: String) { - _domainState.update { - text - } + _state.update { it.copy(domain = text) } } fun onChangeUsernameText(text: String) { - _usernameState.update { - text - } + _state.update { it.copy(username = text) } } fun onChangePasswordText(text: String) { - _passwordState.update { - text - } + _state.update { it.copy(password = text) } } fun onChangeNotesText(text: String) { - _notesState.update { - text - } + _state.update { it.copy(notes = text) } } fun onSavePasswordButtonClick() { viewModelScope.launch { try { controller.savePasswordEntity( - _domainState.value, - _usernameState.value, - _passwordState.value, - _notesState.value + _state.value.domain, + _state.value.username, + _state.value.password, + _state.value.notes ) } catch (e: Exception) { - _isErrorState.update { - true - } + _state.update { it.copy(isError = true) } } } } From 13aff03d951b136d54566c6ba488a9c0f5a11f67 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 9 Nov 2025 21:35:07 +0530 Subject: [PATCH 03/11] refactor: add a onaction function to make code clean for save password screen --- .../passcodes/ui/SavePasswordAction.kt | 9 ++++++ .../passcodes/ui/SavePasswordActivity.kt | 11 ++++---- .../passcodes/ui/SavePasswordViewModel.kt | 28 +++++++++++++------ 3 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt new file mode 100644 index 00000000..fb4af4cb --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt @@ -0,0 +1,9 @@ +package com.jeeldobariya.passcodes.ui + +sealed interface SavePasswordAction { + data class onChangeDomain(val newDomain: String): SavePasswordAction + data class onChangeUsername(val newUsername: String): SavePasswordAction + data class onChangePassword(val newPassword: String): SavePasswordAction + data class onChangeNotes(val newNotes: String): SavePasswordAction + data object onSavePasswordButtonClick: SavePasswordAction +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt index e1f5e181..69f97feb 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt @@ -54,12 +54,13 @@ class SavePasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.savePasswordBtn.setOnClickListener { - viewModel.onChangeDomainText(binding.inputDomain.text.toString()) - viewModel.onChangeUsernameText(binding.inputUsername.text.toString()) - viewModel.onChangePasswordText(binding.inputPassword.text.toString()) - viewModel.onChangeNotesText(binding.inputNotes.text.toString()) + viewModel.onAction(SavePasswordAction.onChangeDomain(binding.inputDomain.text.toString())) + viewModel.onAction(SavePasswordAction.onChangeUsername(binding.inputUsername.text.toString())) + viewModel.onAction(SavePasswordAction.onChangePassword(binding.inputPassword.text.toString())) + viewModel.onAction(SavePasswordAction.onChangeNotes(binding.inputNotes.text.toString())) + + viewModel.onAction(SavePasswordAction.onSavePasswordButtonClick) - viewModel.onSavePasswordButtonClick() if (!viewModel.state.value.isError) { finish() } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt index d841cd77..711ee593 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt @@ -15,23 +15,33 @@ class SavePasswordViewModel( private val _state = MutableStateFlow(SavePasswordState("", "", "", "", false)) val state = _state.asStateFlow() - fun onChangeDomainText(text: String) { - _state.update { it.copy(domain = text) } + fun onAction(action: SavePasswordAction) { + when (action) { + is SavePasswordAction.onChangeDomain -> { onChangeDomainText(action.newDomain) } + is SavePasswordAction.onChangeUsername -> { onChangeUsernameText(action.newUsername) } + is SavePasswordAction.onChangePassword -> { onChangePasswordText(action.newPassword) } + is SavePasswordAction.onChangeNotes -> { onChangeNotesText(action.newNotes) } + SavePasswordAction.onSavePasswordButtonClick -> { savePasswordEntity() } + } + } + + private fun onChangeDomainText(newDomain: String) { + _state.update { it.copy(domain = newDomain) } } - fun onChangeUsernameText(text: String) { - _state.update { it.copy(username = text) } + private fun onChangeUsernameText(newUsername: String) { + _state.update { it.copy(username = newUsername) } } - fun onChangePasswordText(text: String) { - _state.update { it.copy(password = text) } + private fun onChangePasswordText(newPassword: String) { + _state.update { it.copy(password = newPassword) } } - fun onChangeNotesText(text: String) { - _state.update { it.copy(notes = text) } + private fun onChangeNotesText(newNotes: String) { + _state.update { it.copy(notes = newNotes) } } - fun onSavePasswordButtonClick() { + private fun savePasswordEntity() { viewModelScope.launch { try { controller.savePasswordEntity( From 7fc91842cf63619ab33758d6ad71612a00c34fba Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 9 Nov 2025 21:42:14 +0530 Subject: [PATCH 04/11] refactor: add a default value for states --- .../com/jeeldobariya/passcodes/ui/SavePasswordState.kt | 10 +++++----- .../jeeldobariya/passcodes/ui/SavePasswordViewModel.kt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt index 30a9292a..01d1274c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordState.kt @@ -1,9 +1,9 @@ package com.jeeldobariya.passcodes.ui data class SavePasswordState( - val domain: String, - val username: String, - val password: String, - val notes: String, - val isError: Boolean + val domain: String = "", + val username: String = "", + val password: String = "", + val notes: String = "", + val isError: Boolean = false ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt index 711ee593..0e1aff7b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt @@ -12,7 +12,7 @@ class SavePasswordViewModel( val controller: Controller ) : ViewModel() { - private val _state = MutableStateFlow(SavePasswordState("", "", "", "", false)) + private val _state = MutableStateFlow(SavePasswordState()) val state = _state.asStateFlow() fun onAction(action: SavePasswordAction) { From ee1c1eaac9eebad4be133105f438785cc72807ea Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 9 Nov 2025 21:59:22 +0530 Subject: [PATCH 05/11] refactor: add onAction for update password screen --- .../passcodes/ui/UpdatePasswordAction.kt | 9 +++ .../passcodes/ui/UpdatePasswordActivity.kt | 28 +++---- .../passcodes/ui/UpdatePasswordState.kt | 9 +++ .../passcodes/ui/UpdatePasswordViewModel.kt | 78 ++++++++----------- 4 files changed, 63 insertions(+), 61 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordState.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt new file mode 100644 index 00000000..96d272b8 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt @@ -0,0 +1,9 @@ +package com.jeeldobariya.passcodes.ui + +sealed interface UpdatePasswordAction { + data class onChangeDomain(val newDomain: String): UpdatePasswordAction + data class onChangeUsername(val newUsername: String): UpdatePasswordAction + data class onChangePassword(val newPassword: String): UpdatePasswordAction + data class onChangeNotes(val newNotes: String): UpdatePasswordAction + data object onUpdatePasswordButtonClick: UpdatePasswordAction +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt index 287139ee..4fa80040 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt @@ -42,17 +42,11 @@ class UpdatePasswordActivity : AppCompatActivity() { binding.tvId.text = "${getString(R.string.id_prefix)} ${viewModel.passwordEntityId}" - collectLatestLifecycleFlow(viewModel.domainState) { domain -> - binding.inputDomain.setText(domain) - } - collectLatestLifecycleFlow(viewModel.usernameState) { username -> - binding.inputUsername.setText(username) - } - collectLatestLifecycleFlow(viewModel.passwordState) { password -> - binding.inputPassword.setText(password) - } - collectLatestLifecycleFlow(viewModel.notesState) { notes -> - binding.inputNotes.setText(notes) + collectLatestLifecycleFlow(viewModel.state) { state -> + binding.inputDomain.setText(state.domain) + binding.inputUsername.setText(state.username) + binding.inputPassword.setText(state.password) + binding.inputNotes.setText(state.notes) } // Add event onclick listener @@ -65,17 +59,17 @@ class UpdatePasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.updatePasswordBtn.setOnClickListener { - viewModel.onChangeDomainText(binding.inputDomain.text.toString()) - viewModel.onChangeUsernameText(binding.inputUsername.text.toString()) - viewModel.onChangePasswordText(binding.inputPassword.text.toString()) - viewModel.onChangeNotesText(binding.inputNotes.text.toString()) + viewModel.onAction(UpdatePasswordAction.onChangeDomain(binding.inputDomain.text.toString())) + viewModel.onAction(UpdatePasswordAction.onChangeUsername(binding.inputUsername.text.toString())) + viewModel.onAction(UpdatePasswordAction.onChangePassword(binding.inputPassword.text.toString())) + viewModel.onAction(UpdatePasswordAction.onChangeNotes(binding.inputNotes.text.toString())) val confirmDialog = AlertDialog.Builder(this@UpdatePasswordActivity) .setTitle(R.string.update_password_dialog_title) .setMessage(R.string.irreversible_dialog_desc) .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> - viewModel.onUpdatePasswordButtonClick() - if (!viewModel.isErrorState.value) { + viewModel.onAction(UpdatePasswordAction.onUpdatePasswordButtonClick) + if (!viewModel.state.value.isError) { finish() } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordState.kt new file mode 100644 index 00000000..1b4cefaa --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordState.kt @@ -0,0 +1,9 @@ +package com.jeeldobariya.passcodes.ui + +data class UpdatePasswordState( + val domain: String = "", + val username: String = "", + val password: String = "", + val notes: String = "", + val isError: Boolean = false +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt index 94800511..679e4959 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt @@ -15,20 +15,8 @@ class UpdatePasswordViewModel( var passwordEntityId: Int = -1 - private val _domainState = MutableStateFlow("") - val domainState = _domainState.asStateFlow() - - private val _usernameState = MutableStateFlow("") - val usernameState = _usernameState.asStateFlow() - - private val _passwordState = MutableStateFlow("") - val passwordState = _passwordState.asStateFlow() - - private val _notesState = MutableStateFlow("") - val notesState = _notesState.asStateFlow() - - private val _isErrorState = MutableStateFlow(false) - val isErrorState = _isErrorState.asStateFlow() + private val _state = MutableStateFlow(SavePasswordState()) + val state = _state.asStateFlow() fun loadInitialData(passwordId: Int) { passwordEntityId = passwordId @@ -37,56 +25,58 @@ class UpdatePasswordViewModel( try { val password: Password = controller.getPasswordById(passwordId) - _domainState.update { password.domain } - _usernameState.update { password.username } - _passwordState.update { password.password } - _notesState.update { password.notes } - } catch (e: Exception) { - _isErrorState.update { - true + _state.update { + it.copy( + domain = password.domain, + username = password.username, + password = password.password, + notes = password.notes + ) } + } catch (e: Exception) { + _state.update { it.copy(isError = false) } } } } - fun onChangeDomainText(text: String) { - _domainState.update { - text + fun onAction(action: UpdatePasswordAction) { + when (action) { + is UpdatePasswordAction.onChangeDomain -> { onChangeDomainText(action.newDomain) } + is UpdatePasswordAction.onChangeUsername -> { onChangeUsernameText(action.newUsername) } + is UpdatePasswordAction.onChangePassword -> { onChangePasswordText(action.newPassword) } + is UpdatePasswordAction.onChangeNotes -> { onChangeNotesText(action.newNotes) } + UpdatePasswordAction.onUpdatePasswordButtonClick -> { updatePasswordEntity() } } } - fun onChangeUsernameText(text: String) { - _usernameState.update { - text - } + private fun onChangeDomainText(newDomain: String) { + _state.update { it.copy(domain = newDomain) } } - fun onChangePasswordText(text: String) { - _passwordState.update { - text - } + private fun onChangeUsernameText(newUsername: String) { + _state.update { it.copy(username = newUsername) } } - fun onChangeNotesText(text: String) { - _notesState.update { - text - } + private fun onChangePasswordText(newPassword: String) { + _state.update { it.copy(password = newPassword) } } - fun onUpdatePasswordButtonClick() { + private fun onChangeNotesText(newNotes: String) { + _state.update { it.copy(notes = newNotes) } + } + + private fun updatePasswordEntity() { viewModelScope.launch { try { controller.updatePassword( passwordEntityId, - _domainState.value, - _usernameState.value, - _passwordState.value, - _notesState.value + _state.value.domain, + _state.value.username, + _state.value.password, + _state.value.notes ) } catch (e: Exception) { - _isErrorState.update { - true - } + _state.update { it.copy(isError = false) } } } } From f8a3add819d25acb380d6335d3916e8bc5efb890 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 12:26:51 +0530 Subject: [PATCH 06/11] fix: typo in state init, though it compile successfullygit add app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt --- .../com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt index 679e4959..be278823 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt @@ -15,7 +15,7 @@ class UpdatePasswordViewModel( var passwordEntityId: Int = -1 - private val _state = MutableStateFlow(SavePasswordState()) + private val _state = MutableStateFlow(UpdatePasswordState()) val state = _state.asStateFlow() fun loadInitialData(passwordId: Int) { From cd38379b3e62ea004fb838be5c472fc5e7983a88 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 12:31:40 +0530 Subject: [PATCH 07/11] refactor: the view password activity to follow MVI --- .../passcodes/ui/ViewPasswordAction.kt | 6 +++ .../passcodes/ui/ViewPasswordActivity.kt | 31 +++++------- .../passcodes/ui/ViewPasswordState.kt | 10 ++++ .../passcodes/ui/ViewPasswordViewModel.kt | 49 +++++++------------ 4 files changed, 46 insertions(+), 50 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordState.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt new file mode 100644 index 00000000..7f449bce --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt @@ -0,0 +1,6 @@ +package com.jeeldobariya.passcodes.ui + +sealed interface ViewPasswordAction { + // data object navigateUpdatePasswordAction: ViewPasswordAction + data object deletePasswordAction: ViewPasswordAction +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 54138ccd..c21a4de4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -45,28 +45,19 @@ class ViewPasswordActivity : AppCompatActivity() { viewModel.loadInitialData(passwordEntityId) - collectLatestLifecycleFlow(viewModel.domainState) { domain -> + collectLatestLifecycleFlow(viewModel.state) { state -> binding.tvDomain.text = - "${getString(R.string.domain_prefix)} $domain" - } - collectLatestLifecycleFlow(viewModel.usernameState) { username -> + "${getString(R.string.domain_prefix)} ${state.domain}" binding.tvUsername.text = - "${getString(R.string.username_prefix)} $username" - } - collectLatestLifecycleFlow(viewModel.passwordState) { password -> + "${getString(R.string.username_prefix)} ${state.username}" binding.tvPassword.text = - "${getString(R.string.password_prefix)} $password" - } - collectLatestLifecycleFlow(viewModel.notesState) { notes -> + "${getString(R.string.password_prefix)} ${state.password}" binding.tvNotes.text = - "${getString(R.string.notes_prefix)} $notes" - } - collectLatestLifecycleFlow(viewModel.lastUpdatedAtState) { lastUpdatedAt -> + "${getString(R.string.notes_prefix)} ${state.notes}" binding.tvUpdatedAt.text = - "${getString(R.string.updatedat_prefix)} $lastUpdatedAt" - } - collectLatestLifecycleFlow(viewModel.isErrorState) { error -> - if (error) { + "${getString(R.string.updatedat_prefix)} ${state.lastUpdatedAt}" + + if (state.isError) { Toast.makeText( this@ViewPasswordActivity, getString(R.string.something_went_wrong_msg), @@ -97,8 +88,8 @@ class ViewPasswordActivity : AppCompatActivity() { val clipboard = getSystemService(CLIPBOARD_SERVICE) as? ClipboardManager val clip: ClipData = ClipData.newPlainText( - viewModel.usernameState.value, - viewModel.passwordState.value + viewModel.state.value.username, + viewModel.state.value.password ) // Set the ClipData to the clipboard @@ -131,7 +122,7 @@ class ViewPasswordActivity : AppCompatActivity() { .setTitle(R.string.delete_password_dialog_title) .setMessage(R.string.irreversible_dialog_desc) .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> - runBlocking { viewModel.onDeletePasswordButtonClick() } + runBlocking { viewModel.onAction(ViewPasswordAction.deletePasswordAction) } finish() } .setNegativeButton(R.string.discard_dialog_button_text) { dialog, which -> diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordState.kt new file mode 100644 index 00000000..e5e7b099 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordState.kt @@ -0,0 +1,10 @@ +package com.jeeldobariya.passcodes.ui + +data class ViewPasswordState( + val domain: String = "", + val username: String = "", + val password: String = "", + val notes: String = "", + val lastUpdatedAt: String = "", + val isError: Boolean = false +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt index 425c82e0..4543b49a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt @@ -15,23 +15,8 @@ class ViewPasswordViewModel( ) : ViewModel() { var passwordEntityId: Int = -1 - private val _domainState = MutableStateFlow("") - val domainState = _domainState.asStateFlow() - - private val _usernameState = MutableStateFlow("") - val usernameState = _usernameState.asStateFlow() - - private val _passwordState = MutableStateFlow("") - val passwordState = _passwordState.asStateFlow() - - private val _notesState = MutableStateFlow("") - val notesState = _notesState.asStateFlow() - - private val _lastUpdatedAtState = MutableStateFlow("") - val lastUpdatedAtState = _lastUpdatedAtState.asStateFlow() - - private val _isErrorState = MutableStateFlow(false) - val isErrorState = _isErrorState.asStateFlow() + private val _state = MutableStateFlow(ViewPasswordState()) + val state = _state.asStateFlow() fun loadInitialData(passwordId: Int) { passwordEntityId = passwordId @@ -40,29 +25,33 @@ class ViewPasswordViewModel( try { val password: Password = controller.getPasswordById(passwordId) - _domainState.update { password.domain } - _usernameState.update { password.username } - _passwordState.update { password.password } - _notesState.update { password.notes } - _lastUpdatedAtState.update { - DateTimeUtils.getRelativeDays(password.updatedAt.orEmpty()) + _state.update { + it.copy( + domain = password.domain, + username = password.username, + password = password.password, + notes = password.notes, + lastUpdatedAt = DateTimeUtils.getRelativeDays(password.updatedAt.orEmpty()) + ) } } catch (_: Exception) { - _isErrorState.update { - true - } + _state.update { it.copy(isError = true) } } } } - fun onDeletePasswordButtonClick() { + fun onAction(action: ViewPasswordAction) { + when (action) { + ViewPasswordAction.deletePasswordAction -> { deletePasswordEntity() } + } + } + + private fun deletePasswordEntity() { viewModelScope.launch { try { controller.deletePassword(passwordEntityId) } catch (_: Exception) { - _isErrorState.update { - true - } + _state.update { it.copy(isError = true) } } } } From ca196ccea93f4a2c468bcacb85e2b4d873d90c83 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 18:27:58 +0530 Subject: [PATCH 08/11] refactor: the load password activity to follow MVI --- .../passcodes/ui/LoadPasswordActivity.kt | 10 ++++------ .../passcodes/ui/LoadPasswordState.kt | 8 ++++++++ .../passcodes/ui/LoadPasswordViewModel.kt | 20 ++++++++----------- 3 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index 39491487..a1206c37 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -26,18 +26,16 @@ class LoadPasswordActivity : AppCompatActivity() { binding = ActivityLoadPasswordBinding.inflate(layoutInflater) setContentView(binding.root) - collectLatestLifecycleFlow(viewModel.passwordsListState) { passwordList -> + collectLatestLifecycleFlow(viewModel.state) { state -> if (!this@LoadPasswordActivity::passwordAdapter.isInitialized) { passwordAdapter = - PasswordAdapter(this@LoadPasswordActivity, passwordList) + PasswordAdapter(this@LoadPasswordActivity, state.passwordEntityList) binding.passwordList.adapter = passwordAdapter } else { - passwordAdapter.updateData(passwordList) + passwordAdapter.updateData(state.passwordEntityList) } - } - collectLatestLifecycleFlow(viewModel.isErrorState) { error -> - if (error) { + if (state.isError) { Toast.makeText( this@LoadPasswordActivity, "${getString(R.string.something_went_wrong_msg)}", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt new file mode 100644 index 00000000..d46aee81 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt @@ -0,0 +1,8 @@ +package com.jeeldobariya.passcodes.ui + +import com.jeeldobariya.passcodes.database.Password + +data class LoadPasswordState( + val passwordEntityList: List = emptyList(), + val isError: Boolean = false +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt index e682e89b..51da6630 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt @@ -2,7 +2,6 @@ package com.jeeldobariya.passcodes.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -15,20 +14,17 @@ class LoadPasswordViewModel( var controller: Controller ) : ViewModel() { - private val _passwordsListState = MutableStateFlow(emptyList()) - val passwordsListState = _passwordsListState.asStateFlow() - - private val _isErrorState = MutableStateFlow(false) - val isErrorState = _isErrorState.asStateFlow() + private val _state = MutableStateFlow(LoadPasswordState()) + val state = _state.asStateFlow() fun loadInitialData() { viewModelScope.launch { - _passwordsListState.update { - controller.getAllPasswords().catch { - _isErrorState.update { - true - } - }.first() + _state.update { + LoadPasswordState( + passwordEntityList = controller.getAllPasswords().catch { + _state.update { it.copy(isError = true) } + }.first() + ) } } } From a7bf41006eaacecac223b0e4571fcf693ea53225 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 18:45:18 +0530 Subject: [PATCH 09/11] refactor: made LoadPasswordAction for all action releated to LoadPassword --- .../com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt | 5 +++++ .../com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt | 4 ++-- .../jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt new file mode 100644 index 00000000..a782fff2 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt @@ -0,0 +1,5 @@ +package com.jeeldobariya.passcodes.ui + +sealed interface LoadPasswordAction { + data object refreshPassswordData: LoadPasswordAction +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index a1206c37..4bc26aec 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -38,7 +38,7 @@ class LoadPasswordActivity : AppCompatActivity() { if (state.isError) { Toast.makeText( this@LoadPasswordActivity, - "${getString(R.string.something_went_wrong_msg)}", + getString(R.string.something_went_wrong_msg), Toast.LENGTH_LONG ).show() } @@ -54,7 +54,7 @@ class LoadPasswordActivity : AppCompatActivity() { override fun onResume() { super.onResume() - viewModel.loadInitialData() + viewModel.onAction(LoadPasswordAction.refreshPassswordData) } // Added all the onclick event listeners diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt index 51da6630..507df903 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt @@ -17,7 +17,13 @@ class LoadPasswordViewModel( private val _state = MutableStateFlow(LoadPasswordState()) val state = _state.asStateFlow() - fun loadInitialData() { + fun onAction(action: LoadPasswordAction) { + when (action) { + LoadPasswordAction.refreshPassswordData -> { refreshData() } + } + } + + private fun refreshData() { viewModelScope.launch { _state.update { LoadPasswordState( From d702d9f8f8c37a920a0b81326a78bab639881396 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 18:56:56 +0530 Subject: [PATCH 10/11] fix: inconsitent password issue after upadteing password --- .../passcodes/ui/ViewPasswordAction.kt | 2 ++ .../passcodes/ui/ViewPasswordActivity.kt | 7 ++++++- .../passcodes/ui/ViewPasswordViewModel.kt | 16 +++++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt index 7f449bce..90757976 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt @@ -1,6 +1,8 @@ package com.jeeldobariya.passcodes.ui sealed interface ViewPasswordAction { + data class loadPassswordData(val passwordId: Int): ViewPasswordAction + data object refreshPassswordData: ViewPasswordAction // data object navigateUpdatePasswordAction: ViewPasswordAction data object deletePasswordAction: ViewPasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index c21a4de4..0011eaa4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -43,7 +43,7 @@ class ViewPasswordActivity : AppCompatActivity() { return // Exit onCreate if ID is invalid } - viewModel.loadInitialData(passwordEntityId) + viewModel.onAction(ViewPasswordAction.loadPassswordData(passwordEntityId)) collectLatestLifecycleFlow(viewModel.state) { state -> binding.tvDomain.text = @@ -76,6 +76,11 @@ class ViewPasswordActivity : AppCompatActivity() { WindowCompat.setDecorFitsSystemWindows(window, false) } + override fun onResume() { + super.onResume() + viewModel.onAction(ViewPasswordAction.refreshPassswordData) + } + // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.copyPasswordBtn.setOnClickListener { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt index 4543b49a..7ceb07fe 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt @@ -18,7 +18,15 @@ class ViewPasswordViewModel( private val _state = MutableStateFlow(ViewPasswordState()) val state = _state.asStateFlow() - fun loadInitialData(passwordId: Int) { + fun onAction(action: ViewPasswordAction) { + when (action) { + is ViewPasswordAction.loadPassswordData -> { refreshData(action.passwordId) } + ViewPasswordAction.refreshPassswordData -> { refreshData(passwordEntityId) } + ViewPasswordAction.deletePasswordAction -> { deletePasswordEntity() } + } + } + + private fun refreshData(passwordId: Int) { passwordEntityId = passwordId viewModelScope.launch { @@ -40,12 +48,6 @@ class ViewPasswordViewModel( } } - fun onAction(action: ViewPasswordAction) { - when (action) { - ViewPasswordAction.deletePasswordAction -> { deletePasswordEntity() } - } - } - private fun deletePasswordEntity() { viewModelScope.launch { try { From 5bcd71f5ad03a1d201524baf0c253aafc1f85f7f Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 10 Nov 2025 19:04:49 +0530 Subject: [PATCH 11/11] lint: formated & styling, in class & object names --- .../jeeldobariya/passcodes/ui/LoadPasswordAction.kt | 2 +- .../jeeldobariya/passcodes/ui/LoadPasswordActivity.kt | 2 +- .../jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt | 2 +- .../jeeldobariya/passcodes/ui/SavePasswordAction.kt | 10 +++++----- .../jeeldobariya/passcodes/ui/SavePasswordActivity.kt | 10 +++++----- .../jeeldobariya/passcodes/ui/SavePasswordViewModel.kt | 10 +++++----- .../jeeldobariya/passcodes/ui/UpdatePasswordAction.kt | 10 +++++----- .../passcodes/ui/UpdatePasswordActivity.kt | 10 +++++----- .../passcodes/ui/UpdatePasswordViewModel.kt | 10 +++++----- .../jeeldobariya/passcodes/ui/ViewPasswordAction.kt | 8 ++++---- .../jeeldobariya/passcodes/ui/ViewPasswordActivity.kt | 6 +++--- .../jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt | 6 +++--- 12 files changed, 43 insertions(+), 43 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt index a782fff2..5259e82a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt @@ -1,5 +1,5 @@ package com.jeeldobariya.passcodes.ui sealed interface LoadPasswordAction { - data object refreshPassswordData: LoadPasswordAction + data object RefreshPassswordData: LoadPasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index 4bc26aec..70ee5a51 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -54,7 +54,7 @@ class LoadPasswordActivity : AppCompatActivity() { override fun onResume() { super.onResume() - viewModel.onAction(LoadPasswordAction.refreshPassswordData) + viewModel.onAction(LoadPasswordAction.RefreshPassswordData) } // Added all the onclick event listeners diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt index 507df903..5e66a5b2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt @@ -19,7 +19,7 @@ class LoadPasswordViewModel( fun onAction(action: LoadPasswordAction) { when (action) { - LoadPasswordAction.refreshPassswordData -> { refreshData() } + LoadPasswordAction.RefreshPassswordData -> { refreshData() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt index fb4af4cb..7bf6105d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordAction.kt @@ -1,9 +1,9 @@ package com.jeeldobariya.passcodes.ui sealed interface SavePasswordAction { - data class onChangeDomain(val newDomain: String): SavePasswordAction - data class onChangeUsername(val newUsername: String): SavePasswordAction - data class onChangePassword(val newPassword: String): SavePasswordAction - data class onChangeNotes(val newNotes: String): SavePasswordAction - data object onSavePasswordButtonClick: SavePasswordAction + data class OnChangeDomain(val newDomain: String): SavePasswordAction + data class OnChangeUsername(val newUsername: String): SavePasswordAction + data class OnChangePassword(val newPassword: String): SavePasswordAction + data class OnChangeNotes(val newNotes: String): SavePasswordAction + data object OnSavePasswordButtonClick: SavePasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt index 69f97feb..a17990c8 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt @@ -54,12 +54,12 @@ class SavePasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.savePasswordBtn.setOnClickListener { - viewModel.onAction(SavePasswordAction.onChangeDomain(binding.inputDomain.text.toString())) - viewModel.onAction(SavePasswordAction.onChangeUsername(binding.inputUsername.text.toString())) - viewModel.onAction(SavePasswordAction.onChangePassword(binding.inputPassword.text.toString())) - viewModel.onAction(SavePasswordAction.onChangeNotes(binding.inputNotes.text.toString())) + viewModel.onAction(SavePasswordAction.OnChangeDomain(binding.inputDomain.text.toString())) + viewModel.onAction(SavePasswordAction.OnChangeUsername(binding.inputUsername.text.toString())) + viewModel.onAction(SavePasswordAction.OnChangePassword(binding.inputPassword.text.toString())) + viewModel.onAction(SavePasswordAction.OnChangeNotes(binding.inputNotes.text.toString())) - viewModel.onAction(SavePasswordAction.onSavePasswordButtonClick) + viewModel.onAction(SavePasswordAction.OnSavePasswordButtonClick) if (!viewModel.state.value.isError) { finish() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt index 0e1aff7b..0fb9759e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordViewModel.kt @@ -17,11 +17,11 @@ class SavePasswordViewModel( fun onAction(action: SavePasswordAction) { when (action) { - is SavePasswordAction.onChangeDomain -> { onChangeDomainText(action.newDomain) } - is SavePasswordAction.onChangeUsername -> { onChangeUsernameText(action.newUsername) } - is SavePasswordAction.onChangePassword -> { onChangePasswordText(action.newPassword) } - is SavePasswordAction.onChangeNotes -> { onChangeNotesText(action.newNotes) } - SavePasswordAction.onSavePasswordButtonClick -> { savePasswordEntity() } + is SavePasswordAction.OnChangeDomain -> { onChangeDomainText(action.newDomain) } + is SavePasswordAction.OnChangeUsername -> { onChangeUsernameText(action.newUsername) } + is SavePasswordAction.OnChangePassword -> { onChangePasswordText(action.newPassword) } + is SavePasswordAction.OnChangeNotes -> { onChangeNotesText(action.newNotes) } + SavePasswordAction.OnSavePasswordButtonClick -> { savePasswordEntity() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt index 96d272b8..98fd3742 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordAction.kt @@ -1,9 +1,9 @@ package com.jeeldobariya.passcodes.ui sealed interface UpdatePasswordAction { - data class onChangeDomain(val newDomain: String): UpdatePasswordAction - data class onChangeUsername(val newUsername: String): UpdatePasswordAction - data class onChangePassword(val newPassword: String): UpdatePasswordAction - data class onChangeNotes(val newNotes: String): UpdatePasswordAction - data object onUpdatePasswordButtonClick: UpdatePasswordAction + data class OnChangeDomain(val newDomain: String): UpdatePasswordAction + data class OnChangeUsername(val newUsername: String): UpdatePasswordAction + data class OnChangePassword(val newPassword: String): UpdatePasswordAction + data class OnChangeNotes(val newNotes: String): UpdatePasswordAction + data object OnUpdatePasswordButtonClick: UpdatePasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt index 4fa80040..172b5559 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt @@ -59,16 +59,16 @@ class UpdatePasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.updatePasswordBtn.setOnClickListener { - viewModel.onAction(UpdatePasswordAction.onChangeDomain(binding.inputDomain.text.toString())) - viewModel.onAction(UpdatePasswordAction.onChangeUsername(binding.inputUsername.text.toString())) - viewModel.onAction(UpdatePasswordAction.onChangePassword(binding.inputPassword.text.toString())) - viewModel.onAction(UpdatePasswordAction.onChangeNotes(binding.inputNotes.text.toString())) + viewModel.onAction(UpdatePasswordAction.OnChangeDomain(binding.inputDomain.text.toString())) + viewModel.onAction(UpdatePasswordAction.OnChangeUsername(binding.inputUsername.text.toString())) + viewModel.onAction(UpdatePasswordAction.OnChangePassword(binding.inputPassword.text.toString())) + viewModel.onAction(UpdatePasswordAction.OnChangeNotes(binding.inputNotes.text.toString())) val confirmDialog = AlertDialog.Builder(this@UpdatePasswordActivity) .setTitle(R.string.update_password_dialog_title) .setMessage(R.string.irreversible_dialog_desc) .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> - viewModel.onAction(UpdatePasswordAction.onUpdatePasswordButtonClick) + viewModel.onAction(UpdatePasswordAction.OnUpdatePasswordButtonClick) if (!viewModel.state.value.isError) { finish() } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt index be278823..050d75ba 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordViewModel.kt @@ -41,11 +41,11 @@ class UpdatePasswordViewModel( fun onAction(action: UpdatePasswordAction) { when (action) { - is UpdatePasswordAction.onChangeDomain -> { onChangeDomainText(action.newDomain) } - is UpdatePasswordAction.onChangeUsername -> { onChangeUsernameText(action.newUsername) } - is UpdatePasswordAction.onChangePassword -> { onChangePasswordText(action.newPassword) } - is UpdatePasswordAction.onChangeNotes -> { onChangeNotesText(action.newNotes) } - UpdatePasswordAction.onUpdatePasswordButtonClick -> { updatePasswordEntity() } + is UpdatePasswordAction.OnChangeDomain -> { onChangeDomainText(action.newDomain) } + is UpdatePasswordAction.OnChangeUsername -> { onChangeUsernameText(action.newUsername) } + is UpdatePasswordAction.OnChangePassword -> { onChangePasswordText(action.newPassword) } + is UpdatePasswordAction.OnChangeNotes -> { onChangeNotesText(action.newNotes) } + UpdatePasswordAction.OnUpdatePasswordButtonClick -> { updatePasswordEntity() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt index 90757976..741dd1ec 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt @@ -1,8 +1,8 @@ package com.jeeldobariya.passcodes.ui sealed interface ViewPasswordAction { - data class loadPassswordData(val passwordId: Int): ViewPasswordAction - data object refreshPassswordData: ViewPasswordAction - // data object navigateUpdatePasswordAction: ViewPasswordAction - data object deletePasswordAction: ViewPasswordAction + data class LoadPassswordData(val passwordId: Int): ViewPasswordAction + data object RefreshPassswordData: ViewPasswordAction + // data object NavigateUpdatePasswordAction: ViewPasswordAction + data object DeletePasswordAction: ViewPasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 0011eaa4..5e786816 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -43,7 +43,7 @@ class ViewPasswordActivity : AppCompatActivity() { return // Exit onCreate if ID is invalid } - viewModel.onAction(ViewPasswordAction.loadPassswordData(passwordEntityId)) + viewModel.onAction(ViewPasswordAction.LoadPassswordData(passwordEntityId)) collectLatestLifecycleFlow(viewModel.state) { state -> binding.tvDomain.text = @@ -78,7 +78,7 @@ class ViewPasswordActivity : AppCompatActivity() { override fun onResume() { super.onResume() - viewModel.onAction(ViewPasswordAction.refreshPassswordData) + viewModel.onAction(ViewPasswordAction.RefreshPassswordData) } // Added all the onclick event listeners @@ -127,7 +127,7 @@ class ViewPasswordActivity : AppCompatActivity() { .setTitle(R.string.delete_password_dialog_title) .setMessage(R.string.irreversible_dialog_desc) .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> - runBlocking { viewModel.onAction(ViewPasswordAction.deletePasswordAction) } + runBlocking { viewModel.onAction(ViewPasswordAction.DeletePasswordAction) } finish() } .setNegativeButton(R.string.discard_dialog_button_text) { dialog, which -> diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt index 7ceb07fe..c0eec635 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt @@ -20,9 +20,9 @@ class ViewPasswordViewModel( fun onAction(action: ViewPasswordAction) { when (action) { - is ViewPasswordAction.loadPassswordData -> { refreshData(action.passwordId) } - ViewPasswordAction.refreshPassswordData -> { refreshData(passwordEntityId) } - ViewPasswordAction.deletePasswordAction -> { deletePasswordEntity() } + is ViewPasswordAction.LoadPassswordData -> { refreshData(action.passwordId) } + ViewPasswordAction.RefreshPassswordData -> { refreshData(passwordEntityId) } + ViewPasswordAction.DeletePasswordAction -> { deletePasswordEntity() } } }