@@ -37,6 +37,7 @@ import androidx.compose.foundation.layout.padding
3737import androidx.compose.foundation.layout.size
3838import androidx.compose.foundation.layout.statusBarsPadding
3939import androidx.compose.foundation.layout.width
40+ import androidx.compose.foundation.layout.wrapContentHeight
4041import androidx.compose.foundation.rememberScrollState
4142import androidx.compose.foundation.shape.CircleShape
4243import 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
@@ -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
769784fun CreateConversation (conversationCreationViewModel : ConversationCreationViewModel , context : Context ) {
770785 val selectedParticipants by conversationCreationViewModel.selectedParticipants.collectAsState()
0 commit comments