Simplified generic fragment logic for going back

This commit is contained in:
Sylvain Berfini 2023-09-09 18:55:02 +02:00
parent b6f8fb3354
commit 5845c079cb
11 changed files with 35 additions and 86 deletions

View file

@ -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?) {

View file

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

View file

@ -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?) {

View file

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

View file

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

View file

@ -60,9 +60,6 @@ class DrawerMenuFragment : GenericFragment() {
return binding.root
}
override fun goBack() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

View file

@ -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<ImageView>(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
}
}

View file

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

View file

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

View file

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

View file

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