blob: bf84c180e254ab23de0e4be0d3c46ea3c207cb9f [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.internal.telephony.util;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioAttributes;
import android.net.Uri;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import com.android.internal.R;
import java.util.Arrays;
public class NotificationChannelController {
/**
* list of {@link android.app.NotificationChannel} for telephony service.
*/
public static final String CHANNEL_ID_ALERT = "alert";
public static final String CHANNEL_ID_CALL_FORWARD = "callForward";
public static final String CHANNEL_ID_MOBILE_DATA_STATUS = "mobileDataAlertNew";
public static final String CHANNEL_ID_SIM = "sim";
public static final String CHANNEL_ID_SMS = "sms";
public static final String CHANNEL_ID_VOICE_MAIL = "voiceMail";
public static final String CHANNEL_ID_WFC = "wfc";
/** deprecated channel, replaced with @see #CHANNEL_ID_MOBILE_DATA_STATUS */
private static final String CHANNEL_ID_MOBILE_DATA_ALERT_DEPRECATED = "mobileDataAlert";
/**
* Creates all notification channels and registers with NotificationManager. If a channel
* with the same ID is already registered, NotificationManager will ignore this call.
*/
private static void createAll(Context context) {
final NotificationChannel alertChannel = new NotificationChannel(
CHANNEL_ID_ALERT,
context.getText(R.string.notification_channel_network_alert),
NotificationManager.IMPORTANCE_DEFAULT);
alertChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build());
// allow users to block notifications from system
alertChannel.setBlockableSystem(true);
final NotificationChannel mobileDataStatusChannel = new NotificationChannel(
CHANNEL_ID_MOBILE_DATA_STATUS,
context.getText(R.string.notification_channel_mobile_data_status),
NotificationManager.IMPORTANCE_LOW);
// allow users to block notifications from system
mobileDataStatusChannel.setBlockableSystem(true);
final NotificationChannel simChannel = new NotificationChannel(
CHANNEL_ID_SIM,
context.getText(R.string.notification_channel_sim),
NotificationManager.IMPORTANCE_LOW
);
simChannel.setSound(null, null);
context.getSystemService(NotificationManager.class)
.createNotificationChannels(Arrays.asList(
new NotificationChannel(CHANNEL_ID_CALL_FORWARD,
context.getText(R.string.notification_channel_call_forward),
NotificationManager.IMPORTANCE_LOW),
new NotificationChannel(CHANNEL_ID_SMS,
context.getText(R.string.notification_channel_sms),
NotificationManager.IMPORTANCE_HIGH),
new NotificationChannel(CHANNEL_ID_WFC,
context.getText(R.string.notification_channel_wfc),
NotificationManager.IMPORTANCE_LOW),
alertChannel,
mobileDataStatusChannel,
simChannel));
// only for update
if (getChannel(CHANNEL_ID_VOICE_MAIL, context) != null) {
migrateVoicemailNotificationSettings(context);
}
// after channel has been created there is no way to change the channel setting
// programmatically. delete the old channel and create a new one with a new ID.
if (getChannel(CHANNEL_ID_MOBILE_DATA_ALERT_DEPRECATED, context) != null) {
context.getSystemService(NotificationManager.class)
.deleteNotificationChannel(CHANNEL_ID_MOBILE_DATA_ALERT_DEPRECATED);
}
}
public NotificationChannelController(Context context) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
intentFilter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
context.registerReceiver(mBroadcastReceiver, intentFilter);
createAll(context);
}
public static NotificationChannel getChannel(String channelId, Context context) {
return context.getSystemService(NotificationManager.class)
.getNotificationChannel(channelId);
}
/**
* migrate deprecated voicemail notification settings to initial notification channel settings
* {@link VoicemailNotificationSettingsUtil#getRingTonePreference(Context)}}
* {@link VoicemailNotificationSettingsUtil#getVibrationPreference(Context)}
* notification settings are based on subId, only migrate if sub id matches.
* otherwise fallback to predefined voicemail channel settings.
* @param context
*/
private static void migrateVoicemailNotificationSettings(Context context) {
final NotificationChannel voiceMailChannel = new NotificationChannel(
CHANNEL_ID_VOICE_MAIL,
context.getText(R.string.notification_channel_voice_mail),
NotificationManager.IMPORTANCE_DEFAULT);
voiceMailChannel.enableVibration(
VoicemailNotificationSettingsUtil.getVibrationPreference(context));
Uri sound = VoicemailNotificationSettingsUtil.getRingTonePreference(context);
voiceMailChannel.setSound(
(sound == null) ? Settings.System.DEFAULT_NOTIFICATION_URI : sound,
new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build());
context.getSystemService(NotificationManager.class)
.createNotificationChannel(voiceMailChannel);
}
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
// rename all notification channels on locale change
createAll(context);
} else if (Intent.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {
// migrate voicemail notification settings on sim load
if (SubscriptionManager.INVALID_SUBSCRIPTION_ID !=
SubscriptionManager.getDefaultSubscriptionId()) {
migrateVoicemailNotificationSettings(context);
}
}
}
};
}