Merge "Fix crash when altering rate for voicemails without content."
diff --git a/res/layout/call_log_list_item_layout.xml b/res/layout/call_log_list_item_layout.xml
index 344413c..4fbe426 100644
--- a/res/layout/call_log_list_item_layout.xml
+++ b/res/layout/call_log_list_item_layout.xml
@@ -20,6 +20,7 @@
         android:layout_height="?attr/call_log_list_contact_photo_size"
         android:layout_toRightOf="@id/contact_photo"
         android:layout_toLeftOf="@id/divider"
+        android:layout_alignWithParentIfMissing="true"
         android:layout_marginLeft="?attr/call_log_inner_margin"
     >
         <include layout="@layout/call_log_phone_call_details"/>
diff --git a/src/com/android/contacts/calllog/CallLogListItemHelper.java b/src/com/android/contacts/calllog/CallLogListItemHelper.java
index 72d489d..d4f2291 100644
--- a/src/com/android/contacts/calllog/CallLogListItemHelper.java
+++ b/src/com/android/contacts/calllog/CallLogListItemHelper.java
@@ -55,10 +55,19 @@
             boolean useIcons, boolean isHighlighted) {
         mPhoneCallDetailsHelper.setPhoneCallDetails(views.phoneCallDetailsViews, details, useIcons,
                 isHighlighted);
-        views.callView.setVisibility(
-                mPhoneNumberHelper.canPlaceCallsTo(details.number)
-                        ? View.VISIBLE : View.INVISIBLE);
-        views.playView.setVisibility(
-                details.callTypes[0] == Calls.VOICEMAIL_TYPE ? View.VISIBLE : View.GONE);
+        boolean callVisible = mPhoneNumberHelper.canPlaceCallsTo(details.number);
+        boolean playVisible = details.callTypes[0] == Calls.VOICEMAIL_TYPE;
+
+        if (callVisible || playVisible) {
+            // At least one is visible. Keep the divider and the space for the call button.
+            views.callView.setVisibility(callVisible ? View.VISIBLE : View.INVISIBLE);
+            views.playView.setVisibility(playVisible ? View.VISIBLE : View.GONE);
+            views.dividerView.setVisibility(View.VISIBLE);
+        } else {
+            // Neither is visible, remove all of them entirely.
+            views.callView.setVisibility(View.GONE);
+            views.playView.setVisibility(View.GONE);
+            views.dividerView.setVisibility(View.GONE);
+        }
     }
 }
diff --git a/src/com/android/contacts/calllog/CallLogListItemViews.java b/src/com/android/contacts/calllog/CallLogListItemViews.java
index c34779d..b66d84e 100644
--- a/src/com/android/contacts/calllog/CallLogListItemViews.java
+++ b/src/com/android/contacts/calllog/CallLogListItemViews.java
@@ -34,6 +34,8 @@
     public final ImageView callView;
     /** The play action button used for voicemail. */
     public final ImageView playView;
+    /** The divider between callView and playView. */
+    public final View dividerView;
     /** The details of the phone call. */
     public final PhoneCallDetailsViews phoneCallDetailsViews;
     /** The item view for a stand-alone row, or null for other types of rows. */
@@ -44,11 +46,12 @@
     public final TextView listHeaderTextView;
 
     private CallLogListItemViews(QuickContactBadge photoView, ImageView callView,
-            ImageView playView, PhoneCallDetailsViews phoneCallDetailsViews, View listItemView,
-            View listHeaderView, TextView listHeaderTextView) {
+            ImageView playView, View dividerView, PhoneCallDetailsViews phoneCallDetailsViews,
+            View listItemView, View listHeaderView, TextView listHeaderTextView) {
         this.photoView = photoView;
         this.callView = callView;
         this.playView = playView;
+        this.dividerView = dividerView;
         this.phoneCallDetailsViews = phoneCallDetailsViews;
         this.listItemView = listItemView;
         this.listHeaderView = listHeaderView;
@@ -59,6 +62,7 @@
         return new CallLogListItemViews((QuickContactBadge) view.findViewById(R.id.contact_photo),
                 (ImageView) view.findViewById(R.id.call_icon),
                 (ImageView) view.findViewById(R.id.play_icon),
+                view.findViewById(R.id.divider),
                 PhoneCallDetailsViews.fromView(view),
                 view.findViewById(R.id.call_log_item),
                 view.findViewById(R.id.call_log_header),
@@ -66,9 +70,11 @@
     }
 
     public static CallLogListItemViews createForTest(QuickContactBadge photoView,
-            ImageView callView, ImageView playView, PhoneCallDetailsViews phoneCallDetailsViews,
-            View standAloneItemView, View standAloneHeaderView, TextView standAloneHeaderTextView) {
-        return new CallLogListItemViews(photoView, callView, playView, phoneCallDetailsViews,
-                standAloneItemView, standAloneHeaderView, standAloneHeaderTextView);
+            ImageView callView, ImageView playView, View dividerView,
+            PhoneCallDetailsViews phoneCallDetailsViews, View standAloneItemView,
+            View standAloneHeaderView, TextView standAloneHeaderTextView) {
+        return new CallLogListItemViews(photoView, callView, playView, dividerView,
+                phoneCallDetailsViews, standAloneItemView, standAloneHeaderView,
+                standAloneHeaderTextView);
     }
 }
diff --git a/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java b/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
index c56041e..626d7c6 100644
--- a/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
@@ -71,7 +71,7 @@
                 resources, callTypeHelper, mPhoneNumberHelper);
         mHelper = new CallLogListItemHelper(phoneCallDetailsHelper, mPhoneNumberHelper);
         mViews = CallLogListItemViews.createForTest(new QuickContactBadge(context),
-                new ImageView(context), new ImageView(context),
+                new ImageView(context), new ImageView(context), new View(context),
                 PhoneCallDetailsViews.createForTest(new TextView(context),
                         new LinearLayout(context), new TextView(context), new TextView(context),
                         new TextView(context), new TextView(context)),
@@ -93,20 +93,17 @@
 
     public void testSetPhoneCallDetails_Unknown() {
         setPhoneCallDetailsWithNumber(CallerInfo.UNKNOWN_NUMBER, CallerInfo.UNKNOWN_NUMBER);
-        assertEquals(View.INVISIBLE, mViews.callView.getVisibility());
-        assertEquals(View.GONE, mViews.playView.getVisibility());
+        assertNoCallButton();
     }
 
     public void testSetPhoneCallDetails_Private() {
         setPhoneCallDetailsWithNumber(CallerInfo.PRIVATE_NUMBER, CallerInfo.PRIVATE_NUMBER);
-        assertEquals(View.INVISIBLE, mViews.callView.getVisibility());
-        assertEquals(View.GONE, mViews.playView.getVisibility());
+        assertNoCallButton();
     }
 
     public void testSetPhoneCallDetails_Payphone() {
         setPhoneCallDetailsWithNumber(CallerInfo.PAYPHONE_NUMBER, CallerInfo.PAYPHONE_NUMBER);
-        assertEquals(View.INVISIBLE, mViews.callView.getVisibility());
-        assertEquals(View.GONE, mViews.playView.getVisibility());
+        assertNoCallButton();
     }
 
     public void testSetPhoneCallDetails_VoicemailNumber() {
@@ -121,11 +118,37 @@
         assertEquals(View.VISIBLE, mViews.playView.getVisibility());
     }
 
+    public void testSetPhoneCallDetails_VoicemailFromUnknown() {
+        setPhoneCallDetailsWithNumberAndType(CallerInfo.UNKNOWN_NUMBER, CallerInfo.UNKNOWN_NUMBER,
+                Calls.VOICEMAIL_TYPE);
+        assertEquals(View.VISIBLE, mViews.playView.getVisibility());
+        assertEmptyCallButton();
+    }
+
+    /** Asserts that the whole call area is gone. */
+    private void assertNoCallButton() {
+        assertEquals(View.GONE, mViews.callView.getVisibility());
+        assertEquals(View.GONE, mViews.playView.getVisibility());
+        assertEquals(View.GONE, mViews.dividerView.getVisibility());
+    }
+
+    /** Asserts that the call area is present but empty. */
+    private void assertEmptyCallButton() {
+        assertEquals(View.INVISIBLE, mViews.callView.getVisibility());
+        assertEquals(View.VISIBLE, mViews.dividerView.getVisibility());
+    }
+
     /** Sets the details of a phone call using the specified phone number. */
     private void setPhoneCallDetailsWithNumber(String number, String formattedNumber) {
+        setPhoneCallDetailsWithNumberAndType(number, formattedNumber, Calls.INCOMING_TYPE);
+    }
+
+    /** Sets the details of a phone call using the specified phone number. */
+    private void setPhoneCallDetailsWithNumberAndType(String number, String formattedNumber,
+            int callType) {
         mHelper.setPhoneCallDetails(mViews,
                 new PhoneCallDetails(number, formattedNumber, TEST_COUNTRY_ISO,
-                        new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION),
+                        new int[]{ callType }, TEST_DATE, TEST_DURATION),
                 true, false);
     }