From f6df9711b7c410bfb085f3ee2471c5cf4e6c1935 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 21 Apr 2020 18:52:20 +0200 Subject: [PATCH] Changes for local video conferencing --- .../linphone/activities/call/CallActivity.kt | 2 +- .../call/ProximitySensorActivity.kt | 11 +++----- .../viewmodels/ControlsFadingViewModel.kt | 12 ++++---- .../call/viewmodels/ControlsViewModel.kt | 28 +++++++++++++++---- .../viewmodels/StatisticsListViewModel.kt | 6 ++-- .../java/org/linphone/core/CoreContext.kt | 22 +++++++++++---- .../layout-land/call_controls_fragment.xml | 2 +- .../res/layout/call_controls_fragment.xml | 16 ++++++++++- 8 files changed, 72 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/call/CallActivity.kt b/app/src/main/java/org/linphone/activities/call/CallActivity.kt index 212718854..99199f5ae 100644 --- a/app/src/main/java/org/linphone/activities/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/CallActivity.kt @@ -123,7 +123,7 @@ class CallActivity : ProximitySensorActivity() { override fun onUserLeaveHint() { super.onUserLeaveHint() - if (coreContext.core.currentCall?.currentParams?.videoEnabled() == true) { + if (coreContext.isVideoCallOrConferenceActive()) { Compatibility.enterPipMode(this) } } diff --git a/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt b/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt index f94354169..ce7834b1a 100644 --- a/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt @@ -26,7 +26,7 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Bundle import android.os.PowerManager -import org.linphone.LinphoneApplication +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.activities.GenericActivity import org.linphone.core.tools.Log @@ -75,12 +75,9 @@ abstract class ProximitySensorActivity : GenericActivity() { override fun onResume() { super.onResume() - if (LinphoneApplication.coreContext.core.callsNb > 0) { - val currentCall = LinphoneApplication.coreContext.core.currentCall ?: LinphoneApplication.coreContext.core.calls[0] - if (currentCall != null) { - val videoEnabled = currentCall.currentParams.videoEnabled() - enableProximitySensor(!videoEnabled) - } + if (coreContext.core.callsNb > 0) { + val videoEnabled = coreContext.isVideoCallOrConferenceActive() + enableProximitySensor(!videoEnabled) } } diff --git a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt index f9f10325f..b27175a60 100644 --- a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt @@ -46,8 +46,9 @@ class ControlsFadingViewModel : ViewModel() { message: String? ) { if (state == Call.State.StreamsRunning || state == Call.State.Updating || state == Call.State.UpdatedByRemote) { - Log.i("[Controls Fading] Call is in state $state, video is enabled? ${call.currentParams.videoEnabled()}") - if (call.currentParams.videoEnabled()) { + val videoEnabled = coreContext.isVideoCallOrConferenceActive() + Log.i("[Controls Fading] Call is in state $state, video is enabled? $videoEnabled") + if (videoEnabled) { videoEnabledEvent.value = Event(true) startTimer() } else { @@ -64,8 +65,8 @@ class ControlsFadingViewModel : ViewModel() { areControlsHidden.value = false isVideoPreviewHidden.value = false - val currentCall = coreContext.core.currentCall - if (currentCall != null && currentCall.currentParams.videoEnabled()) { + val videoEnabled = coreContext.isVideoCallOrConferenceActive() + if (videoEnabled) { videoEnabledEvent.value = Event(true) startTimer() } @@ -95,7 +96,8 @@ class ControlsFadingViewModel : ViewModel() { timer = Timer("Hide UI controls scheduler") timer?.schedule(object : TimerTask() { override fun run() { - areControlsHidden.postValue(coreContext.core.currentCall?.currentParams?.videoEnabled() ?: false) + val videoEnabled = coreContext.isVideoCallOrConferenceActive() + areControlsHidden.postValue(videoEnabled) } }, 3000) } diff --git a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt index 8df952ce8..0c91c19f0 100644 --- a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt @@ -181,7 +181,13 @@ class ControlsViewModel : ViewModel() { val core = coreContext.core val currentCall = core.currentCall - if (currentCall != null) { + if (core.conference != null && core.isInConference) { + val params = core.createConferenceParams() + val videoEnabled = core.conference.currentParams.videoEnabled() + params.enableVideo(!videoEnabled) + Log.i("[Controls VM] Conference current param for video is $videoEnabled") + core.conference.updateParams(params) + } else if (currentCall != null) { val state = currentCall.state if (state == Call.State.End || state == Call.State.Released || state == Call.State.Error) return @@ -238,7 +244,19 @@ class ControlsViewModel : ViewModel() { fun startConference() { somethingClickedEvent.value = Event(true) - coreContext.core.addAllToConference() + + val core = coreContext.core + val currentCallVideoEnabled = core.currentCall?.currentParams?.videoEnabled() ?: false + + val params = core.createConferenceParams() + params.enableVideo(currentCallVideoEnabled) + Log.i("[Call] Setting videoEnabled to [$currentCallVideoEnabled] in conference params") + + val conference = core.createConferenceWithParams(params) + for (call in core.calls) { + conference.addParticipant(call) + } + toggleOptionsMenu() } @@ -324,12 +342,12 @@ class ControlsViewModel : ViewModel() { private fun updateVideoAvailable() { val core = coreContext.core isVideoAvailable.value = (core.videoCaptureEnabled() || core.videoPreviewEnabled()) && - core.currentCall != null && !core.currentCall.mediaInProgress() + ((core.currentCall != null && !core.currentCall.mediaInProgress()) || + (core.conference != null && core.isInConference)) } private fun updateVideoEnabled() { - val core = coreContext.core - isVideoEnabled.value = core.currentCall?.currentParams?.videoEnabled() + isVideoEnabled.value = coreContext.isVideoCallOrConferenceActive() } private fun updateConferenceState() { diff --git a/app/src/main/java/org/linphone/activities/call/viewmodels/StatisticsListViewModel.kt b/app/src/main/java/org/linphone/activities/call/viewmodels/StatisticsListViewModel.kt index 2f49f30e0..775a9cb07 100644 --- a/app/src/main/java/org/linphone/activities/call/viewmodels/StatisticsListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/call/viewmodels/StatisticsListViewModel.kt @@ -37,11 +37,13 @@ class StatisticsListViewModel : ViewModel() { message: String? ) { if (state == Call.State.End || state == Call.State.Error) { + val newList = arrayListOf() for (stat in callStatsList.value.orEmpty()) { - if (stat.call == call) { - callStatsList.value?.remove(stat) + if (stat.call != call) { + newList.add(stat) } } + callStatsList.value = newList } } } diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 4347d7007..294ad57c6 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -353,18 +353,30 @@ class CoreContext(val context: Context, coreConfig: Config) { } } - val call = core.currentCall - if (call == null) { - Log.w("[Context] Switching camera while not in call") - return + if (core.conference != null && core.isInConference) { + // Nothing to do + } else { + val call = core.currentCall + if (call == null) { + Log.w("[Context] Switching camera while not in call") + return + } + call.update(null) } - call.update(null) } fun showSwitchCameraButton(): Boolean { return core.videoDevicesList.orEmpty().size > 2 // Count StaticImage camera } + fun isVideoCallOrConferenceActive(): Boolean { + return if (core.conference != null && core.isInConference) { + core.conference.currentParams.videoEnabled() + } else { + core.currentCall?.currentParams?.videoEnabled() ?: false + } + } + fun createCallOverlay() { if (!corePreferences.showCallOverlay || callOverlay != null) { return diff --git a/app/src/main/res/layout-land/call_controls_fragment.xml b/app/src/main/res/layout-land/call_controls_fragment.xml index d4269271b..669457170 100644 --- a/app/src/main/res/layout-land/call_controls_fragment.xml +++ b/app/src/main/res/layout-land/call_controls_fragment.xml @@ -116,7 +116,7 @@ + +