summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/contacts/NameSplitter.java
diff options
context:
space:
mode:
authorDmitri Plotnikov <dplotnikov@google.com>2009-12-21 13:40:30 -0800
committerDmitri Plotnikov <dplotnikov@google.com>2009-12-21 13:40:30 -0800
commit5dd6d5d4acb93adc05f1fde904080787f2397f51 (patch)
tree00ce4ba6e18b2bf04a5a1f2a5b15346d0a86a4a0 /src/com/android/providers/contacts/NameSplitter.java
parentf5bda8d8994a50c60e5d39fb66990040b1bb5622 (diff)
downloadpackages_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.java103
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;
}