diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 429bd0b49..9a5cb7c2a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -19,8 +19,6 @@ package org.thoughtcrime.securesms.conversation; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -167,7 +165,6 @@ import org.thoughtcrime.securesms.wallpaper.ChatWallpaper; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -871,24 +868,21 @@ public class ConversationFragment extends LoggingFragment implements Multiselect } private void handleCopyMessage(final Set multiselectParts) { - List multiselectPartList = new ArrayList<>(multiselectParts); - Collections.sort(multiselectPartList, (lhs, rhs) -> Long.compare(lhs.getMessageRecord().getDateReceived(), rhs.getMessageRecord().getDateReceived())); + CharSequence bodies = Stream.of(multiselectParts) + .sortBy(m -> m.getMessageRecord().getDateReceived()) + .map(MultiselectPart::getConversationMessage) + .distinct() + .map(m -> m.getDisplayBody(requireContext())) + .filterNot(TextUtils::isEmpty) + .collect(SpannableStringBuilder::new, (bodyBuilder, body) -> { + if (bodyBuilder.length() > 0) { + bodyBuilder.append('\n'); + } + bodyBuilder.append(body); + }); - SpannableStringBuilder bodyBuilder = new SpannableStringBuilder(); - ClipboardManager clipboard = (ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE); - - for (MultiselectPart part : multiselectPartList) { - CharSequence body = part.getConversationMessage().getDisplayBody(requireContext()); - if (!TextUtils.isEmpty(body)) { - if (bodyBuilder.length() > 0) { - bodyBuilder.append('\n'); - } - bodyBuilder.append(body); - } - } - - if (!TextUtils.isEmpty(bodyBuilder)) { - clipboard.setPrimaryClip(ClipData.newPlainText(null, bodyBuilder)); + if (!TextUtils.isEmpty(bodies)) { + Util.copyToClipboard(requireContext(), bodies); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java index fb27936cb..e25ccba18 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java @@ -483,7 +483,7 @@ public class Util { return MemoryUnitFormat.formatBytes(sizeBytes); } - public static void copyToClipboard(@NonNull Context context, @NonNull String text) { + public static void copyToClipboard(@NonNull Context context, @NonNull CharSequence text) { ServiceUtil.getClipboardManager(context).setPrimaryClip(ClipData.newPlainText("text", text)); }