Add spam blocking setting in spam module.

Test: InAppSpamTest,ApdlSpamTest,VisualVoicemailUpdateTaskTest
PiperOrigin-RevId: 188509191
Change-Id: I8b9c07dcc1c7b3b80ffc914ec99f4e6d80d50985
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
index 2e12cec..6d2581f 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
@@ -32,8 +32,12 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
+import com.android.dialer.logging.DialerImpression;
+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;
 import java.util.List;
@@ -44,7 +48,7 @@
   @Nullable
   @Override
   public Void doInBackground(@NonNull Input input) throws Throwable {
-    updateNotification(input.context, input.queryHelper, input.queryHandler);
+    updateNotification(input.context, input.queryHelper, input.queryHandler, input.spam);
     return null;
   }
 
@@ -58,7 +62,8 @@
   private static void updateNotification(
       Context context,
       CallLogNotificationsQueryHelper queryHelper,
-      FilteredNumberAsyncQueryHandler queryHandler) {
+      FilteredNumberAsyncQueryHandler queryHandler,
+      Spam spam) {
     Assert.isWorkerThread();
     LogUtil.enterBlock("VisualVoicemailUpdateTask.updateNotification");
 
@@ -67,7 +72,15 @@
       // Query failed, just return
       return;
     }
-    voicemailsToNotify = filterBlockedNumbers(context, queryHandler, voicemailsToNotify);
+
+    if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+      LogUtil.i(
+          "VisualVoicemailUpdateTask.updateNotification",
+          "not filtering due to recent emergency call");
+    } else {
+      voicemailsToNotify = filterBlockedNumbers(context, queryHandler, voicemailsToNotify);
+      voicemailsToNotify = filterSpamNumbers(context, spam, voicemailsToNotify);
+    }
     boolean shouldAlert =
         !voicemailsToNotify.isEmpty()
             && voicemailsToNotify.size() > getExistingNotificationCount(context);
@@ -166,13 +179,6 @@
   private static List<NewCall> filterBlockedNumbers(
       Context context, FilteredNumberAsyncQueryHandler queryHandler, List<NewCall> newCalls) {
     Assert.isWorkerThread();
-    if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
-      LogUtil.i(
-          "VisualVoicemailUpdateTask.filterBlockedNumbers",
-          "not filtering due to recent emergency call");
-      return newCalls;
-    }
-
     List<NewCall> result = new ArrayList<>();
     for (NewCall newCall : newCalls) {
       if (queryHandler.getBlockedIdSynchronous(newCall.number, newCall.countryIso) != null) {
@@ -190,6 +196,30 @@
     return result;
   }
 
+  @WorkerThread
+  private static List<NewCall> filterSpamNumbers(
+      Context context, Spam spam, List<NewCall> newCalls) {
+    Assert.isWorkerThread();
+    if (!spam.isSpamBlockingEnabled()) {
+      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)) {
+        LogUtil.i(
+            "VisualVoicemailUpdateTask.filterSpamNumbers",
+            "found voicemail from spam number, suppressing notification");
+        Logger.get(context)
+            .logImpression(DialerImpression.Type.INCOMING_VOICEMAIL_AUTO_BLOCKED_AS_SPAM);
+      } else {
+        result.add(newCall);
+      }
+    }
+    return result;
+  }
+
   /** Updates the voicemail notifications displayed. */
   static void scheduleTask(@NonNull Context context, @NonNull Runnable callback) {
     Assert.isNotNull(context);
@@ -204,7 +234,8 @@
         new Input(
             context,
             CallLogNotificationsQueryHelper.getInstance(context),
-            new FilteredNumberAsyncQueryHandler(context));
+            new FilteredNumberAsyncQueryHandler(context),
+            SpamComponent.get(context).spam());
     DialerExecutorComponent.get(context)
         .dialerExecutorFactory()
         .createNonUiTaskBuilder(new VisualVoicemailUpdateTask())
@@ -226,14 +257,17 @@
     @NonNull final Context context;
     @NonNull final CallLogNotificationsQueryHelper queryHelper;
     @NonNull final FilteredNumberAsyncQueryHandler queryHandler;
+    @NonNull final Spam spam;
 
     Input(
         Context context,
         CallLogNotificationsQueryHelper queryHelper,
-        FilteredNumberAsyncQueryHandler queryHandler) {
+        FilteredNumberAsyncQueryHandler queryHandler,
+        Spam spam) {
       this.context = context;
       this.queryHelper = queryHelper;
       this.queryHandler = queryHandler;
+      this.spam = spam;
     }
   }
 }
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index 8af807f..d16efb6 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -12,7 +12,7 @@
   // Event enums to be used for Impression Logging in Dialer.
   // It's perfectly acceptable for this enum to be large
   // Values should be from 1000 to 100000.
-  // Next Tag: 1352
+  // Next Tag: 1358
   enum Type {
     UNKNOWN_AOSP_EVENT_TYPE = 1000;
 
@@ -695,5 +695,18 @@
     MAIN_OPEN_WITH_TAB_CONTACTS = 1349;
     MAIN_OPEN_WITH_TAB_VOICEMAIL = 1350;
     MAIN_OPEN_WITH_DIALPAD = 1351;
+
+    // Incoming call screened for spam auto blocking
+    INCOMING_CALL_SCREENED = 1352;
+    // Incoming call auto blocked as spam
+    INCOMING_CALL_AUTO_BLOCKED_AS_SPAM = 1353;
+    // Incoming voicemail screened for spam auto blocking
+    INCOMING_VOICEMAIL_SCREENED = 1354;
+    // Incoming voicemail auto blocked as spam
+    INCOMING_VOICEMAIL_AUTO_BLOCKED_AS_SPAM = 1355;
+    // User reported auto blocked spam call as spam
+    AUTO_BLOCKED_SPAM_CALL_REPORTED_AS_SPAM = 1356;
+    // User reported auto blocked spam call as not spam
+    AUTO_BLOCKED_SPAM_CALL_REPORTED_AS_NOT_SPAM = 1357;
   }
 }
diff --git a/java/com/android/dialer/spam/Spam.java b/java/com/android/dialer/spam/Spam.java
index 5924d56..99deb13 100644
--- a/java/com/android/dialer/spam/Spam.java
+++ b/java/com/android/dialer/spam/Spam.java
@@ -33,6 +33,8 @@
 
   boolean isSpamNotificationEnabled();
 
+  boolean isSpamBlockingEnabled();
+
   boolean isDialogEnabledForSpamNotification();
 
   boolean isDialogReportSpamCheckedByDefault();
diff --git a/java/com/android/dialer/spam/SpamStub.java b/java/com/android/dialer/spam/SpamStub.java
index b171d0d..15d9d76 100644
--- a/java/com/android/dialer/spam/SpamStub.java
+++ b/java/com/android/dialer/spam/SpamStub.java
@@ -50,6 +50,11 @@
   }
 
   @Override
+  public boolean isSpamBlockingEnabled() {
+    return false;
+  }
+
+  @Override
   public boolean isDialogEnabledForSpamNotification() {
     return false;
   }