From 6a2ec01c52aaa058bc2a3db22b7910840ffc43d1 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Sun, 24 May 2026 13:29:41 -0400 Subject: [PATCH] Fix duplicate key crash in contact search lists. --- .../securesms/contacts/paged/ContactSearchModels.kt | 8 +++++--- .../conversationlist/ConversationListSearchModels.kt | 12 +++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchModels.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchModels.kt index 6a16f79c08..5502533fb5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchModels.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchModels.kt @@ -148,7 +148,7 @@ object ContactSearchModels { ): MappingEntryProvider { return MappingEntryProviderBuilder().apply { viewHolder( - key = { model -> "StoryModel${model.story.recipient.id}" } + key = { model -> "StoryModel:${model.story.recipient.id}:${model.story.privacyMode}" } ) { ctx -> LayoutFactory( { view -> StoryViewHolder(view, displayOptions.displayCheckBox, callbacks::onStoryClicked, storyContextMenuCallbacks, displayOptions.displayStoryRing) }, @@ -156,7 +156,7 @@ object ContactSearchModels { ).createViewHolder(FrameLayout(ctx)) } entry( - key = { model -> model.knownRecipient.recipient.id } + key = { model -> "${model.knownRecipient.sectionKey}:${model.knownRecipient.recipient.id}" } ) { model -> Column(modifier = Modifier.fillMaxWidth()) { val letter = model.knownRecipient.headerLetter @@ -193,7 +193,9 @@ object ContactSearchModels { ) } } - viewHolder { ctx -> + viewHolder( + key = { model -> "Unknown:${model.data.sectionKey}:${model.data.mode}:${model.data.query}" } + ) { ctx -> LayoutFactory( { view -> UnknownRecipientViewHolder(view, callbacks::onUnknownRecipientClicked, displayOptions.displayCheckBox) }, R.layout.contact_search_unknown_item diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchModels.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchModels.kt index 30ff571934..34ea174bfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchModels.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchModels.kt @@ -105,19 +105,25 @@ object ConversationListSearchModels { requestManager: RequestManager ): MappingEntryProvider { return MappingEntryProviderBuilder().apply { - viewHolder { ctx -> + viewHolder( + key = { model -> "Thread:${model.thread.contactSearchKey}" } + ) { ctx -> LayoutFactory( { view -> ThreadViewHolder(onThreadClicked, onThreadLongClicked, lifecycleOwner, requestManager, view) }, R.layout.conversation_list_item_view ).createViewHolder(FrameLayout(ctx)) } - viewHolder { ctx -> + viewHolder( + key = { model -> "Message:${model.message.contactSearchKey}" } + ) { ctx -> LayoutFactory( { view -> MessageViewHolder(onMessageClicked, lifecycleOwner, requestManager, view) }, R.layout.conversation_list_item_view ).createViewHolder(FrameLayout(ctx)) } - viewHolder { ctx -> + viewHolder( + key = { model -> "GroupWithMembers:${model.groupWithMembers.contactSearchKey}" } + ) { ctx -> LayoutFactory( { view -> GroupWithMembersViewHolder(onGroupWithMembersClicked, lifecycleOwner, requestManager, view) }, R.layout.conversation_list_item_view