Skip to content

Commit

Permalink
Fix shadowed extension functions of NavController pt2
Browse files Browse the repository at this point in the history
  • Loading branch information
raamcosta committed Apr 27, 2024
1 parent 9e0b6af commit fef3f7e
Show file tree
Hide file tree
Showing 16 changed files with 227 additions and 287 deletions.
2 changes: 1 addition & 1 deletion compose-destinations/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,5 @@ tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach
}

dependencies {
implementation(libs.compose.navigation)
api(libs.compose.navigation)
}
Original file line number Diff line number Diff line change
@@ -1,46 +1,12 @@
package com.ramcosta.composedestinations.navigation

import androidx.annotation.MainThread
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.Navigator
import androidx.navigation.PopUpToBuilder
import com.ramcosta.composedestinations.spec.Direction
import com.ramcosta.composedestinations.spec.Route
import java.util.WeakHashMap

class DestinationsNavOptionsBuilder(
private val jetpackBuilder: NavOptionsBuilder
) {

var launchSingleTop
get() = jetpackBuilder.launchSingleTop
set(value) {
jetpackBuilder.launchSingleTop = value
}

var restoreState
get() = jetpackBuilder.restoreState
set(value) {
jetpackBuilder.restoreState = value
}

val popUpToRoute: String?
get() = jetpackBuilder.popUpToRoute

fun popUpTo(route: Route, popUpToBuilder: PopUpToBuilder.() -> Unit = {}) {
jetpackBuilder.popUpTo(route.route, popUpToBuilder)
}
}

private val navigators: WeakHashMap<NavController, DestinationsNavigator> = WeakHashMap()
val NavController.navigator: DestinationsNavigator
get(): DestinationsNavigator {
return navigators[this] ?: DestinationsNavController(this)
.also { navigators[this] = it }
}

import com.ramcosta.composedestinations.spec.RouteOrDirection

/**
* Implementation of [DestinationsNavigator] that uses
Expand Down Expand Up @@ -79,15 +45,19 @@ internal class DestinationsNavController(

@MainThread
override fun popBackStack(
route: Route,
route: RouteOrDirection,
inclusive: Boolean,
saveState: Boolean
): Boolean {
return navController.popBackStack(route.route, inclusive, saveState)
}

@MainThread
override fun clearBackStack(route: Route): Boolean {
override fun clearBackStack(route: RouteOrDirection): Boolean {
return navController.clearBackStack(route.route)
}

override fun getBackStackEntry(route: RouteOrDirection): NavBackStackEntry? {
return runCatching { navController.getBackStackEntry(route.route) }.getOrNull()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.ramcosta.composedestinations.navigation

import androidx.navigation.NavOptionsBuilder
import androidx.navigation.PopUpToBuilder
import com.ramcosta.composedestinations.spec.RouteOrDirection

/**
* Like [NavOptionsBuilder] but has Compose Destinations friendly
* version of its APIs.
*/
class DestinationsNavOptionsBuilder(
private val jetpackBuilder: NavOptionsBuilder
) {

/**
* @see [NavOptionsBuilder.launchSingleTop]
*/
var launchSingleTop
get() = jetpackBuilder.launchSingleTop
set(value) {
jetpackBuilder.launchSingleTop = value
}

/**
* @see [NavOptionsBuilder.restoreState]
*/
var restoreState
get() = jetpackBuilder.restoreState
set(value) {
jetpackBuilder.restoreState = value
}

/**
* @see [NavOptionsBuilder.popUpToRoute]
*/
val popUpToRoute: String?
get() = jetpackBuilder.popUpToRoute

/**
* Like [NavOptionsBuilder.popUpTo] but accepting a [com.ramcosta.composedestinations.spec.Route]
* or [com.ramcosta.composedestinations.spec.Direction] to pop up to.
*
* @see [NavOptionsBuilder.popUpTo]
*/
fun popUpTo(route: RouteOrDirection, popUpToBuilder: PopUpToBuilder.() -> Unit = {}) {
jetpackBuilder.popUpTo(route.route, popUpToBuilder)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.ramcosta.composedestinations.navigation

import androidx.annotation.MainThread
import androidx.compose.runtime.Stable
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.NavOptionsBuilder
Expand Down Expand Up @@ -81,4 +82,14 @@ interface DestinationsNavigator {
*/
@MainThread
fun clearBackStack(route: RouteOrDirection): Boolean

/**
* Like [NavController.getBackStackEntry] but returns null if [RouteOrDirection]
* is not in the back stack instead of throwing an exception.
*
* @see [NavController.getBackStackEntry]
*/
fun getBackStackEntry(
route: RouteOrDirection
): NavBackStackEntry?
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.ramcosta.composedestinations.navigation

import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import com.ramcosta.composedestinations.spec.Direction
import com.ramcosta.composedestinations.spec.Route
import com.ramcosta.composedestinations.spec.RouteOrDirection

/**
* Empty implementation of [DestinationsNavigator]
Expand All @@ -19,8 +20,10 @@ object EmptyDestinationsNavigator : DestinationsNavigator {

override fun popBackStack() = false

override fun popBackStack(route: Route, inclusive: Boolean, saveState: Boolean): Boolean = false
override fun popBackStack(route: RouteOrDirection, inclusive: Boolean, saveState: Boolean): Boolean = false

override fun clearBackStack(route: Route): Boolean = false
override fun clearBackStack(route: RouteOrDirection): Boolean = false

override fun getBackStackEntry(route: RouteOrDirection): NavBackStackEntry? = null

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ package com.ramcosta.composedestinations.result
*/
class EmptyResultBackNavigator<R> : ResultBackNavigator<R> {

override fun navigateBack(result: R, onlyIfResumed: Boolean) = Unit
override fun navigateBack(result: R) = Unit

override fun setResult(result: R) = Unit

override fun navigateBack(onlyIfResumed: Boolean) = Unit
override fun navigateBack() = Unit
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,8 @@ interface ResultBackNavigator<R> {
*
* Check [com.ramcosta.composedestinations.result.ResultRecipient] to see
* how to get the result.
*
* @param onlyIfResumed if true, will ignore the navigation action if the current `NavBackStackEntry`
* is not in the RESUMED state. This avoids duplicate navigation actions.
* By default is false to have the same behaviour as [NavController].
*/
fun navigateBack(
result: R,
onlyIfResumed: Boolean = false
)
fun navigateBack(result: R)

/**
* Sets a [result] to be sent on the next [navigateBack] call.
Expand All @@ -53,13 +46,9 @@ interface ResultBackNavigator<R> {

/**
* Goes back to previous destination sending the last result set with [setResult]
* or just navigating if no result was set..
* or just navigating if no result was set.
*
* It uses [NavController.navigateUp] internally to go back.
*
* @param onlyIfResumed if true, will ignore the navigation action if the current `NavBackStackEntry`
* is not in the RESUMED state. This avoids duplicate navigation actions.
* By default is false to have the same behaviour as [NavController].
*/
fun navigateBack(onlyIfResumed: Boolean = false)
fun navigateBack()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,19 @@ import androidx.compose.runtime.remember
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import com.ramcosta.composedestinations.spec.DestinationSpec

internal class ResultBackNavigatorImpl<R>(
private val navController: NavController,
private val navBackStackEntry: NavBackStackEntry,
resultOriginType: Class<out DestinationSpec>,
resultType: Class<R>
) : ResultBackNavigator<R> {

private val resultKey = resultKey(resultOriginType, resultType)
private val canceledKey = canceledKey(resultOriginType, resultType)

private val isResumed: Boolean
get() = navBackStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED

override fun navigateBack(
result: R,
onlyIfResumed: Boolean
) {
if (onlyIfResumed && !isResumed) {
return
}

override fun navigateBack(result: R) {
setResult(result)
navigateBack()
}
Expand All @@ -43,11 +31,7 @@ internal class ResultBackNavigatorImpl<R>(
}
}

override fun navigateBack(onlyIfResumed: Boolean) {
if (onlyIfResumed && !isResumed) {
return
}

override fun navigateBack() {
navController.navigateUp()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ internal fun <R> resultBackNavigator(
val backNavigator = remember(navController, navBackStackEntry, destination, resultType) {
ResultBackNavigatorImpl(
navController = navController,
navBackStackEntry = navBackStackEntry,
resultOriginType = if (destination is ExternalRoute) {
(destination.original as DestinationSpec).javaClass
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import com.ramcosta.composedestinations.navigation.DependenciesContainerBuilder
import com.ramcosta.composedestinations.navigation.DestinationDependenciesContainer
import com.ramcosta.composedestinations.navigation.DestinationDependenciesContainerImpl
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.navigator
import com.ramcosta.composedestinations.spec.TypedDestinationSpec
import com.ramcosta.composedestinations.utils.toDestinationsNavigator

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
abstract class DestinationScopeImpl<T> : DestinationScope<T> {
Expand All @@ -23,7 +23,7 @@ abstract class DestinationScopeImpl<T> : DestinationScope<T> {
}

override val destinationsNavigator: DestinationsNavigator
get() = navController.navigator
get() = navController.toDestinationsNavigator()

@Composable
override fun buildDependencies(): DestinationDependenciesContainer {
Expand All @@ -49,7 +49,7 @@ abstract class NavGraphBuilderDestinationScopeImpl<T> : NavGraphBuilderDestinati
}

override fun destinationsNavigator(navController: NavController): DestinationsNavigator {
return navController.navigator
return navController.toDestinationsNavigator()
}

private val isCurrentNavBackStackEntryResumed = { navBackStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED }
Expand Down

This file was deleted.

Loading

0 comments on commit fef3f7e

Please sign in to comment.