Fix crash when reading some contact cards.

This commit is contained in:
Greyson Parrelli 2024-08-27 12:26:18 -04:00 committed by Nicholas Tinsley
parent c4ba579310
commit e263d7da73
2 changed files with 20 additions and 2 deletions

View file

@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.components.emoji.EmojiStrings;
import org.thoughtcrime.securesms.contactshare.Contact.Email;
import org.thoughtcrime.securesms.contactshare.Contact.Phone;
import org.thoughtcrime.securesms.contactshare.Contact.PostalAddress;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter;
import org.thoughtcrime.securesms.recipients.Recipient;
@ -35,6 +36,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
public final class ContactUtil {
@ -136,7 +138,13 @@ public final class ContactUtil {
}
public static List<RecipientId> getRecipients(@NonNull Context context, @NonNull Contact contact) {
return Stream.of(contact.getPhoneNumbers()).map(phone -> Recipient.external(context, phone.getNumber())).map(Recipient::getId).toList();
return contact
.getPhoneNumbers()
.stream()
.map(phone -> PhoneNumberFormatter.get(context).formatOrNull(phone.getNumber()))
.filter(number -> number != null)
.map(phone -> SignalDatabase.recipients().getOrInsertFromE164(phone))
.collect(Collectors.toList());
}
@WorkerThread

View file

@ -29,6 +29,8 @@ public class PhoneNumberFormatter {
private static final String TAG = Log.tag(PhoneNumberFormatter.class);
private static final String UNKNOWN_NUMBER = "Unknown";
private static final Set<String> EXCLUDE_FROM_MANUAL_SHORTCODE_4 = SetUtil.newHashSet("AC", "NC", "NU", "TK");
private static final Set<String> MANUAL_SHORTCODE_6 = SetUtil.newHashSet("DE", "FI", "GB", "SK");
private static final Set<Integer> NATIONAL_FORMAT_COUNTRY_CODES = SetUtil.newHashSet(1 /*US*/, 44 /*UK*/);
@ -105,9 +107,17 @@ public class PhoneNumberFormatter {
return localNumber != null && localNumber.isPresent() ? localNumber.get().countryCode : 0;
}
public @Nullable String formatOrNull(@Nullable String number) {
String formatted = format(number);
if (formatted.equals(UNKNOWN_NUMBER)) {
return null;
}
return formatted;
}
public @NonNull String format(@Nullable String number) {
if (number == null) return "Unknown";
if (number == null) return UNKNOWN_NUMBER;
if (GroupId.isEncodedGroup(number)) return number;
if (ALPHA_PATTERN.matcher(number).find()) return number.trim();