Merge remote-tracking branch 'CicadaCinema/fallback-turn-server' into sc

Change-Id: I07acecb8587ee3bdf6b2eef1e130ffd578739416

Conflicts:
	vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
	vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt
	vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
	vector/src/main/res/xml/vector_settings_voice_video.xml
This commit is contained in:
SpiritCroc 2023-04-24 11:49:32 +02:00
commit 0cc0a191bc
7 changed files with 50 additions and 3 deletions

View File

@ -229,4 +229,9 @@
<string name="action_send_as_sticker">Send as sticker</string> <string name="action_send_as_sticker">Send as sticker</string>
<!-- SC-TMP, until merged upstream: https://github.com/vector-im/element-android/pull/5781 -->
<string name="settings_call_ringtone_use_default_stun_title">Allow fallback call assist server</string>
<string name="settings_call_ringtone_use_default_stun_summary">Will use %s as assist when your homeserver does not offer one (your IP address will be seen by the stun server during a call
)</string>
</resources> </resources>

View File

@ -5,6 +5,7 @@
<!-- server urls --> <!-- server urls -->
<string name="matrix_org_server_url" translatable="false">https://matrix.org</string> <string name="matrix_org_server_url" translatable="false">https://matrix.org</string>
<string name="fallback_stun_server_url" translatable="false">turn.matrix.org</string>
<!-- Rageshake configuration --> <!-- Rageshake configuration -->
<string name="bug_report_url" translatable="false">https://rageshake.schildi.chat/api/submit</string> <string name="bug_report_url" translatable="false">https://rageshake.schildi.chat/api/submit</string>

View File

@ -19,6 +19,8 @@ package im.vector.app.features.call.webrtc
import android.content.Context import android.content.Context
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import im.vector.app.R
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.services.CallAndroidService import im.vector.app.core.services.CallAndroidService
import im.vector.app.core.utils.PublishDataSource import im.vector.app.core.utils.PublishDataSource
import im.vector.app.core.utils.TextUtils.formatDuration import im.vector.app.core.utils.TextUtils.formatDuration
@ -35,6 +37,7 @@ import im.vector.app.features.call.utils.awaitSetLocalDescription
import im.vector.app.features.call.utils.awaitSetRemoteDescription import im.vector.app.features.call.utils.awaitSetRemoteDescription
import im.vector.app.features.call.utils.mapToCallCandidate import im.vector.app.features.call.utils.mapToCallCandidate
import im.vector.app.features.session.coroutineScope import im.vector.app.features.session.coroutineScope
import im.vector.app.features.settings.VectorPreferences
import im.vector.lib.core.utils.flow.chunk import im.vector.lib.core.utils.flow.chunk
import im.vector.lib.core.utils.timer.CountUpTimer import im.vector.lib.core.utils.timer.CountUpTimer
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -114,7 +117,9 @@ class WebRtcCall(
private val sessionProvider: Provider<Session?>, private val sessionProvider: Provider<Session?>,
private val peerConnectionFactoryProvider: Provider<PeerConnectionFactory?>, private val peerConnectionFactoryProvider: Provider<PeerConnectionFactory?>,
private val onCallBecomeActive: (WebRtcCall) -> Unit, private val onCallBecomeActive: (WebRtcCall) -> Unit,
private val onCallEnded: (String, EndCallReason, Boolean) -> Unit private val onCallEnded: (String, EndCallReason, Boolean) -> Unit,
private var vectorPreferences: VectorPreferences,
private val stringProvider: StringProvider
) : MxCall.StateListener { ) : MxCall.StateListener {
interface Listener : MxCall.StateListener { interface Listener : MxCall.StateListener {
@ -299,6 +304,14 @@ class WebRtcCall(
) )
} }
} }
if ((turnServerResponse == null || turnServerResponse.uris.isNullOrEmpty()) && vectorPreferences.useFallbackTurnServer()) {
add(
PeerConnection
.IceServer
.builder("stun:" + stringProvider.getString(R.string.fallback_stun_server_url))
.createIceServer()
)
}
} }
Timber.tag(loggerTag.value).v("creating peer connection...with iceServers $iceServers ") Timber.tag(loggerTag.value).v("creating peer connection...with iceServers $iceServers ")
val rtcConfig = PeerConnection.RTCConfiguration(iceServers).apply { val rtcConfig = PeerConnection.RTCConfiguration(iceServers).apply {

View File

@ -21,6 +21,7 @@ import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import im.vector.app.ActiveSessionDataSource import im.vector.app.ActiveSessionDataSource
import im.vector.app.core.pushers.UnifiedPushHelper import im.vector.app.core.pushers.UnifiedPushHelper
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.services.CallAndroidService import im.vector.app.core.services.CallAndroidService
import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.AnalyticsTracker
import im.vector.app.features.analytics.plan.CallEnded import im.vector.app.features.analytics.plan.CallEnded
@ -32,6 +33,7 @@ import im.vector.app.features.call.lookup.CallUserMapper
import im.vector.app.features.call.utils.EglUtils import im.vector.app.features.call.utils.EglUtils
import im.vector.app.features.call.vectorCallService import im.vector.app.features.call.vectorCallService
import im.vector.app.features.session.coroutineScope import im.vector.app.features.session.coroutineScope
import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
@ -74,6 +76,8 @@ class WebRtcCallManager @Inject constructor(
private val analyticsTracker: AnalyticsTracker, private val analyticsTracker: AnalyticsTracker,
private val unifiedPushHelper: UnifiedPushHelper, private val unifiedPushHelper: UnifiedPushHelper,
private val voipConfig: VoipConfig, private val voipConfig: VoipConfig,
private var vectorPreferences: VectorPreferences,
private val stringProvider: StringProvider,
) : CallListener, ) : CallListener,
DefaultLifecycleObserver { DefaultLifecycleObserver {
@ -336,7 +340,9 @@ class WebRtcCallManager @Inject constructor(
}, },
sessionProvider = { currentSession }, sessionProvider = { currentSession },
onCallBecomeActive = this::onCallActive, onCallBecomeActive = this::onCallActive,
onCallEnded = this::onCallEnded onCallEnded = this::onCallEnded,
vectorPreferences = vectorPreferences,
stringProvider = stringProvider
) )
advertisedCalls.add(mxCall.callId) advertisedCalls.add(mxCall.callId)
callsByCallId[mxCall.callId] = webRtcCall callsByCallId[mxCall.callId] = webRtcCall

View File

@ -176,6 +176,7 @@ class VectorPreferences @Inject constructor(
// Calls // Calls
const val SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY = "SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY" const val SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY = "SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY"
const val SETTINGS_CALL_USE_FALLBACK_CALL_ASSIST_SERVER_KEY = "SETTINGS_CALL_USE_FALLBACK_CALL_ASSIST_SERVER_KEY"
const val SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY = "SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY" const val SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY = "SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY"
const val SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY = "SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY" const val SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY = "SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY"
@ -859,6 +860,13 @@ class VectorPreferences @Inject constructor(
return defaultPrefs.getBoolean(SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY, true) return defaultPrefs.getBoolean(SETTINGS_CALL_PREVENT_ACCIDENTAL_CALL_KEY, true)
} }
/**
* Tells if turn.matrix should be used during calls as a fallback
*/
fun useFallbackTurnServer(): Boolean {
return defaultPrefs.getBoolean(SETTINGS_CALL_USE_FALLBACK_CALL_ASSIST_SERVER_KEY, false)
}
/** /**
* Tells if the read receipts should be shown. * Tells if the read receipts should be shown.
* *

View File

@ -46,6 +46,9 @@ class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() {
private val mCallRingtonePreference by lazy { private val mCallRingtonePreference by lazy {
findPreference<VectorPreference>(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY)!! findPreference<VectorPreference>(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY)!!
} }
private val useDefaultStunPreference by lazy {
findPreference<SwitchPreference>(VectorPreferences.SETTINGS_CALL_USE_FALLBACK_CALL_ASSIST_SERVER_KEY)!!
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -59,6 +62,11 @@ class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() {
false false
} }
useDefaultStunPreference.let {
val stun = getString(R.string.fallback_stun_server_url)
it.summary = getString(R.string.settings_call_ringtone_use_default_stun_summary, stun)
}
mCallRingtonePreference.let { mCallRingtonePreference.let {
it.summary = ringtoneUtils.getCallRingtoneName() it.summary = ringtoneUtils.getCallRingtoneName()
it.onPreferenceClickListener = Preference.OnPreferenceClickListener { it.onPreferenceClickListener = Preference.OnPreferenceClickListener {

View File

@ -18,6 +18,12 @@
android:title="@string/settings_hide_call_buttons" android:title="@string/settings_hide_call_buttons"
android:summary="@string/settings_hide_call_buttons_summary" /> android:summary="@string/settings_hide_call_buttons_summary" />
<im.vector.app.core.preference.VectorSwitchPreference
android:defaultValue="false"
android:key="SETTINGS_CALL_USE_FALLBACK_CALL_ASSIST_SERVER_KEY"
android:summary="@string/settings_call_ringtone_use_default_stun_summary"
android:title="@string/settings_call_ringtone_use_default_stun_title" />
<im.vector.app.core.preference.VectorSwitchPreference <im.vector.app.core.preference.VectorSwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:disableDependentsState="true" android:disableDependentsState="true"
@ -33,4 +39,4 @@
</im.vector.app.core.preference.VectorPreferenceCategory> </im.vector.app.core.preference.VectorPreferenceCategory>
</androidx.preference.PreferenceScreen> </androidx.preference.PreferenceScreen>