blob: 31e9edc6a2ee2167546cf4605f2cc6c3c7b227d1 [file] [log] [blame]
/*
* Copyright (C) 2017 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.app.calllog;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.os.Build.VERSION_CODES;
import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.v4.os.BuildCompat;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import com.android.dialer.app.R;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.location.GeoUtil;
import com.android.dialer.notification.DialerNotificationManager;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.theme.base.ThemeComponent;
/** Shows a notification in the status bar for legacy vociemail. */
@TargetApi(VERSION_CODES.O)
public final class LegacyVoicemailNotifier {
private static final String NOTIFICATION_TAG_PREFIX = "LegacyVoicemail_";
private static final String NOTIFICATION_TAG = "LegacyVoicemail";
private static final int NOTIFICATION_ID = 1;
/**
* Replicates how packages/services/Telephony/NotificationMgr.java handles legacy voicemail
* notification. The notification will not be stackable because no information is available for
* individual voicemails.
*/
public static void showNotification(
@NonNull Context context,
@NonNull PhoneAccountHandle handle,
int count,
String voicemailNumber,
PendingIntent callVoicemailIntent,
PendingIntent voicemailSettingsIntent,
boolean isRefresh) {
LogUtil.enterBlock("LegacyVoicemailNotifier.showNotification");
Assert.isNotNull(handle);
Assert.checkArgument(BuildCompat.isAtLeastO());
TelephonyManager pinnedTelephonyManager =
context.getSystemService(TelephonyManager.class).createForPhoneAccountHandle(handle);
if (pinnedTelephonyManager == null) {
LogUtil.e("LegacyVoicemailNotifier.showNotification", "invalid PhoneAccountHandle");
return;
}
Notification notification =
createNotification(
context,
pinnedTelephonyManager,
handle,
count,
voicemailNumber,
callVoicemailIntent,
voicemailSettingsIntent,
isRefresh);
DialerNotificationManager.notify(
context, getNotificationTag(context, handle), NOTIFICATION_ID, notification);
}
@NonNull
private static Notification createNotification(
@NonNull Context context,
@NonNull TelephonyManager pinnedTelephonyManager,
@NonNull PhoneAccountHandle handle,
int count,
String voicemailNumber,
PendingIntent callVoicemailIntent,
PendingIntent voicemailSettingsIntent,
boolean isRefresh) {
String notificationTitle =
context
.getResources()
.getQuantityString(R.plurals.notification_voicemail_title, count, count);
PersistableBundle config = pinnedTelephonyManager.getCarrierConfig();
boolean isOngoing;
if (config == null) {
isOngoing = false;
} else {
isOngoing =
config.getBoolean(CarrierConfigManager.KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL);
}
String contentText;
PendingIntent contentIntent;
if (!TextUtils.isEmpty(voicemailNumber) && callVoicemailIntent != null) {
contentText = getNotificationText(context, handle, voicemailNumber);
contentIntent = callVoicemailIntent;
} else {
contentText = context.getString(R.string.notification_voicemail_no_vm_number);
contentIntent = voicemailSettingsIntent;
}
Notification.Builder builder =
new Notification.Builder(context)
.setSmallIcon(android.R.drawable.stat_notify_voicemail)
.setColor(ThemeComponent.get(context).theme().getColorPrimary())
.setWhen(System.currentTimeMillis())
.setContentTitle(notificationTitle)
.setContentText(contentText)
.setContentIntent(contentIntent)
.setSound(pinnedTelephonyManager.getVoicemailRingtoneUri(handle))
.setOngoing(isOngoing)
.setOnlyAlertOnce(isRefresh)
.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle))
.setDeleteIntent(
CallLogNotificationsService.createLegacyVoicemailDismissedPendingIntent(
context, handle));
if (pinnedTelephonyManager.isVoicemailVibrationEnabled(handle)) {
builder.setDefaults(Notification.DEFAULT_VIBRATE);
}
return builder.build();
}
@NonNull
private static String getNotificationText(
@NonNull Context context, PhoneAccountHandle handle, String voicemailNumber) {
if (TelecomUtil.getCallCapablePhoneAccounts(context).size() > 1) {
TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
PhoneAccount phoneAccount = telecomManager.getPhoneAccount(handle);
if (phoneAccount != null) {
return phoneAccount.getShortDescription().toString();
}
}
return String.format(
context.getString(R.string.notification_voicemail_text_format),
PhoneNumberHelper.formatNumber(
context, voicemailNumber, GeoUtil.getCurrentCountryIso(context)));
}
public static void cancelNotification(
@NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) {
LogUtil.enterBlock("LegacyVoicemailNotifier.cancelNotification");
Assert.checkArgument(BuildCompat.isAtLeastO());
Assert.isNotNull(phoneAccountHandle);
if ("null".equals(phoneAccountHandle.getId())) {
// while PhoneAccountHandle itself will never be null, telephony may still construct a "null"
// handle if the SIM is no longer available. Usually both SIM will be removed at the sames
// time, so just clear all notifications.
LogUtil.i(
"LegacyVoicemailNotifier.cancelNotification",
"'null' id, canceling all legacy voicemail notifications");
DialerNotificationManager.cancelAll(context, NOTIFICATION_TAG);
} else {
DialerNotificationManager.cancel(
context, getNotificationTag(context, phoneAccountHandle), NOTIFICATION_ID);
}
}
@NonNull
private static String getNotificationTag(
@NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) {
if (context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1) {
return NOTIFICATION_TAG;
}
return NOTIFICATION_TAG_PREFIX + phoneAccountHandle.getId();
}
private LegacyVoicemailNotifier() {}
}