Skip to content

Commit

Permalink
Refactor- [:feature:update-password] Apply & Fix Detekt, Ktlint Rules (
Browse files Browse the repository at this point in the history
  • Loading branch information
niyajali authored Sep 2, 2024
1 parent 5bf2744 commit 6e237c3
Show file tree
Hide file tree
Showing 17 changed files with 524 additions and 491 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,7 @@ fun RootNavGraph(
navigateToChangePassword = navController::navigateToUpdatePassword
)

updatePasswordNavGraph(
navController = navController,
)
updatePasswordNavGraph(navigateBack = navController::popBackStack)

thirdPartyTransferNavGraph(
navController = navController,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.junit.runner.RunWith
import org.mifos.mobile.core.data.repository.ClientRepository
import org.mifos.mobile.core.data.repository.UserAuthRepository
import org.mifos.mobile.feature.registration.utils.RegistrationUiState
import org.mifos.mobile.feature.update.password.UpdatePasswordViewModel
import org.mifos.mobile.util.RxSchedulersOverrideRule
import org.mockito.Mock
import org.mockito.Mockito
Expand All @@ -39,13 +40,13 @@ class UpdatePasswordViewModelTest {
@Mock
lateinit var clientRepositoryImp: ClientRepository

private lateinit var updatePasswordViewModel: org.mifos.mobile.feature.update_password.UpdatePasswordViewModel
private lateinit var updatePasswordViewModel: UpdatePasswordViewModel

@Before
fun setUp() {
MockitoAnnotations.openMocks(this)
updatePasswordViewModel =
org.mifos.mobile.feature.update_password.UpdatePasswordViewModel(
UpdatePasswordViewModel(
userAuthRepositoryImp,
clientRepositoryImp
)
Expand Down
20 changes: 10 additions & 10 deletions feature/update-password/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
plugins {
alias(libs.plugins.mifos.android.feature)
alias(libs.plugins.mifos.android.library.compose)
Expand All @@ -8,13 +17,4 @@ android {
namespace = "org.mifos.mobile.feature.update.password"
}

dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
implementation(projects.core.model)
implementation(projects.core.data)

testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
dependencies { }

This file was deleted.

9 changes: 9 additions & 0 deletions feature/update-password/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
package org.mifos.mobile.feature.update.password

import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation.Companion.None
import androidx.compose.ui.unit.dp
import org.mifos.mobile.core.designsystem.components.MifosButton
import org.mifos.mobile.core.designsystem.components.MifosOutlinedTextField
import org.mifos.mobile.core.designsystem.icons.MifosIcons

@Composable
internal fun UpdatePasswordContent(
updatePasswordButtonClicked: () -> Unit,
validateAndUpdatePassword: (PasswordValidationParams) -> Unit,
modifier: Modifier = Modifier,
) {
var newPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(""))
}
var confirmPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(""))
}

var newPasswordVisible by rememberSaveable { mutableStateOf(false) }
var confirmPasswordVisible by rememberSaveable { mutableStateOf(false) }

var newPasswordError by rememberSaveable { mutableStateOf(false) }
var confirmPasswordError by rememberSaveable { mutableStateOf(false) }

var newPasswordErrorContent by rememberSaveable { mutableStateOf("") }
var confirmPasswordErrorContent by rememberSaveable { mutableStateOf("") }

val keyboardController = LocalSoftwareKeyboardController.current

Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
PasswordTextField(
value = newPassword,
onValueChange = {
newPassword = it
newPasswordError = false
},
label = R.string.new_password,
errorContent = newPasswordErrorContent,
isError = newPasswordError,
isVisible = newPasswordVisible,
onVisibilityChange = { newPasswordVisible = it },
)

PasswordTextField(
value = confirmPassword,
onValueChange = {
confirmPassword = it
confirmPasswordError = false
},
label = R.string.confirm_password,
errorContent = confirmPasswordErrorContent,
isError = confirmPasswordError,
isVisible = confirmPasswordVisible,
onVisibilityChange = { confirmPasswordVisible = it },
)

UpdatePasswordButton(
onClick = {
keyboardController?.hide()
updatePasswordButtonClicked()
validateAndUpdatePassword(
PasswordValidationParams(
newPassword = newPassword.text,
confirmPassword = confirmPassword.text,
setNewPasswordError = { newPasswordError = it },
setConfirmPasswordError = { confirmPasswordError = it },
setNewPasswordErrorContent = { newPasswordErrorContent = it },
setConfirmPasswordErrorContent = { confirmPasswordErrorContent = it },
),
)
},
)
}
}

@Composable
private fun PasswordTextField(
value: TextFieldValue,
onValueChange: (TextFieldValue) -> Unit,
@StringRes label: Int,
errorContent: String,
isError: Boolean,
isVisible: Boolean,
onVisibilityChange: (Boolean) -> Unit,
modifier: Modifier = Modifier,
) {
MifosOutlinedTextField(
value = value,
onValueChange = onValueChange,
label = label,
supportingText = errorContent,
icon = R.drawable.feature_update_password_lock,
trailingIcon = {
val image = if (isVisible) MifosIcons.Visibility else MifosIcons.VisibilityOff
if (!isError) {
IconButton(onClick = { onVisibilityChange(!isVisible) }) {
Icon(imageVector = image, contentDescription = "password visibility button")
}
} else {
Icon(imageVector = MifosIcons.Error, contentDescription = null)
}
},
error = isError,
visualTransformation = if (isVisible) None else PasswordVisualTransformation(),
keyboardType = KeyboardType.Password,
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)
}

@Composable
private fun UpdatePasswordButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
MifosButton(
onClick = onClick,
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 4.dp),
contentPadding = PaddingValues(12.dp),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary,
),
) {
Text(text = stringResource(id = R.string.change_password))
}
}

data class PasswordValidationParams(
val newPassword: String,
val confirmPassword: String,
val setNewPasswordError: (Boolean) -> Unit,
val setConfirmPasswordError: (Boolean) -> Unit,
val setNewPasswordErrorContent: (String) -> Unit,
val setConfirmPasswordErrorContent: (String) -> Unit,
)
Loading

0 comments on commit 6e237c3

Please sign in to comment.