Merge "Ignore deleted voicemail for notification"
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
index 4745736..3a4bf87 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
@@ -26,6 +26,7 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.CallLog.Calls;
+import android.provider.VoicemailContract.Voicemails;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
@@ -365,6 +366,11 @@
               .and(Selection.column(Calls.NEW).is("= 1"))
               .and(Selection.column(Calls.TYPE).is("=", type))
               .and(Selection.column(Calls.IS_READ).is("IS NOT 1"));
+
+      if (type == Calls.VOICEMAIL_TYPE) {
+        selectionBuilder.and(Selection.column(Voicemails.DELETED).is(" = 0"));
+      }
+
       if (thresholdMillis != NO_THRESHOLD) {
         selectionBuilder =
             selectionBuilder.and(
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
index e3279ce..2e12cec 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
@@ -67,9 +67,11 @@
       // Query failed, just return
       return;
     }
-    boolean shouldAlert = !voicemailsToNotify.isEmpty();
-    voicemailsToNotify.addAll(getAndUpdateVoicemailsWithExistingNotification(context, queryHelper));
     voicemailsToNotify = filterBlockedNumbers(context, queryHandler, voicemailsToNotify);
+    boolean shouldAlert =
+        !voicemailsToNotify.isEmpty()
+            && voicemailsToNotify.size() > getExistingNotificationCount(context);
+    voicemailsToNotify.addAll(getAndUpdateVoicemailsWithExistingNotification(context, queryHelper));
     if (voicemailsToNotify.isEmpty()) {
       LogUtil.i("VisualVoicemailUpdateTask.updateNotification", "no voicemails to notify about");
       VisualVoicemailNotifier.cancelAllVoicemailNotifications(context);
@@ -107,6 +109,25 @@
     VoicemailNotificationJobService.scheduleJob(context);
   }
 
+  @WorkerThread
+  @NonNull
+  private static int getExistingNotificationCount(Context context) {
+    Assert.isWorkerThread();
+    int result = 0;
+    for (StatusBarNotification notification :
+        DialerNotificationManager.getActiveNotifications(context)) {
+      if (notification.getId() != VisualVoicemailNotifier.NOTIFICATION_ID) {
+        continue;
+      }
+      if (TextUtils.isEmpty(notification.getTag())
+          || !notification.getTag().startsWith(VisualVoicemailNotifier.NOTIFICATION_TAG_PREFIX)) {
+        continue;
+      }
+      result++;
+    }
+    return result;
+  }
+
   /**
    * Cancel notification for voicemail that is already deleted. Returns a list of voicemails that
    * already has notifications posted and should be updated.