From 5ed22a06e3996ec36b6f39a208de5d98a3e3289a Mon Sep 17 00:00:00 2001
From: Aline Bonnet <aline.bonnet@savoirfairelinux.com>
Date: Thu, 19 Jan 2017 13:58:46 -0500
Subject: [PATCH] conversation: fix the historyCall display

Since the a316216 commit, the call messages could be displayed several
times. This commit checks if a call message is already displayed.

Change-Id: I72b74ccd9e9d454d603009de4de1595a6f89279f
Tuleap: #1470
---
 .../java/cx/ring/service/LocalService.java    | 22 +++-------------
 .../main/java/cx/ring/model/Conversation.java |  8 ++++++
 .../main/java/cx/ring/model/HistoryCall.java  | 26 +++++++++++++++++++
 .../main/java/cx/ring/model/HistoryEntry.java |  2 +-
 4 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/ring-android/app/src/main/java/cx/ring/service/LocalService.java b/ring-android/app/src/main/java/cx/ring/service/LocalService.java
index f2e9a3aa8..81e55e89b 100644
--- a/ring-android/app/src/main/java/cx/ring/service/LocalService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/LocalService.java
@@ -909,27 +909,11 @@ public class LocalService extends Service implements Observer<DaemonEvent> {
                 for (HistoryCall call : history) {
                     CallContact contact = getCreateContact(call.getContactID(), call.getContactKey(), call.getNumber());
 
-                    Map.Entry<String, Conversation> merge = null;
-                    for (Map.Entry<String, Conversation> ce : conversations.entrySet()) {
-                        Conversation conversation = ce.getValue();
-                        if ((contact.getId() > 0 && contact.getId() == conversation.getContact().getId()) || conversation.getContact().hasNumber(call.getNumber())) {
-                            merge = ce;
-                            break;
-                        }
-                    }
-                    if (merge != null) {
-                        Conversation conversation = merge.getValue();
-                        if (conversation.getContact().getId() <= 0 && contact.getId() > 0) {
-                            conversation.setContact(contact);
-                            conversations.remove(merge.getKey());
-                            conversations.put(contact.getIds().get(0), conversation);
-                        }
-                        conversation.addHistoryCall(call);
-                        continue;
-                    }
                     String key = contact.getIds().get(0);
                     if (conversations.containsKey(key)) {
-                        conversations.get(key).addHistoryCall(call);
+                        if (!conversations.get(key).getHistoryCalls().contains(call)) {
+                            conversations.get(key).addHistoryCall(call);
+                        }
                     } else {
                         Conversation conversation = new Conversation(contact);
                         conversation.addHistoryCall(call);
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java b/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
index de2abd272..8a7e57fd7 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
@@ -238,6 +238,14 @@ public class Conversation {
         return texts.values();
     }
 
+    public Collection<HistoryCall> getHistoryCalls() {
+        TreeMap<Long, HistoryCall> calls = new TreeMap<>();
+        for (HistoryEntry historyEntry : mHistory.values()) {
+            calls.putAll(historyEntry.getCalls());
+        }
+        return calls.values();
+    }
+
     public TreeMap<Long, TextMessage> getUnreadTextMessages() {
         TreeMap<Long, TextMessage> texts = new TreeMap<>();
         for (HistoryEntry h : mHistory.values()) {
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/HistoryCall.java b/ring-android/libringclient/src/main/java/cx/ring/model/HistoryCall.java
index 31854fcf4..e9120f081 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/HistoryCall.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/HistoryCall.java
@@ -169,4 +169,30 @@ public class HistoryCall implements Serializable {
         return callID;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        HistoryCall that = (HistoryCall) o;
+
+        if (call_start != that.call_start || call_end != that.call_end || contactID != that.contactID) {
+            return false;
+        }
+        return callID != null ? callID.equals(that.callID) : that.callID == null;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (int) (call_start ^ (call_start >>> 32));
+        result = 31 * result + (int) (call_end ^ (call_end >>> 32));
+        result = 31 * result + (int) (contactID ^ (contactID >>> 32));
+        result = 31 * result + (callID != null ? callID.hashCode() : 0);
+        return result;
+    }
 }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/HistoryEntry.java b/ring-android/libringclient/src/main/java/cx/ring/model/HistoryEntry.java
index 36dce4db3..18cd946a8 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/HistoryEntry.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/HistoryEntry.java
@@ -80,7 +80,7 @@ public class HistoryEntry {
      * @param linkedTo    The associated CallContact
      */
     public void addHistoryCall(HistoryCall historyCall, CallContact linkedTo) {
-        mCalls.put(historyCall.call_start, historyCall);
+        mCalls.put(historyCall.call_end, historyCall);
         if (historyCall.isIncoming()) {
             ++mIncomingCount;
         } else {
-- 
GitLab