diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt index cd715c677..e024a2634 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt @@ -30,9 +30,11 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.activity.OnBackPressedCallback +import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat +import androidx.window.layout.FoldingFeature import com.google.android.material.bottomsheet.BottomSheetBehavior import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R @@ -160,6 +162,10 @@ class ActiveConferenceCallFragment : GenericCallFragment() { binding.callsViewModel = callsViewModel binding.numpadModel = callViewModel.numpadModel + sharedViewModel.foldingState.observe(viewLifecycleOwner) { feature -> + updateHingeRelatedConstraints(feature) + } + val actionsBottomSheetBehavior = BottomSheetBehavior.from(binding.bottomBar.root) actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED actionsBottomSheetBehavior.addBottomSheetCallback(actionsBottomSheetCallback) @@ -333,4 +339,24 @@ class ActiveConferenceCallFragment : GenericCallFragment() { binding.localPreviewVideoSurface.setOnTouchListener(null) } + + private fun updateHingeRelatedConstraints(feature: FoldingFeature) { + Log.i("$TAG Updating constraint layout hinges: $feature") + + val constraintLayout = binding.constraintLayout + val set = ConstraintSet() + set.clone(constraintLayout) + + if (feature.isSeparating && feature.state == FoldingFeature.State.HALF_OPENED && feature.orientation == FoldingFeature.Orientation.HORIZONTAL) { + set.setGuidelinePercent(R.id.hinge_top, 0.5f) + set.setGuidelinePercent(R.id.hinge_bottom, 0.5f) + callViewModel.halfOpenedFolded.value = true + } else { + set.setGuidelinePercent(R.id.hinge_top, 0f) + set.setGuidelinePercent(R.id.hinge_bottom, 1f) + callViewModel.halfOpenedFolded.value = false + } + + set.applyTo(constraintLayout) + } } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index 5c77bf5e8..33e3ee2df 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -47,7 +47,6 @@ import org.linphone.ui.call.model.ZrtpAlertDialogModel import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel -import org.linphone.ui.call.viewmodel.SharedCallViewModel import org.linphone.utils.DialogUtils import org.linphone.utils.Event import org.linphone.utils.addCharacterAtPosition @@ -239,10 +238,6 @@ class ActiveCallFragment : GenericCallFragment() { callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED } - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedCallViewModel::class.java] - } - sharedViewModel.foldingState.observe(viewLifecycleOwner) { feature -> updateHingeRelatedConstraints(feature) } @@ -454,7 +449,7 @@ class ActiveCallFragment : GenericCallFragment() { val set = ConstraintSet() set.clone(constraintLayout) - if (feature.state == FoldingFeature.State.HALF_OPENED) { + if (feature.isSeparating && feature.state == FoldingFeature.State.HALF_OPENED && feature.orientation == FoldingFeature.Orientation.HORIZONTAL) { set.setGuidelinePercent(R.id.hinge_top, 0.5f) set.setGuidelinePercent(R.id.hinge_bottom, 0.5f) callViewModel.halfOpenedFolded.value = true diff --git a/app/src/main/res/layout-land/call_active_fragment.xml b/app/src/main/res/layout-land/call_active_fragment.xml index 10e93bdac..b90b5280f 100644 --- a/app/src/main/res/layout-land/call_active_fragment.xml +++ b/app/src/main/res/layout-land/call_active_fragment.xml @@ -136,7 +136,7 @@ android:src="@drawable/caret_left" android:contentDescription="@string/content_description_go_back_icon" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toBottomOf="@id/hinge_top" app:tint="@color/white" /> + + + + @@ -222,12 +236,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" - android:layout_marginBottom="@{viewModel.fullScreenMode || viewModel.pipMode ? @dimen/zero : @dimen/call_main_actions_menu_margin, default=@dimen/call_main_actions_menu_margin}" + 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:visibility="@{conferenceViewModel.isMeParticipantSendingVideo && conferenceViewModel.participants.size() == 1 && !conferenceViewModel.isPaused ? View.VISIBLE : View.GONE}" app:alignTopRight="true" app:displayMode="black_bars" roundCornersRadius="@{viewModel.pipMode ? @dimen/call_pip_round_corners_texture_view_radius : @dimen/call_round_corners_texture_view_radius, default=@dimen/call_round_corners_texture_view_radius}" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toBottomOf="@id/hinge_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_max="@{viewModel.pipMode ? @dimen/call_video_preview_pip_max_size : @dimen/call_video_preview_max_size, default=@dimen/call_video_preview_max_size}" app:layout_constraintWidth_max="@{viewModel.pipMode ? @dimen/call_video_preview_pip_max_size : @dimen/call_video_preview_max_size, default=@dimen/call_video_preview_max_size}" /> @@ -238,14 +252,14 @@ android:onClick="@{() -> viewModel.conferenceModel.toggleFullScreen()}" 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:layout_marginTop="@{viewModel.fullScreenMode || viewModel.pipMode ? @dimen/zero : @dimen/call_remote_video_top_margin, default=@dimen/call_remote_video_top_margin}" + 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_remote_video_top_margin, default=@dimen/call_remote_video_top_margin}" android:visibility="@{conferenceViewModel.participants.size() > 1 && !conferenceViewModel.isPaused ? View.VISIBLE : View.GONE, default=gone}" app:navGraph="@navigation/conference_nav_graph" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintBottom_toBottomOf="@id/hinge_bottom"/>