From e82f42e51a52b42b8961631b15f9c31532fe4c96 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 21 Feb 2024 10:46:26 +0100 Subject: [PATCH] Improved conference pause/resume + hide video surfaces when call or conference is paused --- .../linphone/ui/call/model/ConferenceModel.kt | 18 +++++++++++++ .../ui/call/viewmodel/CurrentCallViewModel.kt | 25 +++++++++++++------ .../res/color/in_call_button_tint_color.xml | 2 +- ...und_in_call_disabled_button_background.xml | 2 +- .../layout-land/call_actions_bottom_sheet.xml | 1 + .../call_conference_actions_bottom_sheet.xml | 3 +++ .../res/layout/call_actions_bottom_sheet.xml | 1 + .../call_active_conference_fragment.xml | 12 ++++----- .../main/res/layout/call_active_fragment.xml | 4 +-- .../call_conference_actions_bottom_sheet.xml | 3 +++ app/src/main/res/values/styles.xml | 2 +- 11 files changed, 54 insertions(+), 19 deletions(-) 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 ce37a1b2f..810628acb 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 @@ -60,6 +60,8 @@ class ConferenceModel { val conferenceLayout = MutableLiveData() + val isPaused = MutableLiveData() + val isMeParticipantSendingVideo = MutableLiveData() val showLayoutMenuEvent: MutableLiveData> by lazy { @@ -195,6 +197,7 @@ class ConferenceModel { isCurrentCallInConference.postValue(true) conference = conf conference.addListener(conferenceListener) + isPaused.postValue(conference.isIn) Log.i( "$TAG Configuring conference with subject [${conference.subject}] from call [${call.callLog.callId}]" @@ -479,4 +482,19 @@ class ConferenceModel { participantDevices.postValue(list) } + + @WorkerThread + fun togglePause() { + if (::conference.isInitialized) { + if (conference.isIn) { + Log.i("$TAG Temporary leaving conference") + conference.leave() + isPaused.postValue(true) + } else { + Log.i("$TAG Entering conference again") + conference.enter() + isPaused.postValue(false) + } + } + } } 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 89b242915..02e1dc8df 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 @@ -589,14 +589,23 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { fun togglePause() { coreContext.postOnCoreThread { if (::currentCall.isInitialized) { - when (isCallPaused()) { - true -> { - Log.i("$TAG Resuming call [${currentCall.remoteAddress.asStringUriOnly()}]") - currentCall.resume() - } - false -> { - Log.i("$TAG Pausing call [${currentCall.remoteAddress.asStringUriOnly()}]") - currentCall.pause() + if (currentCall.conference != null) { + conferenceModel.togglePause() + } else { + when (isCallPaused()) { + true -> { + Log.i( + "$TAG Resuming call [${currentCall.remoteAddress.asStringUriOnly()}]" + ) + currentCall.resume() + } + + false -> { + Log.i( + "$TAG Pausing call [${currentCall.remoteAddress.asStringUriOnly()}]" + ) + currentCall.pause() + } } } } diff --git a/app/src/main/res/color/in_call_button_tint_color.xml b/app/src/main/res/color/in_call_button_tint_color.xml index 1eda9d9d7..e1492132e 100644 --- a/app/src/main/res/color/in_call_button_tint_color.xml +++ b/app/src/main/res/color/in_call_button_tint_color.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/drawable/shape_round_in_call_disabled_button_background.xml b/app/src/main/res/drawable/shape_round_in_call_disabled_button_background.xml index 1076b3193..d242fd79e 100644 --- a/app/src/main/res/drawable/shape_round_in_call_disabled_button_background.xml +++ b/app/src/main/res/drawable/shape_round_in_call_disabled_button_background.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout-land/call_actions_bottom_sheet.xml b/app/src/main/res/layout-land/call_actions_bottom_sheet.xml index d832eb71c..761b834a6 100644 --- a/app/src/main/res/layout-land/call_actions_bottom_sheet.xml +++ b/app/src/main/res/layout-land/call_actions_bottom_sheet.xml @@ -220,6 +220,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_show_messages" + android:enabled="false" app:layout_constraintEnd_toStartOf="@id/pause_call_label" app:layout_constraintStart_toEndOf="@id/numpad_label" app:layout_constraintTop_toBottomOf="@id/chat" /> diff --git a/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml b/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml index 0dffd0c8f..65facc373 100644 --- a/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml +++ b/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml @@ -167,6 +167,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/conference_action_screen_sharing" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/screen_sharing" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/participants_label"/> @@ -214,6 +215,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_show_messages" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/chat" app:layout_constraintStart_toEndOf="@id/layout_label" app:layout_constraintEnd_toStartOf="@id/pause_call_label" /> @@ -236,6 +238,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_record_call" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/record_call" app:layout_constraintStart_toEndOf="@id/pause_call_label" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/call_actions_bottom_sheet.xml b/app/src/main/res/layout/call_actions_bottom_sheet.xml index 9e6556121..630f6cf41 100644 --- a/app/src/main/res/layout/call_actions_bottom_sheet.xml +++ b/app/src/main/res/layout/call_actions_bottom_sheet.xml @@ -216,6 +216,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_show_messages" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/chat" app:layout_constraintStart_toStartOf="@id/transfer_label" app:layout_constraintEnd_toEndOf="@id/transfer_label" /> 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 0af11db79..0780301f2 100644 --- a/app/src/main/res/layout/call_active_conference_fragment.xml +++ b/app/src/main/res/layout/call_active_conference_fragment.xml @@ -100,7 +100,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:visibility="@{viewModel.isPaused || viewModel.isPausedByRemote ? View.GONE : View.VISIBLE}" + android:visibility="@{conferenceViewModel.isPaused ? View.GONE : View.VISIBLE}" app:layout_constraintStart_toEndOf="@id/separator" app:layout_constraintEnd_toStartOf="@id/paused_call_header" app:layout_constraintTop_toTopOf="@id/conference_subject"/> @@ -111,8 +111,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:text="@{viewModel.isPaused ? @string/call_state_paused : @string/call_state_paused_by_remote, default=@string/call_state_paused}" - android:visibility="@{viewModel.isPaused || viewModel.isPausedByRemote ? View.VISIBLE : View.GONE, default=gone}" + android:text="@string/call_state_paused" + android:visibility="@{conferenceViewModel.isPaused ? View.VISIBLE : View.GONE, default=gone}" app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toEndOf="@id/chronometer" app:layout_constraintEnd_toStartOf="@id/switch_camera" @@ -139,7 +139,7 @@ android:layout_height="@dimen/call_top_bar_info_height" android:padding="10dp" android:src="@drawable/pause" - android:visibility="@{!viewModel.fullScreenMode && !viewModel.pipMode && (viewModel.isPaused || viewModel.isPausedByRemote) ? View.VISIBLE : View.GONE, default=gone}" + android:visibility="@{!viewModel.fullScreenMode && !viewModel.pipMode && conferenceViewModel.isPaused ? View.VISIBLE : View.GONE, default=gone}" app:tint="@color/main1_500" app:layout_constraintTop_toTopOf="@id/back" app:layout_constraintBottom_toBottomOf="@id/back" @@ -152,7 +152,7 @@ android:layout_height="@dimen/call_top_bar_info_height" android:padding="10dp" android:src="@{viewModel.qualityIcon, default=@drawable/cell_signal_full}" - android:visibility="@{!viewModel.fullScreenMode && !viewModel.pipMode && !(viewModel.isPaused || viewModel.isPausedByRemote) ? View.VISIBLE : View.GONE}" + android:visibility="@{!viewModel.fullScreenMode && !viewModel.pipMode && !conferenceViewModel.isPaused ? View.VISIBLE : View.GONE}" android:tint="@{viewModel.qualityValue >= 2 ? @color/white : viewModel.qualityValue >= 1 ? @color/orange_warning_600 : @color/red_danger_500, default=@color/white}" app:layout_constraintTop_toTopOf="@id/conference_subject" app:layout_constraintBottom_toBottomOf="@id/conference_subject" @@ -239,7 +239,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:layout_marginBottom="@{viewModel.fullScreenMode || viewModel.pipMode ? @dimen/zero : @dimen/call_main_actions_menu_margin, default=@dimen/call_main_actions_menu_margin}" - android:visibility="@{conferenceViewModel.participantDevices.size() > 1 ? View.VISIBLE : View.GONE}" + android:visibility="@{conferenceViewModel.participantDevices.size() > 1 && !conferenceViewModel.isPaused ? View.VISIBLE : View.GONE}" app:navGraph="@navigation/conference_nav_graph" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/call_active_fragment.xml b/app/src/main/res/layout/call_active_fragment.xml index 331e9b363..fc4858fce 100644 --- a/app/src/main/res/layout/call_active_fragment.xml +++ b/app/src/main/res/layout/call_active_fragment.xml @@ -113,7 +113,7 @@ android:layout_marginBottom="@{viewModel.fullScreenMode || viewModel.pipMode || viewModel.halfOpenedFolded ? @dimen/zero : @dimen/call_main_actions_menu_margin, default=@dimen/call_main_actions_menu_margin}" android:layout_marginTop="@{viewModel.fullScreenMode || viewModel.pipMode || viewModel.halfOpenedFolded ? @dimen/zero : @dimen/call_top_bar_info_height, default=@dimen/call_top_bar_info_height}" android:onClick="@{() -> viewModel.toggleFullScreen()}" - android:visibility="@{viewModel.isVideoEnabled ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isVideoEnabled && !(viewModel.isPaused || viewModel.isPausedByRemote) ? View.VISIBLE : View.GONE}" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="@id/hinge_bottom" app:layout_constraintEnd_toEndOf="parent" @@ -270,7 +270,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:layout_marginBottom="20dp" - android:visibility="@{viewModel.isVideoEnabled ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isVideoEnabled && !(viewModel.isPaused || viewModel.isPausedByRemote) ? View.VISIBLE : View.GONE}" app:alignTopRight="true" app:displayMode="black_bars" app:layout_constraintBottom_toBottomOf="@id/remote_video_surface" diff --git a/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml b/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml index 82e189877..74659e04b 100644 --- a/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml +++ b/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml @@ -166,6 +166,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/conference_action_screen_sharing" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/screen_sharing" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/participants_label"/> @@ -210,6 +211,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_show_messages" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/chat" app:layout_constraintStart_toStartOf="@id/screen_sharing_label" app:layout_constraintEnd_toEndOf="@id/screen_sharing_label" /> @@ -232,6 +234,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_record_call" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/record_call" app:layout_constraintStart_toStartOf="@id/calls_list_label" app:layout_constraintEnd_toEndOf="@id/calls_list_label" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 19d86f28a..d0cfc1eff 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -148,7 +148,7 @@