Merge "Place phonetic name under display name in QuickContact."
diff --git a/res/layout-sw720dp/quickcontact_activity.xml b/res/layout-sw720dp/quickcontact_activity.xml
index efbb4d1..0499b8e 100644
--- a/res/layout-sw720dp/quickcontact_activity.xml
+++ b/res/layout-sw720dp/quickcontact_activity.xml
@@ -71,5 +71,5 @@
     <!-- This title's maximum height must be less than the minimum size of its
      parent ViewGroup because of an oddity in the way View#setScaleY() works. As a result,
      this title can not be inside @style/quickcontact_header. -->
-    <include layout="@layout/quickcontact_title" />
+    <include layout="@layout/quickcontact_title_and_phoneticname" />
 </com.android.contacts.widget.MultiShrinkScroller>
\ No newline at end of file
diff --git a/res/layout/quickcontact_activity.xml b/res/layout/quickcontact_activity.xml
index 6d94fcc..c3b035d 100644
--- a/res/layout/quickcontact_activity.xml
+++ b/res/layout/quickcontact_activity.xml
@@ -49,6 +49,6 @@
     <!-- This title's maximum height must be less than the minimum size of its
          parent ViewGroup because of an oddity in the way View#setScaleY() works. As a result,
          this title can not be inside @style/quickcontact_header. -->
-    <include layout="@layout/quickcontact_title" />
+    <include layout="@layout/quickcontact_title_and_phoneticname" />
 
 </com.android.contacts.widget.MultiShrinkScroller>
\ No newline at end of file
diff --git a/res/layout/quickcontact_activity_landscape.xml b/res/layout/quickcontact_activity_landscape.xml
index 1130ff8..5f3bbc4 100644
--- a/res/layout/quickcontact_activity_landscape.xml
+++ b/res/layout/quickcontact_activity_landscape.xml
@@ -51,7 +51,7 @@
 
                 <include layout="@layout/quickcontact_header" />
 
-                <include layout="@layout/quickcontact_title" />
+                <include layout="@layout/quickcontact_title_and_phoneticname" />
 
             </FrameLayout>
 
diff --git a/res/layout/quickcontact_title.xml b/res/layout/quickcontact_title.xml
deleted file mode 100644
index 3f4886d..0000000
--- a/res/layout/quickcontact_title.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- The importantForAccessibility is set to "no" since we want the ViewGroup that pretends to be
-    this View's parent (contact photo overlay) to provide the content description for Talkback. -->
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="@dimen/quickcontact_title_initial_margin"
-    android:layout_marginEnd="@dimen/quickcontact_title_initial_margin"
-    android:layout_marginBottom="@dimen/quickcontact_title_initial_margin"
-    android:layout_gravity="top|start"
-    android:textColor="@color/actionbar_text_color"
-    android:maxLines="@integer/quickcontact_title_lines"
-    android:textSize="@dimen/quickcontact_maximum_title_size"
-    android:textAlignment="viewStart"
-    android:ellipsize="end"
-    android:importantForAccessibility="no"
-    android:id="@+id/large_title"/>
\ No newline at end of file
diff --git a/res/layout/quickcontact_title_and_phoneticname.xml b/res/layout/quickcontact_title_and_phoneticname.xml
new file mode 100644
index 0000000..350c5e9
--- /dev/null
+++ b/res/layout/quickcontact_title_and_phoneticname.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/title_and_phonetic_name"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:layout_marginStart="@dimen/quickcontact_title_initial_margin"
+    android:layout_marginEnd="@dimen/quickcontact_title_initial_margin"
+    android:layout_marginBottom="@dimen/quickcontact_title_initial_bottom_margin">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top|start"
+        android:textColor="@color/actionbar_text_color"
+        android:maxLines="@integer/quickcontact_title_lines"
+        android:textSize="@dimen/quickcontact_maximum_title_size"
+        android:textAlignment="viewStart"
+        android:ellipsize="end"
+        android:importantForAccessibility="no"
+        android:id="@+id/large_title"/>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/large_title"
+        android:textColor="@color/actionbar_text_color"
+        android:maxLines="@integer/quickcontact_title_lines"
+        android:textSize="@dimen/quickcontact_maximum_phonetic_name_size"
+        android:textAlignment="viewStart"
+        android:ellipsize="end"
+        android:importantForAccessibility="no"
+        android:id="@+id/phonetic_name"/>
+</LinearLayout>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 67b2514..6e87e97 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -22,10 +22,14 @@
     <dimen name="contact_picker_contact_list_min_height">650dip</dimen>
     <dimen name="list_visible_scrollbar_padding">48dip</dimen>
 
-    <!-- When QC is uncollapsed, the title has this much margin on its left, right and bottom -->
+    <!-- When QC is uncollapsed, the title has this much margin on its left and right -->
     <dimen name="quickcontact_title_initial_margin">32dp</dimen>
+    <!-- When QC is uncollapsed, the title has this much margin on its bottom -->
+    <dimen name="quickcontact_title_initial_bottom_margin">0dp</dimen>
     <!-- Initial size of QuickContact's title size -->
-    <dimen name="quickcontact_maximum_title_size">64dp</dimen>
+    <dimen name="quickcontact_maximum_title_size">56dp</dimen>
+    <!-- Initial size of QuickContact's phonetic name size -->
+    <dimen name="quickcontact_maximum_phonetic_name_size">50dp</dimen>
     <!-- Right margin of the floating action button -->
     <dimen name="floating_action_button_margin_right">100dp</dimen>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 8b0a07e..c57127f 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -19,9 +19,13 @@
     <!-- Initial height of transparent space above QuickContacts -->
     <dimen name="quickcontact_starting_empty_height">150dp</dimen>
     <!-- Initial size of QuickContact's title size -->
-    <dimen name="quickcontact_maximum_title_size">30dp</dimen>
-    <!-- When QC is uncollapsed, the title has this much margin on its left, right and bottom -->
+    <dimen name="quickcontact_maximum_title_size">32dp</dimen>
+    <!-- Initial size of QuickContact's phonetic name size -->
+    <dimen name="quickcontact_maximum_phonetic_name_size">28dp</dimen>
+    <!-- When QC is uncollapsed, the title has this much margin on its left and right. -->
     <dimen name="quickcontact_title_initial_margin">16dp</dimen>
+    <!-- When QC is uncollapsed, the title has this much margin on its bottom -->
+    <dimen name="quickcontact_title_initial_bottom_margin">8dp</dimen>
     <!-- The ratio of width:height for the contact's photo in landscape -->
     <item name="quickcontact_landscape_photo_ratio" type="dimen" format="float">0.7</item>
     <!-- How far QuickContacts can be dragged and released from the top of the window before we dismiss it. -->
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 26f84a8..64d8aec 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -942,15 +942,16 @@
         mPhotoView.setIsBusiness(mContactData.isDisplayNameFromOrganization());
         mPhotoSetter.setupContactPhoto(data, mPhotoView);
         extractAndApplyTintFromPhotoViewAsynchronously();
-        String phoneticName = ContactDisplayUtils.getPhoneticName(this, data);
-        String displayName = ContactDisplayUtils.getDisplayName(this, data).toString();
-        if (mContactData.getDisplayNameSource() != DisplayNameSources.STRUCTURED_PHONETIC_NAME
-                && !TextUtils.isEmpty(phoneticName)) {
-            displayName = getResources().getString(
-                    R.string.quick_contact_display_name_with_phonetic, displayName, phoneticName);
-            setHeaderNameText(displayName);
-        } else {
-            setHeaderNameText(displayName);
+        final String displayName = ContactDisplayUtils.getDisplayName(this, data).toString();
+        setHeaderNameText(displayName);
+        final String phoneticName = ContactDisplayUtils.getPhoneticName(this, data);
+        if (mScroller != null) {
+            if (mContactData.getDisplayNameSource() != DisplayNameSources.STRUCTURED_PHONETIC_NAME
+                    && !TextUtils.isEmpty(phoneticName)) {
+                mScroller.setPhoneticName(phoneticName);
+            } else {
+                mScroller.setPhoneticNameGone();
+            }
         }
 
         Trace.endSection();
diff --git a/src/com/android/contacts/widget/MultiShrinkScroller.java b/src/com/android/contacts/widget/MultiShrinkScroller.java
index 7c46a86..95f277c 100644
--- a/src/com/android/contacts/widget/MultiShrinkScroller.java
+++ b/src/com/android/contacts/widget/MultiShrinkScroller.java
@@ -108,6 +108,8 @@
     private View mTransparentView;
     private MultiShrinkScrollerListener mListener;
     private TextView mLargeTextView;
+    private TextView mPhoneticNameView;
+    private View mTitleAndPhoneticNameView;
     private View mPhotoTouchInterceptOverlay;
     /** Contains desired size & vertical offset of the title, once the header is fully compressed */
     private TextView mInvisiblePlaceholderTextView;
@@ -289,6 +291,8 @@
         mPhotoViewContainer = findViewById(R.id.toolbar_parent);
         mTransparentView = findViewById(R.id.transparent_view);
         mLargeTextView = (TextView) findViewById(R.id.large_title);
+        mPhoneticNameView = (TextView) findViewById(R.id.phonetic_name);
+        mTitleAndPhoneticNameView = findViewById(R.id.title_and_phonetic_name);
         mInvisiblePlaceholderTextView = (TextView) findViewById(R.id.placeholder_textview);
         mStartColumn = findViewById(R.id.empty_start_column);
         // Touching the empty space should close the card
@@ -339,7 +343,7 @@
                 mMaximumPortraitHeaderHeight = mIsTwoPanel ? getHeight()
                         : mPhotoViewContainer.getWidth();
                 setHeaderHeight(getMaximumScrollableHeaderHeight());
-                mMaximumHeaderTextSize = mLargeTextView.getHeight();
+                mMaximumHeaderTextSize = mTitleAndPhoneticNameView.getHeight();
                 if (mIsTwoPanel) {
                     mMaximumHeaderHeight = getHeight();
                     mMinimumHeaderHeight = mMaximumHeaderHeight;
@@ -354,16 +358,19 @@
 
                     // Permanently set title width and margin.
                     final FrameLayout.LayoutParams largeTextLayoutParams
-                            = (FrameLayout.LayoutParams) mLargeTextView.getLayoutParams();
+                            = (FrameLayout.LayoutParams) mTitleAndPhoneticNameView
+                            .getLayoutParams();
                     largeTextLayoutParams.width = photoLayoutParams.width -
                             largeTextLayoutParams.leftMargin - largeTextLayoutParams.rightMargin;
                     largeTextLayoutParams.gravity = Gravity.BOTTOM | Gravity.START;
-                    mLargeTextView.setLayoutParams(largeTextLayoutParams);
+                    mTitleAndPhoneticNameView.setLayoutParams(largeTextLayoutParams);
                 } else {
                     // Set the width of mLargeTextView as if it was nested inside
                     // mPhotoViewContainer.
                     mLargeTextView.setWidth(mPhotoViewContainer.getWidth()
                             - 2 * mMaximumTitleMargin);
+                    mPhoneticNameView.setWidth(mPhotoViewContainer.getWidth()
+                            - 2 * mMaximumTitleMargin);
                 }
 
                 calculateCollapsedLargeTitlePadding();
@@ -382,8 +389,8 @@
                 = (FrameLayout.LayoutParams) mTitleGradientView.getLayoutParams();
         final float TITLE_GRADIENT_SIZE_COEFFICIENT = 1.25f;
         final FrameLayout.LayoutParams largeTextLayoutParms
-                = (FrameLayout.LayoutParams) mLargeTextView.getLayoutParams();
-        titleGradientLayoutParams.height = (int) ((mLargeTextView.getHeight()
+                = (FrameLayout.LayoutParams) mTitleAndPhoneticNameView.getLayoutParams();
+        titleGradientLayoutParams.height = (int) ((mTitleAndPhoneticNameView.getHeight()
                 + largeTextLayoutParms.bottomMargin) * TITLE_GRADIENT_SIZE_COEFFICIENT);
         mTitleGradientView.setLayoutParams(titleGradientLayoutParams);
     }
@@ -393,6 +400,20 @@
         mPhotoTouchInterceptOverlay.setContentDescription(title);
     }
 
+    public void setPhoneticName(String phoneticName) {
+        mPhoneticNameView.setText(phoneticName);
+        // Every time the phonetic name is changed, set mPhoneticNameView as visible,
+        // in case it just changed from Visibility=GONE.
+        mPhoneticNameView.setVisibility(View.VISIBLE);
+        initialize(mListener, mIsOpenContactSquare);
+    }
+
+    public void setPhoneticNameGone() {
+        mPhoneticNameView.setVisibility(View.GONE);
+        // Initialize to make Visibility work.
+        initialize(mListener, mIsOpenContactSquare);
+    }
+
     @Override
     public boolean onInterceptTouchEvent(MotionEvent event) {
         if (mVelocityTracker == null) {
@@ -993,19 +1014,19 @@
 
         // The pivot point for scaling should be middle of the starting side.
         if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
-            mLargeTextView.setPivotX(mLargeTextView.getWidth());
+            mTitleAndPhoneticNameView.setPivotX(mTitleAndPhoneticNameView.getWidth());
         } else {
-            mLargeTextView.setPivotX(0);
+            mTitleAndPhoneticNameView.setPivotX(0);
         }
-        mLargeTextView.setPivotY(mLargeTextView.getHeight() / 2);
+        mTitleAndPhoneticNameView.setPivotY(mTitleAndPhoneticNameView.getHeight() / 2);
 
         final int toolbarHeight = mToolbar.getLayoutParams().height;
         mPhotoTouchInterceptOverlay.setClickable(toolbarHeight != mMaximumHeaderHeight);
 
         if (toolbarHeight >= mMaximumHeaderHeight) {
             // Everything is full size when the header is fully expanded.
-            mLargeTextView.setScaleX(1);
-            mLargeTextView.setScaleY(1);
+            mTitleAndPhoneticNameView.setScaleX(1);
+            mTitleAndPhoneticNameView.setScaleY(1);
             setInterpolatedTitleMargins(1);
             return;
         }
@@ -1022,13 +1043,13 @@
         bezierOutput = (float) Math.min(bezierOutput, 1.0f);
         scale = (float) Math.min(scale, 1.0f);
 
-        mLargeTextView.setScaleX(scale);
-        mLargeTextView.setScaleY(scale);
+        mTitleAndPhoneticNameView.setScaleX(scale);
+        mTitleAndPhoneticNameView.setScaleY(scale);
         setInterpolatedTitleMargins(bezierOutput);
     }
 
     /**
-     * Calculate the padding around mLargeTextView so that it will look appropriate once it
+     * Calculate the padding around mTitleAndPhoneticNameView so that it will look appropriate once it
      * finishes moving into its target location/size.
      */
     private void calculateCollapsedLargeTitlePadding() {
@@ -1040,9 +1061,10 @@
         final int desiredTopToCenter = invisiblePlaceHolderLocation[1]
                 + mInvisiblePlaceholderTextView.getHeight() / 2
                 - largeTextViewRectLocation[1];
-        // Padding needed on the mLargeTextView so that it has the same amount of
+        // Padding needed on the mTitleAndPhoneticNameView so that it has the same amount of
         // padding as the target rectangle.
-        mCollapsedTitleBottomMargin = desiredTopToCenter - mLargeTextView.getHeight() / 2;
+        mCollapsedTitleBottomMargin =
+                desiredTopToCenter - mTitleAndPhoneticNameView.getHeight() / 2;
     }
 
     /**
@@ -1051,7 +1073,7 @@
      */
     private void setInterpolatedTitleMargins(float x) {
         final FrameLayout.LayoutParams titleLayoutParams
-                = (FrameLayout.LayoutParams) mLargeTextView.getLayoutParams();
+                = (FrameLayout.LayoutParams) mTitleAndPhoneticNameView.getLayoutParams();
         final LinearLayout.LayoutParams toolbarLayoutParams
                 = (LinearLayout.LayoutParams) mToolbar.getLayoutParams();
 
@@ -1064,14 +1086,14 @@
         final int pretendBottomMargin =  (int) (mCollapsedTitleBottomMargin * (1 - x)
                 + mMaximumTitleMargin * x) ;
         // Calculate how offset the title should be from the top of the screen. Instead of
-        // calling mLargeTextView.getHeight() use the mMaximumHeaderTextSize for this calculation.
-        // The getHeight() value acts unexpectedly when mLargeTextView is partially clipped by
-        // its parent.
+        // calling mTitleAndPhoneticNameView.getHeight() use the mMaximumHeaderTextSize for this
+        // calculation. The getHeight() value acts unexpectedly when mTitleAndPhoneticNameView is
+        // partially clipped by its parent.
         titleLayoutParams.topMargin = getTransparentViewHeight()
                 + toolbarLayoutParams.height - pretendBottomMargin
                 - mMaximumHeaderTextSize;
         titleLayoutParams.bottomMargin = 0;
-        mLargeTextView.setLayoutParams(titleLayoutParams);
+        mTitleAndPhoneticNameView.setLayoutParams(titleLayoutParams);
     }
 
     private void updatePhotoTintAndDropShadow() {