mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-04-16 11:41:41 +00:00
Fix back button behavior
This commit is contained in:
parent
6a10cc9c55
commit
5c5625911d
@ -43,12 +43,11 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
override val navHostId: Int = R.id.main_nav_host
|
override val navHostId: Int = R.id.main_nav_host
|
||||||
override val defaultPosition: Int = 0
|
override val defaultPosition: Int = 0
|
||||||
|
|
||||||
private val navigationController get() = if (navHostId == 0) null else _navigationController
|
private val navigationController by lazy {
|
||||||
private val _navigationController by lazy {
|
|
||||||
FragNavController(supportFragmentManager, navHostId)
|
FragNavController(supportFragmentManager, navHostId)
|
||||||
}
|
}
|
||||||
private val isRootFragment get() =
|
private val isRootFragment get() =
|
||||||
navigationController?.let { it.currentStackIndex != defaultPosition } ?: false
|
navigationController.currentStackIndex != defaultPosition
|
||||||
|
|
||||||
override val baseFragments: List<KClass<out Fragment>> = listOf(
|
override val baseFragments: List<KClass<out Fragment>> = listOf(
|
||||||
HomeFragment::class,
|
HomeFragment::class,
|
||||||
@ -68,7 +67,7 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
navigationController?.apply {
|
navigationController.apply {
|
||||||
rootFragmentListener = this@MainActivity
|
rootFragmentListener = this@MainActivity
|
||||||
transactionListener = this@MainActivity
|
transactionListener = this@MainActivity
|
||||||
initialize(defaultPosition, savedInstanceState)
|
initialize(defaultPosition, savedInstanceState)
|
||||||
@ -90,7 +89,7 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
super.onSaveInstanceState(outState)
|
super.onSaveInstanceState(outState)
|
||||||
navigationController?.onSaveInstanceState(outState)
|
navigationController.onSaveInstanceState(outState)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setTitle(title: CharSequence?) {
|
override fun setTitle(title: CharSequence?) {
|
||||||
@ -102,30 +101,28 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
val fragment = navigationController?.currentFrag as? BaseFragment<*, *>
|
|
||||||
|
|
||||||
if (fragment?.onBackPressed() == true) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
navigationController?.popFragment() ?: throw UnsupportedOperationException()
|
|
||||||
} catch (e: UnsupportedOperationException) {
|
|
||||||
when {
|
|
||||||
isRootFragment -> {
|
|
||||||
val options = FragNavTransactionOptions.newBuilder()
|
|
||||||
.transition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
|
|
||||||
.build()
|
|
||||||
navigationController?.switchTab(defaultPosition, options)
|
|
||||||
}
|
|
||||||
else -> super.onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binding.drawerLayout.isDrawerOpen(binding.navView)) {
|
if (binding.drawerLayout.isDrawerOpen(binding.navView)) {
|
||||||
binding.drawerLayout.closeDrawer(binding.navView)
|
binding.drawerLayout.closeDrawer(binding.navView)
|
||||||
} else {
|
} else {
|
||||||
super.onBackPressed()
|
val fragment = navigationController.currentFrag as? BaseFragment<*, *>
|
||||||
|
|
||||||
|
if (fragment?.onBackPressed() == true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
navigationController.popFragment()
|
||||||
|
} catch (e: UnsupportedOperationException) {
|
||||||
|
when {
|
||||||
|
isRootFragment -> {
|
||||||
|
val options = FragNavTransactionOptions.newBuilder()
|
||||||
|
.transition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
|
||||||
|
.build()
|
||||||
|
navigationController.switchTab(defaultPosition, options)
|
||||||
|
}
|
||||||
|
else -> super.onBackPressed()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,15 +194,15 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
override fun navigateTo(event: MagiskNavigationEvent) {
|
override fun navigateTo(event: MagiskNavigationEvent) {
|
||||||
val directions = event.navDirections
|
val directions = event.navDirections
|
||||||
|
|
||||||
navigationController?.defaultTransactionOptions = FragNavTransactionOptions.newBuilder()
|
navigationController.defaultTransactionOptions = FragNavTransactionOptions.newBuilder()
|
||||||
.customAnimations(event.animOptions)
|
.customAnimations(event.animOptions)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
navigationController?.currentStack
|
navigationController.currentStack
|
||||||
?.indexOfFirst { it.javaClass == event.navOptions.popUpTo }
|
?.indexOfFirst { it.javaClass == event.navOptions.popUpTo }
|
||||||
?.let { if (it == -1) null else it } // invalidate if class is not found
|
?.let { if (it == -1) null else it } // invalidate if class is not found
|
||||||
?.let { if (event.navOptions.inclusive) it + 1 else it }
|
?.let { if (event.navOptions.inclusive) it + 1 else it }
|
||||||
?.let { navigationController?.popFragments(it) }
|
?.let { navigationController.popFragments(it) }
|
||||||
|
|
||||||
when (directions.isActivity) {
|
when (directions.isActivity) {
|
||||||
true -> navigateToActivity(event)
|
true -> navigateToActivity(event)
|
||||||
@ -238,9 +235,9 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
|||||||
when (val index = baseFragments.indexOfFirst { it.java.name == destination.name }) {
|
when (val index = baseFragments.indexOfFirst { it.java.name == destination.name }) {
|
||||||
-1 -> destination.newInstance()
|
-1 -> destination.newInstance()
|
||||||
.apply { arguments = event.navDirections.args }
|
.apply { arguments = event.navDirections.args }
|
||||||
.let { navigationController?.pushFragment(it) }
|
.let { navigationController.pushFragment(it) }
|
||||||
// When it's desired that fragments of same class are put on top of one another edit this
|
// When it's desired that fragments of same class are put on top of one another edit this
|
||||||
else -> navigationController?.switchTab(index)
|
else -> navigationController.switchTab(index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user