Moving call type/location for voicemail

Combination of two related bugs.

22168682: In the voicemail call log, moved call type/location to below the call
action button and removed the call details button as it didn't have any
additional information.

22514722: Modified spacing and text sizes for call log. Moved voicemail
transcription below call date as in mocks.

Bug:22168682,22514722
Change-Id: I557761b815604fee4e6b61f4670608b8fa90d3a7
diff --git a/res/layout/call_detail_header.xml b/res/layout/call_detail_header.xml
index 5931445..6eceb80 100644
--- a/res/layout/call_detail_header.xml
+++ b/res/layout/call_detail_header.xml
@@ -59,7 +59,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="?attr/call_log_secondary_text_color"
-            android:textSize="@dimen/call_log_secondary_text_size"
+            android:textSize="@dimen/call_log_detail_text_size"
             android:layout_marginBottom="1dp"
             android:singleLine="true" />
 
@@ -68,7 +68,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="?attr/call_log_secondary_text_color"
-            android:textSize="@dimen/call_log_secondary_text_size"
+            android:textSize="@dimen/call_log_detail_text_size"
             android:singleLine="true"
             android:visibility="gone" />
 
diff --git a/res/layout/call_detail_history_item.xml b/res/layout/call_detail_history_item.xml
index cbe8442..10d9605 100644
--- a/res/layout/call_detail_history_item.xml
+++ b/res/layout/call_detail_history_item.xml
@@ -46,11 +46,11 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textColor="?attr/call_log_secondary_text_color"
-        android:textSize="@dimen/call_log_secondary_text_size" />
+        android:textSize="@dimen/call_log_detail_text_size" />
     <TextView
         android:id="@+id/duration"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textColor="?attr/call_log_secondary_text_color"
-        android:textSize="@dimen/call_log_secondary_text_size" />
+        android:textSize="@dimen/call_log_detail_text_size" />
 </LinearLayout>
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index ec512b6..95de268 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -30,8 +30,8 @@
         android:layout_marginStart="@dimen/call_log_start_margin"
         android:layout_marginEnd="@dimen/call_log_outer_margin"
         android:fontFamily="sans-serif-medium"
-        android:textColor="?attr/call_log_secondary_text_color"
-        android:textSize="@dimen/call_log_secondary_text_size"
+        android:textColor="@color/call_log_day_group_heading_color"
+        android:textSize="@dimen/call_log_day_group_heading_size"
         android:paddingTop="@dimen/call_log_day_group_padding_top"
         android:paddingBottom="@dimen/call_log_day_group_padding_bottom" />
 
@@ -83,21 +83,10 @@
                         android:layout_height="wrap_content"
                         android:layout_marginBottom="@dimen/call_log_name_margin_bottom"
                         android:layout_marginEnd="@dimen/call_log_icon_margin"
-                        android:textColor="?attr/call_log_primary_text_color"
+                        android:textColor="@color/call_log_primary_color"
                         android:textSize="@dimen/call_log_primary_text_size"
                         android:singleLine="true" />
 
-                    <TextView
-                        android:id="@+id/voicemail_transcription"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginEnd="@dimen/call_log_icon_margin"
-                        android:textColor="?attr/call_log_secondary_text_color"
-                        android:textSize="@dimen/call_log_secondary_text_size"
-                        android:singleLine="true"
-                        android:ellipsize="marquee"
-                        android:visibility="gone" />
-
                     <LinearLayout
                         android:id="@+id/call_type"
                         android:layout_width="wrap_content"
@@ -118,8 +107,8 @@
                             android:layout_height="wrap_content"
                             android:layout_marginEnd="@dimen/call_log_icon_margin"
                             android:layout_gravity="center_vertical"
-                            android:textColor="?attr/call_log_secondary_text_color"
-                            android:textSize="@dimen/call_log_secondary_text_size"
+                            android:textColor="@color/call_log_detail_color"
+                            android:textSize="@dimen/call_log_detail_text_size"
                             android:singleLine="true" />
 
                     </LinearLayout>
@@ -130,10 +119,22 @@
                         android:layout_height="wrap_content"
                         android:layout_marginEnd="@dimen/call_log_icon_margin"
                         android:textColor="?attr/call_log_secondary_text_color"
-                        android:textSize="@dimen/call_log_secondary_text_size"
+                        android:textSize="@dimen/call_log_detail_text_size"
                         android:visibility="gone"
                         android:singleLine="true" />
 
+                    <TextView
+                      android:id="@+id/voicemail_transcription"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layout_marginTop="@dimen/call_log_icon_margin"
+                      android:textColor="@color/call_log_voicemail_transcript_color"
+                      android:textSize="@dimen/call_log_voicemail_transcription_text_size"
+                      android:ellipsize="marquee"
+                      android:visibility="gone"
+                      android:singleLine="false"
+                      android:maxLines="10"/>
+
                 </LinearLayout>
 
                 <ImageView
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 16a712b..262a176 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -19,6 +19,7 @@
     android:gravity="center_vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:paddingBottom="@dimen/call_log_actions_bottom_padding"
     android:orientation="vertical"
     android:visibility="visible"
     android:importantForAccessibility="1">
@@ -35,16 +36,27 @@
 
     <LinearLayout
         android:id="@+id/call_action"
+        android:paddingTop="@dimen/call_log_actions_top_padding"
         style="@style/CallLogActionStyle">
 
         <ImageView
             style="@style/CallLogActionIconStyle"
             android:src="@drawable/ic_call_24dp" />
 
-        <TextView
-            android:id="@+id/call_action_text"
-            style="@style/CallLogActionTextStyle"
-            android:text="@string/description_call_log_call_action" />
+        <LinearLayout
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:orientation="vertical"
+          android:gravity="center_vertical">
+            <TextView
+                android:id="@+id/call_action_text"
+                style="@style/CallLogActionTextStyle"
+                android:text="@string/description_call_log_call_action" />
+
+            <TextView
+              android:id="@+id/call_type_or_location_text"
+              style="@style/CallLogActionSupportTextStyle"/>
+        </LinearLayout>
 
     </LinearLayout>
 
diff --git a/res/layout/voicemail_promo_card.xml b/res/layout/voicemail_promo_card.xml
index 891f096..ba4ac59 100644
--- a/res/layout/voicemail_promo_card.xml
+++ b/res/layout/voicemail_promo_card.xml
@@ -57,7 +57,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:textColor="@color/background_dialer_white"
-                    android:textSize="@dimen/call_log_secondary_text_size"
+                    android:textSize="@dimen/call_log_detail_text_size"
                     android:text="@string/visual_voicemail_text"
                     android:lineSpacingExtra="@dimen/promo_card_line_spacing"
                     android:singleLine="false"/>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index d0f7ed0..8b7b150 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,8 +33,20 @@
     <color name="setting_background_color">#ffffff</color>
     <color name="setting_button_color">#eee</color>
 
+    <!-- 54% black -->
+    <color name="call_log_icon_tint">#8a000000</color>
+    <!-- 87% black -->
+    <color name="call_log_primary_color">#de000000</color>
+    <!-- 54% black -->
+    <color name="call_log_detail_color">#8a000000</color>
+    <!-- 87% black -->
+    <color name="call_log_voicemail_transcript_color">#de000000</color>
     <!-- 70% black -->
-    <color name="call_log_icon_tint">#b3000000</color>
+    <color name="call_log_action_color">#b3000000</color>
+    <!-- 54% black -->
+    <color name="call_log_day_group_heading_color">#8a000000</color>
+    <!-- 87% black-->
+    <color name="call_log_unread_text_color">#de000000</color>
     <color name="call_log_list_item_primary_action_icon_tint">@color/call_log_icon_tint</color>
     <!-- Color of the text describing an unconsumed missed call. -->
     <color name="call_log_missed_call_highlight_color">@color/dialer_red_highlight_color</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d3c52a3..18f33d5 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -108,17 +108,19 @@
     <dimen name="search_list_padding_top">16dp</dimen>
     <dimen name="search_box_elevation">3dp</dimen>
 
-    <dimen name="call_log_action_height">48dp</dimen>
     <dimen name="call_log_action_icon_margin_start">16dp</dimen>
     <dimen name="call_log_action_icon_dimen">24dp</dimen>
     <dimen name="call_log_action_horizontal_padding">24dp</dimen>
 
     <dimen name="call_log_actions_left_padding">64dp</dimen>
-    <dimen name="call_log_primary_text_size">14sp</dimen>
-    <dimen name="call_log_secondary_text_size">14sp</dimen>
-    <dimen name="call_log_list_item_actions_text_size">12sp</dimen>
+    <dimen name="call_log_actions_top_padding">8dp</dimen>
+    <dimen name="call_log_actions_bottom_padding">8dp</dimen>
+    <dimen name="call_log_primary_text_size">16sp</dimen>
+    <dimen name="call_log_detail_text_size">12sp</dimen>
+    <dimen name="call_log_day_group_heading_size">14sp</dimen>
+    <dimen name="call_log_voicemail_transcription_text_size">14sp</dimen>
     <!-- Height of the call log actions section for each call log entry -->
-    <dimen name="call_log_action_height">44dp</dimen>
+    <dimen name="call_log_action_height">48dp</dimen>
     <dimen name="call_log_day_group_padding_top">15dp</dimen>
     <dimen name="call_log_day_group_padding_bottom">9dp</dimen>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 3d86442..7828a20 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -222,14 +222,19 @@
         <item name="android:layout_height">wrap_content</item>
         <item name="android:paddingStart">@dimen/call_log_action_horizontal_padding</item>
         <item name="android:paddingEnd">@dimen/call_log_action_horizontal_padding</item>
-        <item name="android:textColor">?attr/call_log_secondary_text_color</item>
-        <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
-        <item name="android:fontFamily">"sans-serif-medium"</item>
+        <item name="android:textColor">@color/call_log_action_color</item>
+        <item name="android:textSize">@dimen/call_log_primary_text_size</item>
+        <item name="android:fontFamily">"sans-serif"</item>
         <item name="android:focusable">true</item>
         <item name="android:singleLine">true</item>
         <item name="android:importantForAccessibility">no</item>
     </style>
 
+    <style name="CallLogActionSupportTextStyle" parent="@style/CallLogActionTextStyle">
+        <item name="android:textSize">@dimen/call_log_detail_text_size</item>
+        <item name="android:textColor">@color/call_log_detail_color</item>
+    </style>
+
     <style name="CallLogActionIconStyle">
         <item name="android:layout_width">@dimen/call_log_action_icon_dimen</item>
         <item name="android:layout_height">@dimen/call_log_action_icon_dimen</item>
@@ -299,7 +304,7 @@
 
     <style name="PromoCardActionStyle" parent="TextActionStyle">
         <item name="android:textColor">@color/promo_card_text</item>
-        <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
+        <item name="android:textSize">@dimen/call_log_primary_text_size</item>
     </style>
 
     <style name="VoicemailPlaybackLayoutTextStyle">
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 703b18f..0353170 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -367,7 +367,7 @@
      * TODO: This gets called 20-30 times when Dialer starts up for a single call log entry and
      * should not. It invokes cross-process methods and the repeat execution can get costly.
      *
-     * @param ViewHolder The view corresponding to this entry.
+     * @param viewHolder The view corresponding to this entry.
      * @param position The position of the entry.
      */
     public void onBindViewHolder(ViewHolder viewHolder, int position) {
@@ -419,7 +419,7 @@
                 c.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME),
                 c.getString(CallLogQuery.ACCOUNT_ID));
         final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
-        final ContactInfo cachedContactInfo = mContactInfoHelper.getContactInfo(c);
+        final ContactInfo cachedContactInfo = ContactInfoHelper.getContactInfo(c);
         final boolean isVoicemailNumber =
                 mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);
 
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index b7f068e..dff213b 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -18,20 +18,14 @@
 
 import static android.Manifest.permission.READ_CALL_LOG;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
 import android.app.Activity;
-import android.app.DialogFragment;
 import android.app.Fragment;
 import android.app.KeyguardManager;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.database.ContentObserver;
 import android.database.Cursor;
-import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -44,28 +38,16 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.ListView;
-import android.widget.TextView;
 
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.util.PermissionsUtil;
-import com.android.contacts.common.util.ViewUtil;
 import com.android.dialer.R;
-import com.android.dialer.list.ListsFragment.HostInterface;
-import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.EmptyLoader;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
-import com.android.dialer.voicemail.VoicemailStatusHelper;
-import com.android.dialer.voicemail.VoicemailStatusHelper.StatusMessage;
-import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 import com.android.dialer.widget.EmptyContentView;
 import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
 import com.android.dialerbind.ObjectFactory;
 
-import java.util.List;
-
 /**
  * Displays a list of call log entries. To filter for a particular kind of call
  * (all, missed or voicemails), specify it in the constructor.
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 8e45dd3..84d0364 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -57,7 +57,6 @@
     /**
      * Sets the name, label, and number for a contact.
      *
-     * @param context The application context.
      * @param views the views to populate
      * @param details the details of a phone call needed to fill in the data
      */
@@ -76,6 +75,10 @@
         // when the actions ViewStub is inflated.
         views.nameOrNumber = getNameOrNumber(details);
 
+        // The call type or Location associated with the call. Use when setting text for a
+        // voicemail log's call button
+        views.callTypeOrLocation = mPhoneCallDetailsHelper.getCallTypeOrLocation(details);
+
         // Cache country iso. Used for number filtering.
         views.countryIso = details.countryIso;
     }
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 0e234e3..b70ea07 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -162,6 +162,12 @@
     public CharSequence nameOrNumber;
 
     /**
+     * The call type or Location associated with the call. Cached here for use when setting text
+     * for a voicemail log's call button
+     */
+    public CharSequence callTypeOrLocation;
+
+    /**
      * Whether this row is for a business or not.
      */
     public boolean isBusiness;
@@ -171,8 +177,6 @@
      */
     public ContactInfo info;
 
-    private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
-
     private final Context mContext;
     private final TelecomCallLogCache mTelecomCallLogCache;
     private final CallLogListItemHelper mCallLogListItemHelper;
@@ -342,8 +346,6 @@
      * Configures the action buttons in the expandable actions ViewStub. The ViewStub is not
      * inflated during initial binding, so click handlers, tags and accessibility text must be set
      * here, if necessary.
-     *
-     * @param callLogItem The call log list item view.
      */
     public void inflateActionViewStub() {
         ViewStub stub = (ViewStub) rootView.findViewById(R.id.call_log_entry_actions_stub);
@@ -427,6 +429,14 @@
                     .setText(TextUtils.expandTemplate(
                             mContext.getString(R.string.call_log_action_call),
                             nameOrNumber));
+            TextView callTypeOrLocationView = ((TextView) callButtonView.findViewById(
+                    R.id.call_type_or_location_text));
+            if (callType == Calls.VOICEMAIL_TYPE && !TextUtils.isEmpty(callTypeOrLocation)) {
+                callTypeOrLocationView.setText(callTypeOrLocation);
+                callTypeOrLocationView.setVisibility(View.VISIBLE);
+            } else {
+                callTypeOrLocationView.setVisibility(View.GONE);
+            }
             callButtonView.setVisibility(View.VISIBLE);
         } else {
             callButtonView.setVisibility(View.GONE);
@@ -455,9 +465,13 @@
             voicemailPlaybackView.setVisibility(View.GONE);
         }
 
-        detailsButtonView.setVisibility(View.VISIBLE);
-        detailsButtonView.setTag(
+        if (callType == Calls.VOICEMAIL_TYPE) {
+            detailsButtonView.setVisibility(View.GONE);
+        } else {
+            detailsButtonView.setVisibility(View.VISIBLE);
+            detailsButtonView.setTag(
                 IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
+        }
 
         if (info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
             createNewContactButtonView.setTag(IntentProvider.getAddContactIntentProvider(
@@ -495,7 +509,7 @@
      * If the action views have never been shown yet for this view, inflate the view stub.
      */
     public void showActions(boolean show) {
-        expandVoicemailTranscriptionView(show);
+        showOrHideVoicemailTranscriptionView(show);
 
         if (show) {
             // Inflate the view stub if necessary, and wire up the event handlers.
@@ -514,17 +528,17 @@
         updatePrimaryActionButton(show);
     }
 
-    public void expandVoicemailTranscriptionView(boolean isExpanded) {
+    public void showOrHideVoicemailTranscriptionView(boolean isExpanded) {
         if (callType != Calls.VOICEMAIL_TYPE) {
             return;
         }
 
         final TextView view = phoneCallDetailsViews.voicemailTranscriptionView;
-        if (TextUtils.isEmpty(view.getText())) {
+        if (!isExpanded || TextUtils.isEmpty(view.getText())) {
+            view.setVisibility(View.GONE);
             return;
         }
-        view.setMaxLines(isExpanded ? VOICEMAIL_TRANSCRIPTION_MAX_LINES : 1);
-        view.setSingleLine(!isExpanded);
+        view.setVisibility(View.VISIBLE);
     }
 
     public void updatePhoto() {
diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
index 3792056..b16079a 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.calllog;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.Lists;
 
 import android.content.Context;
@@ -50,6 +51,9 @@
     private final Resources mResources;
     /** The injected current time in milliseconds since the epoch. Used only by tests. */
     private Long mCurrentTimeMillisForTest;
+
+    private CharSequence mPhoneTypeLabelForTest;
+
     private final TelecomCallLogCache mTelecomCallLogCache;
 
     /** Calendar used to construct dates */
@@ -138,12 +142,9 @@
 
         views.nameView.setText(nameText);
 
-        if (isVoicemail && !TextUtils.isEmpty(details.transcription)) {
-            views.voicemailTranscriptionView.setText(details.transcription);
-            views.voicemailTranscriptionView.setVisibility(View.VISIBLE);
-        } else {
-            views.voicemailTranscriptionView.setText(null);
-            views.voicemailTranscriptionView.setVisibility(View.GONE);
+        if (isVoicemail) {
+            views.voicemailTranscriptionView.setText(TextUtils.isEmpty(details.transcription) ? null
+                    : details.transcription);
         }
 
         // Bold if not read
@@ -151,10 +152,14 @@
         views.nameView.setTypeface(typeface);
         views.voicemailTranscriptionView.setTypeface(typeface);
         views.callLocationAndDate.setTypeface(typeface);
+        views.callLocationAndDate.setTextColor(mResources.getColor(
+                details.isRead ? R.color.call_log_detail_color : R.color.call_log_unread_text_color,
+                mContext.getTheme()));
     }
 
     /**
-     * Builds a string containing the call location and date.
+     * Builds a string containing the call location and date. For voicemail logs only the call date
+     * is returned because location information is displayed in the call action button
      *
      * @param details The call details.
      * @return The call location and date string.
@@ -162,15 +167,18 @@
     private CharSequence getCallLocationAndDate(PhoneCallDetails details) {
         mDescriptionItems.clear();
 
-        // Get type of call (ie mobile, home, etc) if known, or the caller's location.
-        CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
+        if (details.callTypes[0] != Calls.VOICEMAIL_TYPE) {
+            // Get type of call (ie mobile, home, etc) if known, or the caller's location.
+            CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
 
-        // Only add the call type or location if its not empty.  It will be empty for unknown
-        // callers.
-        if (!TextUtils.isEmpty(callTypeOrLocation)) {
-            mDescriptionItems.add(callTypeOrLocation);
+            // Only add the call type or location if its not empty.  It will be empty for unknown
+            // callers.
+            if (!TextUtils.isEmpty(callTypeOrLocation)) {
+                mDescriptionItems.add(callTypeOrLocation);
+            }
         }
-        // The date of this call, relative to the current time.
+
+        // The date of this call
         mDescriptionItems.add(getCallDate(details));
 
         // Create a comma separated list from the call type or location, and call date.
@@ -197,8 +205,8 @@
             } else if (!(details.numberType == Phone.TYPE_CUSTOM
                     && TextUtils.isEmpty(details.numberLabel))) {
                 // Get type label only if it will not be "Custom" because of an empty number label.
-                numberFormattedLabel = Phone.getTypeLabel(
-                        mResources, details.numberType, details.numberLabel);
+                numberFormattedLabel = MoreObjects.firstNonNull(mPhoneTypeLabelForTest,
+                        Phone.getTypeLabel(mResources, details.numberType, details.numberLabel));
             }
         }
 
@@ -208,6 +216,11 @@
         return numberFormattedLabel;
     }
 
+    @NeededForTesting
+    public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) {
+        this.mPhoneTypeLabelForTest = phoneTypeLabel;
+    }
+
     /**
      * Get the call date/time of the call. For the call log this is relative to the current time.
      * e.g. 3 minutes ago. For voicemail, see {@link #getGranularDateTime(PhoneCallDetails)}
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index 263642c..b255edf 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -116,14 +116,14 @@
     // Voicemail date string has 3 different formats depending on how long ago the call was placed
     public void testSetVoicemailPhoneCallDetails_Today() {
         setVoicemailPhoneCallDetailsWithDate(System.currentTimeMillis());
-        assertDateEquals("Today at");
+        assertLocationAndDateContains("Today at");
     }
 
     public void testSetVoicemailPhoneCallDetails_WithinCurrentYear() {
         mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
         String formattedTestDate = "Jun 3 at 1:00 PM";
         setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
-        assertDateEquals(formattedTestDate);
+        assertLocationAndDateContains(formattedTestDate);
     }
 
     public void testSetVoicemailPhoneCallDetails_OutsideCurrentYear() {
@@ -131,7 +131,12 @@
         long testDate = new GregorianCalendar(2009, 5, 3, 13, 0, 0).getTimeInMillis();
         String formattedTestDate = "Jun 3, 2009 at 1:00 PM";
         setVoicemailPhoneCallDetailsWithDate(testDate);
-        assertDateEquals(formattedTestDate);
+        assertLocationAndDateContains(formattedTestDate);
+    }
+
+    public void testVoicemailLocationNotShownWithDate() {
+        setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
+        assertLocationAndDateExactEquals("Jun 3 at 1:00 PM");
     }
 
     /** Asserts that a char sequence is actually a Spanned corresponding to the expected HTML. */
@@ -150,19 +155,19 @@
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
-        assertDateEquals("0 min. ago");
+        assertLocationAndDateContains("0 min. ago");
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 3, 12, 0, 0).getTimeInMillis());
-        assertDateEquals("1 hr. ago");
+        assertLocationAndDateContains("1 hr. ago");
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
-        assertDateEquals("Yesterday");
+        assertLocationAndDateContains("Yesterday");
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
-        assertDateEquals("2 days ago");
+        assertLocationAndDateContains("2 days ago");
     }
 
     public void testSetPhoneCallDetails_CallTypeIcons() {
@@ -232,24 +237,24 @@
     public void testSetPhoneCallDetails_Geocode() {
         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "Pennsylvania");
         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
-        assertLabelEquals("Pennsylvania"); // The geocode is shown as the label.
+        assertLocationAndDateContains("Pennsylvania"); // The geocode is shown as the label.
     }
 
     public void testSetPhoneCallDetails_NoGeocode() {
         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", null);
         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
-        assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
     }
 
     public void testSetPhoneCallDetails_EmptyGeocode() {
         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "");
         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
-        assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
     }
 
     public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
         setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
-        assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
     }
 
     public void testSetPhoneCallDetails_Highlighted() {
@@ -297,6 +302,25 @@
         assertEquals("John Doe", mNameView.getText().toString());
     }
 
+    public void testGetCallTypeOrLocation_Geocode() {
+        assertEquals(TEST_GEOCODE, mHelper.getCallTypeOrLocation(getPhoneCallDetails()));
+    }
+
+    public void testGetCallTypeOrLocation_CallType() {
+        PhoneCallDetails details = getPhoneCallDetails();
+        details.geocode = null;
+        details.numberType = Calls.INCOMING_TYPE;
+        mHelper.setPhoneTypeLabelForTest("mobile");
+        assertEquals("mobile", mHelper.getCallTypeOrLocation(details));
+    }
+
+    public void testGetCallTypeOrLocation_DisplayNumber() {
+        PhoneCallDetails details = getPhoneCallDetails("", Calls.PRESENTATION_ALLOWED,
+                TEST_FORMATTED_NUMBER);
+        details.name = "name";
+        assertEquals(TEST_FORMATTED_NUMBER, mHelper.getCallTypeOrLocation(details));
+    }
+
     /** Asserts that the name text field contains the value of the given string resource. */
     private void assertNameEqualsResource(int resId) {
         assertNameEquals(getContext().getString(resId));
@@ -307,14 +331,14 @@
         assertEquals(text, mViews.nameView.getText().toString());
     }
 
-    /** Asserts that the label text field contains the given string value. */
-    private void assertLabelEquals(String text) {
+    /** Asserts that the location and date text field contains the given string value. */
+    private void assertLocationAndDateContains(String text) {
         assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
     }
 
-    /** Asserts that the date text field contains the given string value. */
-    private void assertDateEquals(String text) {
-        assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
+    /** Asserts that the location and date text field exactly equals the given string value. */
+    private void assertLocationAndDateExactEquals(String text) {
+        assertEquals(text, mViews.callLocationAndDate.getText());
     }
 
     /** Asserts that the video icon is shown. */