Close any expanded bottom sheet in call/conference fragment instead of leaving is user click/gesture back (except for back arrow at top)

This commit is contained in:
Sylvain Berfini 2024-08-07 17:04:33 +02:00
parent a7f868fe15
commit c8d9248e0c
2 changed files with 84 additions and 0 deletions

View file

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

View file

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