From 48baed897cf516f8ed5890a264b5f50a1dc79512 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 27 Oct 2023 15:14:05 +0200 Subject: [PATCH] More UI work on conference related screens --- .../fragment/ActiveConferenceCallFragment.kt | 21 ++++++ .../linphone/ui/call/model/ConferenceModel.kt | 7 ++ .../ui/call/viewmodel/CurrentCallViewModel.kt | 14 ++-- .../call_active_conference_fragment.xml | 51 +++++++------- .../main/res/layout/call_ended_fragment.xml | 68 ++++++++++++++++--- .../res/layout/call_incoming_fragment.xml | 1 + 6 files changed, 123 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt index 448faf223..447727959 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt @@ -19,6 +19,9 @@ */ package org.linphone.ui.call.fragment +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context import android.os.Bundle import android.os.SystemClock import android.view.LayoutInflater @@ -27,9 +30,11 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.google.android.material.bottomsheet.BottomSheetBehavior import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.tools.Log import org.linphone.databinding.CallActiveConferenceFragmentBinding import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel +import org.linphone.utils.Event class ActiveConferenceCallFragment : GenericCallFragment() { companion object { @@ -87,6 +92,11 @@ class ActiveConferenceCallFragment : GenericCallFragment() { } } + callViewModel.fullScreenMode.observe(viewLifecycleOwner) { hide -> + Log.i("$TAG Switching full screen mode to ${if (hide) "ON" else "OFF"}") + sharedViewModel.toggleFullScreenEvent.value = Event(hide) + } + actionsBottomSheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { when (newState) { @@ -102,6 +112,17 @@ class ActiveConferenceCallFragment : GenericCallFragment() { override fun onSlide(bottomSheet: View, slideOffset: Float) {} }) + + binding.setShareConferenceClickListener { + val sipUri = callViewModel.conferenceModel.sipUri.value.orEmpty() + if (sipUri.isNotEmpty()) { + Log.i("$TAG Sharing conference SIP URI [$sipUri]") + + val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val label = "Conference SIP address" + clipboard.setPrimaryClip(ClipData.newPlainText(label, sipUri)) + } + } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt b/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt index 770a755e0..7d41ba4d9 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt +++ b/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt @@ -35,10 +35,14 @@ class ConferenceModel { val subject = MutableLiveData() + val sipUri = MutableLiveData() + val participantDevices = MutableLiveData>() private lateinit var conference: Conference + val isCurrentCallInConference = MutableLiveData() + private val conferenceListener = object : ConferenceListenerStub() { @WorkerThread override fun onParticipantDeviceAdded( @@ -103,6 +107,7 @@ class ConferenceModel { @WorkerThread fun destroy() { + isCurrentCallInConference.postValue(false) if (::conference.isInitialized) { conference.removeListener(conferenceListener) participantDevices.value.orEmpty().forEach(ConferenceParticipantDeviceModel::destroy) @@ -116,12 +121,14 @@ class ConferenceModel { conference.removeListener(conferenceListener) } + isCurrentCallInConference.postValue(true) conference = conf conference.addListener(conferenceListener) Log.i( "$TAG Configuring conference with subject [${conference.subject}] from call [${call.callLog.callId}]" ) + sipUri.postValue(conference.conferenceAddress.asStringUriOnly()) subject.postValue(conference.subject) if (conference.state == Conference.State.Created) { diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index 9325d31db..0b78715c1 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -236,10 +236,14 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { fullScreenMode.postValue(false) } - if (call.state == Call.State.Connected && call.conference != null) { - Log.i("$TAG Call is in Connected state and conference isn't null") - conferenceModel.configureFromCall(call) - goToConferenceEvent.postValue(Event(true)) + if (call.state == Call.State.Connected) { + if (call.conference != null) { + Log.i("$TAG Call is in Connected state and conference isn't null") + conferenceModel.configureFromCall(call) + goToConferenceEvent.postValue(Event(true)) + } else { + conferenceModel.destroy() + } } } @@ -740,6 +744,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { if (call.conference != null) { conferenceModel.configureFromCall(call) goToConferenceEvent.postValue(Event(true)) + } else { + conferenceModel.destroy() } if (call.dir == Call.Dir.Incoming) { diff --git a/app/src/main/res/layout/call_active_conference_fragment.xml b/app/src/main/res/layout/call_active_conference_fragment.xml index 19ce33059..477885e25 100644 --- a/app/src/main/res/layout/call_active_conference_fragment.xml +++ b/app/src/main/res/layout/call_active_conference_fragment.xml @@ -43,10 +43,10 @@ android:layout_height="0dp" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" - android:layout_marginTop="10dp" + android:layout_marginTop="@dimen/call_top_bar_info_height" android:layout_marginBottom="@dimen/call_main_actions_menu_height" - android:visibility="@{conferenceViewModel.participantDevices.size() > 1 ? View.GONE : View.VISIBLE, default=gone}" - app:layout_constraintTop_toBottomOf="@id/call_direction_label" + android:visibility="@{conferenceViewModel.participantDevices.size() > 1 || viewModel.pipMode ? View.GONE : View.VISIBLE}" + app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> @@ -54,13 +54,16 @@ @@ -111,29 +112,31 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{viewModel.fullScreenMode || viewModel.pipMode ? View.INVISIBLE : View.VISIBLE}" - app:constraint_referenced_ids="call_direction_icon, call_direction_label, separator, chronometer" /> + app:constraint_referenced_ids="conference_icon, conference_subject, separator, chronometer" /> + app:layout_constraintStart_toEndOf="@id/conference_subject" + app:layout_constraintTop_toTopOf="@id/conference_subject"/> + app:layout_constraintTop_toTopOf="@id/conference_subject"/> + app:layout_constraintTop_toTopOf="@id/conference_subject"/> @@ -16,6 +15,20 @@ android:layout_height="match_parent" android:background="@color/gray_900"> + + + + + app:layout_constraintTop_toTopOf="@id/separator" + app:layout_constraintBottom_toBottomOf="@id/separator"/> + + + + + + + app:layout_constraintStart_toEndOf="@id/header_end_barrier" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="@id/separator"/> @@ -124,6 +169,7 @@ android:text="@{viewModel.displayedAddress, default=`sip:johndoe@sip.linphone.org`}" android:textColor="@color/white" android:textSize="14sp" + android:visibility="@{viewModel.conferenceModel.isCurrentCallInConference ? View.GONE : View.VISIBLE}" app:layout_constraintTop_toBottomOf="@id/name" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/call_incoming_fragment.xml b/app/src/main/res/layout/call_incoming_fragment.xml index 6b26e8c7c..092a4f0f5 100644 --- a/app/src/main/res/layout/call_incoming_fragment.xml +++ b/app/src/main/res/layout/call_incoming_fragment.xml @@ -126,6 +126,7 @@ android:text="@{viewModel.displayedAddress, default=`sip:johndoe@sip.linphone.org`}" android:textColor="@color/white" android:textSize="14sp" + android:visibility="@{viewModel.conferenceModel.isCurrentCallInConference ? View.GONE : View.VISIBLE}" app:layout_constraintTop_toBottomOf="@id/name" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" />