根据我们之前的流程梳理,我们了解了铃声的播放,铃声的设置。今天我们就来详细讲解双卡铃声的实现。
一、配置双卡铃声
我们首先需要在配置文件中添加SIM卡二的配置
路径:platform/build/target/product/full_base.mk
# Additional settings used in all AOSP builds
PRODUCT_PROPERTY_OVERRIDES := \
ro.config.ringtone=Ring_Synth_04.ogg \
ro.config.ringtone_2=Ring_Synth_04.ogg \
ro.config.notification_sound=pixiedust.ogg
二、FrameWork配置
我们需要添加一些标志位和路径信息
路径:/frameworks/base/core/java/android/provider/Settings.java
//add by xiangzaixiansheng for support dual sim card ringtones
/**
* Persistent store for the SIM-2 rigntone url
* Persistent store for the SIM-2 ringtone URI.
* <p>
* If you need to play SIM-2 ringtone at any given time, it is recommended
* you give {@link #DEFAULT_RINGTONE_URI_2} to the media player. It will resolve
* to the set default ringtone at the time of playing.
*
* @see #DEFAULT_RINGTONE_URI_2
* @hide
*/
public static final String RINGTONE_2 = "ringtone_2";
private static final Validator RINGTONE_2_VALIDATOR = sUriValidator;
。。。。。
//add by xiangzaixiansheng for support dual sim card ringtones @{
/**
* Definite to the current sim-2 rigntone
* A {@link Uri} that will point to the current SIM-2 ringtone at any
* given time.
* <p>
* If the current default ringtone is in the DRM provider and the caller
* does not have permission, the exception will be a
* FileNotFoundException.
*
* @hide
*/
public static final Uri DEFAULT_RINGTONE_URI_2 = getUriFor(RINGTONE_2);
。。。。。
//add by xiangzaixiansheng for support dual sim card ringtones @{
/** {@hide} */
public static final String RINGTONE_CACHE_2 = "ringtone_cache_2";
/** {@hide} */
public static final Uri RINGTONE_CACHE_URI_2 = getUriFor(RINGTONE_CACHE_2);
//add by xiangzaixiansheng for support dual sim card ringtones @}
。。。。。
public static final String[] SETTINGS_TO_BACKUP = {
。。。。
LOCKSCREEN_SOUNDS_ENABLED,
SHOW_WEB_SUGGESTIONS,
SIP_CALL_OPTIONS,
SIP_RECEIVE_CALLS,
POINTER_SPEED,
VIBRATE_WHEN_RINGING,
RINGTONE,
//add by xiangzaixiansheng for support dual sim card ringtones @{
RINGTONE_2,
//MMS_NOTIFICATION_SOUND,
//add by xiangzaixiansheng for support dual sim card ringtones @}
LOCK_TO_APP_ENABLED,
。。。。。。
};
。。。。。。
public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();
static {
。。。。。。
PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);
/// M: Add MTK settings to PUBLIC group @{
putMtkSettingsToSet(className, "putInPublicSettings", Set.class, PUBLIC_SETTINGS);
/// @}
//add by xiangzaixiansheng for support dual sim card ringtones @{
PUBLIC_SETTINGS.add(RINGTONE_2);
//add by xiangzaixiansheng for support dual sim card ringtones @}
}
。。。。。
public static final Map<String, Validator> VALIDATORS = new ArrayMap<>();
static {
VALIDATORS.put(END_BUTTON_BEHAVIOR,END_BUTTON_BEHAVIOR_VALIDATOR);
。。。。。。。。。
VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);
VALIDATORS.put(SHOW_BATTERY_PERCENT, SHOW_BATTERY_PERCENT_VALIDATOR);
//add by xiangzaixiansheng for support dual sim card ringtones @{
VALIDATORS.put(RINGTONE_2, RINGTONE_2_VALIDATOR);
//VALIDATORS.put(MMS_NOTIFICATION_SOUND, MMS_NOTIFICATION_SOUND_VALIDATOR);
//add by xiangzaixiansheng for support dual sim card ringtones @}
}
路径:/frameworks/base/media/java/android/media/MediaScanner.java
//导包
import android.telephony.TelephonyManager;
//add by xiangzaixiansheng for support dual sim card ringtones @{
/** Whether the scanner has set a default sound for the ringer ringtone 2. */
private boolean mDefaultRingtone2Set;
//add by xiangzaixiansheng for support dual sim card ringtones @}
//add by xiangzaixiansheng for support dual sim card ringtones @{
/** The filename for the default sound for the ringer ringtone 2. */
private String mDefaultRingtone2Filename;
//add by xiangzaixiansheng for support dual sim card ringtones @}
private void setDefaultRingtoneFileNames() {
mDefaultRingtoneFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.RINGTONE);
//add by xiangzaixiansheng for support dual sim card ringtones @{
mDefaultRingtone2Filename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.RINGTONE_2);
//add by xiangzaixiansheng for support dual sim card ringtones @}
mDefaultNotificationFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.NOTIFICATION_SOUND);
mDefaultAlarmAlertFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.ALARM_ALERT);
}
public Uri doScanFile(String path, String mimeType, long lastModified,
long fileSize, boolean isDirectory, boolean scanAlways, boolean noMedia) {
Uri result = null;
// long t1 = System.currentTimeMillis();
try {
FileEntry entry = beginFile(path, mimeType, lastModified,
fileSize, isDirectory, noMedia);
if (entry == null) {
return null;
}
// if this file was just inserted via mtp, set the rowid to zero
// (even though it already exists in the database), to trigger
// the correct code path for updating its entry
if (mMtpObjectHandle != 0) {
entry.mRowId = 0;
}
if (entry.mPath != null) {
if (((!mDefaultNotificationSet &&
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))
|| (!mDefaultRingtoneSet &&
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))
//add by xiangzaixiansheng for support dual sim card ringtones @{
|| (!mDefaultRingtone2Set&&
doesPathHaveFilename(entry.mPath, mDefaultRingtone2Filename))
//|| (!mDefaultMmsNotificationSet&&
// doesPathHaveFilename(entry.mPath, mDefaultMmsNotificationFilename))
//add by xiangzaixiansheng for support dual sim card ringtones ZAL1680G-844 @}
|| (!mDefaultAlarmSet &&
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)))) {
Log.w(TAG, "forcing rescan of " + entry.mPath +
"since ringtone setting didn't finish");
scanAlways = true;
} else if (isSystemSoundWithMetadata(entry.mPath)
}
............
private Uri endFile(FileEntry entry, boolean ringtones, boolean notifications,
boolean alarms, boolean music, boolean podcasts)
throws RemoteException {
boolean needToSetSettings = false;
//add by xiangzaixiansheng for support dual sim card ringtones @{
boolean needToSetRingtoneSettings = false;
boolean needToSetRingtone2Settings = false;
//boolean needToSetMmsNotification = false;
boolean needToSetDefaultNotification = false;
//add by xiangzaixiansheng for support dual sim card ringtones @}
// Setting a flag in order not to use bulk insert for the file related with
// notifications, ringtones, and alarms, because the rowId of the inserted file is
// needed.
//add by xiangzaixiansheng for support dual sim card ringtones @{
if (notifications && !mDefaultNotificationSet) {
if (!mDefaultNotificationSet && (TextUtils.isEmpty(mDefaultNotificationFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))) {
needToSetSettings = true;
needToSetDefaultNotification = true;
}
// if ((TextUtils.isEmpty(mDefaultMmsNotificationFilename) ||
// doesPathHaveFilename(entry.mPath, mDefaultMmsNotificationFilename))) {
// needToSetSettings = true;
// needToSetMmsNotification = true;
// }
} else if (ringtones && (!mDefaultRingtoneSet || !mDefaultRingtone2Set)) {
if (!mDefaultRingtoneSet && (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))) {
needToSetSettings = true;
needToSetRingtoneSettings = true;
}
if (!mDefaultRingtone2Set && (TextUtils.isEmpty(mDefaultRingtone2Filename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtone2Filename))) {
needToSetSettings = true;
needToSetRingtone2Settings = true;
//add by xiangzaixiansheng for support dual sim card ringtones @}
}
} else if (alarms && !mDefaultAlarmSet) {
if (TextUtils.isEmpty(mDefaultAlarmAlertFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)) {
needToSetSettings = true;
}
}
..............
if(needToSetSettings) {
if (notifications) {
//add by xiangzaixiansheng for support dual sim card ringtones @{
if(needToSetDefaultNotification){
setRingtoneIfNotSet(Settings.System.NOTIFICATION_SOUND, tableUri, rowId);
mDefaultNotificationSet = true;
}
// if(needToSetMmsNotification){
// setRingtoneIfNotSet(Settings.System.MMS_NOTIFICATION_SOUND, tableUri, rowId);
// mDefaultMmsNotificationSet = true;
// }
} else if (ringtones) {
// memorize default system ringtone persistently
//setRingtoneIfNotSet(Settings.System.DEFAULT_RINGTONE, tableUri, rowId);
if (needToSetRingtoneSettings) {
setRingtoneIfNotSet(Settings.System.RINGTONE, tableUri, rowId);
mDefaultRingtoneSet = true;
}
if (TelephonyManager.getDefault().isMultiSimEnabled()) {
if (needToSetRingtone2Settings){
setRingtoneIfNotSet(Settings.System.RINGTONE_2, tableUri, rowId);
mDefaultRingtone2Set = true;
}
}
//add by xiangzaixiansheng for support dual sim card ringtones @}
........................
}
........................
private void prescan(String filePath, boolean prescanFiles) throws RemoteException {
........
mDefaultRingtone2Set= wasRingtoneAlreadySet(Settings.System.RINGTONE_2);
........
}
路径:/frameworks/base/media/java/android/media/RingtoneManager.java
//add by xiangzaixiansheng for support dual sim card ringtones @{
/**
* Type that refers to sounds that are used for mms notifications.
* Note: This constant value is only for internal usage and
* can't be added to TYPE_ALL.
*
* @hide
*/
// public static final int TYPE_MMS_NOTIFICATION = 16;
public static final int TYPE_RINGTONE_2 = 32;
//add by xiangzaixiansheng for support dual sim card ringtones @}
private void setFilterColumnsList(int type) {
List<String> columns = mFilterColumns;
columns.clear();
if ((type & TYPE_RINGTONE) != 0) {
columns.add(MediaStore.Audio.AudioColumns.IS_RINGTONE);
}
//add by xiangzaixiahsheng for support dual sim card ringtones @{
if ((type & TYPE_RINGTONE_2) != 0) {
columns.add(MediaStore.Audio.AudioColumns.IS_RINGTONE);
}
//add by xiangzaixiansheng for support dual sim card ringtones @}
if ((type & TYPE_NOTIFICATION) != 0) {
columns.add(MediaStore.Audio.AudioColumns.IS_NOTIFICATION);
}
if ((type & TYPE_ALARM) != 0) {
columns.add(MediaStore.Audio.AudioColumns.IS_ALARM);
}
}
private static String getSettingForType(int type) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.RINGTONE;
} else if ((type & TYPE_NOTIFICATION) != 0) {
return Settings.System.NOTIFICATION_SOUND;
} else if ((type & TYPE_ALARM) != 0) {
return Settings.System.ALARM_ALERT;
//add by xiangzaixiansheng for support dual sim card ringtones @{
// } else if ((type & TYPE_MMS_NOTIFICATION) != 0) {
// return Settings.System.MMS_NOTIFICATION_SOUND;
}else if ((type & TYPE_RINGTONE_2) != 0) {
return Settings.System.RINGTONE_2;
//add by xiangzaixiansheng for support dual sim card ringtones @}
} else {
return null;
}
}
public static Uri getCacheForType(int type, int userId) {
if ((type & TYPE_RINGTONE) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_CACHE_URI, userId);
} else if ((type & TYPE_NOTIFICATION) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.NOTIFICATION_SOUND_CACHE_URI,
userId);
} else if ((type & TYPE_ALARM) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.ALARM_ALERT_CACHE_URI, userId);
}
//add by xiangzaixainsheng for support dual sim card ringtones @{
else if ((type & TYPE_RINGTONE_2) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_CACHE_URI_2, userId);
//}else if ((type & TYPE_MMS_NOTIFICATION) != 0) {
// return ContentProvider.maybeAddUserId(Settings.System.MMS_NOTIFICATION_SOUND_CACHE_URI, userId);
//add by xiangzaixiansheng for support dual sim card ringtones @}
}
return null;
}
public static int getDefaultType(Uri defaultRingtoneUri) {
defaultRingtoneUri = ContentProvider.getUriWithoutUserId(defaultRingtoneUri);
if (defaultRingtoneUri == null) {
return -1;
} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) {
return TYPE_RINGTONE;
} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) {
return TYPE_NOTIFICATION;
} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_ALARM_ALERT_URI)) {
return TYPE_ALARM;
//add by xiangzaixiansheng for support dual sim card ringtones @{
} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI_2)) {
return TYPE_RINGTONE_2;
// }else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_MMS_NOTIFICATION_SOUND_URI)) {
// return TYPE_MMS_NOTIFICATION;
//add by xiangzaixiansheng for support dual sim card ringtones @}
} else {
return -1;
}
}
public static Uri getDefaultUri(int type) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.DEFAULT_RINGTONE_URI;
} else if ((type & TYPE_NOTIFICATION) != 0) {
return Settings.System.DEFAULT_NOTIFICATION_URI;
} else if ((type & TYPE_ALARM) != 0) {
return Settings.System.DEFAULT_ALARM_ALERT_URI;
//add by xiangzaixiansheng for support dual sim card ringtones @{
} else if ((type & TYPE_RINGTONE_2) != 0) {
return Settings.System.DEFAULT_RINGTONE_URI_2;
// } else if ((type & TYPE_MMS_NOTIFICATION) != 0) {
// return Settings.System.DEFAULT_MMS_NOTIFICATION_SOUND_URI;
//add by xiangzaixiansheng for support dual sim card ringtones @}
} else {
return null;
}
}
路径:/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
..........
final String cacheRingtoneSetting;
final String cacheName;
if (Settings.System.RINGTONE_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.RINGTONE;
cacheName = Settings.System.RINGTONE_CACHE;
} else if (Settings.System.NOTIFICATION_SOUND_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.NOTIFICATION_SOUND;
cacheName = Settings.System.NOTIFICATION_SOUND_CACHE;
} else if (Settings.System.ALARM_ALERT_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.ALARM_ALERT;
cacheName = Settings.System.ALARM_ALERT_CACHE;
//add by xiangzaixiansheng for support dual sim card ringtones @{
} else if (Settings.System.RINGTONE_CACHE_URI_2.equals(uri)) {
cacheRingtoneSetting = Settings.System.RINGTONE_2;
cacheName = Settings.System.RINGTONE_CACHE_2;
//add by xiangzaixiansheng for support dual sim card ringtones @}
} else {
throw new FileNotFoundException("Direct file access no longer supported; "
+ "ringtone playback is available through android.media.Ringtone");
}
.........
}
private boolean mutateSystemSetting(String name, String value, int runAsUserId,
int operation) {
.......
// Invalidate any relevant cache files
String cacheName = null;
if (Settings.System.RINGTONE.equals(name)) {
cacheName = Settings.System.RINGTONE_CACHE;
} else if (Settings.System.NOTIFICATION_SOUND.equals(name)) {
cacheName = Settings.System.NOTIFICATION_SOUND_CACHE;
} else if (Settings.System.ALARM_ALERT.equals(name)) {
cacheName = Settings.System.ALARM_ALERT_CACHE;
//add by xiangzaixiansheng for support dual sim card ringtones @{
}else if (Settings.System.RINGTONE_2.equals(name)) {
cacheName = Settings.System.RINGTONE_CACHE_2;
// }else if (Settings.System.MMS_NOTIFICATION_SOUND.equals(name)) {
// cacheName = Settings.System.MMS_NOTIFICATION_SOUND_CACHE;
//add by xiangzaixiansheng for support dual sim card ringtones @}
}
if (cacheName != null) {
final File cacheFile = new File(
getRingtoneCacheDir(owningUserId), cacheName);
cacheFile.delete();
}
}
路径:/frameworks/base/core/res/res/values/attrs.xml
<!-- add by xiangzaixiansheng for support dual sim card ringtones -->
<!-- Ringtones. -->
<flag name="ringtone_2" value="32" />
<!-- add by xiangzaixiansheng for support dual sim card ringtones -->
三、来电监听
这一步做的主要是区分 那个SIM卡来电,并播放相应铃声
路径:/vendor/mediatek/proprietary/packages/services/Telecomm/src/com/android/server/telecom/RingtoneFactory.java
import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import com.android.internal.telephony.PhoneConstants;
public Ringtone getRingtone(Call incomingCall) {
...........
if(ringtoneUri != null && userContext != null) {
// Ringtone URI is explicitly specified. First, try to create a Ringtone with that.
ringtone = RingtoneManager.getRingtone(userContext, ringtoneUri);
}
if(ringtone == null) {
// Contact didn't specify ringtone or custom Ringtone creation failed. Get default
// ringtone for user or profile.
Context contextToUse = hasDefaultRingtoneForUser(userContext) ? userContext : mContext;
Uri defaultRingtoneUri;
if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE);
//add by xiangzaixiansheng for support dual sim card ringtones @{
int slotId = getSlotId(mContext,incomingCall.getTargetPhoneAccount());
if (slotId == PhoneConstants.SUB2) {
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE_2);
}
//add by xiangzaixiansheng for support dual sim card ringtones @}
} else {
defaultRingtoneUri = Settings.System.DEFAULT_RINGTONE_URI;
}
.........
}
private int getSlotId(Context context, PhoneAccountHandle phoneAccountHandle) {
int slotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
SubscriptionManager sm = SubscriptionManager.from(mContext);
List<SubscriptionInfo> subInfoList = sm.getActiveSubscriptionInfoList();
if (phoneAccountHandle != null && !TextUtils.isEmpty(phoneAccountHandle.getId())
&& subInfoList != null) {
for (SubscriptionInfo subInfo : subInfoList) {
if (phoneAccountHandle.getId().startsWith(subInfo.getIccId())) {
slotIndex = subInfo.getSimSlotIndex();
}
}
}
return slotIndex;
}
四、Setting中的设置
这里面其实比较简单,只要模仿SIM卡1来添加就可以了
路径:/packages/apps/Settings/res/xml/sound_settings.xml
<com.android.settings.DefaultRingtonePreference
android:key="ringtone2"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
android:summary="@string/summary_placeholder"
android:ringtoneType="ringtone_2" />
路径:/packages/apps/Settings/src/com/android/settings/notification/SoundSettings.java
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
SoundSettings fragment, VolumeSeekBarPreference.Callback callback,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new ZenModePreferenceController(context));
controllers.add(new EmergencyBroadcastPreferenceController(
context, KEY_CELL_BROADCAST_SETTINGS));
controllers.add(new VibrateWhenRingPreferenceController(context));
// === Volumes ===
controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));
controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));
controllers.add(
new NotificationVolumePreferenceController(context, callback, lifecycle));
controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));
// === Phone & notification ringtone ===
controllers.add(new PhoneRingtonePreferenceController(context));
//add by xiangzaixiansheng for support dual sim card ringtones @{
controllers.add(new PhoneRingtone2PreferenceController(context));
//add by xiangzaixiansheng for support dual sim card ringtones @}
controllers.add(new AlarmRingtonePreferenceController(context));
controllers.add(new NotificationRingtonePreferenceController(context));
......
}
路径:/packages/apps/Settings/src/com/android/settings/notification/PhoneRingtone2PreferenceController.java
package com.android.settings.notification;
import android.content.Context;
import android.media.RingtoneManager;
import com.android.settings.Utils;
public class PhoneRingtone2PreferenceController extends RingtonePreferenceControllerBase {
private static final String KEY_PHONE_RINGTONE_2 = "ringtone2";
String sim2 = "";
public PhoneRingtone2PreferenceController(Context context) {
super(context);
}
@Override
public String getPreferenceKey() {
return KEY_PHONE_RINGTONE_2;
}
@Override
public boolean isAvailable() {
if(simNumberCard == 0) {
return false;
} else if (simNumberCard ==1 ) {
return isShowSim();
} else if (simNumberCard == 2) {
return Utils.isVoiceCapable(mContext);
}
return Utils.isVoiceCapable(mContext);
}
public boolean isShowSim(){
sim2=getSimName(1);
if(sim2 != null && sim2 !="" && !sim2.equals("")) {
return Utils.isVoiceCapable(mContext);
} else {
return false;
}
}
@Override
public int getRingtoneType() {
return RingtoneManager.TYPE_RINGTONE_2;
}
}
路径:/packages/apps/Settings/src/com/android/settings/notification/RingtonePreferenceControllerBase.java
这个里面需要配置的一些何时会显示SIM卡铃声选项显示的时机。例如我们的需求就是如果没有SIM卡2就不显示SIM卡2的铃声设置选项。这里面我们就忽略这些操作了。这里面就给出一个方法,如果获得当前卡槽的SIM卡信息。
public String getSimName(int phoneId) {
mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo info : mSubInfoList) {
if (null != info && phoneId == info.getSimSlotIndex() &&
null != info.getDisplayName() && !"".equals(info.getDisplayName())) {
return info.getDisplayName().toString();
}
}
return "";
}