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