diff --git a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java index 9da8e6bc8e5b2853b5eb1b4ae487a787d6ae92df..15eb5d7d2fb7a515b2fe9a213a13e18b55a83817 100644 --- a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java @@ -11,7 +11,7 @@ import android.os.SystemClock; import android.util.Base64; import android.util.Log; import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import eu.siacs.conversations.Config; import eu.siacs.conversations.crypto.axolotl.AxolotlService; import eu.siacs.conversations.crypto.axolotl.FingerprintStatus; @@ -1809,8 +1809,8 @@ public class DatabaseBackend extends SQLiteOpenHelper { return rows == 1; } - public List readRoster(final Account account) { - final var builder = new ImmutableList.Builder(); + public Map readRoster(final Account account) { + final var builder = new ImmutableMap.Builder(); final SQLiteDatabase db = this.getReadableDatabase(); final String[] args = {account.getUuid()}; try (final Cursor cursor = @@ -1819,11 +1819,11 @@ public class DatabaseBackend extends SQLiteOpenHelper { final var contact = Contact.fromCursor(cursor); if (contact != null) { contact.setAccount(account); - builder.add(contact); + builder.put(contact.getJid(), contact); } } } - return builder.build(); + return builder.buildKeepingLast(); } public void writeRoster( diff --git a/src/main/java/eu/siacs/conversations/ui/ViewProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/ViewProfilePictureActivity.java index 00f3c1f48b49b5efd95792aa9268c1f4bd16f95f..30705664c9f33d4e0053d564b443c1b6157299e8 100644 --- a/src/main/java/eu/siacs/conversations/ui/ViewProfilePictureActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ViewProfilePictureActivity.java @@ -1,7 +1,5 @@ package eu.siacs.conversations.ui; -import static eu.siacs.conversations.ui.XmppActivity.configureActionBar; - import android.net.Uri; import android.os.Bundle; import androidx.databinding.DataBindingUtil; diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/RosterManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/RosterManager.java index ff2d13e50748efb5af9bc3c271882a6e4f5f9ee8..318f6591a33c6822b01c2a55b6837017f362598b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/RosterManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/RosterManager.java @@ -5,7 +5,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.MoreExecutors; @@ -22,9 +21,10 @@ import im.conversations.android.xmpp.model.error.Error; import im.conversations.android.xmpp.model.roster.Item; import im.conversations.android.xmpp.model.roster.Query; import im.conversations.android.xmpp.model.stanza.Iq; -import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; public class RosterManager extends AbstractManager implements Roster { @@ -32,7 +32,7 @@ public class RosterManager extends AbstractManager implements Roster { private final ReplacingSerialSingleThreadExecutor dbExecutor = new ReplacingSerialSingleThreadExecutor(RosterManager.class.getName()); - private final List contacts = new ArrayList<>(); + private final Map contacts = new HashMap<>(); private String version; private final XmppConnectionService service; @@ -196,14 +196,13 @@ public class RosterManager extends AbstractManager implements Roster { @NonNull public Contact getContactInternal(@NonNull final Jid jid) { - final var existing = - Iterables.find(this.contacts, c -> c.getJid().equals(jid.asBareJid()), null); + final var existing = this.contacts.get(jid.asBareJid()); if (existing != null) { return existing; } final var contact = new Contact(jid.asBareJid()); contact.setAccount(getAccount()); - this.contacts.add(contact); + this.contacts.put(jid.asBareJid(), contact); return contact; } @@ -211,8 +210,7 @@ public class RosterManager extends AbstractManager implements Roster { @Nullable public Contact getContactFromContactList(@NonNull final Jid jid) { synchronized (this.contacts) { - final var contact = - Iterables.find(this.contacts, c -> c.getJid().equals(jid.asBareJid()), null); + final var contact = this.contacts.get(jid.asBareJid()); if (contact != null && contact.showInContactList()) { return contact; } else { @@ -224,7 +222,7 @@ public class RosterManager extends AbstractManager implements Roster { @Override public List getContacts() { synchronized (this.contacts) { - return ImmutableList.copyOf(this.contacts); + return ImmutableList.copyOf(this.contacts.values()); } } @@ -234,20 +232,20 @@ public class RosterManager extends AbstractManager implements Roster { final int option = Contact.getOption(clazz); synchronized (this.contacts) { return ImmutableList.copyOf( - Collections2.filter(this.contacts, c -> c.getOption(option))); + Collections2.filter(this.contacts.values(), c -> c.getOption(option))); } } public void clearPresences() { synchronized (this.contacts) { - for (final var contact : this.contacts) { + for (final var contact : this.contacts.values()) { contact.clearPresences(); } } } private void markAllAsNotInRoster() { - for (final var contact : this.contacts) { + for (final var contact : this.contacts.values()) { contact.resetOption(Contact.Options.IN_ROSTER); } } @@ -255,7 +253,7 @@ public class RosterManager extends AbstractManager implements Roster { public void restore() { synchronized (this.contacts) { this.contacts.clear(); - this.contacts.addAll(getDatabase().readRoster(getAccount())); + this.contacts.putAll(getDatabase().readRoster(getAccount())); } } @@ -268,7 +266,7 @@ public class RosterManager extends AbstractManager implements Roster { final List contacts; final String version; synchronized (this.contacts) { - contacts = ImmutableList.copyOf(this.contacts); + contacts = ImmutableList.copyOf(this.contacts.values()); version = this.version; } getDatabase().writeRoster(account, version, contacts); @@ -276,7 +274,7 @@ public class RosterManager extends AbstractManager implements Roster { public void syncDirtyContacts() { synchronized (this.contacts) { - for (final var contact : this.contacts) { + for (final var contact : this.contacts.values()) { if (contact.getOption(Contact.Options.DIRTY_PUSH)) { addRosterItem(contact, null); }