Handle multiple Argentina phone formats.

Fixes #10506
fork-5.53.8
franortiz 2021-01-12 19:31:02 -03:00 zatwierdzone przez Greyson Parrelli
rodzic 528fe67db9
commit 9c6908873c
1 zmienionych plików z 79 dodań i 34 usunięć

Wyświetl plik

@ -3,9 +3,11 @@ package org.thoughtcrime.securesms.contacts.sync;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -18,6 +20,8 @@ import java.util.UUID;
*/ */
class FuzzyPhoneNumberHelper { class FuzzyPhoneNumberHelper {
private final static List<FuzzyVariant> FUZZY_VARIANTS = Arrays.asList(new MxFuzzyVariant(), new ArFuzzyVariant());
/** /**
* This should be run on the list of eligible numbers for contact intersection so that we can * This should be run on the list of eligible numbers for contact intersection so that we can
* create an updated list that has potentially more "fuzzy" number matches in it. * create an updated list that has potentially more "fuzzy" number matches in it.
@ -26,15 +30,14 @@ class FuzzyPhoneNumberHelper {
Set<String> allNumbers = new HashSet<>(testNumbers); Set<String> allNumbers = new HashSet<>(testNumbers);
Map<String, String> fuzzies = new HashMap<>(); Map<String, String> fuzzies = new HashMap<>();
for (String number : testNumbers) {
if (mx(number)) {
String add1 = mxAdd1(number);
String strip1 = mxStrip1(number);
if (mxMissing1(number) && !storedNumbers.contains(add1) && allNumbers.add(add1)) { for (String number : testNumbers) {
fuzzies.put(number, add1); for (FuzzyVariant fuzzyVariant: FUZZY_VARIANTS) {
} else if (mxHas1(number) && !storedNumbers.contains(strip1) && allNumbers.add(strip1)) { if(fuzzyVariant.hasVariants(number)) {
fuzzies.put(number, strip1); String variant = fuzzyVariant.getVariant(number);
if(variant != null && !storedNumbers.contains(variant) && allNumbers.add(variant)) {
fuzzies.put(number, variant);
}
} }
} }
} }
@ -53,11 +56,15 @@ class FuzzyPhoneNumberHelper {
for (Map.Entry<String, String> entry : inputResult.getFuzzies().entrySet()) { for (Map.Entry<String, String> entry : inputResult.getFuzzies().entrySet()) {
if (registeredNumbers.contains(entry.getKey()) && registeredNumbers.contains(entry.getValue())) { if (registeredNumbers.contains(entry.getKey()) && registeredNumbers.contains(entry.getValue())) {
if (mxHas1(entry.getKey())) { for (FuzzyVariant fuzzyVariant: FUZZY_VARIANTS) {
rewrites.put(entry.getKey(), entry.getValue()); if(fuzzyVariant.hasVariants(entry.getKey())) {
allNumbers.remove(entry.getKey()); if (fuzzyVariant.isDefaultVariant(entry.getKey())) {
} else { allNumbers.remove(entry.getValue());
allNumbers.remove(entry.getValue()); } else {
rewrites.put(entry.getKey(), entry.getValue());
allNumbers.remove(entry.getKey());
}
}
} }
} else if (registeredNumbers.contains(entry.getValue())) { } else if (registeredNumbers.contains(entry.getValue())) {
rewrites.put(entry.getKey(), entry.getValue()); rewrites.put(entry.getKey(), entry.getValue());
@ -79,11 +86,15 @@ class FuzzyPhoneNumberHelper {
for (Map.Entry<String, String> entry : inputResult.getFuzzies().entrySet()) { for (Map.Entry<String, String> entry : inputResult.getFuzzies().entrySet()) {
if (registeredNumbers.containsKey(entry.getKey()) && registeredNumbers.containsKey(entry.getValue())) { if (registeredNumbers.containsKey(entry.getKey()) && registeredNumbers.containsKey(entry.getValue())) {
if (mxHas1(entry.getKey())) { for (FuzzyVariant fuzzyVariant: FUZZY_VARIANTS) {
rewrites.put(entry.getKey(), entry.getValue()); if(fuzzyVariant.hasVariants(entry.getKey())) {
allNumbers.remove(entry.getKey()); if (fuzzyVariant.isDefaultVariant(entry.getKey())) {
} else { allNumbers.remove(entry.getValue());
allNumbers.remove(entry.getValue()); } else {
rewrites.put(entry.getKey(), entry.getValue());
allNumbers.remove(entry.getKey());
}
}
} }
} else if (registeredNumbers.containsKey(entry.getValue())) { } else if (registeredNumbers.containsKey(entry.getValue())) {
rewrites.put(entry.getKey(), entry.getValue()); rewrites.put(entry.getKey(), entry.getValue());
@ -94,29 +105,63 @@ class FuzzyPhoneNumberHelper {
return new OutputResultV2(allNumbers, rewrites); return new OutputResultV2(allNumbers, rewrites);
} }
private interface FuzzyVariant {
private static boolean mx(@NonNull String number) { boolean hasVariants(@NonNull String number);
return number.startsWith("+52") && (number.length() == 13 || number.length() == 14); String getVariant(@NonNull String number);
boolean isDefaultVariant(@NonNull String number);
} }
private static boolean mxHas1(@NonNull String number) { private static class MxFuzzyVariant implements FuzzyVariant {
return number.startsWith("+521") && number.length() == 14;
@Override
public boolean hasVariants(@NonNull String number) {
return number.startsWith("+52") && (number.length() == 13 || number.length() == 14);
}
@Override
public String getVariant(String number) {
if(number.startsWith("+521") && number.length() == 14) {
return "+52" + number.substring("+521".length());
}
if(number.startsWith("+52") && !number.startsWith("+521") && number.length() == 13) {
return "+521" + number.substring("+52".length());
}
return null;
}
@Override
public boolean isDefaultVariant(@NonNull String number) {
return number.startsWith("+52") && !number.startsWith("+521") && number.length() == 13;
}
} }
private static boolean mxMissing1(@NonNull String number) { private static class ArFuzzyVariant implements FuzzyVariant {
return number.startsWith("+52") && !number.startsWith("+521") && number.length() == 13;
}
private static @NonNull String mxStrip1(@NonNull String number) { @Override
return mxHas1(number) ? "+52" + number.substring("+521".length()) public boolean hasVariants(@NonNull String number) {
: number; return number.startsWith("+54") && (number.length() == 13 || number.length() == 14);
} }
private static @NonNull String mxAdd1(@NonNull String number) { @Override
return mxMissing1(number) ? "+521" + number.substring("+52".length()) public String getVariant(String number) {
: number; if(number.startsWith("+549") && number.length() == 14) {
} return "+54" + number.substring("+549".length());
}
if(number.startsWith("+54") && !number.startsWith("+549") && number.length() == 13) {
return "+549" + number.substring("+54".length());
}
return null;
}
@Override
public boolean isDefaultVariant(@NonNull String number) {
return number.startsWith("+54") && !number.startsWith("+549") && number.length() == 13;
}
}
public static class InputResult { public static class InputResult {
private final Set<String> numbers; private final Set<String> numbers;