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;
+ }
}