190 lines
7.4 KiB
Java
190 lines
7.4 KiB
Java
|
/*
|
||
|
* 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() {}
|
||
|
}
|