From 05df1f2065aa9b62a5ae067f32fd0f9dbf0d99a8 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 2 Jul 2024 18:12:29 +0200 Subject: [PATCH] Fix crash when getting the system ringtone for ringing calls (#3131) --- .../RingingCallNotificationCreator.kt | 9 ++++++-- .../channels/NotificationChannels.kt | 23 +++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt index 46101250ec..161215eef3 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt @@ -116,7 +116,8 @@ class RingingCallNotificationCreator @Inject constructor( false ) - val ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) + // TODO use a fallback ringtone if the default ringtone is not available + val ringtoneUri = runCatching { RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) }.getOrNull() return NotificationCompat.Builder(context, notificationChannelId) .setSmallIcon(CommonDrawables.ic_notification_small) .setPriority(NotificationCompat.PRIORITY_MAX) @@ -127,7 +128,11 @@ class RingingCallNotificationCreator @Inject constructor( .setWhen(timestamp) .setOngoing(true) .setShowWhen(false) - .setSound(ringtoneUri, AudioManager.STREAM_RING) + .apply { + if (ringtoneUri != null) { + setSound(ringtoneUri, AudioManager.STREAM_RING) + } + } .setTimeoutAfter(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds.inWholeMilliseconds) .setContentIntent(answerIntent) .setDeleteIntent(declineIntent) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt index 080bacc453..3835e9c0a6 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt @@ -162,7 +162,8 @@ class DefaultNotificationChannels @Inject constructor( ) // Register a channel for incoming call notifications which will ring the device when received - val ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) + // TODO use a fallback ringtone if the default ringtone is not available + val ringtoneUri = runCatching { RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) }.getOrNull() notificationManager.createNotificationChannel( NotificationChannelCompat.Builder( RINGING_CALL_NOTIFICATION_CHANNEL_ID, @@ -170,14 +171,18 @@ class DefaultNotificationChannels @Inject constructor( ) .setName(stringProvider.getString(R.string.notification_channel_ringing_calls).ifEmpty { "Ringing calls" }) .setVibrationEnabled(true) - .setSound( - ringtoneUri, - AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setLegacyStreamType(AudioManager.STREAM_RING) - .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) - .build() - ) + .apply { + if (ringtoneUri != null) { + setSound( + ringtoneUri, + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setLegacyStreamType(AudioManager.STREAM_RING) + .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + .build() + ) + } + } .setDescription(stringProvider.getString(R.string.notification_channel_ringing_calls)) .setLightsEnabled(true) .setLightColor(accentColor)