@@ -11,6 +11,8 @@ package com.nextcloud.talk.conversationcreation
1111
1212import android.annotation.SuppressLint
1313import android.app.Activity
14+ import android.content.ClipData
15+ import android.content.ClipboardManager
1416import android.content.Context
1517import android.content.Intent
1618import android.net.Uri
@@ -567,73 +569,97 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
567569 color = MaterialTheme .colorScheme.primary,
568570 modifier = Modifier .padding(top = 24 .dp, start = 16 .dp, end = 16 .dp)
569571 )
570- ConversationOption (
571- icon = R .drawable.ic_avatar_link,
572- text = R .string.nc_guest_access_allow_title,
573- switch = {
574- Switch (
575- checked = isGuestsAllowed,
576- onCheckedChange = {
577- conversationCreationViewModel.isGuestsAllowed.value = it
578- }
579- )
580- },
581- conversationCreationViewModel = conversationCreationViewModel
582- )
583572
584- if (isGuestsAllowed && ! isPasswordSet) {
585- ConversationOption (
586- icon = R .drawable.baseline_lock_open_24,
587- text = R .string.nc_set_password,
588- conversationCreationViewModel = conversationCreationViewModel
573+ Column {
574+ ConversationOptions (
575+ icon = R .drawable.ic_avatar_link,
576+ text = R .string.nc_guest_access_allow_title,
577+ switch = {
578+ Switch (
579+ checked = isGuestsAllowed,
580+ onCheckedChange = {
581+ conversationCreationViewModel.isGuestsAllowed.value = it
582+ }
583+ )
584+ },
585+ conversationCreationViewModel = conversationCreationViewModel,
586+ isPasswordSetOrChange = false ,
587+ copyPassword = false
589588 )
590- }
591589
592- if (isGuestsAllowed && isPasswordSet) {
593- ConversationOption (
594- icon = R .drawable.ic_lock_grey600_24px,
595- text = R .string.nc_change_password,
596- conversationCreationViewModel = conversationCreationViewModel
597- )
598- }
590+ if (isGuestsAllowed && ! isPasswordSet) {
591+ ConversationOptions (
592+ icon = R .drawable.baseline_lock_open_24,
593+ text = R .string.nc_set_password,
594+ conversationCreationViewModel = conversationCreationViewModel,
595+ isPasswordSetOrChange = true ,
596+ copyPassword = false
597+ )
598+ }
599599
600- ConversationOption (
601- icon = R .drawable.baseline_format_list_bulleted_24,
602- text = R .string.nc_open_conversation_to_registered_users,
603- switch = {
604- Switch (
605- checked = isConversationAvailableForRegisteredUsers,
606- onCheckedChange = {
607- conversationCreationViewModel.isConversationAvailableForRegisteredUsers.value = it
608- }
600+ if (isGuestsAllowed && isPasswordSet) {
601+ ConversationOptions (
602+ icon = R .drawable.ic_lock_grey600_24px,
603+ text = R .string.nc_change_password,
604+ conversationCreationViewModel = conversationCreationViewModel,
605+ isPasswordSetOrChange = true ,
606+ copyPassword = false
609607 )
610- },
611- conversationCreationViewModel = conversationCreationViewModel
612- )
608+ }
609+ if (isGuestsAllowed && isPasswordSet) {
610+ ConversationOptions (
611+ icon = R .drawable.ic_content_copy,
612+ text = R .string.nc_copy_password,
613+ conversationCreationViewModel = conversationCreationViewModel,
614+ isPasswordSetOrChange = false ,
615+ copyPassword = true
616+ )
617+ }
613618
614- if (isConversationAvailableForRegisteredUsers) {
615- ConversationOption (
616- text = R .string.nc_open_to_guest_app_users ,
619+ ConversationOptions (
620+ icon = R .drawable.baseline_format_list_bulleted_24,
621+ text = R .string.nc_open_conversation_to_registered_users ,
617622 switch = {
618623 Switch (
619- checked = isOpenForGuestAppUsers ,
624+ checked = isConversationAvailableForRegisteredUsers ,
620625 onCheckedChange = {
621- conversationCreationViewModel.openForGuestAppUsers .value = it
626+ conversationCreationViewModel.isConversationAvailableForRegisteredUsers .value = it
622627 }
623628 )
624629 },
625- conversationCreationViewModel = conversationCreationViewModel
630+ conversationCreationViewModel = conversationCreationViewModel,
631+ isPasswordSetOrChange = false ,
632+ copyPassword = false
626633 )
634+ if (isConversationAvailableForRegisteredUsers) {
635+ ConversationOptions (
636+ text = R .string.nc_open_to_guest_app_users,
637+ switch = {
638+ Switch (
639+ checked = isOpenForGuestAppUsers,
640+ onCheckedChange = {
641+ conversationCreationViewModel.openForGuestAppUsers.value = it
642+ }
643+ )
644+ },
645+ conversationCreationViewModel = conversationCreationViewModel,
646+ isPasswordSetOrChange = false ,
647+ copyPassword = false
648+ )
649+ }
627650 }
628651}
629652
630653@Composable
631- fun ConversationOption (
654+ fun ConversationOptions (
632655 icon : Int? = null,
633656 text : Int ,
634657 switch : @Composable (() -> Unit )? = null,
635- conversationCreationViewModel : ConversationCreationViewModel
658+ conversationCreationViewModel : ConversationCreationViewModel ,
659+ isPasswordSetOrChange : Boolean ,
660+ copyPassword : Boolean
636661) {
662+ val context = LocalContext .current
637663 var showPasswordDialog by rememberSaveable { mutableStateOf(false ) }
638664 var showPasswordChangeDialog by rememberSaveable { mutableStateOf(false ) }
639665 val passwordValidationState by conversationCreationViewModel.validPasswordViewState.collectAsStateWithLifecycle()
@@ -642,19 +668,29 @@ fun ConversationOption(
642668 .fillMaxWidth()
643669 .padding(start = 16 .dp, end = 16 .dp, bottom = 8 .dp)
644670 .then(
645- if (! conversationCreationViewModel.isPasswordEnabled.value) {
671+ if (! conversationCreationViewModel.isPasswordEnabled.value && isPasswordSetOrChange ) {
646672 Modifier .clickable {
647673 showPasswordDialog = true
648674 }
649- } else if (conversationCreationViewModel.isPasswordEnabled.value) {
675+ } else if (conversationCreationViewModel.isPasswordEnabled.value && isPasswordSetOrChange ) {
650676 Modifier .clickable {
651677 showPasswordChangeDialog = true
652678 }
679+ } else if (copyPassword) {
680+ Modifier .clickable {
681+ val clipboardManager =
682+ context.getSystemService(Context .CLIPBOARD_SERVICE ) as ClipboardManager
683+ val clip = ClipData .newPlainText(
684+ context.getString(R .string.nc_app_product_name),
685+ conversationCreationViewModel.password.value
686+ )
687+ clipboardManager.setPrimaryClip(clip)
688+ }
653689 } else {
654690 Modifier
655691 }
656692 ),
657- horizontalArrangement = Arrangement .SpaceBetween ,
693+ horizontalArrangement = Arrangement .SpaceEvenly ,
658694 verticalAlignment = Alignment .CenterVertically
659695 ) {
660696 if (icon != null ) {
@@ -856,19 +892,23 @@ fun PasswordValidationMessage(passwordValidationState: ValidPasswordUiState) {
856892 is ValidPasswordUiState .Success -> Text (
857893 text = passwordValidationState.result.reason
858894 ? : stringResource(R .string.nc_password_secure),
859- color = if ((passwordValidationState as ValidPasswordUiState . Success ).result.passed == false ) {
895+ color = if ((passwordValidationState).result.passed == false ) {
860896 colorResource(
861897 id = R .color
862898 .nc_darkRed
863899 )
864900 } else {
865901 colorResource(id = R .color.nc_darkGreen)
866902 },
903+ style = MaterialTheme .typography.bodySmall,
867904 modifier = Modifier .fillMaxWidth()
868905 )
869906
870907 is ValidPasswordUiState .Error -> {
871- Text (text = passwordValidationState.message)
908+ Text (
909+ text = passwordValidationState.message,
910+ style = MaterialTheme .typography.bodySmall
911+ )
872912 }
873913
874914 else -> {
0 commit comments