48 lines
2.0 KiB
Kotlin
48 lines
2.0 KiB
Kotlin
package androidx.navigation.ui
|
|
|
|
import android.view.Menu
|
|
import android.view.MenuItem
|
|
import androidx.annotation.IdRes
|
|
import androidx.navigation.ActivityNavigator
|
|
import androidx.navigation.NavController
|
|
import androidx.navigation.NavDestination
|
|
import androidx.navigation.NavDestination.Companion.hierarchy
|
|
import androidx.navigation.NavGraph.Companion.findStartDestination
|
|
import androidx.navigation.NavOptions
|
|
|
|
fun onNavDestinationSelected2(item: MenuItem, navController: NavController): Boolean {
|
|
val builder = NavOptions.Builder().setLaunchSingleTop(true)
|
|
if (
|
|
navController.currentDestination!!.parent!!.findNode(item.itemId)
|
|
is ActivityNavigator.Destination
|
|
) {
|
|
builder.setEnterAnim(R.anim.nav_default_enter_anim)
|
|
.setExitAnim(R.anim.nav_default_exit_anim)
|
|
.setPopEnterAnim(R.anim.nav_default_pop_enter_anim)
|
|
.setPopExitAnim(R.anim.nav_default_pop_exit_anim)
|
|
} else {
|
|
builder.setEnterAnim(com.hippo.ehviewer.R.anim.scene_open_enter)
|
|
.setExitAnim(com.hippo.ehviewer.R.anim.scene_open_exit)
|
|
.setPopEnterAnim(com.hippo.ehviewer.R.anim.scene_close_enter)
|
|
.setPopExitAnim(com.hippo.ehviewer.R.anim.scene_close_exit)
|
|
}
|
|
if (item.order and Menu.CATEGORY_SECONDARY == 0) {
|
|
builder.setPopUpTo(
|
|
navController.graph.findStartDestination().id,
|
|
inclusive = false,
|
|
saveState = false
|
|
)
|
|
}
|
|
val options = builder.build()
|
|
return try {
|
|
// TODO provide proper API instead of using Exceptions as Control-Flow.
|
|
navController.navigate(item.itemId, null, options)
|
|
// Return true only if the destination we've navigated to matches the MenuItem
|
|
navController.currentDestination?.matchDestination(item.itemId) == true
|
|
} catch (e: IllegalArgumentException) {
|
|
false
|
|
}
|
|
}
|
|
|
|
fun NavDestination.matchDestination(@IdRes destId: Int): Boolean =
|
|
hierarchy.any { it.id == destId } |