From c7ed32852d702390cecd4566fc79b4dde652e920 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Fri, 29 Mar 2019 16:46:41 +0100 Subject: [PATCH] do not load participant list without need --- .../securesms/GroupCreateActivity.java | 2 +- .../connect/ApplicationDcContext.java | 9 +-- .../securesms/database/Address.java | 4 -- .../securesms/recipients/Recipient.java | 64 +++++++++---------- .../securesms/util/GroupUtil.java | 15 ----- 5 files changed, 32 insertions(+), 62 deletions(-) diff --git a/src/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/org/thoughtcrime/securesms/GroupCreateActivity.java index 0ae75e641..52f2c1497 100644 --- a/src/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -501,7 +501,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity } private void fillExistingGroup(Recipient recipient) { - List participants = recipient.getParticipants(); + List participants = recipient.loadParticipants(this); Recipient[] participantsArray = new Recipient[participants.size()]; participantsArray = participants.toArray(participantsArray); if (!isFinishing()) { diff --git a/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java b/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java index fd1912a9e..3a1e82ece 100644 --- a/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java +++ b/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java @@ -232,12 +232,7 @@ public class ApplicationDcContext extends DcContext { @NonNull public Recipient getRecipient(DcChat chat) { - int[] contactIds = getChatContacts(chat.getId()); - List participants = new ArrayList<>(); - for (int contactId : contactIds) { - participants.add(getRecipient(RECIPIENT_TYPE_CONTACT, contactId)); - } - Recipient recipient = new Recipient(Address.fromChat(chat.getId()), chat.getName(), participants); + Recipient recipient = new Recipient(Address.fromChat(chat.getId()), chat.getName(), chat, null); if (!chat.isGroup()) { String identifier = Hash.sha256(chat.getName() + chat.getSubtitle()); Uri systemContactPhoto = Prefs.getSystemContactPhoto(context, identifier); @@ -251,7 +246,7 @@ public class ApplicationDcContext extends DcContext { @NonNull public Recipient getRecipient(DcContact contact) { - Recipient recipient = new Recipient(Address.fromContact(contact.getId()), contact.getDisplayName(), null); + Recipient recipient = new Recipient(Address.fromContact(contact.getId()), contact.getDisplayName(), null, contact); String identifier = Hash.sha256(contact.getName() + contact.getAddr()); Uri systemContactPhoto = Prefs.getSystemContactPhoto(context, identifier); if (systemContactPhoto != null) { diff --git a/src/org/thoughtcrime/securesms/database/Address.java b/src/org/thoughtcrime/securesms/database/Address.java index 775c00b14..fd08f53c6 100644 --- a/src/org/thoughtcrime/securesms/database/Address.java +++ b/src/org/thoughtcrime/securesms/database/Address.java @@ -52,10 +52,6 @@ public class Address implements Parcelable, Comparable
{ return GroupUtil.isEncodedGroup(address); } - public boolean isMmsGroup() { - return GroupUtil.isMmsGroup(address); - } - public boolean isEmail() { return NumberUtil.isValidEmail(address); } diff --git a/src/org/thoughtcrime/securesms/recipients/Recipient.java b/src/org/thoughtcrime/securesms/recipients/Recipient.java index ba3f46beb..6dc238f14 100644 --- a/src/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/src/org/thoughtcrime/securesms/recipients/Recipient.java @@ -25,6 +25,9 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import com.b44t.messenger.DcChat; +import com.b44t.messenger.DcContact; + import org.thoughtcrime.securesms.connect.ApplicationDcContext; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; @@ -38,6 +41,7 @@ import org.thoughtcrime.securesms.contacts.avatars.TransparentContactPhoto; import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.util.Util; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; @@ -50,11 +54,10 @@ public class Recipient implements RecipientModifiedListener { private final Set listeners = Collections.newSetFromMap(new WeakHashMap()); private final @NonNull Address address; - private final @NonNull List participants = new LinkedList<>(); private @Nullable String name; private @Nullable String customLabel; - private boolean resolving; + private final boolean resolving; private @Nullable Uri systemContactPhoto; private Uri contactUri; @@ -64,6 +67,10 @@ public class Recipient implements RecipientModifiedListener { private @Nullable String profileName; private @Nullable String profileAvatar; + // either dcChat or dcContact are set + private @Nullable DcChat dcChat; + private @Nullable DcContact dcContact; + public static @NonNull Recipient fromChat(@NonNull Context context, int dcMsgId) { ApplicationDcContext dcContext = DcHelper.getContext(context); return fromChat(dcContext, dcMsgId); @@ -95,7 +102,9 @@ public class Recipient implements RecipientModifiedListener { return dcContext.getRecipient(dcContext.getContact(0)); } - public Recipient(@NonNull Address address, @Nullable String name, @Nullable List participants) { + public Recipient(@NonNull Address address, @Nullable String name, @Nullable DcChat dcChat, @Nullable DcContact dcContact) { + this.dcChat = dcChat; + this.dcContact = dcContact; this.address = address; this.contactUri = null; this.name = name; @@ -104,7 +113,6 @@ public class Recipient implements RecipientModifiedListener { this.blocked = false; this.profileName = null; this.profileAvatar = null; - this.participants.addAll(participants==null? new LinkedList<>() : participants); this.resolving = false; } @@ -113,16 +121,6 @@ public class Recipient implements RecipientModifiedListener { } public synchronized @Nullable String getName() { - if (this.name == null && isMmsGroupRecipient()) { - List names = new LinkedList<>(); - - for (Recipient recipient : participants) { - names.add(recipient.toShortString()); - } - - return Util.join(names, ", "); - } - return this.name; } @@ -156,30 +154,27 @@ public class Recipient implements RecipientModifiedListener { } public boolean isGroupRecipient() { - return participants.size() > 1; + return dcChat!=null && dcChat.isGroup(); } - public boolean isMmsGroupRecipient() { - return address.isMmsGroup(); - } - - public @NonNull synchronized List getParticipants() { - return new LinkedList<>(participants); + public @NonNull synchronized List loadParticipants(Context context) { + List participants = new ArrayList<>(); + if (dcChat!=null) { + ApplicationDcContext dcContext = DcHelper.getContext(context); + int[] contactIds = dcContext.getChatContacts(dcChat.getId()); + for (int contactId : contactIds) { + participants.add(dcContext.getRecipient(ApplicationDcContext.RECIPIENT_TYPE_CONTACT, contactId)); + } + } + return participants; } public synchronized void addListener(RecipientModifiedListener listener) { - if (listeners.isEmpty()) { - for (Recipient recipient : participants) recipient.addListener(this); - } - listeners.add(listener); + // TODO: better use DC_EVENT_* } public synchronized void removeListener(RecipientModifiedListener listener) { - listeners.remove(listener); - - if (listeners.isEmpty()) { - for (Recipient recipient : participants) recipient.removeListener(this); - } + // TODO: better use DC_EVENT_* } public synchronized String toShortString() { @@ -188,11 +183,11 @@ public class Recipient implements RecipientModifiedListener { public int getFallbackAvatarColor(Context context) { int rgb = 0x00808080; - if(address.isDcContact()) { - rgb = DcHelper.getContext(context).getContact(address.getDcContactId()).getColor(); + if(dcContact!=null) { + rgb = dcContact.getColor(); } - else if(address.isDcChat()){ - rgb = DcHelper.getContext(context).getChat(address.getDcChatId()).getColor(); + else if(dcChat!=null){ + rgb = dcChat.getColor(); } int argb = Color.argb(0xFF, Color.red(rgb), Color.green(rgb), Color.blue(rgb)); return argb; @@ -301,7 +296,6 @@ public class Recipient implements RecipientModifiedListener { return "Recipient{" + "listeners=" + listeners + ", address=" + address + - ", participants=" + participants + ", name='" + name + '\'' + ", customLabel='" + customLabel + '\'' + ", resolving=" + resolving + diff --git a/src/org/thoughtcrime/securesms/util/GroupUtil.java b/src/org/thoughtcrime/securesms/util/GroupUtil.java index bf807d2e3..a8118aa5a 100644 --- a/src/org/thoughtcrime/securesms/util/GroupUtil.java +++ b/src/org/thoughtcrime/securesms/util/GroupUtil.java @@ -10,23 +10,8 @@ public class GroupUtil { private static final String ENCODED_MMS_GROUP_PREFIX = "__signal_mms_group__!"; private static final String TAG = GroupUtil.class.getSimpleName(); - public static String getEncodedId(byte[] groupId, boolean mms) { - return (mms ? ENCODED_MMS_GROUP_PREFIX : ENCODED_SIGNAL_GROUP_PREFIX) + Hex.toStringCondensed(groupId); - } - - public static byte[] getDecodedId(String groupId) throws IOException { - if (!isEncodedGroup(groupId)) { - throw new IOException("Invalid encoding"); - } - - return Hex.fromStringCondensed(groupId.split("!", 2)[1]); - } - public static boolean isEncodedGroup(@NonNull String groupId) { return groupId.startsWith(ENCODED_SIGNAL_GROUP_PREFIX) || groupId.startsWith(ENCODED_MMS_GROUP_PREFIX); } - public static boolean isMmsGroup(@NonNull String groupId) { - return groupId.startsWith(ENCODED_MMS_GROUP_PREFIX); - } }