From 16555429c4f8d801d4c93ad1004c839293221331 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 17 Mar 2025 15:49:51 +0100 Subject: [PATCH] Revert using notification channel to play incoming calls ringtone --- app/src/main/assets/linphonerc_factory | 2 +- .../notifications/NotificationsManager.kt | 27 ++++++++++- .../settings/fragment/SettingsFragment.kt | 45 ++++++++++++++++--- .../settings/viewmodel/SettingsViewModel.kt | 21 ++++++++- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 2 + 6 files changed, 86 insertions(+), 12 deletions(-) diff --git a/app/src/main/assets/linphonerc_factory b/app/src/main/assets/linphonerc_factory index 31d406b17..9002c427b 100644 --- a/app/src/main/assets/linphonerc_factory +++ b/app/src/main/assets/linphonerc_factory @@ -26,7 +26,7 @@ update_presence_model_timestamp_before_publish_expires_refresh=1 [sound] #remove this property for any application that is not Linphone public version itself ec_calibrator_cool_tones=1 -disable_ringing=1 +disable_ringing=0 [audio] android_disable_audio_focus_requests=1 diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 553000ad5..107c73184 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -544,10 +544,21 @@ class NotificationsManager Log.e("$TAG Failed to delete notification channel ID [${channel.id}]: $e") } } + } else { + try { + val oldId = context.getString(R.string.notification_channel_without_ringtone_incoming_call_id) + val oldChannel = notificationManager.getNotificationChannel(oldId) + if (oldChannel != null) { + Log.i("$TAG Deleting notification channel ID [$oldId]") + notificationManager.deleteNotificationChannel(oldId) + } + } catch (e: Exception) { + Log.e("$TAG Failed to check if deprecated incoming call notification channel exists: $e") + } } createThirdPartyAccountKeepAliveServiceChannel() - createIncomingCallNotificationChannel() + createIncomingCallNotificationChannelWithoutRingtone() createMissedCallNotificationChannel() createActiveCallNotificationChannel() createMessageChannel() @@ -1170,7 +1181,7 @@ class NotificationsManager } val channelId = if (isIncoming) { - context.getString(R.string.notification_channel_incoming_call_id) + context.getString(R.string.notification_channel_without_ringtone_incoming_call_id) } else { context.getString(R.string.notification_channel_call_id) } @@ -1607,6 +1618,18 @@ class NotificationsManager notificationManager.createNotificationChannel(channel) } + @MainThread + private fun createIncomingCallNotificationChannelWithoutRingtone() { + val id = context.getString(R.string.notification_channel_without_ringtone_incoming_call_id) + val name = context.getString(R.string.notification_channel_incoming_call_name) + + val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH).apply { + description = name + lockscreenVisibility = Notification.VISIBILITY_PUBLIC + } + notificationManager.createNotificationChannel(channel) + } + @MainThread private fun createMissedCallNotificationChannel() { val id = context.getString(R.string.notification_channel_missed_call_id) diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index 32e93277d..3b7e7fba6 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -19,10 +19,11 @@ */ package org.linphone.ui.main.settings.fragment -import android.content.ActivityNotFoundException +import android.app.Activity import android.content.Intent +import android.media.RingtoneManager +import android.net.Uri import android.os.Bundle -import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -38,12 +39,16 @@ import org.linphone.databinding.SettingsFragmentBinding import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.utils.ConfirmationDialogModel import org.linphone.ui.main.settings.viewmodel.SettingsViewModel +import org.linphone.utils.AppUtils import org.linphone.utils.DialogUtils +import java.lang.Exception @UiThread class SettingsFragment : GenericMainFragment() { companion object { private const val TAG = "[Settings Fragment]" + + private const val RINGTONE_PICKER_INTENT_ID = 89 } private lateinit var binding: SettingsFragmentBinding @@ -143,19 +148,31 @@ class SettingsFragment : GenericMainFragment() { } viewModel.goToIncomingCallNotificationChannelSettingsEvent.observe(viewLifecycleOwner) { - it.consume { - Log.w("$TAG Going to incoming call channel settings") + it.consume { currentRingtone -> try { + /* + Log.w("$TAG Going to incoming call channel settings") val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) putExtra( Settings.EXTRA_CHANNEL_ID, - getString(R.string.notification_channel_incoming_call_id) + getString(R.string.notification_channel_without_ringtone_incoming_call_id) ) } startActivity(intent) - } catch (anfe: ActivityNotFoundException) { - Log.e("$TAG Failed to go to notification channel settings: $anfe") + */ + val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER).apply { + putExtra( + RingtoneManager.EXTRA_RINGTONE_TYPE, + RingtoneManager.TYPE_RINGTONE + ) + putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentRingtone) + putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, AppUtils.getString(R.string.settings_calls_change_ringtone_pick_title)) + } + startActivityForResult(intent, RINGTONE_PICKER_INTENT_ID) + } catch (e: Exception) { + Log.e("$TAG Failed start ringtone picker: $e") + // TODO: show error to user } } } @@ -277,6 +294,20 @@ class SettingsFragment : GenericMainFragment() { startPostponedEnterTransition() } + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK && requestCode == RINGTONE_PICKER_INTENT_ID) { + val uri: Uri? = data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + if (uri != null) { + Log.i("$TAG Ringtone picker result is OK, URI found in intent is [$uri]") + viewModel.setRingtoneUri(uri) + } else { + Log.e("$TAG Ringtone picker result is OK but URI is null!") + // TODO: show error to user + } + } + } + override fun onResume() { super.onResume() diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index 864121cd8..5adb43cbc 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -19,9 +19,12 @@ */ package org.linphone.ui.main.settings.viewmodel +import android.media.RingtoneManager +import android.net.Uri import android.os.Vibrator import androidx.annotation.UiThread import androidx.annotation.WorkerThread +import androidx.core.net.toUri import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -87,7 +90,7 @@ class SettingsViewModel val autoRecordCalls = MutableLiveData() - val goToIncomingCallNotificationChannelSettingsEvent = MutableLiveData>() + val goToIncomingCallNotificationChannelSettingsEvent = MutableLiveData>() // Conversations settings val showConversationsSettings = MutableLiveData() @@ -436,7 +439,21 @@ class SettingsViewModel @UiThread fun changeRingtone() { - goToIncomingCallNotificationChannelSettingsEvent.value = Event(true) + coreContext.postOnCoreThread { core -> + val defaultDeviceRingtone = RingtoneManager.getActualDefaultRingtoneUri(coreContext.context, RingtoneManager.TYPE_RINGTONE) + val coreRingtone = core.ring?.toUri() + Log.i("$TAG Currently set ringtone in Core is [$coreRingtone], device default ringtone is [$defaultDeviceRingtone]") + val currentRingtone = coreRingtone ?: defaultDeviceRingtone + goToIncomingCallNotificationChannelSettingsEvent.postValue(Event(currentRingtone)) + } + } + + @UiThread + fun setRingtoneUri(ringtone: Uri) { + coreContext.postOnCoreThread { core -> + core.ring = ringtone.toString() + Log.i("$TAG Newly set ringtone is [${core.ring}]") + } } @UiThread diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a4a5a0f80..c201e644b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -200,6 +200,7 @@ Vibration lors de l\'appel Enregistrement automatique des appels Changer de sonnerie + Choisissez la sonnerie Conversations Télécharger automatiquement les fichiers Rendre visible dans la galerie les médias téléchargés diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5e4a818ce..01bc49118 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,6 +18,7 @@ linphone_6.0_notification_missed_call_id linphone_6.0_notification_service_id linphone_6.0_notification_chat_id + linphone_6.0.1_notification_incoming_call_id ❤️ 👍 @@ -239,6 +240,7 @@ Vibrate while incoming call is ringing Automatically start recording calls Change ringtone + Pick ringtone Conversations Auto-download files Make downloaded media public