Remove the call button area if we cannot call.

If this is not a voicemail, then the whole call button area is empty and
there is no need to keep that around. Instead, extend the text area to
the right of the screen.

If there is a voicemail, keep the empty call button area for visual
consistency.

Bug: 5056506
Change-Id: Iaad9228ad6dcc67ebcd8a893ca0383fa595376e4
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);
     }