Also apply foldable UI when in conference + prevent folded UI for non-tabletop orientation

This commit is contained in:
Sylvain Berfini 2024-11-26 16:13:37 +01:00
parent 40541d3316
commit 0ce886cb56
5 changed files with 53 additions and 18 deletions

View file

@ -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)
}
}

View file

@ -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

View file

@ -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" />
<androidx.appcompat.widget.AppCompatTextView

View file

@ -49,6 +49,20 @@
android:layout_height="match_parent"
android:background="@color/gray_900">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/hinge_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/hinge_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="1" />
<androidx.constraintlayout.widget.Group
android:id="@+id/header_info_visibility"
android:layout_width="wrap_content"
@ -66,7 +80,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_toTopOf="@id/hinge_top"
app:tint="@color/white" />
<androidx.appcompat.widget.AppCompatTextView
@ -213,7 +227,7 @@
android:drawablePadding="8dp"
app:drawableTint="@color/gray_main2_400"
app:layout_constraintTop_toBottomOf="@id/waiting_for_others"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toBottomOf="@id/hinge_bottom"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@ -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 &amp;&amp; conferenceViewModel.participants.size() == 1 &amp;&amp; !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 &amp;&amp; !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"/>
<ImageView
android:id="@+id/recording"

View file

@ -62,7 +62,7 @@
android:id="@+id/avatar"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="@{(viewModel.isReceivingVideo &amp;&amp; viewModel.halfOpenedFolded) ? View.GONE : View.VISIBLE}"
android:visibility="@{viewModel.halfOpenedFolded ? View.GONE : View.VISIBLE}"
layout="@layout/contact_avatar_huge"
bind:model="@{viewModel.contact}"
app:layout_constraintDimensionRatio="1:1"
@ -83,7 +83,7 @@
android:text="@{viewModel.displayedName, default=`John Doe`}"
android:textSize="22sp"
android:textColor="@color/white"
android:visibility="@{viewModel.pipMode || (viewModel.isReceivingVideo &amp;&amp; viewModel.halfOpenedFolded) ? View.GONE : View.VISIBLE}"
android:visibility="@{viewModel.pipMode || viewModel.halfOpenedFolded ? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/avatar"
@ -98,7 +98,7 @@
android:text="@{viewModel.displayedAddress, default=`sip:johndoe@sip.linphone.org`}"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="@{viewModel.pipMode || (viewModel.isReceivingVideo &amp;&amp; viewModel.halfOpenedFolded) ? View.GONE : View.VISIBLE}"
android:visibility="@{viewModel.pipMode || viewModel.halfOpenedFolded ? View.GONE : View.VISIBLE}"
app:layout_constraintTop_toBottomOf="@id/display_name"
app:layout_constraintBottom_toBottomOf="@id/hinge_bottom"
app:layout_constraintStart_toStartOf="parent"
@ -134,7 +134,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" />
<androidx.appcompat.widget.AppCompatTextView