From 7f1fed51dda8ec20caf477cd450b9d8ddac35468 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 23 Jan 2024 16:05:25 -0500 Subject: [PATCH] Aggregate known threads --- .../conversations/entities/Conversation.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index de671f21420ff21f3ba9b0fe3bec936551359cf5..1e8f7cef318b77f4736918ce0fde96e97024f4f1 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -90,6 +90,7 @@ import java.time.format.FormatStyle; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.ListIterator; @@ -198,6 +199,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl protected boolean lockThread = false; protected boolean userSelectedThread = false; protected Message replyTo = null; + protected HashMap threads = new HashMap<>(); public Conversation(final String name, final Account account, final Jid contactJid, final int mode) { @@ -648,12 +650,26 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl synchronized (this.messages) { messages.clear(); messages.addAll(this.messages); + threads.clear(); } Set extraIds = new HashSet<>(); for (ListIterator iterator = messages.listIterator(messages.size()); iterator.hasPrevious(); ) { Message m = iterator.previous(); final Element mthread = m.getThread(); - if (m.wasMergedIntoPrevious() || (getLockThread() && !extraIds.contains(m.replyId()) && (mthread == null || !mthread.getContent().equals(getThread() == null ? "" : getThread().getContent())))) { + if (mthread != null) { + Thread thread = threads.get(mthread.getContent()); + if (thread == null) { + thread = new Thread(); + threads.put(mthread.getContent(), thread); + } + if (thread.subject == null && (m.getSubject() != null && (m.getRawBody() == null || m.getRawBody().length() == 0))) { + thread.subject = m; + } else { + if (thread.last == null) thread.last = m; + thread.first = m; + } + } + if (m.wasMergedIntoPrevious() || (m.getSubject() != null && (m.getRawBody() == null || m.getRawBody().length() == 0)) || (getLockThread() && !extraIds.contains(m.replyId()) && (mthread == null || !mthread.getContent().equals(getThread() == null ? "" : getThread().getContent())))) { iterator.remove(); } else if (getLockThread() && mthread != null) { Element reply = m.getReply(); @@ -664,6 +680,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } } + public Thread getThread(String id) { + return threads.get(id); + } + @Override public boolean isBlocked() { return getContact().isBlocked(); @@ -3287,4 +3307,18 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } } } + + public static class Thread { + protected Message subject = null; + protected Message first = null; + protected Message last = null; + + protected Thread() {} + + public String getSubject() { + if (subject == null) return null; + + return subject.getSubject(); + } + } }