diff --git a/CHANGES.md b/CHANGES.md index bb52452f8d..0e2d231e26 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,7 @@ Improvements 🙌: - Considerably faster QR-code bitmap generation (#2331) Bugfix 🐛: + - Fixed ringtone handling (#2100 & #2246) - Messages encrypted with no way to decrypt after SDK update from 0.18 to 1.0.0 (#2252) - Search Result | scroll jumps after pagination (#2238) diff --git a/vector/src/main/java/im/vector/app/core/services/CallRingPlayer.kt b/vector/src/main/java/im/vector/app/core/services/CallRingPlayer.kt index b14a097eb6..d5d8bb14dd 100644 --- a/vector/src/main/java/im/vector/app/core/services/CallRingPlayer.kt +++ b/vector/src/main/java/im/vector/app/core/services/CallRingPlayer.kt @@ -17,6 +17,8 @@ package im.vector.app.core.services import android.content.Context +import android.media.Ringtone +import android.media.RingtoneManager import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer @@ -25,7 +27,26 @@ import androidx.core.content.getSystemService import im.vector.app.R import timber.log.Timber -class CallRingPlayer( +class CallRingPlayerIncoming( + context: Context +) { + + private val applicationContext = context.applicationContext + private var r: Ringtone? = null + + fun start() { + val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE) + r = RingtoneManager.getRingtone(applicationContext, notification) + Timber.v("## VOIP Starting ringing incomming") + r?.play() + } + + fun stop() { + r?.stop() + } +} + +class CallRingPlayerOutgoing( context: Context ) { @@ -44,12 +65,12 @@ class CallRingPlayer( try { if (player?.isPlaying == false) { player?.start() - Timber.v("## VOIP Starting ringing") + Timber.v("## VOIP Starting ringing outgoing") } else { Timber.v("## VOIP already playing") } } catch (failure: Throwable) { - Timber.e(failure, "## VOIP Failed to start ringing") + Timber.e(failure, "## VOIP Failed to start ringing outgoing") player = null } } else { @@ -74,7 +95,7 @@ class CallRingPlayer( } else { mediaPlayer.setAudioAttributes(AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) - .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING) + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) .build()) } return mediaPlayer diff --git a/vector/src/main/java/im/vector/app/core/services/CallService.kt b/vector/src/main/java/im/vector/app/core/services/CallService.kt index 1362c20be1..075b237be2 100644 --- a/vector/src/main/java/im/vector/app/core/services/CallService.kt +++ b/vector/src/main/java/im/vector/app/core/services/CallService.kt @@ -40,7 +40,8 @@ class CallService : VectorService(), WiredHeadsetStateReceiver.HeadsetEventListe private lateinit var notificationUtils: NotificationUtils private lateinit var webRtcPeerConnectionManager: WebRtcPeerConnectionManager - private var callRingPlayer: CallRingPlayer? = null + private var callRingPlayerIncoming: CallRingPlayerIncoming? = null + private var callRingPlayerOutgoing: CallRingPlayerOutgoing? = null private var wiredHeadsetStateReceiver: WiredHeadsetStateReceiver? = null private var bluetoothHeadsetStateReceiver: BluetoothHeadsetReceiver? = null @@ -63,14 +64,16 @@ class CallService : VectorService(), WiredHeadsetStateReceiver.HeadsetEventListe super.onCreate() notificationUtils = vectorComponent().notificationUtils() webRtcPeerConnectionManager = vectorComponent().webRtcPeerConnectionManager() - callRingPlayer = CallRingPlayer(applicationContext) + callRingPlayerIncoming = CallRingPlayerIncoming(applicationContext) + callRingPlayerOutgoing = CallRingPlayerOutgoing(applicationContext) wiredHeadsetStateReceiver = WiredHeadsetStateReceiver.createAndRegister(this, this) bluetoothHeadsetStateReceiver = BluetoothHeadsetReceiver.createAndRegister(this, this) } override fun onDestroy() { super.onDestroy() - callRingPlayer?.stop() + callRingPlayerIncoming?.stop() + callRingPlayerOutgoing?.stop() wiredHeadsetStateReceiver?.let { WiredHeadsetStateReceiver.unRegister(this, it) } wiredHeadsetStateReceiver = null bluetoothHeadsetStateReceiver?.let { BluetoothHeadsetReceiver.unRegister(this, it) } @@ -100,16 +103,17 @@ class CallService : VectorService(), WiredHeadsetStateReceiver.HeadsetEventListe when (intent.action) { ACTION_INCOMING_RINGING_CALL -> { mediaSession?.isActive = true - callRingPlayer?.start() + callRingPlayerIncoming?.start() displayIncomingCallNotification(intent) } ACTION_OUTGOING_RINGING_CALL -> { mediaSession?.isActive = true - callRingPlayer?.start() + callRingPlayerOutgoing?.start() displayOutgoingRingingCallNotification(intent) } ACTION_ONGOING_CALL -> { - callRingPlayer?.stop() + callRingPlayerIncoming?.stop() + callRingPlayerOutgoing?.stop() displayCallInProgressNotification(intent) } ACTION_NO_ACTIVE_CALL -> hideCallNotifications() @@ -117,7 +121,8 @@ class CallService : VectorService(), WiredHeadsetStateReceiver.HeadsetEventListe // lower notification priority displayCallInProgressNotification(intent) // stop ringing - callRingPlayer?.stop() + callRingPlayerIncoming?.stop() + callRingPlayerOutgoing?.stop() } ACTION_ONGOING_CALL_BG -> { // there is an ongoing call but call activity is in background @@ -125,7 +130,8 @@ class CallService : VectorService(), WiredHeadsetStateReceiver.HeadsetEventListe } else -> { // Should not happen - callRingPlayer?.stop() + callRingPlayerIncoming?.stop() + callRingPlayerOutgoing?.stop() myStopSelf() } } diff --git a/vector/src/main/java/im/vector/app/features/call/CallAudioManager.kt b/vector/src/main/java/im/vector/app/features/call/CallAudioManager.kt index 9b3c42ab5d..3a24cf6d48 100644 --- a/vector/src/main/java/im/vector/app/features/call/CallAudioManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/CallAudioManager.kt @@ -93,6 +93,10 @@ class CallAudioManager( fun startForCall(mxCall: MxCall) { Timber.v("## VOIP: AudioManager startForCall ${mxCall.callId}") + } + + private fun setupAudioManager(mxCall: MxCall) { + Timber.v("## VOIP: AudioManager setupAudioManager ${mxCall.callId}") val audioManager = audioManager ?: return savedIsSpeakerPhoneOn = audioManager.isSpeakerphoneOn savedIsMicrophoneMute = audioManager.isMicrophoneMute @@ -150,7 +154,7 @@ class CallAudioManager( fun onCallConnected(mxCall: MxCall) { Timber.v("##VOIP: AudioManager call answered, adjusting current sound device") - adjustCurrentSoundDevice(mxCall) + setupAudioManager(mxCall) } fun getAvailableSoundDevices(): List {