summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
diff options
context:
space:
mode:
authorEric Erfanian <erfanian@google.com>2017-03-15 14:41:07 -0700
committerEric Erfanian <erfanian@google.com>2017-03-15 16:24:23 -0700
commitd5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9 (patch)
treeb54abbb51fb7d66e7755a1fbb5db023ff601090b /java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
parent30436e7e6d3f2c8755a91b2b6222b74d465a9e87 (diff)
Update Dialer source from latest green build.
* Refactor voicemail component * Add new enriched calling components Test: treehugger, manual aosp testing Change-Id: I521a0f86327d4b42e14d93927c7d613044ed5942
Diffstat (limited to 'java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java')
-rw-r--r--java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java264
1 files changed, 134 insertions, 130 deletions
diff --git a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
index 651a0ccb8..cc1dc4f20 100644
--- a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
@@ -19,31 +19,33 @@ package com.android.dialer.app.calllog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
import android.support.v4.util.Pair;
-import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.Log;
import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.app.DialtactsActivity;
import com.android.dialer.app.R;
-import com.android.dialer.app.calllog.CallLogNotificationsHelper.NewCall;
+import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall;
+import com.android.dialer.app.contactinfo.ContactPhotoLoader;
import com.android.dialer.app.list.ListsFragment;
import com.android.dialer.blocking.FilteredNumbersUtil;
-import com.android.dialer.telecom.TelecomUtil;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.notification.NotificationChannelManager;
+import com.android.dialer.notification.NotificationChannelManager.Channel;
+import com.android.dialer.phonenumbercache.ContactInfo;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -54,26 +56,23 @@ public class DefaultVoicemailNotifier {
public static final String TAG = "VoicemailNotifier";
/** The tag used to identify notifications from this class. */
- private static final String NOTIFICATION_TAG = "DefaultVoicemailNotifier";
+ static final String NOTIFICATION_TAG = "DefaultVoicemailNotifier";
/** The identifier of the notification of new voicemails. */
- private static final int NOTIFICATION_ID = 1;
+ private static final int NOTIFICATION_ID = R.id.notification_voicemail;
- /** The singleton instance of {@link DefaultVoicemailNotifier}. */
- private static DefaultVoicemailNotifier sInstance;
+ private final Context context;
+ private final CallLogNotificationsQueryHelper queryHelper;
- private final Context mContext;
-
- private DefaultVoicemailNotifier(Context context) {
- mContext = context;
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ DefaultVoicemailNotifier(Context context, CallLogNotificationsQueryHelper queryHelper) {
+ this.context = context;
+ this.queryHelper = queryHelper;
}
- /** Returns the singleton instance of the {@link DefaultVoicemailNotifier}. */
+ /** Returns an instance of {@link DefaultVoicemailNotifier}. */
public static DefaultVoicemailNotifier getInstance(Context context) {
- if (sInstance == null) {
- ContentResolver contentResolver = context.getContentResolver();
- sInstance = new DefaultVoicemailNotifier(context);
- }
- return sInstance;
+ return new DefaultVoicemailNotifier(
+ context, CallLogNotificationsQueryHelper.getInstance(context));
}
/**
@@ -84,34 +83,23 @@ public class DefaultVoicemailNotifier {
*
* <p>It is not safe to call this method from the main thread.
*/
- public void updateNotification(Uri newCallUri) {
+ public void updateNotification() {
// Lookup the list of new voicemails to include in the notification.
- // TODO: Move this into a service, to avoid holding the receiver up.
- final List<NewCall> newCalls =
- CallLogNotificationsHelper.getInstance(mContext).getNewVoicemails();
+ final List<NewCall> newCalls = queryHelper.getNewVoicemails();
if (newCalls == null) {
// Query failed, just return.
return;
}
- if (newCalls.isEmpty()) {
- // No voicemails to notify about: clear the notification.
- getNotificationManager().cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
- return;
- }
-
- Resources resources = mContext.getResources();
+ Resources resources = context.getResources();
// This represents a list of names to include in the notification.
String callers = null;
// Maps each number into a name: if a number is in the map, it has already left a more
// recent voicemail.
- final Map<String, String> names = new ArrayMap<>();
-
- // Determine the call corresponding to the new voicemail we have to notify about.
- NewCall callToNotify = null;
+ final Map<String, ContactInfo> contactInfos = new ArrayMap<>();
// Iterate over the new voicemails to determine all the information above.
Iterator<NewCall> itr = newCalls.iterator();
@@ -120,95 +108,64 @@ public class DefaultVoicemailNotifier {
// Skip notifying for numbers which are blocked.
if (FilteredNumbersUtil.shouldBlockVoicemail(
- mContext, newCall.number, newCall.countryIso, newCall.dateMs)) {
+ context, newCall.number, newCall.countryIso, newCall.dateMs)) {
itr.remove();
// Delete the voicemail.
- mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
+ context.getContentResolver().delete(newCall.voicemailUri, null, null);
continue;
}
// Check if we already know the name associated with this number.
- String name = names.get(newCall.number);
- if (name == null) {
- name =
- CallLogNotificationsHelper.getInstance(mContext)
- .getName(newCall.number, newCall.numberPresentation, newCall.countryIso);
- names.put(newCall.number, name);
+ ContactInfo contactInfo = contactInfos.get(newCall.number);
+ if (contactInfo == null) {
+ contactInfo =
+ queryHelper.getContactInfo(
+ newCall.number, newCall.numberPresentation, newCall.countryIso);
+ contactInfos.put(newCall.number, contactInfo);
// This is a new caller. Add it to the back of the list of callers.
if (TextUtils.isEmpty(callers)) {
- callers = name;
+ callers = contactInfo.name;
} else {
callers =
- resources.getString(R.string.notification_voicemail_callers_list, callers, name);
+ resources.getString(
+ R.string.notification_voicemail_callers_list, callers, contactInfo.name);
}
}
- // Check if this is the new call we need to notify about.
- if (newCallUri != null
- && newCall.voicemailUri != null
- && ContentUris.parseId(newCallUri) == ContentUris.parseId(newCall.voicemailUri)) {
- callToNotify = newCall;
- }
}
- // All the potential new voicemails have been removed, e.g. if they were spam.
if (newCalls.isEmpty()) {
+ // No voicemails to notify about: clear the notification.
+ CallLogNotificationsService.markNewVoicemailsAsOld(context, null);
return;
}
- // If there is only one voicemail, set its transcription as the "long text".
- String transcription = null;
- if (newCalls.size() == 1) {
- transcription = newCalls.get(0).transcription;
- }
-
- if (newCallUri != null && callToNotify == null) {
- Log.e(TAG, "The new call could not be found in the call log: " + newCallUri);
- }
-
- // Determine the title of the notification and the icon for it.
- final String title =
- resources.getQuantityString(
- R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size());
- // TODO: Use the photo of contact if all calls are from the same person.
- final int icon = android.R.drawable.stat_notify_voicemail;
-
- Pair<Uri, Integer> info = getNotificationInfo(callToNotify);
-
- Notification.Builder notificationBuilder =
- new Notification.Builder(mContext)
- .setSmallIcon(icon)
- .setContentTitle(title)
+ Notification.Builder groupSummary =
+ createNotificationBuilder()
+ .setContentTitle(
+ resources.getQuantityString(
+ R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size()))
.setContentText(callers)
- .setColor(resources.getColor(R.color.dialer_theme_color))
- .setSound(info.first)
- .setDefaults(info.second)
- .setDeleteIntent(createMarkNewVoicemailsAsOldIntent())
- .setAutoCancel(true);
-
- if (!TextUtils.isEmpty(transcription)) {
- notificationBuilder.setStyle(new Notification.BigTextStyle().bigText(transcription));
+ .setDeleteIntent(createMarkNewVoicemailsAsOldIntent(null))
+ .setGroupSummary(true)
+ .setContentIntent(newVoicemailIntent(null));
+
+ NotificationChannelManager.applyChannel(
+ groupSummary,
+ context,
+ Channel.VOICEMAIL,
+ PhoneAccountHandles.getAccount(context, newCalls.get(0)));
+
+ LogUtil.i(TAG, "Creating voicemail notification");
+ getNotificationManager().notify(NOTIFICATION_TAG, NOTIFICATION_ID, groupSummary.build());
+
+ for (NewCall voicemail : newCalls) {
+ getNotificationManager()
+ .notify(
+ voicemail.voicemailUri.toString(),
+ NOTIFICATION_ID,
+ createNotificationForVoicemail(voicemail, contactInfos));
}
-
- // Determine the intent to fire when the notification is clicked on.
- final Intent contentIntent;
- // Open the call log.
- contentIntent = DialtactsActivity.getShowTabIntent(mContext, ListsFragment.TAB_INDEX_VOICEMAIL);
- contentIntent.putExtra(DialtactsActivity.EXTRA_CLEAR_NEW_VOICEMAILS, true);
- notificationBuilder.setContentIntent(
- PendingIntent.getActivity(mContext, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
-
- // The text to show in the ticker, describing the new event.
- if (callToNotify != null) {
- CharSequence msg =
- ContactDisplayUtils.getTtsSpannedPhoneNumber(
- resources,
- R.string.notification_new_voicemail_ticker,
- names.get(callToNotify.number));
- notificationBuilder.setTicker(msg);
- }
- Log.i(TAG, "Creating voicemail notification");
- getNotificationManager().notify(NOTIFICATION_TAG, NOTIFICATION_ID, notificationBuilder.build());
}
/**
@@ -216,30 +173,15 @@ public class DefaultVoicemailNotifier {
* for the given call.
*/
private Pair<Uri, Integer> getNotificationInfo(@Nullable NewCall callToNotify) {
- Log.v(TAG, "getNotificationInfo");
+ LogUtil.v(TAG, "getNotificationInfo");
if (callToNotify == null) {
- Log.i(TAG, "callToNotify == null");
+ LogUtil.i(TAG, "callToNotify == null");
return new Pair<>(null, 0);
}
- PhoneAccountHandle accountHandle;
- if (callToNotify.accountComponentName == null || callToNotify.accountId == null) {
- Log.v(TAG, "accountComponentName == null || callToNotify.accountId == null");
- accountHandle = TelecomUtil.getDefaultOutgoingPhoneAccount(mContext, PhoneAccount.SCHEME_TEL);
- if (accountHandle == null) {
- Log.i(TAG, "No default phone account found, using default notification ringtone");
- return new Pair<>(null, Notification.DEFAULT_ALL);
- }
-
- } else {
- accountHandle =
- new PhoneAccountHandle(
- ComponentName.unflattenFromString(callToNotify.accountComponentName),
- callToNotify.accountId);
- }
- if (accountHandle.getComponentName() != null) {
- Log.v(TAG, "PhoneAccountHandle.ComponentInfo:" + accountHandle.getComponentName());
- } else {
- Log.i(TAG, "PhoneAccountHandle.ComponentInfo: null");
+ PhoneAccountHandle accountHandle = PhoneAccountHandles.getAccount(context, callToNotify);
+ if (accountHandle == null) {
+ LogUtil.i(TAG, "No default phone account found, using default notification ringtone");
+ return new Pair<>(null, Notification.DEFAULT_ALL);
}
return new Pair<>(
TelephonyManagerCompat.getVoicemailRingtoneUri(getTelephonyManager(), accountHandle),
@@ -257,17 +199,79 @@ public class DefaultVoicemailNotifier {
}
/** Creates a pending intent that marks all new voicemails as old. */
- private PendingIntent createMarkNewVoicemailsAsOldIntent() {
- Intent intent = new Intent(mContext, CallLogNotificationsService.class);
+ private PendingIntent createMarkNewVoicemailsAsOldIntent(@Nullable Uri voicemailUri) {
+ Intent intent = new Intent(context, CallLogNotificationsService.class);
intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD);
- return PendingIntent.getService(mContext, 0, intent, 0);
+ intent.setData(voicemailUri);
+ return PendingIntent.getService(context, 0, intent, 0);
}
private NotificationManager getNotificationManager() {
- return (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}
private TelephonyManager getTelephonyManager() {
- return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ }
+
+ private Notification createNotificationForVoicemail(
+ @NonNull NewCall voicemail, @NonNull Map<String, ContactInfo> contactInfos) {
+ Pair<Uri, Integer> notificationInfo = getNotificationInfo(voicemail);
+ ContactInfo contactInfo = contactInfos.get(voicemail.number);
+
+ Notification.Builder notificationBuilder =
+ createNotificationBuilder()
+ .setContentTitle(
+ context
+ .getResources()
+ .getQuantityString(R.plurals.notification_voicemail_title, 1, 1))
+ .setContentText(
+ ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ context.getResources(),
+ R.string.notification_new_voicemail_ticker,
+ contactInfo.name))
+ .setWhen(voicemail.dateMs)
+ .setSound(notificationInfo.first)
+ .setDefaults(notificationInfo.second)
+ .setDeleteIntent(createMarkNewVoicemailsAsOldIntent(voicemail.voicemailUri));
+
+ NotificationChannelManager.applyChannel(
+ notificationBuilder,
+ context,
+ Channel.VOICEMAIL,
+ PhoneAccountHandles.getAccount(context, voicemail));
+
+ ContactPhotoLoader loader = new ContactPhotoLoader(context, contactInfo);
+ Bitmap photoIcon = loader.loadPhotoIcon();
+ if (photoIcon != null) {
+ notificationBuilder.setLargeIcon(photoIcon);
+ }
+
+ if (!TextUtils.isEmpty(voicemail.transcription)) {
+ notificationBuilder.setStyle(
+ new Notification.BigTextStyle().bigText(voicemail.transcription));
+ }
+ notificationBuilder.setContentIntent(newVoicemailIntent(voicemail));
+
+ return notificationBuilder.build();
+ }
+
+ private Notification.Builder createNotificationBuilder() {
+ return new Notification.Builder(context)
+ .setSmallIcon(android.R.drawable.stat_notify_voicemail)
+ .setColor(context.getColor(R.color.dialer_theme_color))
+ .setGroup(NOTIFICATION_TAG)
+ .setOnlyAlertOnce(true)
+ .setAutoCancel(true);
+ }
+
+ private PendingIntent newVoicemailIntent(@Nullable NewCall voicemail) {
+ Intent intent = DialtactsActivity.getShowTabIntent(context, ListsFragment.TAB_INDEX_VOICEMAIL);
+ // TODO (b/35486204): scroll to this voicemail
+ if (voicemail != null) {
+ intent.setData(voicemail.voicemailUri);
+ }
+ intent.putExtra(DialtactsActivity.EXTRA_CLEAR_NEW_VOICEMAILS, true);
+ return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
}