Skip to content

Commit

Permalink
feat: public internal apis and navigator saver relocated
Browse files Browse the repository at this point in the history
  • Loading branch information
DevSrSouza committed May 1, 2023
1 parent 07e50a1 commit ef603b2
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 29 deletions.
6 changes: 6 additions & 0 deletions buildSrc/src/main/kotlin/Setup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ fun Project.setupModuleForComposeMultiplatform(
if (withKotlinExplicitMode) {
explicitApi()
}
sourceSets {
all {
languageSettings.optIn("cafe.adriel.voyager.core.annotation.InternalVoyagerApi")
}
}

android {
publishAllLibraryVariants()
Expand Down Expand Up @@ -160,6 +165,7 @@ private fun KotlinJvmOptions.configureKotlinJvmOptions(
jvmTarget = JavaVersion.VERSION_1_8.toString()

if (enableExplicitMode) freeCompilerArgs += "-Xexplicit-api=strict"
freeCompilerArgs += "-opt-in=cafe.adriel.voyager.core.annotation.InternalVoyagerApi"
}

private fun Project.findAndroidExtension(): BaseExtension = extensions.findByType<LibraryExtension>()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package cafe.adriel.voyager.core.annotation

@Target(
allowedTargets = [
AnnotationTarget.CLASS,
AnnotationTarget.PROPERTY,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPEALIAS,
AnnotationTarget.CONSTRUCTOR,
]
)
@RequiresOptIn(
level = RequiresOptIn.Level.ERROR,
message = "This API is Voyager Internal. It may be changed in the future without notice."
)
public annotation class InternalVoyagerApi
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package cafe.adriel.voyager.navigator.internal
package cafe.adriel.voyager.navigator

import android.os.Parcelable
import androidx.compose.runtime.saveable.listSaver
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.Navigator

/**
* Navigator Saver that forces all Screens be [Parcelable], if not, it will throw a exception while trying to save
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.saveable.SaveableStateHolder
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import androidx.compose.runtime.staticCompositionLocalOf
import cafe.adriel.voyager.core.annotation.InternalVoyagerApi
import cafe.adriel.voyager.core.concurrent.ThreadSafeSet
import cafe.adriel.voyager.core.lifecycle.ScreenLifecycleStore
import cafe.adriel.voyager.core.lifecycle.rememberScreenLifecycleOwner
Expand Down Expand Up @@ -89,7 +90,7 @@ public fun Navigator(
}
}

public class Navigator internal constructor(
public class Navigator @InternalVoyagerApi constructor(
screens: List<Screen>,
private val stateHolder: SaveableStateHolder,
public val disposeBehavior: NavigatorDisposeBehavior,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,11 @@
package cafe.adriel.voyager.navigator.internal
package cafe.adriel.voyager.navigator

import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.SaveableStateHolder
import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.staticCompositionLocalOf
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior

internal val LocalNavigatorStateHolder: ProvidableCompositionLocal<SaveableStateHolder> =
staticCompositionLocalOf { error("LocalNavigatorStateHolder not initialized") }

public val LocalNavigatorSaver: ProvidableCompositionLocal<NavigatorSaver<*>> =
staticCompositionLocalOf { defaultNavigatorSaver() }
Expand All @@ -27,23 +19,6 @@ public fun interface NavigatorSaver<Saveable : Any> {
): Saver<Navigator, Saveable>
}

@Composable
internal fun rememberNavigator(
screens: List<Screen>,
disposeBehavior: NavigatorDisposeBehavior,
parent: Navigator?,
): Navigator {
val stateHolder = LocalNavigatorStateHolder.current
val navigatorSaver = LocalNavigatorSaver.current
val saver = remember(navigatorSaver, stateHolder, parent, disposeBehavior) {
navigatorSaver.saver(screens, stateHolder, disposeBehavior, parent)
}

return rememberSaveable(saver = saver) {
Navigator(screens, stateHolder, disposeBehavior, parent)
}
}

/**
* Default Navigator Saver expect that on Android, your screens can be saved, by default
* all [Screen]s are Java Serializable, this means that by default, if you only pass primitive types
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package cafe.adriel.voyager.navigator.internal

import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.SaveableStateHolder
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.staticCompositionLocalOf
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigatorSaver
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior

internal val LocalNavigatorStateHolder: ProvidableCompositionLocal<SaveableStateHolder> =
staticCompositionLocalOf { error("LocalNavigatorStateHolder not initialized") }

@Composable
internal fun rememberNavigator(
screens: List<Screen>,
disposeBehavior: NavigatorDisposeBehavior,
parent: Navigator?,
): Navigator {
val stateHolder = LocalNavigatorStateHolder.current
val navigatorSaver = LocalNavigatorSaver.current
val saver = remember(navigatorSaver, stateHolder, parent, disposeBehavior) {
navigatorSaver.saver(screens, stateHolder, disposeBehavior, parent)
}

return rememberSaveable(saver = saver) {
Navigator(screens, stateHolder, disposeBehavior, parent)
}
}

0 comments on commit ef603b2

Please sign in to comment.