From b1b426389d9e05f0c57e8176bcf2255f9e58e929 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 4 Apr 2023 14:47:09 +0200 Subject: [PATCH] Fixed UI issue when hanging up an active call when an incoming call is ringing --- .../org/linphone/activities/Navigation.kt | 20 +++++++++++++ .../linphone/activities/voip/CallActivity.kt | 11 +++---- .../voip/fragments/SingleCallFragment.kt | 30 +++++++++++++------ .../voip/viewmodels/CallsViewModel.kt | 19 +++++------- .../voip/viewmodels/ControlsViewModel.kt | 5 +++- 5 files changed, 59 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/Navigation.kt b/app/src/main/java/org/linphone/activities/Navigation.kt index 460469a33..96bd4c815 100644 --- a/app/src/main/java/org/linphone/activities/Navigation.kt +++ b/app/src/main/java/org/linphone/activities/Navigation.kt @@ -965,6 +965,26 @@ internal fun SingleCallFragment.navigateToConferenceLayout() { } } +internal fun SingleCallFragment.navigateToIncomingCall() { + if (findNavController().currentDestination?.id == R.id.singleCallFragment) { + findNavController().navigate( + R.id.action_global_incomingCallFragment, + null, + popupTo(R.id.singleCallFragment, true) + ) + } +} + +internal fun SingleCallFragment.navigateToOutgoingCall() { + if (findNavController().currentDestination?.id == R.id.singleCallFragment) { + findNavController().navigate( + R.id.action_global_outgoingCallFragment, + null, + popupTo(R.id.singleCallFragment, true) + ) + } +} + internal fun ConferenceCallFragment.navigateToCallsList() { if (findNavController().currentDestination?.id == R.id.conferenceCallFragment) { findNavController().navigate( diff --git a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt index 16ff9d6a0..c97afbb44 100644 --- a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt @@ -134,11 +134,12 @@ class CallActivity : ProximitySensorActivity() { callsViewModel.currentCallData.observe( this ) { callData -> - if (callData.call.conference == null) { - Log.i("[Call Activity] Current call isn't linked to a conference, changing fragment") + val call = callData.call + if (call.conference == null) { + Log.i("[Call Activity] Current call isn't linked to a conference, switching to SingleCall fragment") navigateToActiveCall() } else { - Log.i("[Call Activity] Current call is linked to a conference, changing fragment") + Log.i("[Call Activity] Current call is linked to a conference, switching to ConferenceCall fragment") navigateToConferenceCall() } } @@ -156,10 +157,10 @@ class CallActivity : ProximitySensorActivity() { this ) { exists -> if (exists) { - Log.i("[Call Activity] Found active conference, changing fragment") + Log.i("[Call Activity] Found active conference, changing switching to ConferenceCall fragment") navigateToConferenceCall() } else if (coreContext.core.callsNb > 0) { - Log.i("[Call Activity] Conference no longer exists, changing fragment") + Log.i("[Call Activity] Conference no longer exists, switching to SingleCall fragment") navigateToActiveCall() } } diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt index bdbf92075..b20888c83 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt @@ -82,16 +82,28 @@ class SingleCallFragment : GenericVideoPreviewFragment if (callData != null) { val call = callData.call + when (val callState = call.state) { + Call.State.IncomingReceived, Call.State.IncomingEarlyMedia -> { + Log.i("[Single Call] New current call is in [$callState] state, switching to IncomingCall fragment") + navigateToIncomingCall() + } + Call.State.OutgoingInit, Call.State.OutgoingProgress, Call.State.OutgoingRinging, Call.State.OutgoingEarlyMedia -> { + Log.i("[Single Call] New current call is in [$callState] state, switching to OutgoingCall fragment") + navigateToOutgoingCall() + } + else -> { + Log.i("[Single Call] New current call is in [$callState] state, updating call UI") + val timer = binding.root.findViewById(R.id.active_call_timer) + timer.base = + SystemClock.elapsedRealtime() - (1000 * call.duration) // Linphone timestamps are in seconds + timer.start() - val timer = binding.root.findViewById(R.id.active_call_timer) - timer.base = - SystemClock.elapsedRealtime() - (1000 * call.duration) // Linphone timestamps are in seconds - timer.start() - - if (corePreferences.enableFullScreenWhenJoiningVideoCall) { - if (call.currentParams.isVideoEnabled) { - Log.i("[Single Call] Call params have video enabled, enabling full screen mode") - controlsViewModel.fullScreenMode.value = true + if (corePreferences.enableFullScreenWhenJoiningVideoCall) { + if (call.currentParams.isVideoEnabled) { + Log.i("[Single Call] Call params have video enabled, enabling full screen mode") + controlsViewModel.fullScreenMode.value = true + } + } } } } diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt index 711a7ca73..ab9dceb53 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt @@ -138,8 +138,9 @@ class CallsViewModel : ViewModel() { init { coreContext.core.addListener(listener) - val currentCall = coreContext.core.currentCall + val currentCall = coreContext.core.currentCall ?: coreContext.core.calls.firstOrNull() if (currentCall != null) { + Log.i("[Calls] Initializing ViewModel using call [${currentCall.remoteAddress.asStringUriOnly()}] as current") currentCallData.value?.destroy() val viewModel = CallData(currentCall) @@ -223,14 +224,12 @@ class CallsViewModel : ViewModel() { Log.i("[Calls] Removing call with ID ${call.callLog.callId} from calls list") val calls = arrayListOf() - calls.addAll(callsData.value.orEmpty()) - - val data = calls.find { it.call == call } - if (data == null) { - Log.w("[Calls] Data for call to remove wasn't found") - } else { - data.destroy() - calls.remove(data) + for (data in callsData.value.orEmpty()) { + if (data.call == call) { + data.destroy() + } else { + calls.add(data) + } } callsData.value = calls @@ -239,8 +238,6 @@ class CallsViewModel : ViewModel() { private fun updateCurrentCallData(currentCall: Call?) { var callToUse = currentCall if (currentCall == null) { - Log.i("[Calls] Current call is now null") - if (coreContext.core.callsNb == 1) { // Make sure the current call data is matching the only call val firstData = callsData.value?.firstOrNull() diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt index 6de93caa5..e91135669 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt @@ -248,7 +248,10 @@ class ControlsViewModel : ViewModel() { } fun answer() { - val currentCall = coreContext.core.currentCall + val currentCall = coreContext.core.currentCall ?: coreContext.core.calls.find { + call -> + call.state == Call.State.IncomingReceived || call.state == Call.State.IncomingEarlyMedia + } if (currentCall != null) { coreContext.answerCall(currentCall) } else {