Fixed issue with video call layout + auto accept video requests

This commit is contained in:
Sylvain Berfini 2023-09-12 11:58:34 +02:00
parent 036301e34f
commit c8ea1bcd8c
9 changed files with 49 additions and 22 deletions

View file

@ -83,6 +83,14 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C
showCallActivity() showCallActivity()
} }
} }
Call.State.UpdatedByRemote -> {
// TODO FIXME: remove
val params = core.createCallParams(call)
params?.isVideoEnabled = true
core.isVideoCaptureEnabled = true
core.isVideoDisplayEnabled = true
call.acceptUpdate(params)
}
else -> { else -> {
} }
} }

View file

@ -214,11 +214,11 @@ class ActiveCallFragment : GenericCallFragment() {
if (feature.state == FoldingFeature.State.HALF_OPENED) { if (feature.state == FoldingFeature.State.HALF_OPENED) {
set.setGuidelinePercent(R.id.hinge_top, 0.5f) set.setGuidelinePercent(R.id.hinge_top, 0.5f)
set.setGuidelinePercent(R.id.hinge_bottom, 0.5f) set.setGuidelinePercent(R.id.hinge_bottom, 0.5f)
sharedViewModel.folded.value = true callViewModel.halfOpenedFolded.value = true
} else { } else {
set.setGuidelinePercent(R.id.hinge_top, 0f) set.setGuidelinePercent(R.id.hinge_top, 0f)
set.setGuidelinePercent(R.id.hinge_bottom, 1f) set.setGuidelinePercent(R.id.hinge_bottom, 1f)
sharedViewModel.folded.value = false callViewModel.halfOpenedFolded.value = false
} }
set.applyTo(constraintLayout) set.applyTo(constraintLayout)

View file

@ -69,6 +69,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
val pipMode = MutableLiveData<Boolean>() val pipMode = MutableLiveData<Boolean>()
val halfOpenedFolded = MutableLiveData<Boolean>()
// To synchronize chronometers in UI // To synchronize chronometers in UI
val callDuration = MutableLiveData<Int>() val callDuration = MutableLiveData<Int>()

View file

@ -29,6 +29,4 @@ class SharedCallViewModel @UiThread constructor() : ViewModel() {
val toggleFullScreenEvent = MutableLiveData<Event<Boolean>>() val toggleFullScreenEvent = MutableLiveData<Event<Boolean>>()
val foldingState = MutableLiveData<FoldingFeature>() val foldingState = MutableLiveData<FoldingFeature>()
val folded = MutableLiveData<Boolean>()
} }

View file

@ -36,6 +36,7 @@ import androidx.annotation.ColorRes
import androidx.annotation.UiThread import androidx.annotation.UiThread
import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatEditText
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
@ -307,6 +308,22 @@ fun AppCompatEditText.editTextSetting(lambda: () -> Unit) {
}) })
} }
@BindingAdapter("android:layout_marginBottom")
fun setConstraintLayoutBottomMargin(view: View, margins: Float) {
val params = view.layoutParams as ConstraintLayout.LayoutParams
val m = margins.toInt()
params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, m)
view.layoutParams = params
}
@BindingAdapter("android:layout_marginTop")
fun setConstraintLayoutTopMargin(view: View, margins: Float) {
val params = view.layoutParams as ConstraintLayout.LayoutParams
val m = margins.toInt()
params.setMargins(params.leftMargin, m, params.rightMargin, params.bottomMargin)
view.layoutParams = params
}
@BindingAdapter("focusNextOnInput") @BindingAdapter("focusNextOnInput")
fun focusNextOnInput(editText: EditText, enabled: Boolean) { fun focusNextOnInput(editText: EditText, enabled: Boolean) {
if (!enabled) return if (!enabled) return

View file

@ -106,6 +106,8 @@
android:id="@+id/remote_video_surface" android:id="@+id/remote_video_surface"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginBottom="@{viewModel.fullScreenMode || viewModel.pipMode || viewModel.halfOpenedFolded ? @dimen/zero : @dimen/in_call_main_actions_menu_height, default=@dimen/in_call_main_actions_menu_height}"
android:layout_marginTop="@{viewModel.fullScreenMode || viewModel.pipMode || viewModel.halfOpenedFolded ? @dimen/zero : @dimen/in_call_top_bar_info_height, default=@dimen/in_call_top_bar_info_height}"
android:onClick="@{() -> viewModel.toggleFullScreen()}" android:onClick="@{() -> viewModel.toggleFullScreen()}"
android:visibility="@{viewModel.isVideoEnabled ? View.VISIBLE : View.GONE}" android:visibility="@{viewModel.isVideoEnabled ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@ -122,8 +124,8 @@
<ImageView <ImageView
android:id="@+id/call_direction_icon" android:id="@+id/call_direction_icon"
android:layout_width="@dimen/icon_size" android:layout_width="wrap_content"
android:layout_height="@dimen/icon_size" android:layout_height="0dp"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:src="@{viewModel.isOutgoing ? @drawable/outgoing_call : @drawable/incoming_call, default=@drawable/outgoing_call}" android:src="@{viewModel.isOutgoing ? @drawable/outgoing_call : @drawable/incoming_call, default=@drawable/outgoing_call}"
@ -135,7 +137,7 @@
style="@style/default_text_style_800" style="@style/default_text_style_800"
android:id="@+id/call_direction_label" android:id="@+id/call_direction_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/in_call_top_bar_text_height"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
@ -150,33 +152,31 @@
style="@style/default_text_style_800" style="@style/default_text_style_800"
android:id="@+id/separator" android:id="@+id/separator"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/in_call_top_bar_text_height"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="16sp" android:textSize="16sp"
android:text="@string/vertical_separator" android:text="@string/vertical_separator"
app:layout_constraintStart_toEndOf="@id/call_direction_label" app:layout_constraintStart_toEndOf="@id/call_direction_label"
app:layout_constraintTop_toTopOf="@id/call_direction_label" app:layout_constraintTop_toTopOf="@id/call_direction_label"/>
app:layout_constraintBottom_toBottomOf="@id/call_direction_label"/>
<Chronometer <Chronometer
style="@style/default_text_style_800" style="@style/default_text_style_800"
android:id="@+id/chronometer" android:id="@+id/chronometer"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/in_call_top_bar_text_height"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="16sp" android:textSize="16sp"
app:layout_constraintStart_toEndOf="@id/separator" app:layout_constraintStart_toEndOf="@id/separator"
app:layout_constraintTop_toTopOf="@id/call_direction_label" app:layout_constraintTop_toTopOf="@id/call_direction_label"/>
app:layout_constraintBottom_toBottomOf="@id/call_direction_label"/>
<ImageView <ImageView
android:onClick="@{() -> viewModel.switchCamera()}" android:onClick="@{() -> viewModel.switchCamera()}"
android:id="@+id/switch_camera" android:id="@+id/switch_camera"
android:layout_width="34dp" android:layout_width="@dimen/in_call_top_bar_info_height"
android:layout_height="34dp" android:layout_height="@dimen/in_call_top_bar_info_height"
android:padding="5dp" android:padding="10dp"
android:layout_marginEnd="10dp" android:layout_marginEnd="10dp"
android:src="@drawable/camera_rotate" android:src="@drawable/camera_rotate"
android:visibility="@{!viewModel.fullScreenMode &amp;&amp; !viewModel.pipMode &amp;&amp; viewModel.isVideoEnabled &amp;&amp; viewModel.showSwitchCamera ? View.VISIBLE : View.GONE}" android:visibility="@{!viewModel.fullScreenMode &amp;&amp; !viewModel.pipMode &amp;&amp; viewModel.isVideoEnabled &amp;&amp; viewModel.showSwitchCamera ? View.VISIBLE : View.GONE}"

View file

@ -17,8 +17,8 @@
<ImageView <ImageView
android:id="@+id/call_direction_icon" android:id="@+id/call_direction_icon"
android:layout_width="@dimen/icon_size" android:layout_width="wrap_content"
android:layout_height="@dimen/icon_size" android:layout_height="0dp"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:src="@drawable/incoming_call" android:src="@drawable/incoming_call"
@ -30,7 +30,7 @@
style="@style/default_text_style_800" style="@style/default_text_style_800"
android:id="@+id/call_direction_label" android:id="@+id/call_direction_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/in_call_top_bar_text_height"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"

View file

@ -17,8 +17,8 @@
<ImageView <ImageView
android:id="@+id/call_direction_icon" android:id="@+id/call_direction_icon"
android:layout_width="@dimen/icon_size" android:layout_width="wrap_content"
android:layout_height="@dimen/icon_size" android:layout_height="0dp"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:src="@drawable/outgoing_call" android:src="@drawable/outgoing_call"
@ -30,7 +30,7 @@
style="@style/default_text_style_800" style="@style/default_text_style_800"
android:id="@+id/call_direction_label" android:id="@+id/call_direction_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="@dimen/in_call_top_bar_text_height"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"

View file

@ -29,6 +29,8 @@
<dimen name="top_bar_height">55dp</dimen> <dimen name="top_bar_height">55dp</dimen>
<dimen name="toast_top_margin">70dp</dimen> <!-- 15dp + top_bar_height --> <dimen name="toast_top_margin">70dp</dimen> <!-- 15dp + top_bar_height -->
<dimen name="in_call_top_bar_text_height">28dp</dimen>
<dimen name="in_call_top_bar_info_height">48dp</dimen> <!-- Size of top text + top & bottom margins -->
<dimen name="in_call_main_actions_menu_height">110dp</dimen> <dimen name="in_call_main_actions_menu_height">110dp</dimen>
<dimen name="in_call_extra_actions_menu_height">235dp</dimen> <dimen name="in_call_extra_actions_menu_height">235dp</dimen>
<dimen name="in_call_all_actions_menu_height">345dp</dimen> <!-- sum of above two --> <dimen name="in_call_all_actions_menu_height">345dp</dimen> <!-- sum of above two -->