Move spam setting related methods out of spam interface into a separate spam
setting interface.

Test: All the existing tests
PiperOrigin-RevId: 190314880
Change-Id: I030acbd70120f508c5a4616757d89113524110fa
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.");
     }