CallDetailActivity respect display name order

- Updated the CallDetailActivity to choose whether to show last name first
or first name first based on user preferences.
- Modified callLog code to behave in a similar fashion
- Fixed bug in ContactInfoHelperTests
- Rename PhoneCallDetails.name -> PhoneCallDetails.namePrimary

Bug: 19364093
Change-Id: I50971ad0f26f6ede49f1c82965d1b00ce0cba4d3
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 284a578..2aff61c 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -24,7 +24,6 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.support.v7.app.AppCompatActivity;
-import android.telecom.PhoneAccountHandle;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
 import android.text.TextUtils;
@@ -45,6 +44,7 @@
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.calllog.CallDetailHistoryAdapter;
@@ -109,7 +109,6 @@
             mDetails = details[0];
             mNumber = TextUtils.isEmpty(mDetails.number) ? null : mDetails.number.toString();
             mDisplayNumber = mDetails.displayNumber;
-            final int numberPresentation = mDetails.numberPresentation;
 
             final CharSequence callLocationOrType = getNumberTypeOrLocation(mDetails);
 
@@ -117,8 +116,10 @@
             final String displayNumberStr = mBidiFormatter.unicodeWrap(
                     displayNumber.toString(), TextDirectionHeuristics.LTR);
 
-            if (!TextUtils.isEmpty(mDetails.name)) {
-                mCallerName.setText(mDetails.name);
+            mDetails.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
+
+            if (!TextUtils.isEmpty(mDetails.getPreferredName())) {
+                mCallerName.setText(mDetails.getPreferredName());
                 mCallerNumber.setText(callLocationOrType + " " + displayNumberStr);
             } else {
                 mCallerName.setText(displayNumberStr);
@@ -174,7 +175,7 @@
          * @return The phone number type or location.
          */
         private CharSequence getNumberTypeOrLocation(PhoneCallDetails details) {
-            if (!TextUtils.isEmpty(details.name)) {
+            if (!TextUtils.isEmpty(details.namePrimary)) {
                 return Phone.getTypeLabel(mResources, details.numberType,
                         details.numberLabel);
             } else {
@@ -185,6 +186,7 @@
 
     private Context mContext;
     private ContactInfoHelper mContactInfoHelper;
+    private ContactsPreferences mContactsPreferences;
     private CallTypeHelper mCallTypeHelper;
     private ContactPhotoManager mContactPhotoManager;
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
@@ -223,6 +225,7 @@
         mContext = this;
         mResources = getResources();
         mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
+        mContactsPreferences = new ContactsPreferences(mContext);
         mCallTypeHelper = new CallTypeHelper(getResources());
         mFilteredNumberAsyncQueryHandler =
                 new FilteredNumberAsyncQueryHandler(getContentResolver());
@@ -280,6 +283,7 @@
     @Override
     public void onResume() {
         super.onResume();
+        mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
         getCallDetails();
     }
 
@@ -436,8 +440,8 @@
             contactType = ContactPhotoManager.TYPE_BUSINESS;
         }
 
-        final String displayName = TextUtils.isEmpty(mDetails.name)
-                ? mDetails.displayNumber : mDetails.name.toString();
+        final String displayName = TextUtils.isEmpty(mDetails.namePrimary)
+                ? mDetails.displayNumber : mDetails.namePrimary.toString();
         final String lookupKey = mDetails.contactUri == null
                 ? null : UriUtils.getLookupKeyFromUri(mDetails.contactUri);
 
diff --git a/src/com/android/dialer/PhoneCallDetails.java b/src/com/android/dialer/PhoneCallDetails.java
index 403c4e8..fb1827d 100644
--- a/src/com/android/dialer/PhoneCallDetails.java
+++ b/src/com/android/dialer/PhoneCallDetails.java
@@ -16,12 +16,14 @@
 
 package com.android.dialer;
 
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.calllog.PhoneNumberDisplayUtil;
 
 import android.content.Context;
 import android.net.Uri;
 import android.provider.CallLog.Calls;
 import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
 
 /**
  * The details of a phone call to be shown in the UI.
@@ -50,7 +52,14 @@
     // The duration of the call in milliseconds, or 0 for missed calls.
     public long duration;
     // The name of the contact, or the empty string.
-    public CharSequence name;
+    public CharSequence namePrimary;
+    // The alternative name of the contact, e.g. last name first, or the empty string
+    public CharSequence nameAlternative;
+    /**
+     * The user's preference on name display order, last name first or first time first.
+     * {@see ContactsPreferences}
+     */
+    public int nameDisplayOrder;
     // The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
     public int numberType;
     // The custom label associated with the phone number in the contact, or the empty string.
@@ -117,4 +126,18 @@
                 this.formattedNumber,
                 this.isVoicemail).toString();
     }
+
+    /**
+     * Returns the preferred name for the call details as specified by the
+     * {@link #nameDisplayOrder}
+     *
+     * @return the preferred name
+     */
+    public CharSequence getPreferredName() {
+        if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
+                || TextUtils.isEmpty(nameAlternative)) {
+            return namePrimary;
+        }
+        return nameAlternative;
+    }
 }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index ae20e49..01af982 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -465,10 +465,11 @@
             details.dataUsage = c.getLong(CallLogQuery.DATA_USAGE);
         }
 
-        String preferredName = getPreferredDisplayName(info);
-        if (!TextUtils.isEmpty(preferredName)) {
+        if (!TextUtils.isEmpty(info.name) || !TextUtils.isEmpty(info.nameAlternative)) {
             details.contactUri = info.lookupUri;
-            details.name = preferredName;
+            details.namePrimary = info.name;
+            details.nameAlternative = info.nameAlternative;
+            details.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
             details.numberType = info.type;
             details.numberLabel = info.label;
             details.photoUri = info.photoUri;
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 89932ff..2fffaff 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -189,7 +189,8 @@
 
             details.accountHandle = accountHandle;
             details.contactUri = info.lookupUri;
-            details.name = info.name;
+            details.namePrimary = info.name;
+            details.nameAlternative = info.nameAlternative;
             details.numberType = info.type;
             details.numberLabel = info.label;
             details.photoUri = info.photoUri;
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 84d0364..f856bf9 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -260,8 +260,8 @@
      */
     private CharSequence getNameOrNumber(PhoneCallDetails details) {
         final CharSequence recipient;
-        if (!TextUtils.isEmpty(details.name)) {
-            recipient = details.name;
+        if (!TextUtils.isEmpty(details.getPreferredName())) {
+            recipient = details.getPreferredName();
         } else {
             recipient = details.displayNumber;
         }
diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
index b16079a..96dbf82 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -132,12 +132,12 @@
 
         final CharSequence nameText;
         final CharSequence displayNumber = details.displayNumber;
-        if (TextUtils.isEmpty(details.name)) {
+        if (TextUtils.isEmpty(details.getPreferredName())) {
             nameText = displayNumber;
             // We have a real phone number as "nameView" so make it always LTR
             views.nameView.setTextDirection(View.TEXT_DIRECTION_LTR);
         } else {
-            nameText = details.name;
+            nameText = details.getPreferredName();
         }
 
         views.nameView.setText(nameText);
@@ -200,7 +200,7 @@
                 && !PhoneNumberHelper.isUriNumber(details.number.toString())
                 && !mTelecomCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
 
-            if (TextUtils.isEmpty(details.name) && !TextUtils.isEmpty(details.geocode)) {
+            if (TextUtils.isEmpty(details.namePrimary) && !TextUtils.isEmpty(details.geocode)) {
                 numberFormattedLabel = details.geocode;
             } else if (!(details.numberType == Phone.TYPE_CUSTOM
                     && TextUtils.isEmpty(details.numberLabel))) {
@@ -210,7 +210,7 @@
             }
         }
 
-        if (!TextUtils.isEmpty(details.name) && TextUtils.isEmpty(numberFormattedLabel)) {
+        if (!TextUtils.isEmpty(details.namePrimary) && TextUtils.isEmpty(numberFormattedLabel)) {
             numberFormattedLabel = details.displayNumber;
         }
         return numberFormattedLabel;
@@ -284,8 +284,8 @@
     @NeededForTesting
     public void setCallDetailsHeader(TextView nameView, PhoneCallDetails details) {
         final CharSequence nameText;
-        if (!TextUtils.isEmpty(details.name)) {
-            nameText = details.name;
+        if (!TextUtils.isEmpty(details.namePrimary)) {
+            nameText = details.namePrimary;
         } else if (!TextUtils.isEmpty(details.displayNumber)) {
             nameText = details.displayNumber;
         } else {