diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt index 66864dda3..5628e3472 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt @@ -66,10 +66,10 @@ class CallFragment : GenericFragment() { return binding.root } - override fun goBack() { + override fun goBack(): Boolean { sharedViewModel.closeSlidingPaneEvent.value = Event(true) // If not done, when going back to CallsFragment this fragment will be created again - findNavController().popBackStack() + return findNavController().popBackStack() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt index 6c9754f65..0c14345b7 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt @@ -26,7 +26,6 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw -import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -94,10 +93,6 @@ class StartCallFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) postponeEnterTransition() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index fcf23746e..0eb5f6cfd 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -71,10 +71,10 @@ class ContactFragment : GenericFragment() { return binding.root } - override fun goBack() { + override fun goBack(): Boolean { sharedViewModel.closeSlidingPaneEvent.value = Event(true) // If not done, when going back to ContactsFragment this fragment will be created again - findNavController().popBackStack() + return findNavController().popBackStack() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index 3248b2158..64599d518 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -31,7 +31,6 @@ import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.navigation.navGraphViewModels import kotlinx.coroutines.launch @@ -89,10 +88,6 @@ class EditContactFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) postponeEnterTransition() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 0462aa459..52c3f8cff 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -31,7 +31,6 @@ import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import kotlinx.coroutines.launch import org.linphone.BR @@ -95,10 +94,6 @@ class NewContactFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt index d1aa7f8ff..ff98c7cfb 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt @@ -60,9 +60,6 @@ class DrawerMenuFragment : GenericFragment() { return binding.root } - override fun goBack() { - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) 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 bed6b2a72..188631bfd 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 @@ -21,7 +21,6 @@ package org.linphone.ui.main.fragment import android.os.Bundle import android.view.View -import android.widget.ImageView import androidx.activity.OnBackPressedCallback import androidx.annotation.UiThread import androidx.fragment.app.Fragment @@ -41,18 +40,29 @@ abstract class GenericFragment : Fragment() { private val onBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { + Log.d("$TAG ${getFragmentRealClassName()} handleOnBackPressed") try { - val navController = findNavController() - Log.d("$TAG ${getFragmentRealClassName()} handleOnBackPressed") - if (!navController.popBackStack()) { - Log.d("$TAG ${getFragmentRealClassName()} couldn't pop") - if (!navController.navigateUp()) { - Log.d( - "$TAG ${getFragmentRealClassName()} couldn't navigate up" - ) - // Disable this callback & start a new back press event - isEnabled = false - goBack() + if (!goBack()) { + Log.d( + "$TAG ${getFragmentRealClassName()}'s goBack() method returned false, trying other things" + ) + val navController = findNavController() + if (!navController.popBackStack()) { + Log.d("$TAG ${getFragmentRealClassName()} couldn't pop") + if (!navController.navigateUp()) { + Log.d( + "$TAG ${getFragmentRealClassName()} couldn't navigate up" + ) + // Disable this callback & start a new back press event + isEnabled = false + try { + requireActivity().onBackPressedDispatcher.onBackPressed() + } catch (ise: IllegalStateException) { + Log.w( + "$TAG ${getFragmentRealClassName()}.goBack() can't go back: $ise" + ) + } + } } } } catch (ise: IllegalStateException) { @@ -71,13 +81,13 @@ abstract class GenericFragment : Fragment() { } sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { - Log.d( - "$TAG ${getFragmentRealClassName()} shared main VM sliding pane has changed" - ) onBackPressedCallback.isEnabled = backPressedCallBackEnabled() } - setupBackPressCallback() + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + onBackPressedCallback + ) } override fun onDestroyView() { @@ -90,33 +100,14 @@ abstract class GenericFragment : Fragment() { return this.javaClass.name } - protected open fun goBack() { + protected open fun goBack(): Boolean { try { requireActivity().onBackPressedDispatcher.onBackPressed() } catch (ise: IllegalStateException) { Log.w("$TAG ${getFragmentRealClassName()}.goBack() can't go back: $ise") onBackPressedCallback.handleOnBackPressed() } - } - - private fun setupBackPressCallback() { - Log.d("$TAG ${getFragmentRealClassName()} setupBackPressCallback") - - val backButton = view?.findViewById(R.id.back) - if (backButton != null && backButton.visibility == View.VISIBLE) { - Log.d("$TAG ${getFragmentRealClassName()} found back button") - // If popping navigation back stack entry would bring us to an "empty" fragment - // then don't do it if sliding pane layout isn't "flat" - onBackPressedCallback.isEnabled = backPressedCallBackEnabled() - backButton.setOnClickListener { goBack() } - } else { - onBackPressedCallback.isEnabled = false - } - - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - onBackPressedCallback - ) + return true } private fun backPressedCallBackEnabled(): Boolean { @@ -129,12 +120,8 @@ abstract class GenericFragment : Fragment() { Log.d( "$TAG ${getFragmentRealClassName()} isSlidingPaneFlat ? $isSlidingPaneFlat" ) - val isPreviousFragmentEmpty = findNavController().previousBackStackEntry?.destination?.id == R.id.emptyFragment - Log.d( - "$TAG ${getFragmentRealClassName()} isPreviousFragmentEmpty ? $isPreviousFragmentEmpty" - ) - val popBackStack = isSlidingPaneFlat || !isPreviousFragmentEmpty - Log.d("$TAG ${getFragmentRealClassName()} popBackStack ? $popBackStack") - return popBackStack + if (isSlidingPaneFlat) return false + + return true } } diff --git a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt index 78cc0c7cf..58645fd59 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.navigation.fragment.findNavController import org.linphone.databinding.RecordingsFragmentBinding import org.linphone.ui.main.fragment.GenericFragment @@ -21,10 +20,6 @@ class RecordingsFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index 7c152ec28..b23b58c74 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -9,7 +9,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.navigation.navGraphViewModels import kotlinx.coroutines.launch @@ -62,10 +61,6 @@ class AccountProfileFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) postponeEnterTransition() diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt index 0be9c0dcd..d5f1c5576 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.navigation.fragment.findNavController import org.linphone.databinding.HelpFragmentBinding import org.linphone.ui.main.fragment.GenericFragment @@ -22,10 +21,6 @@ class HelpFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index 5920ae4c6..8ec0e54ad 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.navigation.fragment.findNavController import org.linphone.databinding.SettingsFragmentBinding import org.linphone.ui.main.fragment.GenericFragment @@ -22,10 +21,6 @@ class SettingsFragment : GenericFragment() { return binding.root } - override fun goBack() { - findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner