New Spam-related options in call log entries.

This includes small UI additions to the call log UI; Mainly,
two new buttons to mark each phone number entry as a Spam number
or remove the phone number from the spam list. This also includes
a service definition that will be needed to render the buttons or
keep them hidden.

Change-Id: I7cf22f6027728ebc0dfe9e3b5b923ee70bcaadd2
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index ca00405..63385ee 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -129,6 +129,11 @@
 
     </LinearLayout>
 
+    <ViewStub
+        android:id="@+id/spam_actions_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
     <LinearLayout
         android:id="@+id/details_action"
         style="@style/CallLogActionStyle">
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 21f3213..e5ee3bc 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -55,10 +55,16 @@
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ScreenEvent;
+import com.android.dialer.service.SpamButtonRenderer;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PhoneNumberUtil;
 import com.android.dialer.voicemail.VoicemailPlaybackLayout;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
+import com.android.dialerbind.ObjectFactory;
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * This is an object containing references to views contained by the call log list item. This
@@ -198,6 +204,9 @@
 
     private final int mPhotoSize;
 
+    private ViewStub mSpamViewStub;
+    private SpamButtonRenderer mSpamButtonRenderer;
+
     private View.OnClickListener mExpandCollapseListener;
     private boolean mVoicemailPrimaryActionButtonClicked;
 
@@ -401,6 +410,9 @@
 
             callWithNoteButtonView = actionsView.findViewById(R.id.call_with_note_action);
             callWithNoteButtonView.setOnClickListener(this);
+
+            mSpamViewStub = (ViewStub) actionsView.findViewById(R.id.spam_actions_container);
+            mSpamButtonRenderer = ObjectFactory.newSpamButtonRenderer(mContext, mSpamViewStub);
         }
 
         bindActionButtons();
@@ -499,7 +511,7 @@
         } else {
             detailsButtonView.setVisibility(View.VISIBLE);
             detailsButtonView.setTag(
-                IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
+                    IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
         }
 
         if (info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
@@ -530,6 +542,24 @@
                 mCallLogCache.isVoicemailNumber(accountHandle, number);
         callWithNoteButtonView.setVisibility(
                 supportsCallSubject && !isVoicemailNumber ? View.VISIBLE : View.GONE);
+
+        if(mSpamButtonRenderer != null){
+            List<View> completeLogListItems = Lists.newArrayList(
+                    createNewContactButtonView,
+                    addToExistingContactButtonView,
+                    sendMessageView,
+                    callButtonView,
+                    callWithNoteButtonView,
+                    detailsButtonView,
+                    voicemailPlaybackView);
+            List<View> blockedNumberVisibleViews = new ArrayList<>();
+            List<View> spamNumberVisibleViews = Lists.newArrayList(detailsButtonView);
+
+            mSpamButtonRenderer.setCompleteListItemViews(completeLogListItems);
+            mSpamButtonRenderer.setFilteredNumberViews(blockedNumberVisibleViews);
+            mSpamButtonRenderer.setSpamFilteredViews(spamNumberVisibleViews);
+            mSpamButtonRenderer.render(number, countryIso);
+        }
     }
 
     /**
diff --git a/src/com/android/dialer/service/SpamButtonRenderer.java b/src/com/android/dialer/service/SpamButtonRenderer.java
new file mode 100644
index 0000000..843bc55
--- /dev/null
+++ b/src/com/android/dialer/service/SpamButtonRenderer.java
@@ -0,0 +1,23 @@
+package com.android.dialer.service;
+
+import android.view.View;
+
+import java.util.List;
+
+/**
+ * Interface responsible for rendering spam buttons.
+ */
+public interface SpamButtonRenderer {
+
+    /**
+     * Renders buttons for a phone number.
+     */
+    void render(String number, String countryIso);
+
+    void setCompleteListItemViews(List<View> views);
+
+    void setSpamFilteredViews(List<View> views);
+
+    void setFilteredNumberViews(List<View> views);
+
+}
diff --git a/src/com/android/dialerbind/ObjectFactory.java b/src/com/android/dialerbind/ObjectFactory.java
index f346a7e..d06d55e 100644
--- a/src/com/android/dialerbind/ObjectFactory.java
+++ b/src/com/android/dialerbind/ObjectFactory.java
@@ -19,12 +19,16 @@
 import static com.android.dialer.calllog.CallLogAdapter.CallFetcher;
 
 import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewStub;
 
 import com.android.dialer.calllog.CallLogAdapter;
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.list.RegularSearchFragment;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.SpamButtonRenderer;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 
 /**
@@ -41,6 +45,12 @@
         return "com.android.dialer.database.filterednumberprovider";
     }
 
+    public static SpamButtonRenderer newSpamButtonRenderer(
+            Context context,
+            ViewStub stub) {
+        return null;
+    }
+
     /**
      * Create a new instance of the call log adapter.
      * @param context The context to use.