diff options
author | Makoto Onuki <omakoto@google.com> | 2012-10-01 10:14:14 -0700 |
---|---|---|
committer | Makoto Onuki <omakoto@google.com> | 2012-10-01 14:37:57 -0700 |
commit | d2f6ad6d50b5570327f8cca3b2d2bdcaec36ea90 (patch) | |
tree | 6a45200d53f55e3dfbb51b12c30d0429ab31504b /src/com/android/providers/contacts/NameNormalizer.java | |
parent | 9ff2587608416b4378767141ad396f51f23040a7 (diff) | |
download | packages_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.java | 51 |
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; } |