Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.jeeldobariya.passcodes.ui

sealed interface LoadPasswordAction {
data object RefreshPassswordData: LoadPasswordAction
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,19 @@ 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)}",
getString(R.string.something_went_wrong_msg),
Toast.LENGTH_LONG
).show()
}
Expand All @@ -56,7 +54,7 @@ class LoadPasswordActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()

viewModel.loadInitialData()
viewModel.onAction(LoadPasswordAction.RefreshPassswordData)
}

// Added all the onclick event listeners
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.jeeldobariya.passcodes.ui

import com.jeeldobariya.passcodes.database.Password

data class LoadPasswordState(
val passwordEntityList: List<Password> = emptyList<Password>(),
val isError: Boolean = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,20 +14,23 @@ class LoadPasswordViewModel(
var controller: Controller
) : ViewModel() {

private val _passwordsListState = MutableStateFlow(emptyList<Password>())
val passwordsListState = _passwordsListState.asStateFlow()
private val _state = MutableStateFlow(LoadPasswordState())
val state = _state.asStateFlow()

private val _isErrorState = MutableStateFlow(false)
val isErrorState = _isErrorState.asStateFlow()
fun onAction(action: LoadPasswordAction) {
when (action) {
LoadPasswordAction.RefreshPassswordData -> { refreshData() }
}
}

fun loadInitialData() {
private fun refreshData() {
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()
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,14 @@ 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.onSavePasswordButtonClick()
if (!viewModel.isErrorState.value) {
viewModel.onAction(SavePasswordAction.OnSavePasswordButtonClick)

if (!viewModel.state.value.isError) {
finish()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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 = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -11,58 +11,47 @@ 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 _state = MutableStateFlow(SavePasswordState())
val state = _state.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()

fun onChangeDomainText(text: String) {
_domainState.update {
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() }
}
}

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) }
}

private fun onChangeNotesText(newNotes: String) {
_state.update { it.copy(notes = newNotes) }
}

fun onSavePasswordButtonClick() {
private fun savePasswordEntity() {
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) }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
Expand Up @@ -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(UpdatePasswordState())
val state = _state.asStateFlow()

fun loadInitialData(passwordId: Int) {
passwordEntityId = passwordId
Expand All @@ -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) }
}
}
}
Expand Down
Loading