diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 28082df..05fb2b3 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -17,9 +17,7 @@
 package com.android.dialer.app.calllog;
 
 import android.app.FragmentManager;
-import android.content.ContentValues;
 import android.content.Context;
-import android.net.Uri;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
 import com.android.dialer.blocking.BlockReportSpamDialogs;
@@ -30,6 +28,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
 
 /** Listener to show dialogs for block and report spam actions. */
 public class BlockReportSpamListener implements CallLogListItemViewHolder.OnClickListener {
@@ -38,6 +37,7 @@
   private final FragmentManager mFragmentManager;
   private final RecyclerView.Adapter mAdapter;
   private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+  private final Spam spam;
 
   public BlockReportSpamListener(
       Context context,
@@ -48,6 +48,7 @@
     mFragmentManager = fragmentManager;
     mAdapter = adapter;
     mFilteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+    spam = SpamComponent.get(context).spam();
   }
 
   @Override
@@ -59,36 +60,29 @@
       @NonNull final ContactSource.Type contactSourceType) {
     BlockReportSpamDialogs.BlockReportSpamDialogFragment.newInstance(
             displayNumber,
-            Spam.get(mContext).isDialogReportSpamCheckedByDefault(),
-            new BlockReportSpamDialogs.OnSpamDialogClickListener() {
-              @Override
-              public void onClick(boolean isSpamChecked) {
-                LogUtil.i("BlockReportSpamListener.onBlockReportSpam", "onClick");
-                if (isSpamChecked && Spam.get(mContext).isSpamEnabled()) {
-                  Logger.get(mContext)
-                      .logImpression(
-                          DialerImpression.Type
-                              .REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG);
-                  Spam.get(mContext)
-                      .reportSpamFromCallHistory(
-                          number,
-                          countryIso,
-                          callType,
-                          ReportingLocation.Type.CALL_LOG_HISTORY,
-                          contactSourceType);
-                }
-                mFilteredNumberAsyncQueryHandler.blockNumber(
-                    new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() {
-                      @Override
-                      public void onBlockComplete(Uri uri) {
-                        Logger.get(mContext)
-                            .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
-                        mAdapter.notifyDataSetChanged();
-                      }
-                    },
+            spam.isDialogReportSpamCheckedByDefault(),
+            isSpamChecked -> {
+              LogUtil.i("BlockReportSpamListener.onBlockReportSpam", "onClick");
+              if (isSpamChecked && spam.isSpamEnabled()) {
+                Logger.get(mContext)
+                    .logImpression(
+                        DialerImpression.Type
+                            .REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG);
+                spam.reportSpamFromCallHistory(
                     number,
-                    countryIso);
+                    countryIso,
+                    callType,
+                    ReportingLocation.Type.CALL_LOG_HISTORY,
+                    contactSourceType);
               }
+              mFilteredNumberAsyncQueryHandler.blockNumber(
+                  uri -> {
+                    Logger.get(mContext)
+                        .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
+                    mAdapter.notifyDataSetChanged();
+                  },
+                  number,
+                  countryIso);
             },
             null)
         .show(mFragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
@@ -103,36 +97,29 @@
       @NonNull final ContactSource.Type contactSourceType) {
     BlockReportSpamDialogs.BlockDialogFragment.newInstance(
             displayNumber,
-            Spam.get(mContext).isSpamEnabled(),
-            new BlockReportSpamDialogs.OnConfirmListener() {
-              @Override
-              public void onClick() {
-                LogUtil.i("BlockReportSpamListener.onBlock", "onClick");
-                if (Spam.get(mContext).isSpamEnabled()) {
-                  Logger.get(mContext)
-                      .logImpression(
-                          DialerImpression.Type
-                              .DIALOG_ACTION_CONFIRM_NUMBER_SPAM_INDIRECTLY_VIA_BLOCK_NUMBER);
-                  Spam.get(mContext)
-                      .reportSpamFromCallHistory(
-                          number,
-                          countryIso,
-                          callType,
-                          ReportingLocation.Type.CALL_LOG_HISTORY,
-                          contactSourceType);
-                }
-                mFilteredNumberAsyncQueryHandler.blockNumber(
-                    new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() {
-                      @Override
-                      public void onBlockComplete(Uri uri) {
-                        Logger.get(mContext)
-                            .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
-                        mAdapter.notifyDataSetChanged();
-                      }
-                    },
+            spam.isSpamEnabled(),
+            () -> {
+              LogUtil.i("BlockReportSpamListener.onBlock", "onClick");
+              if (spam.isSpamEnabled()) {
+                Logger.get(mContext)
+                    .logImpression(
+                        DialerImpression.Type
+                            .DIALOG_ACTION_CONFIRM_NUMBER_SPAM_INDIRECTLY_VIA_BLOCK_NUMBER);
+                spam.reportSpamFromCallHistory(
                     number,
-                    countryIso);
+                    countryIso,
+                    callType,
+                    ReportingLocation.Type.CALL_LOG_HISTORY,
+                    contactSourceType);
               }
+              mFilteredNumberAsyncQueryHandler.blockNumber(
+                  uri -> {
+                    Logger.get(mContext)
+                        .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
+                    mAdapter.notifyDataSetChanged();
+                  },
+                  number,
+                  countryIso);
             },
             null)
         .show(mFragmentManager, BlockReportSpamDialogs.BLOCK_DIALOG_TAG);
@@ -150,32 +137,25 @@
     BlockReportSpamDialogs.UnblockDialogFragment.newInstance(
             displayNumber,
             isSpam,
-            new BlockReportSpamDialogs.OnConfirmListener() {
-              @Override
-              public void onClick() {
-                LogUtil.i("BlockReportSpamListener.onUnblock", "onClick");
-                if (isSpam && Spam.get(mContext).isSpamEnabled()) {
-                  Logger.get(mContext)
-                      .logImpression(DialerImpression.Type.REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER);
-                  Spam.get(mContext)
-                      .reportNotSpamFromCallHistory(
-                          number,
-                          countryIso,
-                          callType,
-                          ReportingLocation.Type.CALL_LOG_HISTORY,
-                          contactSourceType);
-                }
-                mFilteredNumberAsyncQueryHandler.unblock(
-                    new FilteredNumberAsyncQueryHandler.OnUnblockNumberListener() {
-                      @Override
-                      public void onUnblockComplete(int rows, ContentValues values) {
-                        Logger.get(mContext)
-                            .logImpression(DialerImpression.Type.USER_ACTION_UNBLOCKED_NUMBER);
-                        mAdapter.notifyDataSetChanged();
-                      }
-                    },
-                    blockId);
+            () -> {
+              LogUtil.i("BlockReportSpamListener.onUnblock", "onClick");
+              if (isSpam && spam.isSpamEnabled()) {
+                Logger.get(mContext)
+                    .logImpression(DialerImpression.Type.REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER);
+                spam.reportNotSpamFromCallHistory(
+                    number,
+                    countryIso,
+                    callType,
+                    ReportingLocation.Type.CALL_LOG_HISTORY,
+                    contactSourceType);
               }
+              mFilteredNumberAsyncQueryHandler.unblock(
+                  (rows, values) -> {
+                    Logger.get(mContext)
+                        .logImpression(DialerImpression.Type.USER_ACTION_UNBLOCKED_NUMBER);
+                    mAdapter.notifyDataSetChanged();
+                  },
+                  blockId);
             },
             null)
         .show(mFragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG);
@@ -190,23 +170,19 @@
       final ContactSource.Type contactSourceType) {
     BlockReportSpamDialogs.ReportNotSpamDialogFragment.newInstance(
             displayNumber,
-            new BlockReportSpamDialogs.OnConfirmListener() {
-              @Override
-              public void onClick() {
-                LogUtil.i("BlockReportSpamListener.onReportNotSpam", "onClick");
-                if (Spam.get(mContext).isSpamEnabled()) {
-                  Logger.get(mContext)
-                      .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
-                  Spam.get(mContext)
-                      .reportNotSpamFromCallHistory(
-                          number,
-                          countryIso,
-                          callType,
-                          ReportingLocation.Type.CALL_LOG_HISTORY,
-                          contactSourceType);
-                }
-                mAdapter.notifyDataSetChanged();
+            () -> {
+              LogUtil.i("BlockReportSpamListener.onReportNotSpam", "onClick");
+              if (spam.isSpamEnabled()) {
+                Logger.get(mContext)
+                    .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
+                spam.reportNotSpamFromCallHistory(
+                    number,
+                    countryIso,
+                    callType,
+                    ReportingLocation.Type.CALL_LOG_HISTORY,
+                    contactSourceType);
               }
+              mAdapter.notifyDataSetChanged();
             },
             null)
         .show(mFragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index f456555..0459519 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -89,7 +89,7 @@
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.phonenumbercache.ContactInfoHelper;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
 import com.android.dialer.util.PermissionsUtil;
 import java.util.ArrayList;
 import java.util.Map;
@@ -667,7 +667,7 @@
       mContactInfoCache.start();
     }
     mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    mIsSpamEnabled = Spam.get(mActivity).isSpamEnabled();
+    mIsSpamEnabled = SpamComponent.get(mActivity).spam().isSpamEnabled();
     getDuo().registerListener(this);
     notifyDataSetChanged();
   }
@@ -862,7 +862,8 @@
               // Call log cards with only outgoing calls should never be displayed as spam.
               viewHolder.isSpam =
                   details.hasIncomingCalls()
-                      && Spam.get(mActivity)
+                      && SpamComponent.get(mActivity)
+                          .spam()
                           .checkSpamStatusSynchronous(viewHolder.number, viewHolder.countryIso);
               details.isSpam = viewHolder.isSpam;
             }
diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
index 2bba432..c344fad 100644
--- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
+++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
@@ -29,6 +29,7 @@
 import com.android.dialer.precall.impl.PreCallModule;
 import com.android.dialer.preferredsim.suggestion.stub.StubSimSuggestionModule;
 import com.android.dialer.simulator.impl.SimulatorModule;
+import com.android.dialer.spam.StubSpamModule;
 import com.android.dialer.storage.StorageModule;
 import com.android.dialer.strictmode.impl.SystemStrictModeModule;
 import com.android.incallui.calllocation.stub.StubCallLocationModule;
@@ -58,6 +59,7 @@
     VoicemailModule.class,
     StubSimSuggestionModule.class,
     StubFeedbackModule.class,
+    StubSpamModule.class,
   }
 )
 public interface AospDialerRootComponent extends BaseDialerRootComponent {}
diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
index 2e13cfb..8973a32 100644
--- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
+++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
@@ -29,6 +29,7 @@
 import com.android.dialer.precall.PreCallComponent;
 import com.android.dialer.preferredsim.suggestion.SimSuggestionComponent;
 import com.android.dialer.simulator.SimulatorComponent;
+import com.android.dialer.spam.SpamComponent;
 import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.strictmode.StrictModeComponent;
 import com.android.incallui.calllocation.CallLocationComponent;
@@ -57,4 +58,5 @@
         SimulatorComponent.HasComponent,
         StorageComponent.HasComponent,
         StrictModeComponent.HasComponent,
-        VoicemailComponent.HasComponent {}
+        VoicemailComponent.HasComponent,
+        SpamComponent.HasComponent {}
diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
index 2801bde..b54e062 100644
--- a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
+++ b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
@@ -29,6 +29,7 @@
 import com.android.dialer.precall.impl.PreCallModule;
 import com.android.dialer.preferredsim.suggestion.stub.StubSimSuggestionModule;
 import com.android.dialer.simulator.impl.SimulatorModule;
+import com.android.dialer.spam.StubSpamModule;
 import com.android.dialer.storage.StorageModule;
 import com.android.dialer.strictmode.impl.SystemStrictModeModule;
 import com.android.incallui.calllocation.impl.CallLocationModule;
@@ -61,6 +62,7 @@
     VoicemailModule.class,
     StubDuoModule.class,
     StubFeedbackModule.class,
+    StubSpamModule.class,
   }
 )
 public interface GoogleStubDialerRootComponent extends BaseDialerRootComponent {}
diff --git a/java/com/android/dialer/simulator/impl/SimulatorNotifications.java b/java/com/android/dialer/simulator/impl/SimulatorNotifications.java
index a243c34..bd17b7f 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorNotifications.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorNotifications.java
@@ -35,15 +35,7 @@
     return new SimulatorSubMenu(context)
         .addItem(
             "Missed calls", () -> new SimulatorMissedCallCreator(context).start(NOTIFICATION_COUNT))
-        .addItem("Voicemails", () -> addVoicemailNotifications(context))
-        .addItem(
-            "Non spam",
-            () ->
-                new SimulatorSpamCallCreator(context, false /* isSpam */).start(NOTIFICATION_COUNT))
-        .addItem(
-            "Confirm spam",
-            () ->
-                new SimulatorSpamCallCreator(context, true /* isSpam */).start(NOTIFICATION_COUNT));
+        .addItem("Voicemails", () -> addVoicemailNotifications(context));
   }
 
   private static void addVoicemailNotifications(@NonNull Context context) {
diff --git a/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java b/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java
deleted file mode 100644
index a843ec0..0000000
--- a/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.simulator.impl;
-
-import android.content.ContentProviderOperation;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.provider.CallLog;
-import android.support.annotation.NonNull;
-import android.telecom.Connection;
-import android.telecom.DisconnectCause;
-import com.android.dialer.common.Assert;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.ThreadUtil;
-import com.android.dialer.spam.Spam;
-import com.android.dialer.spam.SpamBindingsStub;
-import java.util.ArrayList;
-
-/**
- * Creates many spam call notifications by adding new incoming calls one at a time and disconnecting
- * them.
- */
-final class SimulatorSpamCallCreator implements SimulatorConnectionService.Listener {
-  private static final String EXTRA_CALL_COUNT = "call_count";
-  private static final String EXTRA_IS_SPAM_CALL_CONNECTION = "is_spam_call_connection";
-  private static final int DISCONNECT_DELAY_MILLIS = 1000;
-
-  private final Context context;
-  private final boolean isSpam;
-
-  SimulatorSpamCallCreator(@NonNull Context context, boolean isSpam) {
-    this.context = Assert.isNotNull(context);
-    this.isSpam = isSpam;
-  }
-
-  public void start(int callCount) {
-    Spam.setForTesting(new SimulatorSpamBindings(isSpam));
-    SimulatorConnectionService.addListener(this);
-    addNextIncomingCall(callCount);
-  }
-
-  @Override
-  public void onNewOutgoingConnection(@NonNull SimulatorConnection connection) {}
-
-  @Override
-  public void onNewIncomingConnection(@NonNull SimulatorConnection connection) {
-    if (!isSpamCallConnection(connection)) {
-      return;
-    }
-    ThreadUtil.postDelayedOnUiThread(
-        () -> {
-          LogUtil.i("SimulatorSpamCallCreator.onNewIncomingConnection", "disconnecting");
-          connection.setActive();
-          connection.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
-          ThreadUtil.postDelayedOnUiThread(
-              () -> addNextIncomingCall(getCallCount(connection)), DISCONNECT_DELAY_MILLIS);
-        },
-        DISCONNECT_DELAY_MILLIS);
-  }
-
-  @Override
-  public void onConference(
-      @NonNull SimulatorConnection connection1, @NonNull SimulatorConnection connection2) {}
-
-  private void addNextIncomingCall(int callCount) {
-    if (callCount <= 0) {
-      LogUtil.i("SimulatorSpamCallCreator.addNextIncomingCall", "done adding calls");
-      SimulatorConnectionService.removeListener(this);
-      Spam.setForTesting(null);
-      return;
-    }
-
-    // Caller ID must be e.164 formatted and unique.
-    String callerId = String.format("+1-650-234%04d", callCount);
-    Bundle extras = new Bundle();
-    extras.putInt(EXTRA_CALL_COUNT, callCount - 1);
-    extras.putBoolean(EXTRA_IS_SPAM_CALL_CONNECTION, true);
-
-    // We need to clear the call log because spam notifications are only shown for new calls.
-    clearCallLog(context);
-
-    SimulatorSimCallManager.addNewIncomingCall(context, callerId, false /* isVideo */, extras);
-  }
-
-  private static boolean isSpamCallConnection(@NonNull Connection connection) {
-    return connection.getExtras().getBoolean(EXTRA_IS_SPAM_CALL_CONNECTION);
-  }
-
-  private static int getCallCount(@NonNull Connection connection) {
-    return connection.getExtras().getInt(EXTRA_CALL_COUNT);
-  }
-
-  private static void clearCallLog(@NonNull Context context) {
-    try {
-      ArrayList<ContentProviderOperation> operations = new ArrayList<>();
-      operations.add(ContentProviderOperation.newDelete(CallLog.Calls.CONTENT_URI).build());
-      context.getContentResolver().applyBatch(CallLog.AUTHORITY, operations);
-    } catch (RemoteException | OperationApplicationException e) {
-      Assert.fail("failed to clear call log: " + e);
-    }
-  }
-
-  /**
-   * Custom spam bindings that allow us to override which phone numbers are considered to be spam.
-   * Also disables throttling of spam notifications.
-   */
-  private static class SimulatorSpamBindings extends SpamBindingsStub {
-    private final boolean isSpam;
-
-    SimulatorSpamBindings(boolean isSpam) {
-      this.isSpam = isSpam;
-    }
-
-    @Override
-    public boolean isSpamEnabled() {
-      return true;
-    }
-
-    @Override
-    public boolean isSpamNotificationEnabled() {
-      return true;
-    }
-
-    @Override
-    public int percentOfSpamNotificationsToShow() {
-      return 100;
-    }
-
-    @Override
-    public int percentOfNonSpamNotificationsToShow() {
-      return 100;
-    }
-
-    @Override
-    public void checkSpamStatus(String number, String countryIso, Listener listener) {
-      listener.onComplete(isSpam);
-    }
-  }
-}
diff --git a/java/com/android/dialer/spam/Spam.java b/java/com/android/dialer/spam/Spam.java
index 692a1a0..b1240c6 100644
--- a/java/com/android/dialer/spam/Spam.java
+++ b/java/com/android/dialer/spam/Spam.java
@@ -16,34 +16,150 @@
 
 package com.android.dialer.spam;
 
-import android.content.Context;
-import java.util.Objects;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import com.android.dialer.logging.ContactLookupResult;
+import com.android.dialer.logging.ContactSource;
+import com.android.dialer.logging.ReportingLocation;
 
-/** Accessor for the spam bindings. */
-public class Spam {
+/** Allows the container application to mark calls as spam. */
+public interface Spam {
 
-  private static SpamBindings spamBindings;
+  boolean isSpamEnabled();
 
-  private Spam() {}
+  boolean isSpamNotificationEnabled();
 
-  public static SpamBindings get(Context context) {
-    Objects.requireNonNull(context);
-    if (spamBindings != null) {
-      return spamBindings;
-    }
+  boolean isDialogEnabledForSpamNotification();
 
-    Context application = context.getApplicationContext();
-    if (application instanceof SpamBindingsFactory) {
-      spamBindings = ((SpamBindingsFactory) application).newSpamBindings();
-    }
+  boolean isDialogReportSpamCheckedByDefault();
 
-    if (spamBindings == null) {
-      spamBindings = new SpamBindingsStub();
-    }
-    return spamBindings;
-  }
+  /** @return what percentage of aftercall notifications to show to the user */
+  int percentOfSpamNotificationsToShow();
 
-  public static void setForTesting(SpamBindings spamBindings) {
-    Spam.spamBindings = spamBindings;
+  int percentOfNonSpamNotificationsToShow();
+
+  /**
+   * Checks if the given number is suspected of being a spamer.
+   *
+   * @param number The phone number of the call.
+   * @param countryIso The country ISO of the call.
+   * @param listener The callback to be invoked after {@code Info} is fetched.
+   */
+  void checkSpamStatus(String number, String countryIso, Listener listener);
+
+  /**
+   * @param number The number to check if the number is in the user's white list (non spam list)
+   * @param countryIso The country ISO of the call.
+   * @param listener The callback to be invoked after {@code Info} is fetched.
+   */
+  void checkUserMarkedNonSpamStatus(
+      String number, @Nullable String countryIso, @NonNull Listener listener);
+
+  /**
+   * @param number The number to check if it is in user's spam list
+   * @param countryIso The country ISO of the call.
+   * @param listener The callback to be invoked after {@code Info} is fetched.
+   */
+  void checkUserMarkedSpamStatus(
+      String number, @Nullable String countryIso, @NonNull Listener listener);
+
+  /**
+   * @param number The number to check if it is in the global spam list
+   * @param countryIso The country ISO of the call.
+   * @param listener The callback to be invoked after {@code Info} is fetched.
+   */
+  void checkGlobalSpamListStatus(
+      String number, @Nullable String countryIso, @NonNull Listener listener);
+
+  /**
+   * Synchronously checks if the given number is suspected of being a spamer.
+   *
+   * @param number The phone number of the call.
+   * @param countryIso The country ISO of the call.
+   * @return True if the number is spam.
+   */
+  boolean checkSpamStatusSynchronous(String number, String countryIso);
+
+  /**
+   * Reports number as spam.
+   *
+   * @param number The number to be reported.
+   * @param countryIso The country ISO of the number.
+   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
+   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
+   * @param from Where in the dialer this was reported from. Must be one of {@link
+   *     com.android.dialer.logging.ReportingLocation}.
+   * @param contactLookupResultType The result of the contact lookup for this phone number. Must be
+   *     one of {@link com.android.dialer.logging.ContactLookupResult}.
+   */
+  void reportSpamFromAfterCallNotification(
+      String number,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type from,
+      ContactLookupResult.Type contactLookupResultType);
+
+  /**
+   * Reports number as spam.
+   *
+   * @param number The number to be reported.
+   * @param countryIso The country ISO of the number.
+   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
+   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
+   * @param from Where in the dialer this was reported from. Must be one of {@link
+   *     com.android.dialer.logging.ReportingLocation}.
+   * @param contactSourceType If we have cached contact information for the phone number, this
+   *     indicates its source. Must be one of {@link com.android.dialer.logging.ContactSource}.
+   */
+  void reportSpamFromCallHistory(
+      String number,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type from,
+      ContactSource.Type contactSourceType);
+
+  /**
+   * Reports number as not spam.
+   *
+   * @param number The number to be reported.
+   * @param countryIso The country ISO of the number.
+   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
+   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
+   * @param from Where in the dialer this was reported from. Must be one of {@link
+   *     com.android.dialer.logging.ReportingLocation}.
+   * @param contactLookupResultType The result of the contact lookup for this phone number. Must be
+   *     one of {@link com.android.dialer.logging.ContactLookupResult}.
+   */
+  void reportNotSpamFromAfterCallNotification(
+      String number,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type from,
+      ContactLookupResult.Type contactLookupResultType);
+
+  /**
+   * Reports number as not spam.
+   *
+   * @param number The number to be reported.
+   * @param countryIso The country ISO of the number.
+   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
+   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
+   * @param from Where in the dialer this was reported from. Must be one of {@link
+   *     com.android.dialer.logging.ReportingLocation}.
+   * @param contactSourceType If we have cached contact information for the phone number, this
+   *     indicates its source. Must be one of {@link com.android.dialer.logging.ContactSource}.
+   */
+  void reportNotSpamFromCallHistory(
+      String number,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type from,
+      ContactSource.Type contactSourceType);
+
+  /** Callback to be invoked when data is fetched. */
+  interface Listener {
+
+    /** Called when data is fetched. */
+    void onComplete(boolean isSpam);
   }
 }
diff --git a/java/com/android/dialer/spam/SpamBindings.java b/java/com/android/dialer/spam/SpamBindings.java
deleted file mode 100644
index 5631da6..0000000
--- a/java/com/android/dialer/spam/SpamBindings.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.spam;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import com.android.dialer.logging.ContactLookupResult;
-import com.android.dialer.logging.ContactSource;
-import com.android.dialer.logging.ReportingLocation;
-
-/** Allows the container application to mark calls as spam. */
-public interface SpamBindings {
-
-  boolean isSpamEnabled();
-
-  boolean isSpamNotificationEnabled();
-
-  boolean isDialogEnabledForSpamNotification();
-
-  boolean isDialogReportSpamCheckedByDefault();
-
-  /** @return what percentage of aftercall notifications to show to the user */
-  int percentOfSpamNotificationsToShow();
-
-  int percentOfNonSpamNotificationsToShow();
-
-  /**
-   * Checks if the given number is suspected of being a spamer.
-   *
-   * @param number The phone number of the call.
-   * @param countryIso The country ISO of the call.
-   * @param listener The callback to be invoked after {@code Info} is fetched.
-   */
-  void checkSpamStatus(String number, String countryIso, Listener listener);
-
-  /**
-   * @param number The number to check if the number is in the user's white list (non spam list)
-   * @param countryIso The country ISO of the call.
-   * @param listener The callback to be invoked after {@code Info} is fetched.
-   */
-  void checkUserMarkedNonSpamStatus(
-      String number, @Nullable String countryIso, @NonNull Listener listener);
-
-  /**
-   * @param number The number to check if it is in user's spam list
-   * @param countryIso The country ISO of the call.
-   * @param listener The callback to be invoked after {@code Info} is fetched.
-   */
-  void checkUserMarkedSpamStatus(
-      String number, @Nullable String countryIso, @NonNull Listener listener);
-
-  /**
-   * @param number The number to check if it is in the global spam list
-   * @param countryIso The country ISO of the call.
-   * @param listener The callback to be invoked after {@code Info} is fetched.
-   */
-  void checkGlobalSpamListStatus(
-      String number, @Nullable String countryIso, @NonNull Listener listener);
-
-  /**
-   * Synchronously checks if the given number is suspected of being a spamer.
-   *
-   * @param number The phone number of the call.
-   * @param countryIso The country ISO of the call.
-   * @return True if the number is spam.
-   */
-  boolean checkSpamStatusSynchronous(String number, String countryIso);
-
-  /**
-   * Reports number as spam.
-   *
-   * @param number The number to be reported.
-   * @param countryIso The country ISO of the number.
-   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
-   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
-   * @param from Where in the dialer this was reported from. Must be one of {@link
-   *     com.android.dialer.logging.ReportingLocation}.
-   * @param contactLookupResultType The result of the contact lookup for this phone number. Must be
-   *     one of {@link com.android.dialer.logging.ContactLookupResult}.
-   */
-  void reportSpamFromAfterCallNotification(
-      String number,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type from,
-      ContactLookupResult.Type contactLookupResultType);
-
-  /**
-   * Reports number as spam.
-   *
-   * @param number The number to be reported.
-   * @param countryIso The country ISO of the number.
-   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
-   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
-   * @param from Where in the dialer this was reported from. Must be one of {@link
-   *     com.android.dialer.logging.ReportingLocation}.
-   * @param contactSourceType If we have cached contact information for the phone number, this
-   *     indicates its source. Must be one of {@link com.android.dialer.logging.ContactSource}.
-   */
-  void reportSpamFromCallHistory(
-      String number,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type from,
-      ContactSource.Type contactSourceType);
-
-  /**
-   * Reports number as not spam.
-   *
-   * @param number The number to be reported.
-   * @param countryIso The country ISO of the number.
-   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
-   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
-   * @param from Where in the dialer this was reported from. Must be one of {@link
-   *     com.android.dialer.logging.ReportingLocation}.
-   * @param contactLookupResultType The result of the contact lookup for this phone number. Must be
-   *     one of {@link com.android.dialer.logging.ContactLookupResult}.
-   */
-  void reportNotSpamFromAfterCallNotification(
-      String number,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type from,
-      ContactLookupResult.Type contactLookupResultType);
-
-  /**
-   * Reports number as not spam.
-   *
-   * @param number The number to be reported.
-   * @param countryIso The country ISO of the number.
-   * @param callType Whether the type of call is missed, voicemail, etc. Example of this is {@link
-   *     android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
-   * @param from Where in the dialer this was reported from. Must be one of {@link
-   *     com.android.dialer.logging.ReportingLocation}.
-   * @param contactSourceType If we have cached contact information for the phone number, this
-   *     indicates its source. Must be one of {@link com.android.dialer.logging.ContactSource}.
-   */
-  void reportNotSpamFromCallHistory(
-      String number,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type from,
-      ContactSource.Type contactSourceType);
-
-  /** Callback to be invoked when data is fetched. */
-  interface Listener {
-
-    /** Called when data is fetched. */
-    void onComplete(boolean isSpam);
-  }
-}
diff --git a/java/com/android/dialer/spam/SpamComponent.java b/java/com/android/dialer/spam/SpamComponent.java
new file mode 100644
index 0000000..0bcdafa
--- /dev/null
+++ b/java/com/android/dialer/spam/SpamComponent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.spam;
+
+import android.content.Context;
+import com.android.dialer.inject.HasRootComponent;
+import dagger.Subcomponent;
+
+/** Dagger component to get Spam. */
+@Subcomponent
+public abstract class SpamComponent {
+
+  public abstract Spam spam();
+
+  public static SpamComponent get(Context context) {
+    return ((SpamComponent.HasComponent)
+            ((HasRootComponent) context.getApplicationContext()).component())
+        .spamComponent();
+  }
+
+  /** Used to refer to the root application component. */
+  public interface HasComponent {
+    SpamComponent spamComponent();
+  }
+}
diff --git a/java/com/android/dialer/spam/SpamBindingsStub.java b/java/com/android/dialer/spam/SpamStub.java
similarity index 95%
rename from java/com/android/dialer/spam/SpamBindingsStub.java
rename to java/com/android/dialer/spam/SpamStub.java
index b815dc9..daa475c 100644
--- a/java/com/android/dialer/spam/SpamBindingsStub.java
+++ b/java/com/android/dialer/spam/SpamStub.java
@@ -19,9 +19,13 @@
 import com.android.dialer.logging.ContactLookupResult;
 import com.android.dialer.logging.ContactSource;
 import com.android.dialer.logging.ReportingLocation;
+import javax.inject.Inject;
 
-/** Default implementation of SpamBindings. */
-public class SpamBindingsStub implements SpamBindings {
+/** Default implementation of Spam. */
+public class SpamStub implements Spam {
+
+  @Inject
+  public SpamStub() {}
 
   @Override
   public boolean isSpamEnabled() {
diff --git a/java/com/android/dialer/spam/SpamBindingsFactory.java b/java/com/android/dialer/spam/StubSpamModule.java
similarity index 75%
rename from java/com/android/dialer/spam/SpamBindingsFactory.java
rename to java/com/android/dialer/spam/StubSpamModule.java
index 41144e1..0d3b917 100644
--- a/java/com/android/dialer/spam/SpamBindingsFactory.java
+++ b/java/com/android/dialer/spam/StubSpamModule.java
@@ -16,11 +16,13 @@
 
 package com.android.dialer.spam;
 
-/**
- * This interface should be implementated by the Application subclass. It allows this module to get
- * references to the SpamBindings.
- */
-public interface SpamBindingsFactory {
+import dagger.Binds;
+import dagger.Module;
 
-  SpamBindings newSpamBindings();
+/** Module which binds {@link SpamStub}. */
+@Module
+public abstract class StubSpamModule {
+
+  @Binds
+  public abstract Spam bindSpam(SpamStub stub);
 }
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index fd43a4a..d2ac483 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -39,7 +39,7 @@
 import com.android.dialer.logging.LoggingBindings;
 import com.android.dialer.shortcuts.ShortcutUsageReporter;
 import com.android.dialer.spam.Spam;
-import com.android.dialer.spam.SpamBindings;
+import com.android.dialer.spam.SpamComponent;
 import com.android.incallui.call.DialerCall.State;
 import com.android.incallui.latencyreport.LatencyReport;
 import com.android.incallui.util.TelecomCallUtil;
@@ -141,13 +141,14 @@
     Trace.beginSection("checkSpam");
     call.addListener(new DialerCallListenerImpl(call));
     LogUtil.d("CallList.onCallAdded", "callState=" + call.getState());
-    if (Spam.get(context).isSpamEnabled()) {
+    if (SpamComponent.get(context).spam().isSpamEnabled()) {
       String number = TelecomCallUtil.getNumber(telecomCall);
-      Spam.get(context)
+      SpamComponent.get(context)
+          .spam()
           .checkSpamStatus(
               number,
               call.getCountryIso(),
-              new SpamBindings.Listener() {
+              new Spam.Listener() {
                 @Override
                 public void onComplete(boolean isSpam) {
                   boolean isIncomingCall =
@@ -262,33 +263,36 @@
   private void updateUserMarkedSpamStatus(
       final DialerCall call, final Context context, String number) {
 
-    Spam.get(context)
+    SpamComponent.get(context)
+        .spam()
         .checkUserMarkedNonSpamStatus(
             number,
             call.getCountryIso(),
-            new SpamBindings.Listener() {
+            new Spam.Listener() {
               @Override
               public void onComplete(boolean isInUserWhiteList) {
                 call.setIsInUserWhiteList(isInUserWhiteList);
               }
             });
 
-    Spam.get(context)
+    SpamComponent.get(context)
+        .spam()
         .checkGlobalSpamListStatus(
             number,
             call.getCountryIso(),
-            new SpamBindings.Listener() {
+            new Spam.Listener() {
               @Override
               public void onComplete(boolean isInGlobalSpamList) {
                 call.setIsInGlobalSpamList(isInGlobalSpamList);
               }
             });
 
-    Spam.get(context)
+    SpamComponent.get(context)
+        .spam()
         .checkUserMarkedSpamStatus(
             number,
             call.getCountryIso(),
-            new SpamBindings.Listener() {
+            new Spam.Listener() {
               @Override
               public void onComplete(boolean isInUserSpamList) {
                 call.setIsInUserSpamList(isInUserSpamList);
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index cf545c0..fa3dd6e 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -47,7 +47,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.notification.NotificationChannelId;
-import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.PermissionsUtil;
 import com.android.incallui.call.CallList;
@@ -205,7 +205,7 @@
 
   /** Determines if the after call notification should be shown for the specified call. */
   private boolean shouldShowAfterCallNotification(DialerCall call) {
-    if (!Spam.get(context).isSpamNotificationEnabled()) {
+    if (!SpamComponent.get(context).spam().isSpamNotificationEnabled()) {
       return false;
     }
 
@@ -304,7 +304,7 @@
 
   private boolean shouldThrottleSpamNotification() {
     int randomNumber = random.nextInt(100);
-    int thresholdForShowing = Spam.get(context).percentOfSpamNotificationsToShow();
+    int thresholdForShowing = SpamComponent.get(context).spam().percentOfSpamNotificationsToShow();
     if (thresholdForShowing == 0) {
       LogUtil.d(
           "SpamCallListListener.shouldThrottleSpamNotification",
@@ -327,7 +327,8 @@
 
   private boolean shouldThrottleNonSpamNotification() {
     int randomNumber = random.nextInt(100);
-    int thresholdForShowing = Spam.get(context).percentOfNonSpamNotificationsToShow();
+    int thresholdForShowing =
+        SpamComponent.get(context).spam().percentOfNonSpamNotificationsToShow();
     if (thresholdForShowing == 0) {
       LogUtil.d(
           "SpamCallListListener.shouldThrottleNonSpamNotification",
@@ -419,7 +420,7 @@
    */
   private PendingIntent createBlockReportSpamPendingIntent(DialerCall call) {
     String action = SpamNotificationActivity.ACTION_MARK_NUMBER_AS_SPAM;
-    return Spam.get(context).isDialogEnabledForSpamNotification()
+    return SpamComponent.get(context).spam().isDialogEnabledForSpamNotification()
         ? createActivityPendingIntent(call, action)
         : createServicePendingIntent(call, action);
   }
@@ -430,7 +431,7 @@
    */
   private PendingIntent createNotSpamPendingIntent(DialerCall call) {
     String action = SpamNotificationActivity.ACTION_MARK_NUMBER_AS_NOT_SPAM;
-    return Spam.get(context).isDialogEnabledForSpamNotification()
+    return SpamComponent.get(context).spam().isDialogEnabledForSpamNotification()
         ? createActivityPendingIntent(call, action)
         : createServicePendingIntent(call, action);
   }
diff --git a/java/com/android/incallui/spam/SpamNotificationActivity.java b/java/com/android/incallui/spam/SpamNotificationActivity.java
index f5ea73c..ceb9ebb 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -38,7 +38,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.notification.DialerNotificationManager;
-import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
 import com.android.incallui.call.DialerCall;
 
 /** Creates the after call notification dialogs. */
@@ -188,7 +188,7 @@
   /** Creates and displays the dialog for whitelisting a number. */
   private void maybeShowNotSpamDialog(
       final String number, final ContactLookupResult.Type contactLookupResultType) {
-    if (Spam.get(this).isDialogEnabledForSpamNotification()) {
+    if (SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
       BlockReportSpamDialogs.ReportNotSpamDialogFragment.newInstance(
               getFormattedNumber(number),
               new BlockReportSpamDialogs.OnConfirmListener() {
@@ -207,14 +207,16 @@
   /** Creates and displays the dialog for blocking/reporting a number as spam. */
   private void maybeShowBlockReportSpamDialog(
       final String number, final ContactLookupResult.Type contactLookupResultType) {
-    if (Spam.get(this).isDialogEnabledForSpamNotification()) {
+    if (SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
             @Override
             public void onComplete() {
               BlockReportSpamDialogs.BlockReportSpamDialogFragment.newInstance(
                       getFormattedNumber(number),
-                      Spam.get(SpamNotificationActivity.this).isDialogReportSpamCheckedByDefault(),
+                      SpamComponent.get(SpamNotificationActivity.this)
+                          .spam()
+                          .isDialogReportSpamCheckedByDefault(),
                       new BlockReportSpamDialogs.OnSpamDialogClickListener() {
                         @Override
                         public void onClick(boolean isSpamChecked) {
@@ -263,7 +265,8 @@
       String number, boolean reportAsSpam, ContactLookupResult.Type contactLookupResultType) {
     if (reportAsSpam) {
       logCallImpression(DialerImpression.Type.SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_SPAM);
-      Spam.get(this)
+      SpamComponent.get(this)
+          .spam()
           .reportSpamFromAfterCallNotification(
               number,
               getCountryIso(),
@@ -282,7 +285,8 @@
   private void reportNotSpamAndFinish(
       String number, ContactLookupResult.Type contactLookupResultType) {
     logCallImpression(DialerImpression.Type.SPAM_AFTER_CALL_NOTIFICATION_REPORT_NUMBER_AS_NOT_SPAM);
-    Spam.get(this)
+    SpamComponent.get(this)
+        .spam()
         .reportNotSpamFromAfterCallNotification(
             number,
             getCountryIso(),
@@ -305,7 +309,7 @@
   }
 
   private void assertDialogsEnabled() {
-    if (!Spam.get(this).isDialogEnabledForSpamNotification()) {
+    if (!SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
       throw new IllegalStateException(
           "Cannot start this activity with given action because dialogs are not enabled.");
     }
diff --git a/java/com/android/incallui/spam/SpamNotificationService.java b/java/com/android/incallui/spam/SpamNotificationService.java
index 3c1061a..b85ab11 100644
--- a/java/com/android/incallui/spam/SpamNotificationService.java
+++ b/java/com/android/incallui/spam/SpamNotificationService.java
@@ -30,7 +30,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.notification.DialerNotificationManager;
-import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
 import com.android.incallui.call.DialerCall;
 
 /**
@@ -95,7 +95,8 @@
       case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_SPAM:
         logCallImpression(
             intent, DialerImpression.Type.SPAM_NOTIFICATION_SERVICE_ACTION_MARK_NUMBER_AS_SPAM);
-        Spam.get(this)
+        SpamComponent.get(this)
+            .spam()
             .reportSpamFromAfterCallNotification(
                 number,
                 countryIso,
@@ -107,7 +108,8 @@
       case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_NOT_SPAM:
         logCallImpression(
             intent, DialerImpression.Type.SPAM_NOTIFICATION_SERVICE_ACTION_MARK_NUMBER_AS_NOT_SPAM);
-        Spam.get(this)
+        SpamComponent.get(this)
+            .spam()
             .reportNotSpamFromAfterCallNotification(
                 number,
                 countryIso,
