summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
diff options
context:
space:
mode:
authormdooley <mdooley@google.com>2017-09-07 17:15:59 -0700
committerEric Erfanian <erfanian@google.com>2017-09-11 13:48:23 -0700
commitc18ca0fba4375134107c6e71dab9bd0f85a2c968 (patch)
treeea9f73b83bdf4f07b0b53aad69dcfd4691c69806 /java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
parentb2b77b3b4154c37b5caf39990332d00c9e9122c7 (diff)
Updating voicemail notifications
This is mostly just a revived version of cl/158901400. It adds a job service that is triggered by changes to the voicemail database. The job updates voicemail notifications, as necessary. video of notification update: https://drive.google.com/open?id=0B9o_KvtLkcuId1ptNk1EbGotWFU Bug: 37340510,27535759 Test: manual and unit test PiperOrigin-RevId: 167934550 Change-Id: I36f03c0769645f7a0cb478172171f1079eca2108
Diffstat (limited to 'java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java')
-rw-r--r--java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java58
1 files changed, 52 insertions, 6 deletions
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
index d6601be36..219ad676d 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
@@ -17,6 +17,8 @@
package com.android.dialer.app.calllog;
import android.content.Context;
+import android.net.Uri;
+import android.service.notification.StatusBarNotification;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
@@ -30,6 +32,7 @@ import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutor.Worker;
import com.android.dialer.common.concurrent.DialerExecutors;
+import com.android.dialer.notification.DialerNotificationManager;
import com.android.dialer.phonenumbercache.ContactInfo;
import com.android.dialer.telecom.TelecomUtil;
import java.util.ArrayList;
@@ -57,13 +60,20 @@ class VisualVoicemailUpdateTask implements Worker<VisualVoicemailUpdateTask.Inpu
CallLogNotificationsQueryHelper queryHelper,
FilteredNumberAsyncQueryHandler queryHandler) {
Assert.isWorkerThread();
+ LogUtil.enterBlock("VisualVoicemailUpdateTask.updateNotification");
- List<NewCall> newCalls = queryHelper.getNewVoicemails();
- if (newCalls == null) {
+ List<NewCall> voicemailsToNotify = queryHelper.getNewVoicemails();
+ if (voicemailsToNotify == null) {
+ // Query failed, just return
return;
}
- newCalls = filterBlockedNumbers(context, queryHandler, newCalls);
- if (newCalls.isEmpty()) {
+
+ voicemailsToNotify.addAll(getAndUpdateVoicemailsWithExistingNotification(context, queryHelper));
+ voicemailsToNotify = filterBlockedNumbers(context, queryHandler, voicemailsToNotify);
+ if (voicemailsToNotify.isEmpty()) {
+ LogUtil.i("VisualVoicemailUpdateTask.updateNotification", "no voicemails to notify about");
+ VisualVoicemailNotifier.cancelAllVoicemailNotifications(context);
+ VoicemailNotificationJobService.cancelJob(context);
return;
}
@@ -73,7 +83,7 @@ class VisualVoicemailUpdateTask implements Worker<VisualVoicemailUpdateTask.Inpu
// Maps each number into a name: if a number is in the map, it has already left a more
// recent voicemail.
Map<String, ContactInfo> contactInfos = new ArrayMap<>();
- for (NewCall newCall : newCalls) {
+ for (NewCall newCall : voicemailsToNotify) {
if (!contactInfos.containsKey(newCall.number)) {
ContactInfo contactInfo =
queryHelper.getContactInfo(
@@ -90,7 +100,43 @@ class VisualVoicemailUpdateTask implements Worker<VisualVoicemailUpdateTask.Inpu
}
}
}
- VisualVoicemailNotifier.showNotifications(context, newCalls, contactInfos, callers);
+ VisualVoicemailNotifier.showNotifications(context, voicemailsToNotify, contactInfos, callers);
+
+ // Set trigger to update notifications when database changes.
+ VoicemailNotificationJobService.scheduleJob(context);
+ }
+
+ /**
+ * Cancel notification for voicemail that is already deleted. Returns a list of voicemails that
+ * already has notifications posted and should be updated.
+ */
+ @WorkerThread
+ @NonNull
+ private static List<NewCall> getAndUpdateVoicemailsWithExistingNotification(
+ Context context, CallLogNotificationsQueryHelper queryHelper) {
+ Assert.isWorkerThread();
+ List<NewCall> result = new ArrayList<>();
+ for (StatusBarNotification notification :
+ DialerNotificationManager.getActiveNotifications(context)) {
+ if (notification.getId() != VisualVoicemailNotifier.NOTIFICATION_ID) {
+ continue;
+ }
+ if (TextUtils.equals(
+ notification.getTag(), VisualVoicemailNotifier.GROUP_SUMMARY_NOTIFICATION_TAG)) {
+ // Group header
+ continue;
+ }
+ NewCall existingCall = queryHelper.getNewCallsQuery().query(Uri.parse(notification.getTag()));
+ if (existingCall != null) {
+ result.add(existingCall);
+ } else {
+ LogUtil.i(
+ "VisualVoicemailUpdateTask.getVoicemailsWithExistingNotification",
+ "voicemail deleted, removing notification");
+ DialerNotificationManager.cancel(context, notification.getTag(), notification.getId());
+ }
+ }
+ return result;
}
@WorkerThread