diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Account.java b/ring-android/libringclient/src/main/java/net/jami/model/Account.java index 1ffe46f611d426d9938010a9d261886072593d87..eaabc395ab289d211a49b58f33e7b056468ca79f 100644 --- a/ring-android/libringclient/src/main/java/net/jami/model/Account.java +++ b/ring-android/libringclient/src/main/java/net/jami/model/Account.java @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * along with this program. If not, see <https://www.gnu.org/licenses/>. */ package net.jami.model; @@ -94,7 +94,6 @@ public class Account { private final Subject<ContactLocationEntry> mLocationStartedSubject = PublishSubject.create(); public Single<Account> historyLoader; - //sprivate VCard mProfile; private Single<Tuple<String, Object>> mLoadedProfile = null; public Account(String bAccountID) { @@ -145,27 +144,31 @@ public class Account { contact.setConversationUri(conversation.getUri()); } conversations.put(conversation.getUri().getUri(), conversation); + conversationChanged(); } - conversationChanged(); } public Conversation getSwarm(String conversationId) { - return swarmConversations.get(conversationId); + synchronized (conversations) { + return swarmConversations.get(conversationId); + } } public Conversation newSwarm(String conversationId, Conversation.Mode mode) { - Conversation c = swarmConversations.get(conversationId); - if (c == null) { - c = new Conversation(accountID, new Uri(Uri.SWARM_SCHEME, conversationId), mode); - swarmConversations.put(conversationId, c); + synchronized (conversations) { + Conversation c = swarmConversations.get(conversationId); + if (c == null) { + c = new Conversation(accountID, new Uri(Uri.SWARM_SCHEME, conversationId), mode); + swarmConversations.put(conversationId, c); + } + return c; } - return c; } public void removeSwarm(String conversationId) { Log.w(TAG, "removeSwarm " + conversationId); - Conversation conversation = swarmConversations.remove(conversationId); - if (conversation != null) { - synchronized (conversations) { + synchronized (conversations) { + Conversation conversation = swarmConversations.remove(conversationId); + if (conversation != null) { Conversation c = conversations.remove(conversation.getUri().getUri()); try { Contact contact = c.getContact(); @@ -174,10 +177,9 @@ public class Account { contact.setConversationUri(contact.getUri()); contactAdded(contact); } - } catch (Exception ignored) { - } + } catch (Exception ignored) {} + conversationChanged(); } - conversationChanged(); } } @@ -271,17 +273,19 @@ public class Account { } public void conversationChanged() { - conversationsChanged = true; - if (historyLoaded) { - conversationsSubject.onNext(new ArrayList<>(getSortedConversations())); + synchronized (conversations) { + conversationsChanged = true; + if (historyLoaded) { + conversationsSubject.onNext(new ArrayList<>(getSortedConversations())); + } + updateUnreadConversations(); } - updateUnreadConversations(); } public void conversationUpdated(Conversation conversation) { - if (!historyLoaded) - return; - synchronized (sortedConversations) { + synchronized (conversations) { + if (!historyLoaded) + return; if (conversationsChanged) { getSortedConversations(); } else { @@ -296,15 +300,13 @@ public class Account { private void updateUnreadConversations() { int unread = 0; - synchronized (sortedConversations) { - for (Conversation model : sortedConversations) { - Interaction last = model.getLastEvent(); - if (last != null && !last.isRead()) - unread++; - } - // Log.w(TAG, "updateUnreadConversations " + unread); - unreadConversationsSubject.onNext(unread); + for (Conversation model : sortedConversations) { + Interaction last = model.getLastEvent(); + if (last != null && !last.isRead()) + unread++; } + // Log.w(TAG, "updateUnreadConversations " + unread); + unreadConversationsSubject.onNext(unread); } private void updateUnreadPending() { @@ -338,11 +340,19 @@ public class Account { public void updated(Conversation conversation) { String key = conversation.getUri().getUri(); - if (conversation == conversations.get(key)) - conversationUpdated(conversation); - else if (conversation == pending.get(key)) - pendingUpdated(conversation); - else if (conversation == cache.get(key)) { + synchronized (conversations) { + if (conversation == conversations.get(key)) { + conversationUpdated(conversation); + return; + } + } + synchronized (pending) { + if (conversation == pending.get(key)) { + pendingUpdated(conversation); + return; + } + } + if (conversation == cache.get(key)) { if (isJami() && !conversation.isSwarm() && conversation.getContacts().size() == 1 && !conversation.getContact().getConversationUri().blockingFirst().equals(conversation.getUri())) { return; } @@ -358,10 +368,16 @@ public class Account { } public void refreshed(Conversation conversation) { - if (conversations.containsValue(conversation)) - conversationRefreshed(conversation); - else if (pending.containsValue(conversation)) - pendingRefreshed(); + synchronized (conversations) { + if (conversations.containsValue(conversation)) { + conversationRefreshed(conversation); + return; + } + } + synchronized (pending) { + if (pending.containsValue(conversation)) + pendingRefreshed(); + } } public void addTextMessage(TextMessage txt) { @@ -687,10 +703,8 @@ public class Account { TrustRequest req = mRequests.get(id); if (req != null) { mRequests.remove(id); - //trustRequestsSubject.onNext(mRequests.values()); } contactAdded(contact); - //contactSubject.onNext(new ContactEvent(callContact, true)); contactListSubject.onNext(mContacts.values()); } @@ -708,11 +722,9 @@ public class Account { TrustRequest req = mRequests.get(id); if (req != null) { mRequests.remove(id); - //trustRequestsSubject.onNext(mRequests.values()); } if (contact != null) { contactRemoved(contact.getUri()); - //contactSubject.onNext(new ContactEvent(callContact, false)); } contactListSubject.onNext(mContacts.values()); } @@ -756,31 +768,17 @@ public class Account { return requests; } - public Map<String, TrustRequest> getRequestsMigration() { - return mRequests; - } - public TrustRequest getRequest(Uri uri) { return mRequests.get(uri.getUri()); } public void addRequest(TrustRequest request) { - //Log.w(TAG, "addRequest start"); synchronized (pending) { - //boolean isSwarm = request.getConversationId() != null; String key = request.getUri().getUri(); - //if (!isSwarm) { mRequests.put(key, request); - //trustRequestSubject.onNext(new RequestEvent(request, true)); - //trustRequestsSubject.onNext(mRequests.values()); - //} - Conversation conversation = pending.get(key); if (conversation == null) { - /*if (isSwarm) { - Log.w(TAG, "new public swarm request"); - }*/ - conversation = /*isSwarm ? newSwarm(key, Conversation.Mode.Public) : */getByKey(key); + conversation = getByKey(key); pending.put(key, conversation); if (!conversation.isSwarm()) { Contact contact = getContactFromCache(request.getUri()); @@ -804,9 +802,7 @@ public class Account { Contact contact = getContactFromCache(request.getUri()); conversation.addRequestEvent(request, contact); } - //trustRequestSubject.onNext(new RequestEvent(request, true)); } - //trustRequestsSubject.onNext(mRequests.values()); pendingChanged(); } } @@ -815,10 +811,6 @@ public class Account { synchronized (pending) { String contactUri = contact.getUri(); TrustRequest request = mRequests.remove(contactUri); - if (request != null) { - //trustRequestSubject.onNext(new RequestEvent(request, true)); - //trustRequestsSubject.onNext(mRequests.values()); - } if (pending.remove(contactUri) != null) { pendingChanged(); return true; @@ -872,53 +864,45 @@ public class Account { } public void setHistoryLoaded(List<Conversation> conversations) { - if (historyLoaded) - return; - //Log.w(TAG, "setHistoryLoaded " + getAccountID() + " " + conversations.size()); - for (Conversation c : conversations) { - Contact contact = c.getContact(); - if (!c.isSwarm() && contact != null && contact.getConversationUri().blockingFirst().equals(c.getUri())) - updated(c); + synchronized (this.conversations) { + if (historyLoaded) + return; + //Log.w(TAG, "setHistoryLoaded " + getAccountID() + " " + conversations.size()); + for (Conversation c : conversations) { + Contact contact = c.getContact(); + if (!c.isSwarm() && contact != null && contact.getConversationUri().blockingFirst().equals(c.getUri())) + updated(c); + } + historyLoaded = true; + conversationChanged(); + pendingChanged(); } - historyLoaded = true; - conversationChanged(); - pendingChanged(); } private List<Conversation> getSortedConversations() { - //Log.w(TAG, "getSortedConversations() " + Thread.currentThread().getId()); - synchronized (sortedConversations) { - if (conversationsChanged) { - sortedConversations.clear(); - synchronized (conversations) { - sortedConversations.addAll(conversations.values()); - } - for (Conversation c : sortedConversations) - c.sortHistory(); - Collections.sort(sortedConversations, new ConversationComparator()); - conversationsChanged = false; - } + if (conversationsChanged) { + sortedConversations.clear(); + sortedConversations.addAll(conversations.values()); + for (Conversation c : sortedConversations) + c.sortHistory(); + Collections.sort(sortedConversations, new ConversationComparator()); + conversationsChanged = false; } return sortedConversations; } private List<Conversation> getSortedPending() { - synchronized (sortedPending) { - if (pendingsChanged) { - sortedPending.clear(); - synchronized (pending) { - sortedPending.addAll(pending.values()); - } - for (Conversation c : sortedPending) - c.sortHistory(); - Collections.sort(sortedPending, new ConversationComparator()); - pendingsChanged = false; - } + if (pendingsChanged) { + sortedPending.clear(); + sortedPending.addAll(pending.values()); + for (Conversation c : sortedPending) + c.sortHistory(); + Collections.sort(sortedPending, new ConversationComparator()); + pendingsChanged = false; } return sortedPending; } - private void contactAdded(Contact contact) { Uri uri = contact.getUri(); String key = uri.getUri();