diff options
author | Dmitri Plotnikov <dplotnikov@google.com> | 2009-12-21 13:40:30 -0800 |
---|---|---|
committer | Dmitri Plotnikov <dplotnikov@google.com> | 2009-12-21 13:40:30 -0800 |
commit | 5dd6d5d4acb93adc05f1fde904080787f2397f51 (patch) | |
tree | 00ce4ba6e18b2bf04a5a1f2a5b15346d0a86a4a0 /src/com/android/providers/contacts/NameSplitter.java | |
parent | f5bda8d8994a50c60e5d39fb66990040b1bb5622 (diff) | |
download | packages_providers_ContactsProvider-5dd6d5d4acb93adc05f1fde904080787f2397f51.zip packages_providers_ContactsProvider-5dd6d5d4acb93adc05f1fde904080787f2397f51.tar.gz packages_providers_ContactsProvider-5dd6d5d4acb93adc05f1fde904080787f2397f51.tar.bz2 |
Resubmit: Adding support for new Contacts columns for names and sorting
This is in preparation for fixing bugs:
Bug: 2075641
Bug: 2021660
Bug: 2164422
Bug: 2267198
Change-Id: I7696abe8c8fd17d8854632cc8e818b9e4d2e643c
Diffstat (limited to 'src/com/android/providers/contacts/NameSplitter.java')
-rw-r--r-- | src/com/android/providers/contacts/NameSplitter.java | 103 |
1 files changed, 87 insertions, 16 deletions
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java index 058da27..476e098 100644 --- a/src/com/android/providers/contacts/NameSplitter.java +++ b/src/com/android/providers/contacts/NameSplitter.java @@ -15,14 +15,17 @@ */ package com.android.providers.contacts; +import com.android.internal.util.HanziToPinyin; +import com.android.internal.util.HanziToPinyin.Token; + import android.content.ContentValues; -import android.database.DatabaseUtils; import android.provider.ContactsContract.FullNameStyle; import android.provider.ContactsContract.PhoneticNameStyle; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.text.TextUtils; import java.lang.Character.UnicodeBlock; +import java.util.ArrayList; import java.util.HashSet; import java.util.Locale; import java.util.StringTokenizer; @@ -156,6 +159,24 @@ public class NameSplitter { phoneticGivenName = null; phoneticNameStyle = PhoneticNameStyle.UNDEFINED; } + + public boolean isEmpty() { + return TextUtils.isEmpty(givenNames) + && TextUtils.isEmpty(middleName) + && TextUtils.isEmpty(familyName) + && TextUtils.isEmpty(suffix) + && TextUtils.isEmpty(phoneticFamilyName) + && TextUtils.isEmpty(phoneticMiddleName) + && TextUtils.isEmpty(phoneticGivenName); + } + + @Override + public String toString() { + return "[given: " + givenNames + " middle: " + middleName + " family: " + familyName + + " ph/given: " + phoneticGivenName + " ph/middle: " + phoneticMiddleName + + " ph/family: " + phoneticFamilyName + "]"; + } + } private static class NameTokenizer extends StringTokenizer { @@ -294,6 +315,8 @@ public class NameSplitter { fullNameStyle = getAdjustedFullNameStyle(fullNameStyle); } + name.fullNameStyle = fullNameStyle; + switch (fullNameStyle) { case FullNameStyle.CHINESE: splitChineseName(name, fullName); @@ -447,6 +470,41 @@ public class NameSplitter { } /** + * Concatenates components of the phonetic name following the CJK tradition: + * family name + middle name + given name(s). + */ + public String joinPhoneticName(Name name) { + return join(name.phoneticFamilyName, name.phoneticMiddleName, + name.phoneticGivenName, null, true, false, false); + } + + /** + * Given a name in Chinese, returns a Pinyin representation. + */ + public String convertHanziToPinyin(String name) { + + // TODO: move this code to HanziToPinyin and optimize + ArrayList<Token> tokens = HanziToPinyin.getInstance().get(name); + if (tokens != null) { + int size = tokens.size(); + if (size != 0) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < size; i++) { + String pinyin = tokens.get(i).target; + if (!TextUtils.isEmpty(pinyin)) { + if (sb.length() != 0) { + sb.append(' '); + } + sb.append(pinyin); + } + } + return sb.toString(); + } + } + return null; + } + + /** * Concatenates parts of a full name inserting spaces and commas as specified. */ private String join(String part1, String part2, String part3, String suffix, @@ -747,24 +805,29 @@ public class NameSplitter { public void guessNameStyle(Name name) { guessFullNameStyle(name); guessPhoneticNameStyle(name); + name.fullNameStyle = getAdjustedNameStyleBasedOnPhoneticNameStyle(name.fullNameStyle, + name.phoneticNameStyle); + } - // If we were unsure about display name style based on the name components, - // but phonetic name makes it more definitive, update the display name style - // according to the phonetic name style. - if (name.phoneticNameStyle != PhoneticNameStyle.UNDEFINED) { - if (name.fullNameStyle == FullNameStyle.UNDEFINED - || name.fullNameStyle == FullNameStyle.CJK) { - if (name.phoneticNameStyle == PhoneticNameStyle.JAPANESE) { - name.fullNameStyle = FullNameStyle.JAPANESE; - } else if (name.phoneticNameStyle == PhoneticNameStyle.KOREAN) { - name.fullNameStyle = FullNameStyle.KOREAN; + /** + * Updates the display name style according to the phonetic name style if we + * were unsure about display name style based on the name components, but + * phonetic name makes it more definitive. + */ + public int getAdjustedNameStyleBasedOnPhoneticNameStyle(int nameStyle, int phoneticNameStyle) { + if (phoneticNameStyle != PhoneticNameStyle.UNDEFINED) { + if (nameStyle == FullNameStyle.UNDEFINED || nameStyle == FullNameStyle.CJK) { + if (phoneticNameStyle == PhoneticNameStyle.JAPANESE) { + return FullNameStyle.JAPANESE; + } else if (phoneticNameStyle == PhoneticNameStyle.KOREAN) { + return FullNameStyle.KOREAN; } - if (name.fullNameStyle == FullNameStyle.CJK - && name.phoneticNameStyle == PhoneticNameStyle.PINYIN) { - name.fullNameStyle = FullNameStyle.CHINESE; + if (nameStyle == FullNameStyle.CJK && phoneticNameStyle == PhoneticNameStyle.PINYIN) { + return FullNameStyle.CHINESE; } } } + return nameStyle; } /** @@ -772,6 +835,10 @@ public class NameSplitter { * used in the supplied name. */ private void guessFullNameStyle(NameSplitter.Name name) { + if (name.fullNameStyle != FullNameStyle.UNDEFINED) { + return; + } + int bestGuess = guessFullNameStyle(name.givenNames); if (bestGuess != FullNameStyle.UNDEFINED && bestGuess != FullNameStyle.CJK) { name.fullNameStyle = bestGuess; @@ -799,7 +866,7 @@ public class NameSplitter { name.fullNameStyle = bestGuess; } - private int guessFullNameStyle(String name) { + public int guessFullNameStyle(String name) { if (name == null) { return FullNameStyle.UNDEFINED; } @@ -858,6 +925,10 @@ public class NameSplitter { } private void guessPhoneticNameStyle(NameSplitter.Name name) { + if (name.phoneticNameStyle != PhoneticNameStyle.UNDEFINED) { + return; + } + int bestGuess = guessPhoneticNameStyle(name.phoneticFamilyName); if (bestGuess != FullNameStyle.UNDEFINED && bestGuess != FullNameStyle.CJK) { name.phoneticNameStyle = bestGuess; @@ -883,7 +954,7 @@ public class NameSplitter { } } - private int guessPhoneticNameStyle(String name) { + public int guessPhoneticNameStyle(String name) { if (name == null) { return PhoneticNameStyle.UNDEFINED; } |