Handle accented characters in country name sorting.

Closes #8419
This commit is contained in:
Alan Evans 2019-06-14 15:35:03 -04:00 committed by Greyson Parrelli
parent b8bb2b78bd
commit cb86be578b

View file

@ -1,6 +1,14 @@
package org.thoughtcrime.securesms.database.loaders; package org.thoughtcrime.securesms.database.loaders;
import android.content.Context;
import androidx.loader.content.AsyncTaskLoader;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
import java.text.Collator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@ -8,14 +16,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import android.content.Context; public final class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, String>>> {
import androidx.loader.content.AsyncTaskLoader;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, String>>> {
public CountryListLoader(Context context) { public CountryListLoader(Context context) {
super(context); super(context);
@ -24,10 +25,10 @@ public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, Str
@Override @Override
public ArrayList<Map<String, String>> loadInBackground() { public ArrayList<Map<String, String>> loadInBackground() {
Set<String> regions = PhoneNumberUtil.getInstance().getSupportedRegions(); Set<String> regions = PhoneNumberUtil.getInstance().getSupportedRegions();
ArrayList<Map<String, String>> results = new ArrayList<Map<String, String>>(regions.size()); ArrayList<Map<String, String>> results = new ArrayList<>(regions.size());
for (String region : regions) { for (String region : regions) {
Map<String, String> data = new HashMap<String, String>(2); Map<String, String> data = new HashMap<>(2);
data.put("country_name", PhoneNumberFormatter.getRegionDisplayName(region)); data.put("country_name", PhoneNumberFormatter.getRegionDisplayName(region));
data.put("country_code", "+" +PhoneNumberUtil.getInstance().getCountryCodeForRegion(region)); data.put("country_code", "+" +PhoneNumberUtil.getInstance().getCountryCodeForRegion(region));
results.add(data); results.add(data);
@ -39,9 +40,19 @@ public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, Str
} }
private static class RegionComparator implements Comparator<Map<String, String>> { private static class RegionComparator implements Comparator<Map<String, String>> {
private final Collator collator;
RegionComparator() {
collator = Collator.getInstance();
collator.setStrength(Collator.PRIMARY);
}
@Override @Override
public int compare(Map<String, String> lhs, Map<String, String> rhs) { public int compare(Map<String, String> lhs, Map<String, String> rhs) {
return lhs.get("country_name").compareTo(rhs.get("country_name")); String a = lhs.get("country_name");
String b = rhs.get("country_name");
return collator.compare(a, b);
} }
} }
} }