diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 5c7641c..d52ac32 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -32,6 +32,7 @@
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.spam.Spam;
 import com.android.dialer.spam.SpamComponent;
+import com.android.dialer.spam.SpamSettings;
 import com.android.dialer.spam.promo.SpamBlockingPromoHelper;
 
 /** Listener to show dialogs for block and report spam actions. */
@@ -43,6 +44,7 @@
   private final RecyclerView.Adapter adapter;
   private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
   private final Spam spam;
+  private final SpamSettings spamSettings;
   private final SpamBlockingPromoHelper spamBlockingPromoHelper;
 
   public BlockReportSpamListener(
@@ -57,7 +59,8 @@
     this.adapter = adapter;
     this.filteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
     spam = SpamComponent.get(context).spam();
-    spamBlockingPromoHelper = new SpamBlockingPromoHelper(context, spam);
+    spamSettings = SpamComponent.get(context).spamSettings();
+    spamBlockingPromoHelper = new SpamBlockingPromoHelper(context, spamSettings);
   }
 
   @Override
@@ -69,10 +72,10 @@
       @NonNull final ContactSource.Type contactSourceType) {
     BlockReportSpamDialogs.DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam.newInstance(
             displayNumber,
-            spam.isDialogReportSpamCheckedByDefault(),
+            spamSettings.isDialogReportSpamCheckedByDefault(),
             isSpamChecked -> {
               LogUtil.i("BlockReportSpamListener.onBlockReportSpam", "onClick");
-              if (isSpamChecked && spam.isSpamEnabled()) {
+              if (isSpamChecked && spamSettings.isSpamEnabled()) {
                 Logger.get(context)
                     .logImpression(
                         DialerImpression.Type
@@ -110,10 +113,10 @@
       @NonNull final ContactSource.Type contactSourceType) {
     BlockReportSpamDialogs.DialogFragmentForBlockingNumberAndReportingAsSpam.newInstance(
             displayNumber,
-            spam.isSpamEnabled(),
+            spamSettings.isSpamEnabled(),
             () -> {
               LogUtil.i("BlockReportSpamListener.onBlock", "onClick");
-              if (spam.isSpamEnabled()) {
+              if (spamSettings.isSpamEnabled()) {
                 Logger.get(context)
                     .logImpression(
                         DialerImpression.Type
@@ -154,7 +157,7 @@
             isSpam,
             () -> {
               LogUtil.i("BlockReportSpamListener.onUnblock", "onClick");
-              if (isSpam && spam.isSpamEnabled()) {
+              if (isSpam && spamSettings.isSpamEnabled()) {
                 Logger.get(context)
                     .logImpression(DialerImpression.Type.REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER);
                 spam.reportNotSpamFromCallHistory(
@@ -187,7 +190,7 @@
             displayNumber,
             () -> {
               LogUtil.i("BlockReportSpamListener.onReportNotSpam", "onClick");
-              if (spam.isSpamEnabled()) {
+              if (spamSettings.isSpamEnabled()) {
                 Logger.get(context)
                     .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
                 spam.reportNotSpamFromCallHistory(
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 376057f..de9b95e 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -682,7 +682,7 @@
       contactInfoCache.start();
     }
     contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    isSpamEnabled = SpamComponent.get(activity).spam().isSpamEnabled();
+    isSpamEnabled = SpamComponent.get(activity).spamSettings().isSpamEnabled();
     getDuo().registerListener(this);
     notifyDataSetChanged();
   }
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
index 6d2581f..4516382 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
@@ -36,7 +36,6 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.phonenumbercache.ContactInfo;
-import com.android.dialer.spam.Spam;
 import com.android.dialer.spam.SpamComponent;
 import com.android.dialer.telecom.TelecomUtil;
 import java.util.ArrayList;
@@ -48,7 +47,7 @@
   @Nullable
   @Override
   public Void doInBackground(@NonNull Input input) throws Throwable {
-    updateNotification(input.context, input.queryHelper, input.queryHandler, input.spam);
+    updateNotification(input.context, input.queryHelper, input.queryHandler);
     return null;
   }
 
@@ -62,8 +61,7 @@
   private static void updateNotification(
       Context context,
       CallLogNotificationsQueryHelper queryHelper,
-      FilteredNumberAsyncQueryHandler queryHandler,
-      Spam spam) {
+      FilteredNumberAsyncQueryHandler queryHandler) {
     Assert.isWorkerThread();
     LogUtil.enterBlock("VisualVoicemailUpdateTask.updateNotification");
 
@@ -79,7 +77,7 @@
           "not filtering due to recent emergency call");
     } else {
       voicemailsToNotify = filterBlockedNumbers(context, queryHandler, voicemailsToNotify);
-      voicemailsToNotify = filterSpamNumbers(context, spam, voicemailsToNotify);
+      voicemailsToNotify = filterSpamNumbers(context, voicemailsToNotify);
     }
     boolean shouldAlert =
         !voicemailsToNotify.isEmpty()
@@ -197,23 +195,26 @@
   }
 
   @WorkerThread
-  private static List<NewCall> filterSpamNumbers(
-      Context context, Spam spam, List<NewCall> newCalls) {
+  private static List<NewCall> filterSpamNumbers(Context context, List<NewCall> newCalls) {
     Assert.isWorkerThread();
-    if (!spam.isSpamBlockingEnabled()) {
+    if (!SpamComponent.get(context).spamSettings().isSpamBlockingEnabled()) {
+      LogUtil.w("VisualVoicemailUpdateTask.wwwwwwwwwwwww", "NOT ENABLED");
       return newCalls;
     }
 
     List<NewCall> result = new ArrayList<>();
     for (NewCall newCall : newCalls) {
       Logger.get(context).logImpression(DialerImpression.Type.INCOMING_VOICEMAIL_SCREENED);
-      if (spam.checkSpamStatusSynchronous(newCall.number, newCall.countryIso)) {
+      if (SpamComponent.get(context)
+          .spam()
+          .checkSpamStatusSynchronous(newCall.number, newCall.countryIso)) {
         LogUtil.i(
             "VisualVoicemailUpdateTask.filterSpamNumbers",
             "found voicemail from spam number, suppressing notification");
         Logger.get(context)
             .logImpression(DialerImpression.Type.INCOMING_VOICEMAIL_AUTO_BLOCKED_AS_SPAM);
       } else {
+        LogUtil.w("VisualVoicemailUpdateTask.wwwwwwwwwwwww", "NOT SPAM NUMBER");
         result.add(newCall);
       }
     }
@@ -234,8 +235,7 @@
         new Input(
             context,
             CallLogNotificationsQueryHelper.getInstance(context),
-            new FilteredNumberAsyncQueryHandler(context),
-            SpamComponent.get(context).spam());
+            new FilteredNumberAsyncQueryHandler(context));
     DialerExecutorComponent.get(context)
         .dialerExecutorFactory()
         .createNonUiTaskBuilder(new VisualVoicemailUpdateTask())
@@ -257,17 +257,14 @@
     @NonNull final Context context;
     @NonNull final CallLogNotificationsQueryHelper queryHelper;
     @NonNull final FilteredNumberAsyncQueryHandler queryHandler;
-    @NonNull final Spam spam;
 
     Input(
         Context context,
         CallLogNotificationsQueryHelper queryHelper,
-        FilteredNumberAsyncQueryHandler queryHandler,
-        Spam spam) {
+        FilteredNumberAsyncQueryHandler queryHandler) {
       this.context = context;
       this.queryHelper = queryHelper;
       this.queryHandler = queryHandler;
-      this.spam = spam;
     }
   }
 }
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
index 02aa994..cc307b6 100644
--- a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
@@ -38,6 +38,7 @@
 import com.android.dialer.protos.ProtoParsers;
 import com.android.dialer.spam.Spam;
 import com.android.dialer.spam.SpamComponent;
+import com.android.dialer.spam.SpamSettings;
 import com.google.auto.value.AutoValue;
 
 /**
@@ -104,6 +105,7 @@
             intent, EXTRA_DIALOG_INFO, BlockReportSpamDialogInfo.getDefaultInstance());
 
     Spam spam = SpamComponent.get(context).spam();
+    SpamSettings spamSettings = SpamComponent.get(context).spamSettings();
     FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler =
         new FilteredNumberAsyncQueryHandler(context);
 
@@ -114,7 +116,7 @@
               "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
               "confirmed");
 
-          if (reportSpam && spam.isSpamEnabled()) {
+          if (reportSpam && spamSettings.isSpamEnabled()) {
             LogUtil.i(
                 "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
                 "report spam");
@@ -141,7 +143,7 @@
     // Create and show the dialog.
     DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam.newInstance(
             dialogInfo.getNormalizedNumber(),
-            spam.isDialogReportSpamCheckedByDefault(),
+            spamSettings.isDialogReportSpamCheckedByDefault(),
             onSpamDialogClickListener,
             /* dismissListener = */ null)
         .show(fragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
@@ -189,16 +191,17 @@
         () -> {
           LogUtil.i("ShowBlockReportSpamDialogReceiver.showDialogToReportNotSpam", "confirmed");
 
-          Spam spam = SpamComponent.get(context).spam();
-          if (spam.isSpamEnabled()) {
+          if (SpamComponent.get(context).spamSettings().isSpamEnabled()) {
             Logger.get(context)
                 .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
-            spam.reportNotSpamFromCallHistory(
-                dialogInfo.getNormalizedNumber(),
-                dialogInfo.getCountryIso(),
-                dialogInfo.getCallType(),
-                dialogInfo.getReportingLocation(),
-                dialogInfo.getContactSource());
+            SpamComponent.get(context)
+                .spam()
+                .reportNotSpamFromCallHistory(
+                    dialogInfo.getNormalizedNumber(),
+                    dialogInfo.getCountryIso(),
+                    dialogInfo.getCallType(),
+                    dialogInfo.getReportingLocation(),
+                    dialogInfo.getContactSource());
           }
         };
 
diff --git a/java/com/android/dialer/spam/Spam.java b/java/com/android/dialer/spam/Spam.java
index 09b7ce9..c22f541 100644
--- a/java/com/android/dialer/spam/Spam.java
+++ b/java/com/android/dialer/spam/Spam.java
@@ -16,8 +16,6 @@
 
 package com.android.dialer.spam;
 
-import android.content.Context;
-import android.content.Intent;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import com.android.dialer.DialerPhoneNumber;
@@ -31,23 +29,6 @@
 /** Allows the container application to mark calls as spam. */
 public interface Spam {
 
-  boolean isSpamEnabled();
-
-  boolean isSpamNotificationEnabled();
-
-  boolean isSpamBlockingAvailable();
-
-  boolean isSpamBlockingEnabled();
-
-  boolean isDialogEnabledForSpamNotification();
-
-  boolean isDialogReportSpamCheckedByDefault();
-
-  /** @return what percentage of aftercall notifications to show to the user */
-  int percentOfSpamNotificationsToShow();
-
-  int percentOfNonSpamNotificationsToShow();
-
   /**
    * Checks if each of numbers in the given list is suspected of being a spam.
    *
@@ -184,28 +165,10 @@
       ReportingLocation.Type from,
       ContactSource.Type contactSourceType);
 
-  /**
-   * Modifies spam blocking setting.
-   *
-   * @param enabled Whether to enable or disable the setting.
-   * @param listener The callback to be invoked after setting change is done.
-   */
-  void modifySpamBlockingSetting(boolean enabled, ModifySettingListener listener);
-
-  /** Returns an intent to start spam blocking setting */
-  Intent getSpamBlockingSettingIntent(Context context);
-
   /** Callback to be invoked when data is fetched. */
   interface Listener {
 
     /** Called when data is fetched. */
     void onComplete(boolean isSpam);
   }
-
-  /** Callback to be invoked when setting change completes. */
-  interface ModifySettingListener {
-
-    /** Called when setting change completes. */
-    void onComplete(boolean success);
-  }
 }
diff --git a/java/com/android/dialer/spam/SpamComponent.java b/java/com/android/dialer/spam/SpamComponent.java
index 0bcdafa..2b70b6f 100644
--- a/java/com/android/dialer/spam/SpamComponent.java
+++ b/java/com/android/dialer/spam/SpamComponent.java
@@ -26,6 +26,8 @@
 
   public abstract Spam spam();
 
+  public abstract SpamSettings spamSettings();
+
   public static SpamComponent get(Context context) {
     return ((SpamComponent.HasComponent)
             ((HasRootComponent) context.getApplicationContext()).component())
diff --git a/java/com/android/dialer/spam/SpamSettings.java b/java/com/android/dialer/spam/SpamSettings.java
new file mode 100644
index 0000000..e0c0682
--- /dev/null
+++ b/java/com/android/dialer/spam/SpamSettings.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 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 android.content.Intent;
+
+/** Allows the container application to interact with spam settings. */
+public interface SpamSettings {
+
+  /** @return if spam module is enabled */
+  boolean isSpamEnabled();
+
+  /** @return if spam after call notification is enabled */
+  boolean isSpamNotificationEnabled();
+
+  /** @return if spam blocking is enabled */
+  boolean isSpamBlockingEnabled();
+
+  /** @return if spam blocking user setting is controlled by carrier */
+  boolean isSpamBlockingControlledByCarrier();
+
+  /** @return if spam blocking module is enabled by flag */
+  boolean isSpamBlockingEnabledByFlag();
+
+  /** @return if spam blocking setting is enabled by user */
+  boolean isSpamBlockingEnabledByUser();
+
+  /** @return if dialog is used by default for spam after call notification */
+  boolean isDialogEnabledForSpamNotification();
+
+  /** @return if report spam is checked by default in block/report dialog */
+  boolean isDialogReportSpamCheckedByDefault();
+
+  /** @return percentage of after call notifications for spam numbers to show to the user */
+  int percentOfSpamNotificationsToShow();
+
+  /** @return percentage of after call notifications for nonspam numbers to show to the user */
+  int percentOfNonSpamNotificationsToShow();
+
+  /**
+   * Modifies spam blocking setting.
+   *
+   * @param enabled Whether to enable or disable the setting.
+   * @param listener The callback to be invoked after setting change is done.
+   */
+  void modifySpamBlockingSetting(boolean enabled, ModifySettingListener listener);
+
+  /** @return an intent to start spam blocking setting */
+  Intent getSpamBlockingSettingIntent(Context context);
+
+  /** Callback to be invoked when setting change completes. */
+  interface ModifySettingListener {
+
+    /** Called when setting change completes. */
+    void onComplete(boolean success);
+  }
+}
diff --git a/java/com/android/dialer/spam/SpamSettingsStub.java b/java/com/android/dialer/spam/SpamSettingsStub.java
new file mode 100644
index 0000000..905daa4
--- /dev/null
+++ b/java/com/android/dialer/spam/SpamSettingsStub.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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 android.content.Intent;
+import javax.inject.Inject;
+
+/** Default implementation of SpamSettings. */
+public class SpamSettingsStub implements SpamSettings {
+
+  @Inject
+  public SpamSettingsStub() {}
+
+  @Override
+  public boolean isSpamEnabled() {
+    return false;
+  }
+
+  @Override
+  public boolean isSpamNotificationEnabled() {
+    return false;
+  }
+
+  @Override
+  public boolean isSpamBlockingEnabledByFlag() {
+    return false;
+  }
+
+  @Override
+  public boolean isSpamBlockingControlledByCarrier() {
+    return false;
+  }
+
+  @Override
+  public boolean isSpamBlockingEnabled() {
+    return false;
+  }
+
+  @Override
+  public boolean isSpamBlockingEnabledByUser() {
+    return false;
+  }
+
+  @Override
+  public boolean isDialogEnabledForSpamNotification() {
+    return false;
+  }
+
+  @Override
+  public boolean isDialogReportSpamCheckedByDefault() {
+    return false;
+  }
+
+  @Override
+  public int percentOfSpamNotificationsToShow() {
+    return 0;
+  }
+
+  @Override
+  public int percentOfNonSpamNotificationsToShow() {
+    return 0;
+  }
+
+  @Override
+  public void modifySpamBlockingSetting(boolean enabled, ModifySettingListener listener) {
+    listener.onComplete(false);
+  }
+
+  @Override
+  public Intent getSpamBlockingSettingIntent(Context context) {
+    return new Intent();
+  }
+}
diff --git a/java/com/android/dialer/spam/SpamStub.java b/java/com/android/dialer/spam/SpamStub.java
index 39b05fc..28f26d1 100644
--- a/java/com/android/dialer/spam/SpamStub.java
+++ b/java/com/android/dialer/spam/SpamStub.java
@@ -16,8 +16,6 @@
 
 package com.android.dialer.spam;
 
-import android.content.Context;
-import android.content.Intent;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.logging.ContactLookupResult;
@@ -42,46 +40,6 @@
   }
 
   @Override
-  public boolean isSpamEnabled() {
-    return false;
-  }
-
-  @Override
-  public boolean isSpamNotificationEnabled() {
-    return false;
-  }
-
-  @Override
-  public boolean isSpamBlockingAvailable() {
-    return false;
-  }
-
-  @Override
-  public boolean isSpamBlockingEnabled() {
-    return false;
-  }
-
-  @Override
-  public boolean isDialogEnabledForSpamNotification() {
-    return false;
-  }
-
-  @Override
-  public boolean isDialogReportSpamCheckedByDefault() {
-    return false;
-  }
-
-  @Override
-  public int percentOfSpamNotificationsToShow() {
-    return 0;
-  }
-
-  @Override
-  public int percentOfNonSpamNotificationsToShow() {
-    return 0;
-  }
-
-  @Override
   public ListenableFuture<ImmutableMap<DialerPhoneNumber, SpamStatus>> batchCheckSpamStatus(
       ImmutableSet<DialerPhoneNumber> dialerPhoneNumbers) {
     return backgroundExecutorService.submit(
@@ -168,14 +126,4 @@
       int callType,
       ReportingLocation.Type from,
       ContactSource.Type contactSourceType) {}
-
-  @Override
-  public void modifySpamBlockingSetting(boolean enabled, ModifySettingListener listener) {
-    listener.onComplete(false);
-  }
-
-  @Override
-  public Intent getSpamBlockingSettingIntent(Context context) {
-    return new Intent();
-  }
 }
diff --git a/java/com/android/dialer/spam/StubSpamModule.java b/java/com/android/dialer/spam/StubSpamModule.java
index 0d3b917..5540408 100644
--- a/java/com/android/dialer/spam/StubSpamModule.java
+++ b/java/com/android/dialer/spam/StubSpamModule.java
@@ -25,4 +25,7 @@
 
   @Binds
   public abstract Spam bindSpam(SpamStub stub);
+
+  @Binds
+  public abstract SpamSettings bindSpamSettings(SpamSettingsStub stub);
 }
diff --git a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
index 9349577..cba94e0 100644
--- a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
+++ b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
@@ -25,7 +25,7 @@
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
-import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamSettings;
 
 /** Helper class for showing spam blocking on-boarding promotions. */
 public class SpamBlockingPromoHelper {
@@ -34,11 +34,11 @@
   static final String SPAM_BLOCKING_PROMO_LAST_SHOW_MILLIS = "spam_blocking_promo_last_show_millis";
 
   private final Context context;
-  private final Spam spam;
+  private final SpamSettings spamSettings;
 
-  public SpamBlockingPromoHelper(Context context, Spam spam) {
+  public SpamBlockingPromoHelper(Context context, SpamSettings spamSettings) {
     this.context = context;
-    this.spam = spam;
+    this.spamSettings = spamSettings;
   }
 
   /** Shows a spam blocking promo dialog with on complete snackbar if all the prerequisites meet. */
@@ -54,7 +54,7 @@
               Logger.get(context)
                   .logImpression(
                       DialerImpression.Type.SPAM_BLOCKING_ENABLED_THROUGH_CALL_LOG_PROMO);
-              spam.modifySpamBlockingSetting(
+              spamSettings.modifySpamBlockingSetting(
                   true, success -> showModifySettingOnCompleteSnackbar(view, success));
             })
         .show(fragmentManager, SpamBlockingPromoDialogFragment.SPAM_BLOCKING_PROMO_DIALOG_TAG);
@@ -71,7 +71,9 @@
    */
   @VisibleForTesting
   boolean shouldShowSpamBlockingPromo() {
-    if (!spam.isSpamEnabled() || !spam.isSpamBlockingAvailable() || spam.isSpamBlockingEnabled()) {
+    if (!spamSettings.isSpamEnabled()
+        || !spamSettings.isSpamBlockingEnabledByFlag()
+        || spamSettings.isSpamBlockingEnabledByUser()) {
       return false;
     }
 
@@ -109,7 +111,7 @@
     Snackbar.make(view, snackBarText, Snackbar.LENGTH_LONG)
         .setAction(
             R.string.spam_blocking_setting_prompt,
-            v -> context.startActivity(spam.getSpamBlockingSettingIntent(context)))
+            v -> context.startActivity(spamSettings.getSpamBlockingSettingIntent(context)))
         .setActionTextColor(
             context.getResources().getColor(R.color.dialer_snackbar_action_text_color))
         .show();
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 9a09026..f639e5b 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -144,7 +144,7 @@
     Trace.beginSection("checkSpam");
     call.addListener(new DialerCallListenerImpl(call));
     LogUtil.d("CallList.onCallAdded", "callState=" + call.getState());
-    if (SpamComponent.get(context).spam().isSpamEnabled()) {
+    if (SpamComponent.get(context).spamSettings().isSpamEnabled()) {
       String number = TelecomCallUtil.getNumber(telecomCall);
       SpamComponent.get(context)
           .spam()
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index 9ef65d8..e852f3d 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -205,7 +205,7 @@
 
   /** Determines if the after call notification should be shown for the specified call. */
   private boolean shouldShowAfterCallNotification(DialerCall call) {
-    if (!SpamComponent.get(context).spam().isSpamNotificationEnabled()) {
+    if (!SpamComponent.get(context).spamSettings().isSpamNotificationEnabled()) {
       return false;
     }
 
@@ -305,7 +305,8 @@
 
   private boolean shouldThrottleSpamNotification() {
     int randomNumber = random.nextInt(100);
-    int thresholdForShowing = SpamComponent.get(context).spam().percentOfSpamNotificationsToShow();
+    int thresholdForShowing =
+        SpamComponent.get(context).spamSettings().percentOfSpamNotificationsToShow();
     if (thresholdForShowing == 0) {
       LogUtil.d(
           "SpamCallListListener.shouldThrottleSpamNotification",
@@ -329,7 +330,7 @@
   private boolean shouldThrottleNonSpamNotification() {
     int randomNumber = random.nextInt(100);
     int thresholdForShowing =
-        SpamComponent.get(context).spam().percentOfNonSpamNotificationsToShow();
+        SpamComponent.get(context).spamSettings().percentOfNonSpamNotificationsToShow();
     if (thresholdForShowing == 0) {
       LogUtil.d(
           "SpamCallListListener.shouldThrottleNonSpamNotification",
@@ -418,7 +419,7 @@
    */
   private PendingIntent createBlockReportSpamPendingIntent(DialerCall call) {
     String action = SpamNotificationActivity.ACTION_MARK_NUMBER_AS_SPAM;
-    return SpamComponent.get(context).spam().isDialogEnabledForSpamNotification()
+    return SpamComponent.get(context).spamSettings().isDialogEnabledForSpamNotification()
         ? createActivityPendingIntent(call, action)
         : createServicePendingIntent(call, action);
   }
@@ -429,7 +430,7 @@
    */
   private PendingIntent createNotSpamPendingIntent(DialerCall call) {
     String action = SpamNotificationActivity.ACTION_MARK_NUMBER_AS_NOT_SPAM;
-    return SpamComponent.get(context).spam().isDialogEnabledForSpamNotification()
+    return SpamComponent.get(context).spamSettings().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 61d04a0..cb5f8e5 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -197,7 +197,7 @@
   /** Creates and displays the dialog for whitelisting a number. */
   private void maybeShowNotSpamDialog(
       final String number, final ContactLookupResult.Type contactLookupResultType) {
-    if (SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
+    if (SpamComponent.get(this).spamSettings().isDialogEnabledForSpamNotification()) {
       DialogFragmentForReportingNotSpam.newInstance(
               getFormattedNumber(number, this),
               new BlockReportSpamDialogs.OnConfirmListener() {
@@ -216,7 +216,7 @@
   /** Creates and displays the dialog for blocking/reporting a number as spam. */
   private void maybeShowBlockReportSpamDialog(
       final String number, final ContactLookupResult.Type contactLookupResultType) {
-    if (SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
+    if (SpamComponent.get(this).spamSettings().isDialogEnabledForSpamNotification()) {
       String displayNumber = getFormattedNumber(number, this);
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
@@ -225,7 +225,7 @@
               DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam.newInstance(
                       displayNumber,
                       SpamComponent.get(SpamNotificationActivity.this)
-                          .spam()
+                          .spamSettings()
                           .isDialogReportSpamCheckedByDefault(),
                       new BlockReportSpamDialogs.OnSpamDialogClickListener() {
                         @Override
@@ -319,7 +319,7 @@
   }
 
   private void assertDialogsEnabled() {
-    if (!SpamComponent.get(this).spam().isDialogEnabledForSpamNotification()) {
+    if (!SpamComponent.get(this).spamSettings().isDialogEnabledForSpamNotification()) {
       throw new IllegalStateException(
           "Cannot start this activity with given action because dialogs are not enabled.");
     }
