@@ -38,6 +38,7 @@ import androidx.compose.foundation.layout.padding
3838import androidx.compose.foundation.layout.size
3939import androidx.compose.foundation.layout.statusBarsPadding
4040import androidx.compose.foundation.layout.width
41+ import androidx.compose.foundation.layout.wrapContentHeight
4142import androidx.compose.foundation.rememberScrollState
4243import androidx.compose.foundation.shape.CircleShape
4344import androidx.compose.foundation.shape.RoundedCornerShape
@@ -81,6 +82,7 @@ import androidx.compose.ui.unit.dp
8182import androidx.compose.ui.unit.sp
8283import androidx.compose.ui.window.Dialog
8384import androidx.lifecycle.ViewModelProvider
85+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
8486import autodagger.AutoInjector
8587import coil.compose.AsyncImage
8688import 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
763779fun CreateConversation (conversationCreationViewModel : ConversationCreationViewModel , context : Context ) {
764780 val selectedParticipants by conversationCreationViewModel.selectedParticipants.collectAsState()
0 commit comments