From fd088fdbc819c5c94b641dd64713e466513a617f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Sat, 2 Dec 2023 17:11:49 +0100 Subject: [PATCH] Fixed double back gesture required to leave conversations list when app is opened from shortcut --- .../ui/main/fragment/AbstractTopBarFragment.kt | 13 +++++++------ .../linphone/ui/main/fragment/GenericFragment.kt | 16 +++++++++++----- .../utils/SlidingPaneBackPressCallback.kt | 8 ++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt index 5eeaa8a36..901db6d5e 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt @@ -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( diff --git a/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt index c6fa55921..1c07298d6 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt @@ -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 } } diff --git a/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt b/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt index b6e969830..d7f607a80 100644 --- a/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt +++ b/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt @@ -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 } }