Aggregate known threads

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java | 36 ++
1 file changed, 35 insertions(+), 1 deletion(-)

Detailed changes

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<String, Thread> 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<String> extraIds = new HashSet<>();
         for (ListIterator<Message> 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();
+        }
+    }
 }