Merge "Fixed to Added the function to add the Phonetic name into Phonetic field automaticaly." am: 420c364900
am: ec84224dd6

Change-Id: Ib80f014d5f54b7e9face9fef8bfb4c466d4f008f
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index ac07342..a250b4e 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -52,6 +52,7 @@
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
+import android.widget.EditText;
 import android.widget.LinearLayout;
 import android.widget.ListPopupWindow;
 import android.widget.Toast;
@@ -100,6 +101,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
 /**
@@ -1280,6 +1282,13 @@
         if (uri != null) {
             editorView.setFullSizePhoto(uri);
         }
+        final StructuredNameEditorView nameEditor = editorView.getNameEditorView();
+        final TextFieldsEditorView phoneticNameEditor = editorView.getPhoneticEditorView();
+        final boolean useJapaneseOrder = 
+                       Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
+        if (useJapaneseOrder && nameEditor != null && phoneticNameEditor != null) {
+            nameEditor.setPhoneticView(phoneticNameEditor);
+        }
 
         // The editor is ready now so make it visible
         editorView.setEnabled(mEnabled);
diff --git a/src/com/android/contacts/editor/Editor.java b/src/com/android/contacts/editor/Editor.java
index 711fbc0..c02816a 100644
--- a/src/com/android/contacts/editor/Editor.java
+++ b/src/com/android/contacts/editor/Editor.java
@@ -81,6 +81,16 @@
     public void onFieldChanged(String column, String value);
 
     /**
+     * Update the phonetic field with the specified character string.
+     */
+    public void updatePhonetic(String column, String value);
+
+    /**
+     * Returns the phonetic field string of the specified column.
+     */
+    public String getPhonetic(String column);
+
+    /**
      * Marks the underlying ValuesDelta as deleted, but does not update the view.
      */
     public void markDeleted();
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 94f8a32..5d49064 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -254,6 +254,19 @@
         return (StructuredNameEditorView) mEditors.getChildAt(0);
     }
 
+    public TextFieldsEditorView getPhoneticEditorView() {
+        if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())) {
+            return null;
+        }
+        for (int i = 0; i < mEditors.getChildCount(); i++) {
+            final View view = mEditors.getChildAt(i);
+            if (!(view instanceof StructuredNameEditorView)) {
+                return (TextFieldsEditorView) view;
+            }
+        }
+        return null;
+    }
+
     /**
      * Binds views for the given {@link KindSectionData}.
      *
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 5712f39..df4c5f9 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -331,6 +331,17 @@
         notifyEditorListener();
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void updatePhonetic(String column, String value) {
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String getPhonetic(String column){
+        return "";
+    }
+
     protected void saveValue(String column, String value) {
         mEntry.put(column, value);
     }
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 7c61f64..19da5bc 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -387,6 +387,13 @@
                 ? null : nameKindSectionView.getNameEditorView();
     }
 
+    public TextFieldsEditorView getPhoneticEditorView() {
+        final KindSectionView kindSectionView = mKindSectionViewMap
+                .get(StructuredName.CONTENT_ITEM_TYPE);
+        return kindSectionView == null
+                ? null : kindSectionView.getPhoneticEditorView();
+    }
+
     public RawContactDelta getCurrentRawContactDelta() {
         return mCurrentRawContactDelta;
     }
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
index 1387bd1..922ceec 100644
--- a/src/com/android/contacts/editor/StructuredNameEditorView.java
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -21,8 +21,12 @@
 import android.content.res.Resources;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.Editable;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
 
 import com.android.contacts.R;
 import com.android.contacts.model.RawContactDelta;
@@ -40,6 +44,8 @@
     private StructuredNameDataItem mSnapshot;
     private boolean mChanged;
 
+    private TextFieldsEditorView mPhoneticView;
+
     public StructuredNameEditorView(Context context) {
         super(context);
     }
@@ -93,6 +99,53 @@
         notifyEditorListener();
     }
 
+    public void updatePhonetic(String column, String value) {
+        EditText view = null;
+
+        if (mPhoneticView != null) {
+            ViewGroup fields = (ViewGroup) mPhoneticView.findViewById(R.id.editors);
+
+            if (StructuredName.FAMILY_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(0);
+            } else if (StructuredName.GIVEN_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(2);
+            } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(1);
+            }
+
+            if (view != null) {
+                view.setText(value);
+            }
+        }
+    }
+
+    @Override
+    public String getPhonetic(String column) {
+        String input = "";
+        EditText view = null;
+
+        if (mPhoneticView != null) {
+            ViewGroup fields = (ViewGroup) mPhoneticView.findViewById(R.id.editors);
+
+            if (StructuredName.FAMILY_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(0);
+            } else if (StructuredName.GIVEN_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(2);
+            } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(1);
+            }
+
+            if (view != null) {
+                input = view.getText().toString();
+            }
+        }
+        return input;
+    }
+
+    public void setPhoneticView(TextFieldsEditorView phoneticNameEditor) {
+        mPhoneticView = phoneticNameEditor;
+    }
+
     /**
      * Returns the display name currently displayed in the editor.
      */
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index c3a240a..28fe87f 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -22,9 +22,11 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Spannable;
+import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.text.style.TtsSpan;
@@ -69,6 +71,10 @@
     private int mMinFieldHeight;
     private int mPreviousViewHeight;
     private int mHintTextColorUnfocused;
+    private String mFixedPhonetic = "";
+    private String mFixedDisplayName = "";
+    private boolean needInputInitialize;
+
 
     public TextFieldsEditorView(Context context) {
         super(context);
@@ -174,6 +180,10 @@
             }
             // Rebuild the label spinner using the new colors.
             rebuildLabel();
+
+            if (hasFocus) {
+                needInputInitialize = true;
+            }
         }
     };
 
@@ -214,6 +224,38 @@
         mFieldEditTexts[field].setText(value);
     }
 
+    private boolean isUnFixed(Editable input) {
+        boolean unfixed = false;
+        Object[] spanned = input.getSpans(0, input.length(), Object.class);
+        if (spanned != null) {
+            for (Object obj : spanned) {
+                if ((input.getSpanFlags(obj) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
+                    unfixed = true;
+                }
+            }
+        }
+        return unfixed;
+    }
+
+    private String getNameField(String column) {
+
+      EditText editText = null;
+
+      if (StructuredName.FAMILY_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(1);
+      } else if (StructuredName.GIVEN_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(3);
+      } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(2);
+      }
+
+      if (editText != null) {
+          return editText.getText().toString();
+      }
+
+      return "";
+    }
+
     @Override
     public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly,
             ViewIdGenerator vig) {
@@ -280,18 +322,45 @@
 
             // Prepare listener for writing changes
             fieldView.addTextChangedListener(new TextWatcher() {
+                private int mStart = 0;
                 @Override
                 public void afterTextChanged(Editable s) {
                     // Trigger event for newly changed value
                     onFieldChanged(column, s.toString());
+
+                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
+                        return;
+                    }
+
+                    String displayNameField = s.toString();
+
+                    int nonFixedLen = displayNameField.length() - mFixedDisplayName.length();
+                    if (isUnFixed(s) || nonFixedLen == 0) {
+                        String tmpString = mFixedPhonetic
+                             + displayNameField.substring(mStart, displayNameField.length());
+
+                        updatePhonetic(column, tmpString);
+                    } else {
+                        mFixedPhonetic = getPhonetic(column);
+                        mFixedDisplayName = displayNameField;
+                    }
                 }
 
                 @Override
                 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
+                        return;
+                    }
+                    if (needInputInitialize) {
+                        mFixedPhonetic = getPhonetic(column);
+                        mFixedDisplayName = getNameField(column);
+                        needInputInitialize = false;
+                    }
                 }
 
                 @Override
                 public void onTextChanged(CharSequence s, int start, int before, int count) {
+                    mStart = start;
                     if (!ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(
                             getKind().mimeType) || !(s instanceof Spannable)) {
                         return;
diff --git a/src/com/android/contacts/model/account/AccountType.java b/src/com/android/contacts/model/account/AccountType.java
index bddfc09..c3e0eb5 100644
--- a/src/com/android/contacts/model/account/AccountType.java
+++ b/src/com/android/contacts/model/account/AccountType.java
@@ -444,6 +444,7 @@
         public boolean optional;
         public boolean shortForm;
         public boolean longForm;
+        public String phoneticsColumn;
 
         public EditField(String column, int titleRes) {
             this.column = column;
@@ -470,6 +471,11 @@
             return this;
         }
 
+        public EditField setPhoneticsColumn(String phoneticsColumn) {
+            this.phoneticsColumn = phoneticsColumn;
+            return this;
+        }
+
         public EditField setMinLines(int minLines) {
             this.minLines = minLines;
             return this;
diff --git a/src/com/android/contacts/model/account/BaseAccountType.java b/src/com/android/contacts/model/account/BaseAccountType.java
index 50f623a..b242950 100644
--- a/src/com/android/contacts/model/account/BaseAccountType.java
+++ b/src/com/android/contacts/model/account/BaseAccountType.java
@@ -191,18 +191,18 @@
                 FLAGS_PERSON_NAME).setOptional(true));
         if (!displayOrderPrimary) {
             kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_FAMILY_NAME));
             kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setOptional(true));
+                    FLAGS_PERSON_NAME).setOptional(true).setPhoneticsColumn(StructuredName.PHONETIC_MIDDLE_NAME));
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_GIVEN_NAME));
         } else {
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_GIVEN_NAME));
             kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setOptional(true));
+                    FLAGS_PERSON_NAME).setOptional(true).setPhoneticsColumn(StructuredName.PHONETIC_MIDDLE_NAME));
             kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_FAMILY_NAME));
         }
         kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
                 FLAGS_PERSON_NAME).setOptional(true));