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 f1aa36402..5ee5934d5 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
@@ -36,13 +36,11 @@ import androidx.navigation.fragment.findNavController
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import androidx.window.layout.FoldingFeature
import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.CallActiveFragmentBinding
import org.linphone.ui.call.CallActivity
-import org.linphone.ui.call.model.CallMediaEncryptionModel
import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel
import org.linphone.ui.call.viewmodel.CallsViewModel
import org.linphone.ui.call.viewmodel.CurrentCallViewModel
@@ -67,8 +65,6 @@ class ActiveCallFragment : GenericCallFragment() {
private var zrtpSasDialog: Dialog? = null
- private var bottomSheetDialog: BottomSheetDialogFragment? = null
-
// For moving video preview purposes
private var previewX: Float = 0f
@@ -96,22 +92,11 @@ class ActiveCallFragment : GenericCallFragment() {
}
}
- private val numpadBottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
+ private val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
- val numpadBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
- numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
- }
- }
-
- override fun onSlide(bottomSheet: View, slideOffset: Float) { }
- }
-
- private val callStatsBottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
- override fun onStateChanged(bottomSheet: View, newState: Int) {
- if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
- val callStatsBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
- callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ val bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
+ bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
}
}
@@ -177,11 +162,17 @@ class ActiveCallFragment : GenericCallFragment() {
val numpadBottomSheetBehavior = BottomSheetBehavior.from(binding.callNumpad.root)
numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
- numpadBottomSheetBehavior.addBottomSheetCallback(numpadBottomSheetCallback)
+ numpadBottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
val callStatsBottomSheetBehavior = BottomSheetBehavior.from(binding.callStats.root)
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
- callStatsBottomSheetBehavior.addBottomSheetCallback(callStatsBottomSheetCallback)
+ callStatsBottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
+
+ val callMediaEncryptionStatsBottomSheetBehavior = BottomSheetBehavior.from(
+ binding.callMediaEncryptionStats.root
+ )
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ callMediaEncryptionStatsBottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
binding.setBackClickListener {
requireActivity().finish()
@@ -200,9 +191,17 @@ class ActiveCallFragment : GenericCallFragment() {
binding.setCallStatisticsClickListener {
actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
}
+ binding.setCallMediaEncryptionStatisticsClickListener {
+ actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
+ }
+
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedCallViewModel::class.java]
}
@@ -223,6 +222,7 @@ class ActiveCallFragment : GenericCallFragment() {
sharedViewModel.toggleFullScreenEvent.value = Event(hide)
numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
}
callViewModel.showZrtpSasDialogEvent.observe(viewLifecycleOwner) {
@@ -334,12 +334,6 @@ class ActiveCallFragment : GenericCallFragment() {
}
}
}
-
- callViewModel.showMediaEncryptionStatisticsEvent.observe(viewLifecycleOwner) {
- it.consume { model ->
- showMediaEncryptionStatistics(model)
- }
- }
}
@SuppressLint("ClickableViewAccessibility")
@@ -363,9 +357,6 @@ class ActiveCallFragment : GenericCallFragment() {
zrtpSasDialog?.dismiss()
zrtpSasDialog = null
- bottomSheetDialog?.dismiss()
- bottomSheetDialog = null
-
binding.localPreviewVideoSurface.setOnTouchListener(null)
}
@@ -388,22 +379,4 @@ class ActiveCallFragment : GenericCallFragment() {
set.applyTo(constraintLayout)
}
-
- private fun showMediaEncryptionStatistics(model: CallMediaEncryptionModel) {
- val modalBottomSheet = MediaEncryptionStatisticsDialogFragment(model)
- modalBottomSheet.show(
- requireActivity().supportFragmentManager,
- MediaEncryptionStatisticsDialogFragment.TAG
- )
- bottomSheetDialog = modalBottomSheet
-
- model.showZrtpSasValidationDialogEvent.observe(viewLifecycleOwner) {
- it.consume {
- callViewModel.showZrtpSasDialogIfPossible()
-
- modalBottomSheet.dismiss()
- bottomSheetDialog = null
- }
- }
- }
}
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 2c47830fd..e4a79987e 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
@@ -31,12 +31,10 @@ import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.CallActiveConferenceFragmentBinding
-import org.linphone.ui.call.model.CallMediaEncryptionModel
import org.linphone.ui.call.viewmodel.CallsViewModel
import org.linphone.ui.call.viewmodel.CurrentCallViewModel
import org.linphone.utils.Event
@@ -53,6 +51,17 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
private lateinit var callsViewModel: CallsViewModel
+ private val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
+ override fun onStateChanged(bottomSheet: View, newState: Int) {
+ if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
+ val bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
+ bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ }
+ }
+
+ override fun onSlide(bottomSheet: View, slideOffset: Float) { }
+ }
+
private val actionsBottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
if (newState == BottomSheetBehavior.STATE_EXPANDED) {
@@ -73,19 +82,6 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
override fun onSlide(bottomSheet: View, slideOffset: Float) { }
}
- private val callStatsBottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
- override fun onStateChanged(bottomSheet: View, newState: Int) {
- if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
- val callStatsBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
- callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
- }
- }
-
- override fun onSlide(bottomSheet: View, slideOffset: Float) { }
- }
-
- private var bottomSheetDialog: BottomSheetDialogFragment? = null
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -118,7 +114,13 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
val callStatsBottomSheetBehavior = BottomSheetBehavior.from(binding.callStats.root)
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
- callStatsBottomSheetBehavior.addBottomSheetCallback(callStatsBottomSheetCallback)
+ callStatsBottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
+
+ val callMediaEncryptionStatsBottomSheetBehavior = BottomSheetBehavior.from(
+ binding.callMediaEncryptionStats.root
+ )
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ callMediaEncryptionStatsBottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
callViewModel.callDuration.observe(viewLifecycleOwner) { duration ->
binding.chronometer.base = SystemClock.elapsedRealtime() - (1000 * duration)
@@ -152,6 +154,7 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
Log.i("$TAG Switching full screen mode to ${if (hide) "ON" else "OFF"}")
sharedViewModel.toggleFullScreenEvent.value = Event(hide)
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
}
callViewModel.conferenceModel.conferenceLayout.observe(viewLifecycleOwner) { layout ->
@@ -159,12 +162,6 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
}
- callViewModel.showMediaEncryptionStatisticsEvent.observe(viewLifecycleOwner) {
- it.consume { model ->
- showMediaEncryptionStatistics(model)
- }
- }
-
binding.setBackClickListener {
requireActivity().finish()
}
@@ -194,8 +191,15 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
binding.setCallStatisticsClickListener {
actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
}
+
+ binding.setCallMediaEncryptionStatisticsClickListener {
+ actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
+ callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
+ }
}
override fun onResume() {
@@ -206,20 +210,4 @@ class ActiveConferenceCallFragment : GenericCallFragment() {
callViewModel.updateCallDuration()
}
}
-
- override fun onPause() {
- super.onPause()
-
- bottomSheetDialog?.dismiss()
- bottomSheetDialog = null
- }
-
- private fun showMediaEncryptionStatistics(model: CallMediaEncryptionModel) {
- val modalBottomSheet = MediaEncryptionStatisticsDialogFragment(model)
- modalBottomSheet.show(
- requireActivity().supportFragmentManager,
- MediaEncryptionStatisticsDialogFragment.TAG
- )
- bottomSheetDialog = modalBottomSheet
- }
}
diff --git a/app/src/main/java/org/linphone/ui/call/fragment/CallStatisticsDialogFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/CallStatisticsDialogFragment.kt
deleted file mode 100644
index d903bc309..000000000
--- a/app/src/main/java/org/linphone/ui/call/fragment/CallStatisticsDialogFragment.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2010-2023 Belledonne Communications SARL.
- *
- * This file is part of linphone-android
- * (see https://www.linphone.org).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package org.linphone.ui.call.fragment
-
-import android.app.Dialog
-import android.content.DialogInterface
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.annotation.UiThread
-import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetDialog
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import org.linphone.databinding.CallStatsBottomSheetBindingImpl
-import org.linphone.ui.call.model.CallStatsModel
-
-@UiThread
-class CallStatisticsDialogFragment(
- private val model: CallStatsModel,
- private val onDismiss: (() -> Unit)? = null
-) : BottomSheetDialogFragment() {
- companion object {
- const val TAG = "CallStatisticsDialogFragment"
- }
-
- override fun onCancel(dialog: DialogInterface) {
- onDismiss?.invoke()
- super.onCancel(dialog)
- }
-
- override fun onDismiss(dialog: DialogInterface) {
- onDismiss?.invoke()
- super.onDismiss(dialog)
- }
-
- override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
- // Makes sure all menu entries are visible,
- // required for landscape mode (otherwise only first item is visible)
- dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
- return dialog
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- val view = CallStatsBottomSheetBindingImpl.inflate(layoutInflater)
- view.lifecycleOwner = viewLifecycleOwner
-
- view.model = model
-
- return view.root
- }
-}
diff --git a/app/src/main/java/org/linphone/ui/call/fragment/MediaEncryptionStatisticsDialogFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/MediaEncryptionStatisticsDialogFragment.kt
deleted file mode 100644
index ce758eada..000000000
--- a/app/src/main/java/org/linphone/ui/call/fragment/MediaEncryptionStatisticsDialogFragment.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2010-2023 Belledonne Communications SARL.
- *
- * This file is part of linphone-android
- * (see https://www.linphone.org).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package org.linphone.ui.call.fragment
-
-import android.app.Dialog
-import android.content.DialogInterface
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.annotation.UiThread
-import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetDialog
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import org.linphone.databinding.CallMediaEncryptionStatsBottomSheetBinding
-import org.linphone.ui.call.model.CallMediaEncryptionModel
-
-@UiThread
-class MediaEncryptionStatisticsDialogFragment(
- private val model: CallMediaEncryptionModel,
- private val onDismiss: (() -> Unit)? = null
-) : BottomSheetDialogFragment() {
- companion object {
- const val TAG = "MediaEncryptionStatisticsDialogFragment"
- }
-
- override fun onCancel(dialog: DialogInterface) {
- onDismiss?.invoke()
- super.onCancel(dialog)
- }
-
- override fun onDismiss(dialog: DialogInterface) {
- onDismiss?.invoke()
- super.onDismiss(dialog)
- }
-
- override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
- // Makes sure all menu entries are visible,
- // required for landscape mode (otherwise only first item is visible)
- dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
- return dialog
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- val view = CallMediaEncryptionStatsBottomSheetBinding.inflate(layoutInflater)
- view.lifecycleOwner = viewLifecycleOwner
-
- view.model = model
-
- return view.root
- }
-}
diff --git a/app/src/main/java/org/linphone/ui/call/model/CallMediaEncryptionModel.kt b/app/src/main/java/org/linphone/ui/call/model/CallMediaEncryptionModel.kt
index b2b644ca0..97cd407eb 100644
--- a/app/src/main/java/org/linphone/ui/call/model/CallMediaEncryptionModel.kt
+++ b/app/src/main/java/org/linphone/ui/call/model/CallMediaEncryptionModel.kt
@@ -28,7 +28,7 @@ import org.linphone.core.StreamType
import org.linphone.utils.AppUtils
import org.linphone.utils.Event
-class CallMediaEncryptionModel @WorkerThread constructor(call: Call) {
+class CallMediaEncryptionModel @WorkerThread constructor() {
val mediaEncryption = MutableLiveData()
val isMediaEncryptionZrtp = MutableLiveData()
@@ -42,7 +42,8 @@ class CallMediaEncryptionModel @WorkerThread constructor(call: Call) {
MutableLiveData>()
}
- init {
+ @WorkerThread
+ fun update(call: Call) {
isMediaEncryptionZrtp.postValue(false)
val stats = call.getStats(StreamType.Audio)
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 7d8e9e7b7..8aac3cfe9 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
@@ -106,6 +106,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
val callStatsModel = CallStatsModel()
+ val callMediaEncryptionModel = CallMediaEncryptionModel()
+
val incomingCallTitle: MutableLiveData by lazy {
MutableLiveData()
}
@@ -149,10 +151,6 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
MutableLiveData>>()
}
- val showMediaEncryptionStatisticsEvent: MutableLiveData> by lazy {
- MutableLiveData>()
- }
-
// Conference
val conferenceModel = ConferenceModel()
@@ -195,6 +193,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
@WorkerThread
override fun onEncryptionChanged(call: Call, on: Boolean, authenticationToken: String?) {
updateEncryption()
+ callMediaEncryptionModel.update(call)
}
override fun onRemoteRecording(call: Call, recording: Boolean) {
@@ -696,16 +695,6 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
}
}
- @UiThread
- fun showMediaEncryptionStatisticsIfPossible(): Boolean {
- coreContext.postOnCoreThread {
- val model = CallMediaEncryptionModel(currentCall)
- showMediaEncryptionStatisticsEvent.postValue(Event(model))
- }
-
- return true
- }
-
@WorkerThread
private fun showZrtpSasDialog(authToken: String) {
val upperCaseAuthToken = authToken.uppercase(Locale.getDefault())
@@ -777,6 +766,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
terminatedByUsed = false
currentCall = call
callStatsModel.update(call, call.audioStats)
+ callMediaEncryptionModel.update(call)
call.addListener(callListener)
if (call.conference != null) {
diff --git a/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml b/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml
index af28bb27f..476061914 100644
--- a/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml
+++ b/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml
@@ -4,98 +4,147 @@
+
-
+ android:background="@color/black"
+ android:visibility="@{viewModel.fullScreenMode || viewModel.pipMode ? View.INVISIBLE : View.VISIBLE}"
+ app:behavior_hideable="true"
+ app:behavior_peekHeight="0dp"
+ app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
-
+
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_marginStart="20dp"
+ android:layout_marginEnd="20dp"
+ android:layout_marginBottom="20dp"
+ android:background="@drawable/shape_squircle_gray_600_background"
+ app:columnCount="2"
+ app:layout_constraintTop_toBottomOf="@id/handle"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/call_stats_bottom_sheet.xml b/app/src/main/res/layout-land/call_stats_bottom_sheet.xml
index 31c565e8d..2f833b6d9 100644
--- a/app/src/main/res/layout-land/call_stats_bottom_sheet.xml
+++ b/app/src/main/res/layout-land/call_stats_bottom_sheet.xml
@@ -4,6 +4,9 @@
+
@@ -13,6 +16,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black"
+ android:visibility="@{viewModel.fullScreenMode || viewModel.pipMode ? View.INVISIBLE : View.VISIBLE}"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
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 ce701886e..662a76587 100644
--- a/app/src/main/res/layout/call_active_conference_fragment.xml
+++ b/app/src/main/res/layout/call_active_conference_fragment.xml
@@ -22,6 +22,9 @@
+
@@ -161,7 +164,7 @@
+
+
diff --git a/app/src/main/res/layout/call_active_fragment.xml b/app/src/main/res/layout/call_active_fragment.xml
index 2d18808c7..d7caf6d43 100644
--- a/app/src/main/res/layout/call_active_fragment.xml
+++ b/app/src/main/res/layout/call_active_fragment.xml
@@ -18,6 +18,9 @@
+
@@ -234,7 +237,7 @@
+
+
diff --git a/app/src/main/res/layout/call_ended_fragment.xml b/app/src/main/res/layout/call_ended_fragment.xml
index bc5785225..1a1da5d32 100644
--- a/app/src/main/res/layout/call_ended_fragment.xml
+++ b/app/src/main/res/layout/call_ended_fragment.xml
@@ -62,7 +62,6 @@
-
+
+
-
+ android:background="@color/black"
+ android:visibility="@{viewModel.fullScreenMode || viewModel.pipMode ? View.INVISIBLE : View.VISIBLE}"
+ app:behavior_hideable="true"
+ app:behavior_peekHeight="0dp"
+ app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
-
+
+
+ android:layout_marginStart="20dp"
+ android:layout_marginEnd="20dp"
+ android:layout_marginBottom="20dp"
+ android:background="@drawable/shape_squircle_gray_600_background"
+ app:layout_constraintTop_toBottomOf="@id/handle"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/call_stats_bottom_sheet.xml b/app/src/main/res/layout/call_stats_bottom_sheet.xml
index 12f86f295..22a7342fc 100644
--- a/app/src/main/res/layout/call_stats_bottom_sheet.xml
+++ b/app/src/main/res/layout/call_stats_bottom_sheet.xml
@@ -4,6 +4,9 @@
+
@@ -13,6 +16,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black"
+ android:visibility="@{viewModel.fullScreenMode || viewModel.pipMode ? View.INVISIBLE : View.VISIBLE}"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ef2917de8..26b7b19b3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -558,6 +558,7 @@
Resolution: %s
FPS: %s
+ Media encryption
Media encryption: %s
Post Quantum ZRTP
Cipher algorithm: %s