Fixed double back gesture required to leave conversations list when app is opened from shortcut

This commit is contained in:
Sylvain Berfini 2023-12-02 17:11:49 +01:00
parent ef1669dd4c
commit fd088fdbc8
3 changed files with 26 additions and 11 deletions

View file

@ -52,15 +52,16 @@ abstract class AbstractTopBarFragment : GenericFragment() {
abstract fun onDefaultAccountChanged()
fun initSlidingPane(slidingPane: SlidingPaneLayout) {
val slidingPaneBackPressedCallback = SlidingPaneBackPressedCallback(slidingPane)
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
slidingPaneBackPressedCallback
)
view?.doOnPreDraw {
slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
sharedViewModel.isSlidingPaneSlideable.value = slidingPane.isSlideable
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
SlidingPaneBackPressedCallback(slidingPane)
)
slidingPaneBackPressedCallback.isEnabled = slidingPane.isSlideable
}
sharedViewModel.closeSlidingPaneEvent.observe(

View file

@ -82,7 +82,11 @@ abstract class GenericFragment : Fragment() {
}
sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) {
onBackPressedCallback.isEnabled = backPressedCallBackEnabled()
val enabled = backPressedCallBackEnabled()
onBackPressedCallback.isEnabled = enabled
Log.d(
"$TAG ${getFragmentRealClassName()} Our own back press callback is ${if (enabled) "enabled" else "disabled"}"
)
}
requireActivity().onBackPressedDispatcher.addCallback(
@ -103,6 +107,7 @@ abstract class GenericFragment : Fragment() {
protected open fun goBack(): Boolean {
try {
Log.d("$TAG ${getFragmentRealClassName()} Calling onBackPressed on activity dispatcher")
requireActivity().onBackPressedDispatcher.onBackPressed()
} catch (ise: IllegalStateException) {
Log.w("$TAG ${getFragmentRealClassName()}.goBack() can't go back: $ise")
@ -115,14 +120,15 @@ abstract class GenericFragment : Fragment() {
// This allow to navigate a SlidingPane child nav graph.
// This only concerns fragments for which the nav graph is inside a SlidingPane layout.
// In our case it's all graphs except the main one.
if (!isSlidingPaneChild) return false
if (!isSlidingPaneChild) {
Log.d("$TAG ${getFragmentRealClassName()} isn't a sliding pane child, disable callback")
return false
}
val isSlidingPaneFlat = sharedViewModel.isSlidingPaneSlideable.value == false
Log.d(
"$TAG ${getFragmentRealClassName()} isSlidingPaneFlat ? $isSlidingPaneFlat"
)
if (isSlidingPaneFlat) return false
return true
return !isSlidingPaneFlat
}
}

View file

@ -23,6 +23,7 @@ import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.annotation.UiThread
import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.linphone.core.tools.Log
@UiThread
class SlidingPaneBackPressedCallback(private val slidingPaneLayout: SlidingPaneLayout) :
@ -30,25 +31,32 @@ class SlidingPaneBackPressedCallback(private val slidingPaneLayout: SlidingPaneL
slidingPaneLayout.isSlideable && slidingPaneLayout.isOpen
),
SlidingPaneLayout.PanelSlideListener {
companion object {
private const val TAG = "[Sliding Pane Back Pressed Callback]"
}
init {
slidingPaneLayout.addPanelSlideListener(this)
}
override fun handleOnBackPressed() {
Log.d("$TAG handleOnBackPressed: hiding keyboard & closing pane")
slidingPaneLayout.hideKeyboard()
slidingPaneLayout.closePane()
}
override fun onPanelOpened(panel: View) {
Log.d("$TAG Panel is opened, enabling back press callback")
isEnabled = true
}
override fun onPanelClosed(panel: View) {
Log.d("$TAG Panel is closed, disabled back press callback")
isEnabled = false
}
override fun onPanelSlide(panel: View, slideOffset: Float) {
Log.d("$TAG Panel is sliding, enabling back press callback")
isEnabled = true
}
}