Skip to content

Commit d36ab7d

Browse files
committed
handle states of password states
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
1 parent 4ccf2e2 commit d36ab7d

3 files changed

Lines changed: 78 additions & 58 deletions

File tree

app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt

Lines changed: 73 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import androidx.compose.foundation.layout.padding
3737
import androidx.compose.foundation.layout.size
3838
import androidx.compose.foundation.layout.statusBarsPadding
3939
import androidx.compose.foundation.layout.width
40+
import androidx.compose.foundation.layout.wrapContentHeight
4041
import androidx.compose.foundation.rememberScrollState
4142
import androidx.compose.foundation.shape.CircleShape
4243
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -81,6 +82,7 @@ import androidx.compose.ui.unit.dp
8182
import androidx.compose.ui.unit.sp
8283
import androidx.compose.ui.window.Dialog
8384
import androidx.lifecycle.ViewModelProvider
85+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
8486
import autodagger.AutoInjector
8587
import coil.compose.AsyncImage
8688
import com.nextcloud.talk.R
@@ -538,6 +540,7 @@ fun ConversationOptions(
538540
) {
539541
var showPasswordDialog by rememberSaveable { mutableStateOf(false) }
540542
var showPasswordChangeDialog by rememberSaveable { mutableStateOf(false) }
543+
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsStateWithLifecycle()
541544
Row(
542545
modifier = Modifier
543546
.fillMaxWidth()
@@ -578,35 +581,41 @@ fun ConversationOptions(
578581
if (showPasswordDialog) {
579582
ShowPasswordDialog(
580583
onDismiss = { showPasswordDialog = false },
581-
conversationCreationViewModel = conversationCreationViewModel
584+
conversationCreationViewModel = conversationCreationViewModel,
585+
passwordValidationState = passwordValidationState
582586
)
583587
}
584588
if (showPasswordChangeDialog) {
585589
ShowChangePassword(
586590
onDismiss = {
587591
showPasswordChangeDialog = false
588592
},
589-
conversationCreationViewModel = conversationCreationViewModel
593+
conversationCreationViewModel = conversationCreationViewModel,
594+
passwordValidationState = passwordValidationState
590595
)
591596
}
592597
}
593598
}
594599

595600
@Suppress("LongMethod")
596601
@Composable
597-
fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
602+
fun ShowChangePassword(
603+
onDismiss: () -> Unit,
604+
conversationCreationViewModel: ConversationCreationViewModel,
605+
passwordValidationState: ValidPasswordUiState
606+
) {
598607
var changedPassword by rememberSaveable { mutableStateOf("") }
599-
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsState()
600608
Dialog(onDismissRequest = {
601609
onDismiss()
602610
}) {
603611
Card(
604612
modifier = Modifier
605613
.fillMaxWidth()
606-
.height(375.dp)
614+
.wrapContentHeight()
607615
.padding(32.dp)
608616
.clip(RoundedCornerShape(16.dp))
609617
.background(color = colorResource(id = R.color.appbar))
618+
.verticalScroll(rememberScrollState())
610619
) {
611620
Column(
612621
modifier = Modifier
@@ -615,7 +624,8 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
615624
verticalArrangement = Arrangement.Center,
616625
horizontalAlignment = Alignment.CenterHorizontally
617626
) {
618-
val validatePasswordUrl = conversationCreationViewModel.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
627+
val validatePasswordUrl = conversationCreationViewModel
628+
.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
619629
Text(text = stringResource(id = R.string.nc_set_new_password), fontWeight = FontWeight.SemiBold)
620630
Spacer(modifier = Modifier.height(16.dp))
621631
OutlinedTextField(
@@ -630,27 +640,7 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
630640
singleLine = true
631641
)
632642
Spacer(modifier = Modifier.height(8.dp))
633-
when (passwordValidationState) {
634-
is ValidPasswordUiState.Success -> Text(
635-
text = (passwordValidationState as ValidPasswordUiState.Success).result.reason!!,
636-
color = if ((passwordValidationState as ValidPasswordUiState.Success).result.passed == false) {
637-
colorResource(
638-
id = R.color
639-
.nc_darkRed
640-
)
641-
} else {
642-
colorResource(id = R.color.nc_darkGreen)
643-
},
644-
modifier = Modifier.fillMaxWidth()
645-
)
646-
647-
is ValidPasswordUiState.Error -> {
648-
Text(text = (passwordValidationState as ValidPasswordUiState.Error).message)
649-
}
650-
651-
else -> {
652-
}
653-
}
643+
PasswordValidationMessage(passwordValidationState)
654644

655645
Column(
656646
modifier = Modifier
@@ -659,15 +649,18 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
659649
verticalArrangement = Arrangement.Center,
660650
horizontalAlignment = Alignment.CenterHorizontally
661651
) {
652+
val securePassword = (passwordValidationState as? ValidPasswordUiState.Success)?.result?.passed
653+
?: false
662654
TextButton(
663655
onClick = {
664656
conversationCreationViewModel.updatePassword(changedPassword)
665657
conversationCreationViewModel.isPasswordEnabled.value = true
658+
conversationCreationViewModel.resetPasswordViewState()
666659
onDismiss()
667660
},
668661
enabled = changedPassword.isNotEmpty() &&
669662
changedPassword.isNotBlank() &&
670-
(passwordValidationState as ValidPasswordUiState.Success).result.passed == true,
663+
securePassword,
671664
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
672665
) {
673666
Text(text = stringResource(id = R.string.nc_change_password))
@@ -676,6 +669,7 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
676669
TextButton(
677670
onClick = {
678671
conversationCreationViewModel.isPasswordEnabled.value = false
672+
conversationCreationViewModel.resetPasswordViewState()
679673
onDismiss()
680674
},
681675
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
@@ -687,7 +681,11 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
687681
}
688682
Spacer(modifier = Modifier.height(4.dp))
689683
TextButton(
690-
onClick = { onDismiss() },
684+
onClick = {
685+
conversationCreationViewModel.resetPasswordViewState()
686+
onDismiss()
687+
},
688+
691689
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
692690
) {
693691
Text(text = stringResource(id = R.string.nc_cancel))
@@ -699,16 +697,20 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
699697
}
700698

701699
@Composable
702-
fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
700+
fun ShowPasswordDialog(
701+
onDismiss: () -> Unit,
702+
conversationCreationViewModel: ConversationCreationViewModel,
703+
passwordValidationState: ValidPasswordUiState
704+
) {
703705
var password by rememberSaveable { mutableStateOf("") }
704-
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsState()
705-
val validatePasswordUrl = conversationCreationViewModel.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
706+
val validatePasswordUrl = conversationCreationViewModel
707+
.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
706708
AlertDialog(
707709
containerColor = colorResource(id = R.color.dialog_background),
708710
onDismissRequest = onDismiss,
709711
title = { Text(text = stringResource(id = R.string.nc_set_password)) },
710712
text = {
711-
Row {
713+
Column {
712714
TextField(
713715
value = password,
714716
onValueChange = {
@@ -720,51 +722,64 @@ fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: Con
720722
label = { Text(text = stringResource(id = R.string.nc_guest_access_password_dialog_hint)) }
721723
)
722724
Spacer(modifier = Modifier.height(8.dp))
723-
724-
when (passwordValidationState) {
725-
is ValidPasswordUiState.Success -> Text(
726-
text = (passwordValidationState as ValidPasswordUiState.Success).result.reason!!,
727-
color = if ((passwordValidationState as ValidPasswordUiState.Success).result.passed == false) {
728-
colorResource(
729-
id = R.color
730-
.nc_darkRed
731-
)
732-
} else {
733-
colorResource(id = R.color.nc_darkGreen)
734-
},
735-
modifier = Modifier.fillMaxWidth()
736-
)
737-
738-
is ValidPasswordUiState.Error -> {
739-
Text(text = (passwordValidationState as ValidPasswordUiState.Error).message)
740-
}
741-
742-
else -> {
743-
}
744-
}
725+
PasswordValidationMessage(passwordValidationState)
745726
}
746727
},
747728
confirmButton = {
729+
val securePassword = (passwordValidationState as? ValidPasswordUiState.Success)?.result?.passed
730+
?: false
748731
TextButton(
749732
onClick = {
750-
if (password.isNotEmpty() && password.isNotBlank()) {
733+
if (password.isNotEmpty() &&
734+
password.isNotBlank() &&
735+
securePassword
736+
) {
751737
conversationCreationViewModel.updatePassword(password)
752738
conversationCreationViewModel.isPasswordEnabled(true)
753-
onDismiss()
739+
conversationCreationViewModel.resetPasswordViewState()
754740
}
755741
}
756742
) {
757743
Text(text = stringResource(id = R.string.save))
758744
}
759745
},
760746
dismissButton = {
761-
TextButton(onClick = { onDismiss() }) {
747+
TextButton(onClick = {
748+
conversationCreationViewModel.resetPasswordViewState()
749+
onDismiss()
750+
}) {
762751
Text(text = stringResource(id = R.string.nc_cancel))
763752
}
764753
}
765754
)
766755
}
767756

757+
@Composable
758+
fun PasswordValidationMessage(passwordValidationState: ValidPasswordUiState) {
759+
when (passwordValidationState) {
760+
is ValidPasswordUiState.Success -> Text(
761+
text = passwordValidationState.result.reason
762+
?: stringResource(R.string.nc_password_secure),
763+
color = if ((passwordValidationState as ValidPasswordUiState.Success).result.passed == false) {
764+
colorResource(
765+
id = R.color
766+
.nc_darkRed
767+
)
768+
} else {
769+
colorResource(id = R.color.nc_darkGreen)
770+
},
771+
modifier = Modifier.fillMaxWidth()
772+
)
773+
774+
is ValidPasswordUiState.Error -> {
775+
Text(text = passwordValidationState.message)
776+
}
777+
778+
else -> {
779+
}
780+
}
781+
}
782+
768783
@Composable
769784
fun CreateConversation(conversationCreationViewModel: ConversationCreationViewModel, context: Context) {
770785
val selectedParticipants by conversationCreationViewModel.selectedParticipants.collectAsState()

app/src/main/java/com/nextcloud/talk/conversationcreation/viewmodel/ConversationCreationViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ class ConversationCreationViewModel @Inject constructor(
8585
_conversationDescription.value = conversationDescription
8686
}
8787

88+
fun resetPasswordViewState() {
89+
_validPasswordViewState.value = ValidPasswordUiState.None
90+
}
91+
8892
@Suppress("Detekt.TooGenericExceptionCaught")
8993
fun validatePassword(url: String, password: String) {
9094
val credentials = ApiUtils.getCredentials(_currentUser.username, _currentUser.token) ?: ""

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,4 +966,5 @@ How to translate with transifex:
966966
<string name="no_scheduled_messages_offline">No connection to server - Scheduled messages could not be loaded</string>
967967
<string name="nc_show_ecosystem_title">Show app switcher</string>
968968
<string name="nc_show_ecosystem_description">Nextcloud app suggestions in account chooser dialog</string>
969+
<string name="nc_password_secure">Password is secure</string>
969970
</resources>

0 commit comments

Comments
 (0)