diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index b06482b3b..5af5dcd98 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -159,7 +159,7 @@ class ConversationInfoActivity : private val addParticipantsResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult() - ) { + ) { it -> executeIfResultOk(it) { intent -> val selectedAutocompleteUsers = intent?.getParcelableArrayListExtraProvider("selectedParticipants") @@ -168,6 +168,7 @@ class ConversationInfoActivity : if (startGroupChat) { viewModel.createRoomFromOneToOne( conversationUser, + userItems.map { it.model }, selectedAutocompleteUsers, conversationToken ) @@ -237,6 +238,7 @@ class ConversationInfoActivity : initObservers() } + @Suppress("Detekt.LongMethod") private fun initObservers() { initViewStateObserver() diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index 4fe7b7158..8ed98e29d 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -22,6 +22,7 @@ import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.conversations.RoomOverall +import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.participants.Participant.ActorType.CIRCLES import com.nextcloud.talk.models.json.participants.Participant.ActorType.EMAILS import com.nextcloud.talk.models.json.participants.Participant.ActorType.FEDERATED @@ -135,7 +136,12 @@ class ConversationInfoViewModel @Inject constructor( } @Suppress("Detekt.TooGenericExceptionCaught") - fun createRoomFromOneToOne(user: User, autocompleteUsers: List, roomToken: String) { + fun createRoomFromOneToOne( + user: User, + userItems: List, + autocompleteUsers: List, + roomToken: String + ) { val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, 1)) val url = getUrlForRooms(apiVersion, user.baseUrl!!) val credentials = ApiUtils.getCredentials(user.username, user.token)!! @@ -143,7 +149,10 @@ class ConversationInfoViewModel @Inject constructor( val participantsBody = convertAutocompleteUserToParticipant(autocompleteUsers) val body = CreateRoomRequest( - roomName = createConversationNameByParticipants(autocompleteUsers), + roomName = createConversationNameByParticipants( + userItems.map { it.displayName }, + autocompleteUsers.map { it.label } + ), roomType = GROUP_CONVERSATION_TYPE, readOnly = 0, listable = 1, @@ -172,15 +181,6 @@ class ConversationInfoViewModel @Inject constructor( } } - private fun createConversationNameByParticipants(autocompleteUsers: List): String { - val conversationName = autocompleteUsers - .sortedBy { it.label?.lowercase() } - .mapNotNull { it.label } - .joinToString(NEW_CONVERSATION_PARTICIPANTS_SEPARATOR) - - return DisplayUtils.ellipsize(conversationName, MAX_ROOM_NAME_LENGTH) - } - private fun convertAutocompleteUserToParticipant(autocompleteUsers: List): Participants { val participants = Participants() @@ -362,6 +362,22 @@ class ConversationInfoViewModel @Inject constructor( private const val EXTENDED_CONVERSATION = "extended_conversation" private const val GROUP_CONVERSATION_TYPE = "2" private const val MAX_ROOM_NAME_LENGTH = 255 + + fun createConversationNameByParticipants( + originalParticipants: List, + allParticipants: List + ): String { + fun List.sortedJoined() = + sortedBy { it?.lowercase() } + .joinToString(NEW_CONVERSATION_PARTICIPANTS_SEPARATOR) + + val addedParticipants = allParticipants - originalParticipants.toSet() + val conversationName = originalParticipants.mapNotNull { it }.sortedJoined() + + NEW_CONVERSATION_PARTICIPANTS_SEPARATOR + + addedParticipants.mapNotNull { it }.sortedJoined() + + return DisplayUtils.ellipsize(conversationName, MAX_ROOM_NAME_LENGTH) + } } sealed class ClearChatHistoryViewState { diff --git a/app/src/test/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModelTest.kt b/app/src/test/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModelTest.kt new file mode 100644 index 000000000..b7b4272b3 --- /dev/null +++ b/app/src/test/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModelTest.kt @@ -0,0 +1,18 @@ +package com.nextcloud.talk.conversationinfo.viewmodel + +import org.junit.Test +import org.junit.Assert.assertEquals + +class ConversationInfoViewModelTest { + + @Test + fun `createConversationNameByParticipants should combine names correctly`() { + val original = listOf("Dave", null, "Charlie") + val all = listOf("Bob", "Charlie", "Dave", "Alice", null, "Simon") + + val expectedName = "Charlie, Dave, Alice, Bob, Simon" + val result = ConversationInfoViewModel.createConversationNameByParticipants(original, all) + + assertEquals(expectedName, result) + } +}