Convert to primary action button on call log items.

+ This is the call button on the standard call log list item, but
will be play on voicemail call log list items.
+ Add call "list" action for voicemail call log list items.

Change-Id: I4b115b96738b77c8a19c1071d5290e65f93395ac
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index abc0fbb..fde1de5 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -85,13 +85,13 @@
 
         <ImageView
             android:id="@+id/call_back_button"
-            android:layout_width="@dimen/call_button_dimen"
-            android:layout_height="@dimen/call_button_dimen"
+            android:layout_width="@dimen/call_log_list_item_primary_action_dimen"
+            android:layout_height="@dimen/call_log_list_item_primary_action_dimen"
             android:layout_marginEnd="16dp"
             android:background="?android:attr/selectableItemBackgroundBorderless"
             android:src="@drawable/ic_call_24dp"
             android:scaleType="center"
-            android:tint="@color/recent_call_log_item_phone_icon_tint"
+            android:tint="@color/call_log_list_item_primary_action_icon_tint"
             android:contentDescription="@string/description_call_log_call_action"
             android:visibility="gone" />
 
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index 7fce595..ec512b6 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -137,16 +137,14 @@
                 </LinearLayout>
 
                 <ImageView
-                    android:id="@+id/call_icon"
-                    android:layout_width="@dimen/call_button_dimen"
-                    android:layout_height="@dimen/call_button_dimen"
+                    android:id="@+id/primary_action_button"
+                    android:layout_width="@dimen/call_log_list_item_primary_action_dimen"
+                    android:layout_height="@dimen/call_log_list_item_primary_action_dimen"
                     android:layout_gravity="center_vertical"
                     android:layout_marginEnd="@dimen/call_log_icon_margin"
                     android:background="?android:attr/selectableItemBackgroundBorderless"
-                    android:src="@drawable/ic_call_24dp"
                     android:scaleType="center"
-                    android:tint="@color/recent_call_log_item_phone_icon_tint"
-                    android:contentDescription="@string/description_call_log_call_action"
+                    android:tint="@color/call_log_list_item_primary_action_icon_tint"
                     android:visibility="gone" />
 
             </LinearLayout>
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index d4c9706..4d3fb75 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -29,6 +29,21 @@
         android:layout_height="wrap_content" />
 
     <LinearLayout
+        android:id="@+id/call_action"
+        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>
+
+    <LinearLayout
         android:id="@+id/video_call_action"
         style="@style/CallLogActionStyle">
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 352bce5..f83c328 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -37,7 +37,7 @@
     <color name="call_log_voicemail_highlight_color">#33b5e5</color>
 
     <!-- Tint of the recent card phone icon; 30% black -->
-    <color name="recent_call_log_item_phone_icon_tint">#4d000000</color>
+    <color name="call_log_list_item_primary_action_icon_tint">#4d000000</color>
 
     <color name="voicemail_playback_icon_tint">#8e8e8e</color>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9d987e8..bcde855 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -133,5 +133,5 @@
     <dimen name="preference_side_margin">16dp</dimen>
     <dimen name="preference_summary_line_spacing_extra">4dp</dimen>
 
-    <dimen name="call_button_dimen">36dp</dimen>
+    <dimen name="call_log_list_item_primary_action_dimen">36dp</dimen>
 </resources>
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 69fbb03..3c7e080 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -41,7 +41,6 @@
 import com.android.dialer.R;
 import com.android.dialer.contactinfo.ContactInfoCache;
 import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
-import com.android.dialer.util.DialerUtils;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -105,24 +104,6 @@
     /** Helper to group call log entries. */
     private final CallLogGroupBuilder mCallLogGroupBuilder;
 
-    /** Listener for the primary or secondary actions in the list.
-     *  Primary opens the call details.
-     *  Secondary calls or plays.
-     **/
-    private final View.OnClickListener mActionListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View view) {
-            final IntentProvider intentProvider = (IntentProvider) view.getTag();
-            if (intentProvider != null) {
-                final Intent intent = intentProvider.getIntent(mContext);
-                // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
-                if (intent != null) {
-                    DialerUtils.startActivityWithErrorToast(mContext, intent);
-                }
-            }
-        }
-    };
-
     /**
      * The OnClickListener used to expand or collapse the action buttons of a call log entry.
      */
@@ -308,7 +289,6 @@
         CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create(
                 view,
                 mContext,
-                mActionListener,
                 mPhoneNumberUtilsWrapper,
                 mCallLogViewsHelper,
                 mVoicemailPlaybackPresenter);
@@ -414,13 +394,15 @@
             views.dayGroupHeader.setVisibility(View.GONE);
         }
 
+        mCallLogViewsHelper.setPhoneCallDetails(mContext, views, details);
+
         // Update the expanded position if the rowIds match, in case ViewHolders were added/removed.
         // Then restore the state of the row on rebind.
         if (mCurrentlyExpandedRowId == views.rowId) {
             mCurrentlyExpandedPosition = position;
         }
         views.showActions(mCurrentlyExpandedPosition == position);
-        views.updateCallButton();
+        views.updatePrimaryActionButton();
 
         String nameForDefaultImage = null;
         if (TextUtils.isEmpty(info.name)) {
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 987bcb8..1d6a434 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -31,6 +31,7 @@
 import android.view.ViewStub;
 import android.view.ViewTreeObserver;
 import android.widget.QuickContactBadge;
+import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.android.contacts.common.CallUtil;
@@ -42,6 +43,7 @@
 import com.android.dialer.PhoneCallDetailsViews;
 import com.android.dialer.R;
 import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.util.DialerUtils;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 import com.android.dialer.voicemail.VoicemailPlaybackLayout;
 
@@ -51,7 +53,8 @@
  *
  * This object also contains UI logic pertaining to the view, to isolate it from the CallLogAdapter.
  */
-public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder {
+public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
+        implements View.OnClickListener {
 
     /** The root view of the call log list item */
     public final View rootView;
@@ -66,12 +69,13 @@
     /** The view containing the details for the call log row, including the action buttons. */
     public final CardView callLogEntryView;
     /** The actionable view which places a call to the number corresponding to the call log row. */
-    public final View callActionView;
+    public final ImageView primaryActionButtonView;
 
     /** The view containing call log item actions.  Null until the ViewStub is inflated. */
     public View actionsView;
     /** The button views below are assigned only when the action section is expanded. */
     public VoicemailPlaybackLayout voicemailPlaybackView;
+    public View callButtonView;
     public View videoCallButtonView;
     public View createNewContactButtonView;
     public View addToExistingContactButtonView;
@@ -135,7 +139,6 @@
     private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
 
     private final Context mContext;
-    private final View.OnClickListener mActionListener;
     private final PhoneNumberUtilsWrapper mPhoneNumberUtilsWrapper;
     private final CallLogListItemHelper mCallLogListItemHelper;
     private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
@@ -144,7 +147,6 @@
 
     private CallLogListItemViewHolder(
             Context context,
-            View.OnClickListener actionListener,
             PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
@@ -154,11 +156,10 @@
             PhoneCallDetailsViews phoneCallDetailsViews,
             CardView callLogEntryView,
             TextView dayGroupHeader,
-            View callActionView) {
+            ImageView primaryActionButtonView) {
         super(rootView);
 
         mContext = context;
-        mActionListener = actionListener;
         mPhoneNumberUtilsWrapper = phoneNumberUtilsWrapper;
         mCallLogListItemHelper = callLogListItemHelper;
         mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
@@ -169,7 +170,7 @@
         this.phoneCallDetailsViews = phoneCallDetailsViews;
         this.callLogEntryView = callLogEntryView;
         this.dayGroupHeader = dayGroupHeader;
-        this.callActionView = callActionView;
+        this.primaryActionButtonView = primaryActionButtonView;
 
         Resources resources = mContext.getResources();
         mPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
@@ -180,22 +181,18 @@
 
         quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
 
-        if (callActionView != null) {
-            callActionView.setOnClickListener(mActionListener);
-        }
+        primaryActionButtonView.setOnClickListener(this);
     }
 
     public static CallLogListItemViewHolder create(
             View view,
             Context context,
-            View.OnClickListener actionListener,
             PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
 
         return new CallLogListItemViewHolder(
                 context,
-                actionListener,
                 phoneNumberUtilsWrapper,
                 callLogListItemHelper,
                 voicemailPlaybackPresenter,
@@ -205,7 +202,7 @@
                 PhoneCallDetailsViews.fromView(view),
                 (CardView) view.findViewById(R.id.call_log_row),
                 (TextView) view.findViewById(R.id.call_log_day_group_label),
-                view.findViewById(R.id.call_icon));
+                (ImageView) view.findViewById(R.id.primary_action_button));
     }
 
     /**
@@ -223,54 +220,55 @@
             voicemailPlaybackView = (VoicemailPlaybackLayout) actionsView
                     .findViewById(R.id.voicemail_playback_layout);
 
+            callButtonView = actionsView.findViewById(R.id.call_action);
+            callButtonView.setOnClickListener(this);
+
             videoCallButtonView = actionsView.findViewById(R.id.video_call_action);
-            videoCallButtonView.setOnClickListener(mActionListener);
+            videoCallButtonView.setOnClickListener(this);
 
             createNewContactButtonView = actionsView.findViewById(R.id.create_new_contact_action);
-            createNewContactButtonView.setOnClickListener(mActionListener);
+            createNewContactButtonView.setOnClickListener(this);
 
             addToExistingContactButtonView =
                     actionsView.findViewById(R.id.add_to_existing_contact_action);
-            addToExistingContactButtonView.setOnClickListener(mActionListener);
+            addToExistingContactButtonView.setOnClickListener(this);
 
             sendMessageView = actionsView.findViewById(R.id.send_message_action);
-            sendMessageView.setOnClickListener(mActionListener);
+            sendMessageView.setOnClickListener(this);
 
             detailsButtonView = actionsView.findViewById(R.id.details_action);
-            detailsButtonView.setOnClickListener(mActionListener);
+            detailsButtonView.setOnClickListener(this);
         }
 
         bindActionButtons();
     }
 
-    public void updateCallButton() {
-        boolean canPlaceCallToNumber =
-                PhoneNumberUtilsWrapper.canPlaceCallsTo(number, numberPresentation);
+    public void updatePrimaryActionButton() {
+        if (TextUtils.isEmpty(voicemailUri)) {
+            boolean canPlaceCallToNumber =
+                    PhoneNumberUtilsWrapper.canPlaceCallsTo(number, numberPresentation);
 
-        if (canPlaceCallToNumber) {
-            boolean isVoicemailNumber =
-                    mPhoneNumberUtilsWrapper.isVoicemailNumber(accountHandle, number);
-            if (isVoicemailNumber) {
-                // Make a general call to voicemail to ensure that if there are multiple accounts
-                // it does not call the voicemail number of a specific phone account.
-                callActionView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider());
-            } else {
-                callActionView.setTag(IntentProvider.getReturnCallIntentProvider(number));
-            }
+            if (canPlaceCallToNumber) {
+                boolean isVoicemailNumber =
+                        mPhoneNumberUtilsWrapper.isVoicemailNumber(accountHandle, number);
+                if (isVoicemailNumber) {
+                    // Call to generic voicemail number, in case there are multiple accounts.
+                    primaryActionButtonView.setTag(
+                            IntentProvider.getReturnVoicemailCallIntentProvider());
+                } else {
+                    primaryActionButtonView.setTag(
+                            IntentProvider.getReturnCallIntentProvider(number));
+                }
 
-            if (nameOrNumber != null) {
-                callActionView.setContentDescription(TextUtils.expandTemplate(
+                primaryActionButtonView.setContentDescription(TextUtils.expandTemplate(
                         mContext.getString(R.string.description_call_action),
                         nameOrNumber));
+                primaryActionButtonView.setImageResource(R.drawable.ic_call_24dp);
+                primaryActionButtonView.setVisibility(View.VISIBLE);
             } else {
-                callActionView.setContentDescription(
-                        mContext.getString(R.string.description_call_log_call_action));
+                primaryActionButtonView.setTag(null);
+                primaryActionButtonView.setVisibility(View.GONE);
             }
-
-            callActionView.setVisibility(View.VISIBLE);
-        } else {
-            callActionView.setTag(null);
-            callActionView.setVisibility(View.GONE);
         }
     }
 
@@ -282,13 +280,23 @@
         boolean canPlaceCallToNumber =
                 PhoneNumberUtilsWrapper.canPlaceCallsTo(number, numberPresentation);
 
+        if (!TextUtils.isEmpty(voicemailUri) && canPlaceCallToNumber) {
+            callButtonView.setTag(IntentProvider.getReturnCallIntentProvider(number));
+            ((TextView) callButtonView.findViewById(R.id.call_action_text))
+                    .setText(TextUtils.expandTemplate(
+                            mContext.getString(R.string.call_log_action_call),
+                            nameOrNumber));
+            callButtonView.setVisibility(View.VISIBLE);
+        } else {
+            callButtonView.setVisibility(View.GONE);
+        }
+
         // If one of the calls had video capabilities, show the video call button.
         if (CallUtil.isVideoEnabled(mContext) && canPlaceCallToNumber &&
                 phoneCallDetailsViews.callTypeIcons.isVideoShown()) {
             videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
             videoCallButtonView.setVisibility(View.VISIBLE);
         } else {
-            videoCallButtonView.setTag(null);
             videoCallButtonView.setVisibility(View.GONE);
         }
 
@@ -392,6 +400,18 @@
         }
     }
 
+    @Override
+    public void onClick(View view) {
+        final IntentProvider intentProvider = (IntentProvider) view.getTag();
+        if (intentProvider != null) {
+            final Intent intent = intentProvider.getIntent(mContext);
+            // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
+            if (intent != null) {
+                DialerUtils.startActivityWithErrorToast(mContext, intent);
+            }
+        }
+    }
+
     @NeededForTesting
     public static CallLogListItemViewHolder createForTest(Context context) {
         Resources resources = context.getResources();
@@ -401,7 +421,6 @@
 
         CallLogListItemViewHolder viewHolder = new CallLogListItemViewHolder(
                 context,
-                null /* actionListener */,
                 phoneNumberUtilsWrapper,
                 new CallLogListItemHelper(phoneCallDetailsHelper, resources),
                 null /* voicemailPlaybackPresenter */,
@@ -411,7 +430,7 @@
                 PhoneCallDetailsViews.createForTest(context),
                 new CardView(context),
                 new TextView(context),
-                new View(context));
+                new ImageView(context));
         viewHolder.detailsButtonView = new TextView(context);
         viewHolder.actionsView = new View(context);
         viewHolder.voicemailPlaybackView = new VoicemailPlaybackLayout(context);
diff --git a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java b/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
index df6719c..a739b16 100644
--- a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
@@ -326,13 +326,14 @@
         CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
                 mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
         bindViewForTest(viewHolder);
-        viewHolder.updateCallButton();
+        viewHolder.updatePrimaryActionButton();
 
         // The primaryActionView tag is set in the
         // {@link com.android.dialer.calllog.CallLogAdapter#bindView} method.  If it is possible
         // to place a call to the phone number, a call intent will have been created for the
         // primaryActionView.
-        IntentProvider intentProvider = (IntentProvider) viewHolder.callActionView.getTag();
+        IntentProvider intentProvider =
+                (IntentProvider) viewHolder.primaryActionButtonView.getTag();
         Intent intent = intentProvider.getIntent(mActivity);
         // Starts a call.
         assertEquals(TestConstants.CALL_INTENT_ACTION, intent.getAction());
@@ -375,12 +376,13 @@
             if (presentation == Calls.PRESENTATION_RESTRICTED ||
                     presentation == Calls.PRESENTATION_UNKNOWN) {
                 //If number is not callable, the primary action view should have a null tag.
-                assertNull(mItem.callActionView.getTag());
+                assertNull(mItem.primaryActionButtonView.getTag());
             } else {
                 //If the number is callable, the primary action view should have a non-null tag.
-                assertNotNull(mItem.callActionView.getTag());
+                assertNotNull(mItem.primaryActionButtonView.getTag());
 
-                IntentProvider intentProvider = (IntentProvider)mItem.callActionView.getTag();
+                IntentProvider intentProvider =
+                        (IntentProvider) mItem.primaryActionButtonView.getTag();
                 Intent callIntent = intentProvider.getIntent(mActivity);
 
                 //The intent should be to make the call
@@ -457,7 +459,7 @@
             }
         });
         getInstrumentation().waitForIdleSync();
-        viewHolder.updateCallButton();
+        viewHolder.updatePrimaryActionButton();
     }
 
     private void bindViewForTest(CallLogListItemViewHolder viewHolder) {
diff --git a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
index 091065b..8ee85a4 100644
--- a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
@@ -78,7 +78,7 @@
     public void testSetPhoneCallDetails() {
         setPhoneCallDetailsWithNumber("12125551234", Calls.PRESENTATION_ALLOWED,
                 "1-212-555-1234");
-        assertEquals(View.VISIBLE, mViewHolder.callActionView.getVisibility());
+        assertEquals(View.VISIBLE, mViewHolder.primaryActionButtonView.getVisibility());
     }
 
     public void testSetPhoneCallDetails_Unknown() {