AndroidTV: fix duplicated contacts in smartlist

Change-Id: I0c0334a093aeb5d06eb3126ab92cfa2c6b7b8b56
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/contacts/ContactCard.java b/ring-android/app/src/main/java/cx/ring/tv/cards/contacts/ContactCard.java
index 6b57773..b40a4ec 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/contacts/ContactCard.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/contacts/ContactCard.java
@@ -26,7 +26,7 @@
 import cx.ring.tv.model.TVListViewModel;
 
 public class ContactCard extends Card {
-    TVListViewModel mModel = null;
+    private TVListViewModel mModel = null;
     private byte[] mPhoto = null;
 
     public ContactCard(CallContact pCallContact, Type type) {
@@ -62,6 +62,27 @@
         }
     }
 
+    public void setModel(TVListViewModel model) {
+        if (model == null || model.equals(this.mModel)) {
+            return;
+        }
+
+        mModel = model;
+
+        setTitle(model.getCallContact().getDisplayName());
+        setDescription(model.getCallContact().getRingUsername());
+
+        if (model.isOnline()) {
+            setType(Type.CONTACT_WITH_USERNAME_ONLINE);
+        } else {
+            setType(Type.CONTACT_WITH_USERNAME);
+        }
+
+        if (model.getCallContact().getPhoto() != null && !Arrays.equals(mPhoto, model.getCallContact().getPhoto())) {
+            mPhoto = model.getCallContact().getPhoto();
+        }
+    }
+
     public TVListViewModel getModel() {
         return mModel;
     }
@@ -78,10 +99,10 @@
 
         ContactCard that = (ContactCard) pO;
 
-        if (mModel != null )
-            return mModel.getCallContact().getId() == that.mModel.getCallContact().getId();
+        if (mModel != null) {
+            return mModel.getCallContact().equals(that.mModel.getCallContact());
+        }
         return Arrays.equals(mPhoto, that.mPhoto);
-
     }
 
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
index 2f89e22..d79a540 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
@@ -208,19 +208,13 @@
     }
 
     @Override
-    public void refreshContact(final TVListViewModel contact) {
+    public void refreshContact(final int index, final TVListViewModel contact) {
         getActivity().runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                ContactCard updatedCard = new ContactCard(contact);
-                int pos = cardRowAdapter.indexOf(updatedCard);
-                if (pos > -1) {
-                    ContactCard previousCard = (ContactCard) cardRowAdapter.get(pos);
-                    if (previousCard.getModel().isOnline() != updatedCard.getModel().isOnline()) {
-                        cardRowAdapter.replace(pos, updatedCard);
-                        cardRowAdapter.notifyArrayItemRangeChanged(pos, 1);
-                    }
-                }
+                ContactCard contactCard = (ContactCard) cardRowAdapter.get(index);
+                contactCard.setModel(contact);
+                cardRowAdapter.notifyArrayItemRangeChanged(index, 1);
             }
         });
     }
@@ -251,7 +245,6 @@
         } else if (!display && isContactRequestRowDisplayed) {
             mRowsAdapter.removeItems(2, 1);
         }
-
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
index 92b906b..4b2374e 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
@@ -38,7 +38,6 @@
 import cx.ring.services.ContactService;
 import cx.ring.services.HardwareService;
 import cx.ring.services.PresenceService;
-import cx.ring.tv.cards.iconcards.IconCard;
 import cx.ring.tv.model.TVContactRequestViewModel;
 import cx.ring.tv.model.TVListViewModel;
 import cx.ring.utils.Log;
@@ -124,13 +123,18 @@
     }
 
     private void refreshContact(String buddy) {
-        for (TVListViewModel tvListViewModel : mTvListViewModels) {
+        for (int i = 0; i < mTvListViewModels.size(); i++) {
+            TVListViewModel tvListViewModel = mTvListViewModels.get(i);
             CallContact callContact = tvListViewModel.getCallContact();
+
             if (callContact.getIds().get(0).equals("ring:" + buddy)) {
-                TVListViewModel smartListViewModel = new TVListViewModel(
+                TVListViewModel updatedTvListViewModel = new TVListViewModel(
                         callContact,
                         mPresenceService.isBuddyOnline(callContact.getIds().get(0)));
-                getView().refreshContact(smartListViewModel);
+
+                if (!updatedTvListViewModel.equals(tvListViewModel)) {
+                    getView().refreshContact(i, updatedTvListViewModel);
+                }
             }
         }
     }
@@ -139,7 +143,7 @@
         getView().showLoading(true);
         Account currentAccount = mAccountService.getCurrentAccount();
         if (currentAccount == null) {
-            android.util.Log.e(TAG, "reloadConversations: Not able to get currentAccount");
+            Log.e(TAG, "reloadConversations: Not able to get currentAccount");
             return;
         }
 
@@ -178,8 +182,6 @@
                         getView().showLoading(false);
                     }
                 }));
-
-
     }
 
     public void loadContactRequest() {
@@ -252,6 +254,7 @@
 
     public void reloadAccountInfos() {
         if (mAccountService == null) {
+            Log.e(TAG, "reloadAccountInfos: No account service available");
             return;
         }
         String displayableAddress = null;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
index 28b9c59..9da548a 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
@@ -30,7 +30,7 @@
 
     void showLoading(boolean show);
 
-    void refreshContact(TVListViewModel contact);
+    void refreshContact(int index, TVListViewModel contact);
 
     void showContacts(List<TVListViewModel> contacts);
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/model/TVListViewModel.java b/ring-android/app/src/main/java/cx/ring/tv/model/TVListViewModel.java
index ceb296b..1134b65 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/model/TVListViewModel.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/model/TVListViewModel.java
@@ -54,7 +54,21 @@
     }
 
     @Override
+    public boolean equals(Object pO) {
+        if (this == pO) return true;
+        if (pO == null || getClass() != pO.getClass()) return false;
+
+        TVListViewModel tvListViewModel = (TVListViewModel) pO;
+        return tvListViewModel.mCallContact.equals(mCallContact) && tvListViewModel.isOnline == isOnline;
+    }
+
+    @Override
     public int compareTo(@NonNull TVListViewModel o) {
         return mCallContact.getDisplayName().compareTo(o.getCallContact().getDisplayName());
     }
+
+    @Override
+    public String toString() {
+        return mCallContact.toString() + " " + isOnline;
+    }
 }