From c8d9248e0c49a701f3cadcd345e7989d5311cab6 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Aug 2024 17:04:33 +0200 Subject: [PATCH] Close any expanded bottom sheet in call/conference fragment instead of leaving is user click/gesture back (except for back arrow at top) --- .../fragment/ActiveConferenceCallFragment.kt | 38 +++++++++++++++ .../ui/call/fragment/ActiveCallFragment.kt | 46 +++++++++++++++++++ 2 files changed, 84 insertions(+) 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 fd8a56c94..517103c7f 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 @@ -29,6 +29,7 @@ import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat @@ -101,6 +102,38 @@ class ActiveConferenceCallFragment : GenericCallFragment() { } } + private val backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val actionsBottomSheetBehavior = BottomSheetBehavior.from(binding.bottomBar.root) + if (actionsBottomSheetBehavior.state != BottomSheetBehavior.STATE_COLLAPSED) { + actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + return + } + + val callStatsBottomSheetBehavior = BottomSheetBehavior.from(binding.callStats.root) + if (callStatsBottomSheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) { + callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN + return + } + + val callMediaEncryptionStatsBottomSheetBehavior = BottomSheetBehavior.from( + binding.callMediaEncryptionStats.root + ) + if (callMediaEncryptionStatsBottomSheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) { + callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN + return + } + + Log.i("$TAG Back gesture/click detected, no bottom sheet is expanded, going back") + isEnabled = false + try { + requireActivity().onBackPressedDispatcher.onBackPressed() + } catch (ise: IllegalStateException) { + Log.w("$TAG Can't go back: $ise") + } + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -240,6 +273,11 @@ class ActiveConferenceCallFragment : GenericCallFragment() { callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED } + + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + backPressedCallback + ) } @SuppressLint("ClickableViewAccessibility") 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 d34548017..2200f2e4d 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 @@ -29,6 +29,7 @@ import android.view.View import android.view.ViewGroup import android.view.animation.Animation import android.view.animation.AnimationUtils +import androidx.activity.OnBackPressedCallback import androidx.annotation.UiThread import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.ViewModelProvider @@ -114,6 +115,46 @@ class ActiveCallFragment : GenericCallFragment() { override fun onSlide(bottomSheet: View, slideOffset: Float) { } } + private val backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val actionsBottomSheetBehavior = BottomSheetBehavior.from(binding.bottomBar.root) + if (actionsBottomSheetBehavior.state != BottomSheetBehavior.STATE_COLLAPSED) { + actionsBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + return + } + + val numpadBottomSheetBehavior = BottomSheetBehavior.from(binding.callNumpad.root) + if (numpadBottomSheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) { + numpadBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN + return + } + + val callStatsBottomSheetBehavior = BottomSheetBehavior.from(binding.callStats.root) + if (callStatsBottomSheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) { + callStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN + return + } + + val callMediaEncryptionStatsBottomSheetBehavior = BottomSheetBehavior.from( + binding.callMediaEncryptionStats.root + ) + if (callMediaEncryptionStatsBottomSheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) { + callMediaEncryptionStatsBottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN + return + } + + Log.i("$TAG Back gesture/click detected, no bottom sheet is expanded, going back") + isEnabled = false + try { + requireActivity().onBackPressedDispatcher.onBackPressed() + } catch (ise: IllegalStateException) { + Log.w( + "$TAG Can't go back: $ise" + ) + } + } + } + override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { return when (findNavController().currentDestination?.id) { R.id.newCallFragment, R.id.callsListFragment, R.id.transferCallFragment, R.id.inCallConversationFragment -> { @@ -369,6 +410,11 @@ class ActiveCallFragment : GenericCallFragment() { } } } + + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + backPressedCallback + ) } @SuppressLint("ClickableViewAccessibility")