Ignore contacts that don't have a phone number.
This commit is contained in:
parent
c39751f9db
commit
989b071a6d
2 changed files with 12 additions and 3 deletions
|
@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
|
import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||||
import org.thoughtcrime.securesms.util.SetUtil;
|
import org.thoughtcrime.securesms.util.SetUtil;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
@ -231,7 +232,7 @@ public final class StorageSyncHelper {
|
||||||
public static @NonNull MergeResult resolveConflict(@NonNull Collection<SignalStorageRecord> remoteOnlyRecords,
|
public static @NonNull MergeResult resolveConflict(@NonNull Collection<SignalStorageRecord> remoteOnlyRecords,
|
||||||
@NonNull Collection<SignalStorageRecord> localOnlyRecords)
|
@NonNull Collection<SignalStorageRecord> localOnlyRecords)
|
||||||
{
|
{
|
||||||
List<SignalContactRecord> remoteOnlyContacts = Stream.of(remoteOnlyRecords).filter(r -> r.getContact().isPresent()).map(r -> r.getContact().get()).toList();
|
List<SignalContactRecord> remoteOnlyContacts = Stream.of(remoteOnlyRecords).filter(r -> r.getContact().isPresent() && isValidContact(r.getContact().get())).map(r -> r.getContact().get()).toList();
|
||||||
List<SignalContactRecord> localOnlyContacts = Stream.of(localOnlyRecords).filter(r -> r.getContact().isPresent()).map(r -> r.getContact().get()).toList();
|
List<SignalContactRecord> localOnlyContacts = Stream.of(localOnlyRecords).filter(r -> r.getContact().isPresent()).map(r -> r.getContact().get()).toList();
|
||||||
|
|
||||||
List<SignalGroupV1Record> remoteOnlyGroupV1 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV1().isPresent()).map(r -> r.getGroupV1().get()).toList();
|
List<SignalGroupV1Record> remoteOnlyGroupV1 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV1().isPresent()).map(r -> r.getGroupV1().get()).toList();
|
||||||
|
@ -240,7 +241,7 @@ public final class StorageSyncHelper {
|
||||||
List<SignalGroupV2Record> remoteOnlyGroupV2 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList();
|
List<SignalGroupV2Record> remoteOnlyGroupV2 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList();
|
||||||
List<SignalGroupV2Record> localOnlyGroupV2 = Stream.of(localOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList();
|
List<SignalGroupV2Record> localOnlyGroupV2 = Stream.of(localOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList();
|
||||||
|
|
||||||
List<SignalStorageRecord> remoteOnlyUnknowns = Stream.of(remoteOnlyRecords).filter(SignalStorageRecord::isUnknown).toList();
|
List<SignalStorageRecord> remoteOnlyUnknowns = Stream.of(remoteOnlyRecords).filter(r -> r.isUnknown() || (r.getContact().isPresent() && !isValidContact(r.getContact().get()))).toList();
|
||||||
List<SignalStorageRecord> localOnlyUnknowns = Stream.of(localOnlyRecords).filter(SignalStorageRecord::isUnknown).toList();
|
List<SignalStorageRecord> localOnlyUnknowns = Stream.of(localOnlyRecords).filter(SignalStorageRecord::isUnknown).toList();
|
||||||
|
|
||||||
List<SignalAccountRecord> remoteOnlyAccount = Stream.of(remoteOnlyRecords).filter(r -> r.getAccount().isPresent()).map(r -> r.getAccount().get()).toList();
|
List<SignalAccountRecord> remoteOnlyAccount = Stream.of(remoteOnlyRecords).filter(r -> r.getAccount().isPresent()).map(r -> r.getAccount().get()).toList();
|
||||||
|
@ -440,6 +441,10 @@ public final class StorageSyncHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isValidContact(@NonNull SignalContactRecord contact) {
|
||||||
|
return FeatureFlags.uuids() || contact.getAddress().getNumber().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
public static final class KeyDifferenceResult {
|
public static final class KeyDifferenceResult {
|
||||||
private final List<StorageId> remoteOnlyKeys;
|
private final List<StorageId> remoteOnlyKeys;
|
||||||
private final List<StorageId> localOnlyKeys;
|
private final List<StorageId> localOnlyKeys;
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.logging.Log;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.storage.StorageSyncHelper.KeyDifferenceResult;
|
import org.thoughtcrime.securesms.storage.StorageSyncHelper.KeyDifferenceResult;
|
||||||
import org.thoughtcrime.securesms.storage.StorageSyncHelper.MergeResult;
|
import org.thoughtcrime.securesms.storage.StorageSyncHelper.MergeResult;
|
||||||
|
import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||||
import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
|
import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
|
||||||
|
@ -47,7 +48,7 @@ import static org.thoughtcrime.securesms.testutil.TestHelpers.byteListOf;
|
||||||
import static org.thoughtcrime.securesms.testutil.TestHelpers.setOf;
|
import static org.thoughtcrime.securesms.testutil.TestHelpers.setOf;
|
||||||
|
|
||||||
@RunWith(PowerMockRunner.class)
|
@RunWith(PowerMockRunner.class)
|
||||||
@PrepareForTest({ Recipient.class })
|
@PrepareForTest({ Recipient.class, FeatureFlags.class})
|
||||||
public final class StorageSyncHelperTest {
|
public final class StorageSyncHelperTest {
|
||||||
|
|
||||||
private static final UUID UUID_A = UuidUtil.parseOrThrow("ebef429e-695e-4f51-bcc4-526a60ac68c7");
|
private static final UUID UUID_A = UuidUtil.parseOrThrow("ebef429e-695e-4f51-bcc4-526a60ac68c7");
|
||||||
|
@ -76,6 +77,7 @@ public final class StorageSyncHelperTest {
|
||||||
mockStatic(Recipient.class);
|
mockStatic(Recipient.class);
|
||||||
when(Recipient.self()).thenReturn(SELF);
|
when(Recipient.self()).thenReturn(SELF);
|
||||||
Log.initialize(new Log.Logger[0]);
|
Log.initialize(new Log.Logger[0]);
|
||||||
|
mockStatic(FeatureFlags.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -242,6 +244,8 @@ public final class StorageSyncHelperTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void resolveConflict_complex() {
|
public void resolveConflict_complex() {
|
||||||
|
when(FeatureFlags.uuids()).thenReturn(true);
|
||||||
|
|
||||||
SignalContactRecord remote1 = contact(1, UUID_A, null, "a");
|
SignalContactRecord remote1 = contact(1, UUID_A, null, "a");
|
||||||
SignalContactRecord local1 = contact(2, UUID_A, E164_A, "a");
|
SignalContactRecord local1 = contact(2, UUID_A, E164_A, "a");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue