Skip to content

Commit af95b98

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

3 files changed

Lines changed: 78 additions & 57 deletions

File tree

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

Lines changed: 73 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import androidx.compose.foundation.layout.padding
3838
import androidx.compose.foundation.layout.size
3939
import androidx.compose.foundation.layout.statusBarsPadding
4040
import androidx.compose.foundation.layout.width
41+
import androidx.compose.foundation.layout.wrapContentHeight
4142
import androidx.compose.foundation.rememberScrollState
4243
import androidx.compose.foundation.shape.CircleShape
4344
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
@@ -533,6 +535,7 @@ fun ConversationOptions(
533535
) {
534536
var showPasswordDialog by rememberSaveable { mutableStateOf(false) }
535537
var showPasswordChangeDialog by rememberSaveable { mutableStateOf(false) }
538+
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsStateWithLifecycle()
536539
Row(
537540
modifier = Modifier
538541
.fillMaxWidth()
@@ -573,35 +576,41 @@ fun ConversationOptions(
573576
if (showPasswordDialog) {
574577
ShowPasswordDialog(
575578
onDismiss = { showPasswordDialog = false },
576-
conversationCreationViewModel = conversationCreationViewModel
579+
conversationCreationViewModel = conversationCreationViewModel,
580+
passwordValidationState = passwordValidationState
577581
)
578582
}
579583
if (showPasswordChangeDialog) {
580584
ShowChangePassword(
581585
onDismiss = {
582586
showPasswordChangeDialog = false
583587
},
584-
conversationCreationViewModel = conversationCreationViewModel
588+
conversationCreationViewModel = conversationCreationViewModel,
589+
passwordValidationState = passwordValidationState
585590
)
586591
}
587592
}
588593
}
589594

590595
@Suppress("LongMethod")
591596
@Composable
592-
fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
597+
fun ShowChangePassword(
598+
onDismiss: () -> Unit,
599+
conversationCreationViewModel: ConversationCreationViewModel,
600+
passwordValidationState: ValidPasswordUiState
601+
) {
593602
var changedPassword by rememberSaveable { mutableStateOf("") }
594-
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsState()
595603
Dialog(onDismissRequest = {
596604
onDismiss()
597605
}) {
598606
Card(
599607
modifier = Modifier
600608
.fillMaxWidth()
601-
.height(375.dp)
609+
.wrapContentHeight()
602610
.padding(32.dp)
603611
.clip(RoundedCornerShape(16.dp))
604612
.background(color = colorResource(id = R.color.appbar))
613+
.verticalScroll(rememberScrollState())
605614
) {
606615
Column(
607616
modifier = Modifier
@@ -610,7 +619,8 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
610619
verticalArrangement = Arrangement.Center,
611620
horizontalAlignment = Alignment.CenterHorizontally
612621
) {
613-
val validatePasswordUrl = conversationCreationViewModel.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
622+
val validatePasswordUrl = conversationCreationViewModel
623+
.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
614624
Text(text = stringResource(id = R.string.nc_set_new_password), fontWeight = FontWeight.SemiBold)
615625
Spacer(modifier = Modifier.height(16.dp))
616626
OutlinedTextField(
@@ -625,27 +635,7 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
625635
singleLine = true
626636
)
627637
Spacer(modifier = Modifier.height(8.dp))
628-
when (passwordValidationState) {
629-
is ValidPasswordUiState.Success -> Text(
630-
text = (passwordValidationState as ValidPasswordUiState.Success).result.reason!!,
631-
color = if ((passwordValidationState as ValidPasswordUiState.Success).result.passed == false) {
632-
colorResource(
633-
id = R.color
634-
.nc_darkRed
635-
)
636-
} else {
637-
colorResource(id = R.color.nc_darkGreen)
638-
},
639-
modifier = Modifier.fillMaxWidth()
640-
)
641-
642-
is ValidPasswordUiState.Error -> {
643-
Text(text = (passwordValidationState as ValidPasswordUiState.Error).message)
644-
}
645-
646-
else -> {
647-
}
648-
}
638+
PasswordValidationMessage(passwordValidationState)
649639

650640
Column(
651641
modifier = Modifier
@@ -654,15 +644,18 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
654644
verticalArrangement = Arrangement.Center,
655645
horizontalAlignment = Alignment.CenterHorizontally
656646
) {
647+
val securePassword = (passwordValidationState as? ValidPasswordUiState.Success)?.result?.passed
648+
?: false
657649
TextButton(
658650
onClick = {
659651
conversationCreationViewModel.updatePassword(changedPassword)
660652
conversationCreationViewModel.isPasswordEnabled.value = true
653+
conversationCreationViewModel.resetPasswordViewState()
661654
onDismiss()
662655
},
663656
enabled = changedPassword.isNotEmpty() &&
664657
changedPassword.isNotBlank() &&
665-
(passwordValidationState as ValidPasswordUiState.Success).result.passed == true,
658+
securePassword,
666659
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
667660
) {
668661
Text(text = stringResource(id = R.string.nc_change_password))
@@ -671,6 +664,7 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
671664
TextButton(
672665
onClick = {
673666
conversationCreationViewModel.isPasswordEnabled.value = false
667+
conversationCreationViewModel.resetPasswordViewState()
674668
onDismiss()
675669
},
676670
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
@@ -682,7 +676,11 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
682676
}
683677
Spacer(modifier = Modifier.height(4.dp))
684678
TextButton(
685-
onClick = { onDismiss() },
679+
onClick = {
680+
conversationCreationViewModel.resetPasswordViewState()
681+
onDismiss()
682+
},
683+
686684
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
687685
) {
688686
Text(text = stringResource(id = R.string.nc_cancel))
@@ -694,16 +692,20 @@ fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: Con
694692
}
695693

696694
@Composable
697-
fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
695+
fun ShowPasswordDialog(
696+
onDismiss: () -> Unit,
697+
conversationCreationViewModel: ConversationCreationViewModel,
698+
passwordValidationState: ValidPasswordUiState
699+
) {
698700
var password by rememberSaveable { mutableStateOf("") }
699-
val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsState()
700-
val validatePasswordUrl = conversationCreationViewModel.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
701+
val validatePasswordUrl = conversationCreationViewModel
702+
.currentUser.capabilities?.passwordCapability?.api?.validatePasswordApi
701703
AlertDialog(
702704
containerColor = colorResource(id = R.color.dialog_background),
703705
onDismissRequest = onDismiss,
704706
title = { Text(text = stringResource(id = R.string.nc_set_password)) },
705707
text = {
706-
Row {
708+
Column {
707709
TextField(
708710
value = password,
709711
onValueChange = {
@@ -715,50 +717,64 @@ fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: Con
715717
label = { Text(text = stringResource(id = R.string.nc_guest_access_password_dialog_hint)) }
716718
)
717719
Spacer(modifier = Modifier.height(8.dp))
718-
719-
when (passwordValidationState) {
720-
is ValidPasswordUiState.Success -> Text(
721-
text = (passwordValidationState as ValidPasswordUiState.Success).result.reason!!,
722-
color = if ((passwordValidationState as ValidPasswordUiState.Success).result.passed == false) {
723-
colorResource(
724-
id = R.color
725-
.nc_darkRed
726-
)
727-
} else {
728-
colorResource(id = R.color.nc_darkGreen)
729-
},
730-
modifier = Modifier.fillMaxWidth()
731-
)
732-
733-
is ValidPasswordUiState.Error -> {
734-
Text(text = (passwordValidationState as ValidPasswordUiState.Error).message)
735-
}
736-
737-
else -> {
738-
}
739-
}
720+
PasswordValidationMessage(passwordValidationState)
740721
}
741722
},
742723
confirmButton = {
724+
val securePassword = (passwordValidationState as? ValidPasswordUiState.Success)?.result?.passed
725+
?: false
743726
TextButton(
744727
onClick = {
745-
if (password.isNotEmpty() && password.isNotBlank()) {
728+
if (password.isNotEmpty() &&
729+
password.isNotBlank() &&
730+
securePassword
731+
) {
746732
conversationCreationViewModel.updatePassword(password)
747733
conversationCreationViewModel.isPasswordEnabled(true)
734+
conversationCreationViewModel.resetPasswordViewState()
748735
}
749736
}
750737
) {
751738
Text(text = stringResource(id = R.string.save))
752739
}
753740
},
754741
dismissButton = {
755-
TextButton(onClick = { onDismiss() }) {
742+
TextButton(onClick = {
743+
conversationCreationViewModel.resetPasswordViewState()
744+
onDismiss()
745+
}) {
756746
Text(text = stringResource(id = R.string.nc_cancel))
757747
}
758748
}
759749
)
760750
}
761751

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

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

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

87+
fun resetPasswordViewState() {
88+
_validPasswordViewState.value = ValidPasswordUiState.None
89+
}
90+
8791
@Suppress("Detekt.TooGenericExceptionCaught")
8892
fun validatePassword(url: String, password: String) {
8993
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
@@ -959,4 +959,5 @@ How to translate with transifex:
959959
<string name="no_scheduled_messages_offline">No connection to server - Scheduled messages could not be loaded</string>
960960
<string name="nc_show_ecosystem_title">Show app switcher</string>
961961
<string name="nc_show_ecosystem_description">Nextcloud app suggestions in account chooser dialog</string>
962+
<string name="nc_password_secure">Password is secure</string>
962963
</resources>

0 commit comments

Comments
 (0)