summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/contacts/NameNormalizer.java
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2012-10-01 10:14:14 -0700
committerMakoto Onuki <omakoto@google.com>2012-10-01 14:37:57 -0700
commitd2f6ad6d50b5570327f8cca3b2d2bdcaec36ea90 (patch)
tree6a45200d53f55e3dfbb51b12c30d0429ab31504b /src/com/android/providers/contacts/NameNormalizer.java
parent9ff2587608416b4378767141ad396f51f23040a7 (diff)
downloadpackages_providers_ContactsProvider-d2f6ad6d50b5570327f8cca3b2d2bdcaec36ea90.zip
packages_providers_ContactsProvider-d2f6ad6d50b5570327f8cca3b2d2bdcaec36ea90.tar.gz
packages_providers_ContactsProvider-d2f6ad6d50b5570327f8cca3b2d2bdcaec36ea90.tar.bz2
Make sure to rebuild search index on locale changes...
so that search will still work even after changing the locale. - Rebuild the search index upon locale changes, as it contains locale-sensitive data. - Also make sure to update the in-memory collator in NameNormalizer upon locale changes. - Rebuild the search index on the next db upgrade in order to fix the search index which already contains invalid data. Bug 7251461 Change-Id: Id579a67de792a52a0091bf76d7c5d374f76f1639
Diffstat (limited to 'src/com/android/providers/contacts/NameNormalizer.java')
-rw-r--r--src/com/android/providers/contacts/NameNormalizer.java51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/com/android/providers/contacts/NameNormalizer.java b/src/com/android/providers/contacts/NameNormalizer.java
index c2b945e..e3f98a8 100644
--- a/src/com/android/providers/contacts/NameNormalizer.java
+++ b/src/com/android/providers/contacts/NameNormalizer.java
@@ -16,6 +16,7 @@
package com.android.providers.contacts;
import com.android.providers.contacts.util.Hex;
+import com.google.common.annotations.VisibleForTesting;
import java.text.CollationKey;
import java.text.Collator;
@@ -28,17 +29,45 @@ import java.util.Locale;
*/
public class NameNormalizer {
- private static final RuleBasedCollator sCompressingCollator;
- static {
- sCompressingCollator = (RuleBasedCollator)Collator.getInstance(Locale.getDefault());
- sCompressingCollator.setStrength(Collator.PRIMARY);
- sCompressingCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
+ private static final Object sCollatorLock = new Object();
+
+ private static Locale sCollatorLocale;
+
+ private static RuleBasedCollator sCachedCompressingCollator;
+ private static RuleBasedCollator sCachedComplexityCollator;
+
+ /**
+ * Ensure that the cached collators are for the current locale.
+ */
+ private static void ensureCollators() {
+ final Locale locale = Locale.getDefault();
+ if (locale.equals(sCollatorLocale)) {
+ return;
+ }
+ sCollatorLocale = locale;
+
+ sCachedCompressingCollator = (RuleBasedCollator) Collator.getInstance(locale);
+ sCachedCompressingCollator.setStrength(Collator.PRIMARY);
+ sCachedCompressingCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
+
+ sCachedComplexityCollator = (RuleBasedCollator) Collator.getInstance(locale);
+ sCachedComplexityCollator.setStrength(Collator.SECONDARY);
+ }
+
+ @VisibleForTesting
+ static RuleBasedCollator getCompressingCollator() {
+ synchronized (sCollatorLock) {
+ ensureCollators();
+ return sCachedCompressingCollator;
+ }
}
- private static final RuleBasedCollator sComplexityCollator;
- static {
- sComplexityCollator = (RuleBasedCollator)Collator.getInstance(Locale.getDefault());
- sComplexityCollator.setStrength(Collator.SECONDARY);
+ @VisibleForTesting
+ static RuleBasedCollator getComplexityCollator() {
+ synchronized (sCollatorLock) {
+ ensureCollators();
+ return sCachedComplexityCollator;
+ }
}
/**
@@ -46,7 +75,7 @@ public class NameNormalizer {
* of names. It ignores non-letter, non-digit characters, and removes accents.
*/
public static String normalize(String name) {
- CollationKey key = sCompressingCollator.getCollationKey(lettersAndDigitsOnly(name));
+ CollationKey key = getCompressingCollator().getCollationKey(lettersAndDigitsOnly(name));
return Hex.encodeHex(key.toByteArray(), true);
}
@@ -57,7 +86,7 @@ public class NameNormalizer {
public static int compareComplexity(String name1, String name2) {
String clean1 = lettersAndDigitsOnly(name1);
String clean2 = lettersAndDigitsOnly(name2);
- int diff = sComplexityCollator.compare(clean1, clean2);
+ int diff = getComplexityCollator().compare(clean1, clean2);
if (diff != 0) {
return diff;
}