1. Rebuild locale related RowHandler when locale was changed
2. Don't save adjusted full name style into DB.

Bug: 2582391

Change-Id: I7f6720f59cb452ac19cb7fafac5e704c3d51c2bb
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index a4f672d..6a76a0b 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -1750,10 +1750,13 @@
             NameSplitter splitter, StringBuilder sb) {
 
         splitter.guessNameStyle(name);
+        int unadjustedFullNameStyle = name.fullNameStyle;
         name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle);
         String displayName = splitter.join(name, true);
 
-        structuredNameUpdate.bindLong(1, name.fullNameStyle);
+        // Don't update database with the adjusted fullNameStyle as it is locale
+        // related
+        structuredNameUpdate.bindLong(1, unadjustedFullNameStyle);
         DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName);
         structuredNameUpdate.bindLong(3, name.phoneticNameStyle);
         structuredNameUpdate.bindLong(4, dataId);
@@ -1767,8 +1770,10 @@
 
             if (phoneticName != null) {
                 sortKey = sortKeyAlternative = phoneticName;
-            } else if (name.fullNameStyle == FullNameStyle.CHINESE) {
-                sortKey = sortKeyAlternative = splitter.convertHanziToPinyin(displayName);
+            } else if (name.fullNameStyle == FullNameStyle.CHINESE ||
+                    name.fullNameStyle == FullNameStyle.CJK) {
+                sortKey = sortKeyAlternative = ContactLocaleUtils.getIntance()
+                        .getSortKey(displayName, name.fullNameStyle);
             }
 
             if (sortKey == null) {
@@ -1829,8 +1834,10 @@
                 if (phoneticName == null && company != null) {
                     int nameStyle = splitter.guessFullNameStyle(company);
                     nameStyle = splitter.getAdjustedFullNameStyle(nameStyle);
-                    if (nameStyle == FullNameStyle.CHINESE) {
-                        sortKey = splitter.convertHanziToPinyin(company);
+                    if (nameStyle == FullNameStyle.CHINESE ||
+                            nameStyle == FullNameStyle.CJK ) {
+                        sortKey = ContactLocaleUtils.getIntance()
+                                .getSortKey(company, nameStyle);
                     }
                 }
 
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 6b218a1..b65a113 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -1244,11 +1244,12 @@
                 // As the name could be changed, let's guess the name style again.
                 name.fullNameStyle = FullNameStyle.UNDEFINED;
                 mSplitter.guessNameStyle(name);
-
+                int unadjustedFullNameStyle = name.fullNameStyle;
+                name.fullNameStyle = mSplitter.getAdjustedFullNameStyle(name.fullNameStyle);
                 final String joined = mSplitter.join(name, true);
                 update.put(StructuredName.DISPLAY_NAME, joined);
 
-                update.put(StructuredName.FULL_NAME_STYLE, name.fullNameStyle);
+                update.put(StructuredName.FULL_NAME_STYLE, unadjustedFullNameStyle);
                 update.put(StructuredName.PHONETIC_NAME_STYLE, name.phoneticNameStyle);
             } else if (touchedUnstruct && touchedStruct){
                 if (!update.containsKey(StructuredName.FULL_NAME_STYLE)) {
@@ -1969,23 +1970,6 @@
                         " WHERE " + RawContacts._ID + "=?)" +
                 " AND " + RawContacts._ID + "!=?");
 
-        mDataRowHandlers = new HashMap<String, DataRowHandler>();
-
-        mDataRowHandlers.put(Email.CONTENT_ITEM_TYPE, new EmailDataRowHandler());
-        mDataRowHandlers.put(Im.CONTENT_ITEM_TYPE,
-                new CommonDataRowHandler(Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL));
-        mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new CommonDataRowHandler(
-                StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, StructuredPostal.LABEL));
-        mDataRowHandlers.put(Organization.CONTENT_ITEM_TYPE, new OrganizationDataRowHandler());
-        mDataRowHandlers.put(Phone.CONTENT_ITEM_TYPE, new PhoneDataRowHandler());
-        mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new NicknameDataRowHandler());
-        mDataRowHandlers.put(StructuredName.CONTENT_ITEM_TYPE,
-                new StructuredNameRowHandler(mNameSplitter));
-        mDataRowHandlers.put(StructuredPostal.CONTENT_ITEM_TYPE,
-                new StructuredPostalRowHandler(mPostalSplitter));
-        mDataRowHandlers.put(GroupMembership.CONTENT_ITEM_TYPE, new GroupMembershipRowHandler());
-        mDataRowHandlers.put(Photo.CONTENT_ITEM_TYPE, new PhotoDataRowHandler());
-
         mMimeTypeIdEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
         mMimeTypeIdIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
         mMimeTypeIdStructuredName = mDbHelper.getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE);
@@ -2003,6 +1987,24 @@
         return (mDb != null);
     }
 
+    private void initDataRowHandlers() {
+      mDataRowHandlers = new HashMap<String, DataRowHandler>();
+
+      mDataRowHandlers.put(Email.CONTENT_ITEM_TYPE, new EmailDataRowHandler());
+      mDataRowHandlers.put(Im.CONTENT_ITEM_TYPE,
+              new CommonDataRowHandler(Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL));
+      mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new CommonDataRowHandler(
+              StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, StructuredPostal.LABEL));
+      mDataRowHandlers.put(Organization.CONTENT_ITEM_TYPE, new OrganizationDataRowHandler());
+      mDataRowHandlers.put(Phone.CONTENT_ITEM_TYPE, new PhoneDataRowHandler());
+      mDataRowHandlers.put(Nickname.CONTENT_ITEM_TYPE, new NicknameDataRowHandler());
+      mDataRowHandlers.put(StructuredName.CONTENT_ITEM_TYPE,
+              new StructuredNameRowHandler(mNameSplitter));
+      mDataRowHandlers.put(StructuredPostal.CONTENT_ITEM_TYPE,
+              new StructuredPostalRowHandler(mPostalSplitter));
+      mDataRowHandlers.put(GroupMembership.CONTENT_ITEM_TYPE, new GroupMembershipRowHandler());
+      mDataRowHandlers.put(Photo.CONTENT_ITEM_TYPE, new PhotoDataRowHandler());
+    }
     /**
      * Visible for testing.
      */
@@ -2020,6 +2022,7 @@
         mPostalSplitter = new PostalSplitter(mCurrentLocale);
         mCommonNicknameCache = new CommonNicknameCache(mDbHelper.getReadableDatabase());
         ContactLocaleUtils.getIntance().setLocale(mCurrentLocale);
+        initDataRowHandlers();
     }
 
     @Override
@@ -2879,10 +2882,11 @@
                 }
                 displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle);
             }
-            if (displayNameStyle == FullNameStyle.CHINESE) {
+            if (displayNameStyle == FullNameStyle.CHINESE ||
+                    displayNameStyle == FullNameStyle.CJK) {
                 sortKeyPrimary = sortKeyAlternative =
                         ContactLocaleUtils.getIntance().getSortKey(
-                                displayNamePrimary, FullNameStyle.CHINESE);
+                                displayNamePrimary, displayNameStyle);
             }
         }
 
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java
index f47b490..3f9bc86 100644
--- a/src/com/android/providers/contacts/NameSplitter.java
+++ b/src/com/android/providers/contacts/NameSplitter.java
@@ -480,32 +480,6 @@
     }
 
     /**
-     * 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,
@@ -805,9 +779,6 @@
      */
     public void guessNameStyle(Name name) {
         guessFullNameStyle(name);
-        if (FullNameStyle.CJK == name.fullNameStyle) {
-            name.fullNameStyle = getAdjustedFullNameStyle(name.fullNameStyle);
-        }
         guessPhoneticNameStyle(name);
         name.fullNameStyle = getAdjustedNameStyleBasedOnPhoneticNameStyle(name.fullNameStyle,
                 name.phoneticNameStyle);