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:
commit
0cc0a191bc
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue