Merge changes from topic "KMP-navigation-common" into androidx-main
* changes:
Add a multiplatform SynchronizedObject to the navigation-common.
Configure kotlin multiplatform build in the navigation-common.
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index d4298a1..b28ed69 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -246,7 +246,7 @@
docs(project(":mediarouter:mediarouter"))
docs(project(":mediarouter:mediarouter-testing"))
docs(project(":metrics:metrics-performance"))
- docs(project(":navigation:navigation-common"))
+ kmpDocs(project(":navigation:navigation-common"))
docs(project(":navigation:navigation-common-ktx"))
docs(project(":navigation:navigation-compose"))
docs(project(":navigation:navigation-dynamic-features-fragment"))
diff --git a/navigation/navigation-common/bcv/native/current.txt b/navigation/navigation-common/bcv/native/current.txt
new file mode 100644
index 0000000..0930ceb
--- /dev/null
+++ b/navigation/navigation-common/bcv/native/current.txt
@@ -0,0 +1,8 @@
+// Klib ABI Dump
+// Targets: [iosArm64, iosSimulatorArm64, iosX64, linuxArm64, linuxX64, macosArm64, macosX64]
+// Rendering settings:
+// - Signature version: 2
+// - Show manifest properties: true
+// - Show declarations: true
+
+// Library unique name: <androidx.navigation:navigation-common>
diff --git a/navigation/navigation-common/build.gradle b/navigation/navigation-common/build.gradle
index e657ad5..cc63769 100644
--- a/navigation/navigation-common/build.gradle
+++ b/navigation/navigation-common/build.gradle
@@ -24,14 +24,139 @@
import androidx.build.KotlinTarget
import androidx.build.LibraryType
+import androidx.build.PlatformIdentifier
+import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
+import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
plugins {
id("AndroidXPlugin")
id("com.android.library")
- id("kotlin-android")
alias(libs.plugins.kotlinSerialization)
}
+androidXMultiplatform {
+ android()
+ desktop()
+ mac()
+ linux()
+ ios()
+
+ defaultPlatform(PlatformIdentifier.ANDROID)
+
+ sourceSets {
+ configureEach {
+ languageSettings.optIn("kotlin.contracts.ExperimentalContracts")
+ }
+
+ commonMain {
+ dependencies {
+ api("androidx.annotation:annotation:1.8.1")
+ api("androidx.lifecycle:lifecycle-common:2.9.0-alpha07")
+ api("androidx.lifecycle:lifecycle-runtime:2.9.0-alpha07")
+ api("androidx.lifecycle:lifecycle-viewmodel:2.9.0-alpha07")
+ api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.0-alpha07")
+ api("androidx.savedstate:savedstate:1.3.0-alpha05")
+ api(libs.kotlinStdlib)
+ implementation("androidx.collection:collection:1.4.2")
+ implementation(libs.kotlinSerializationCore)
+ }
+ }
+ commonTest {
+ dependencies {
+ implementation(libs.kotlinTest)
+ }
+ }
+
+ nonAndroidMain {
+ dependsOn(commonMain)
+ }
+ nonAndroidTest {
+ dependsOn(commonTest)
+ }
+ jvmCommonMain {
+ dependsOn(commonMain)
+ }
+ jvmCommonTest {
+ dependsOn(commonTest)
+ }
+ desktopMain {
+ dependsOn(jvmCommonMain)
+ dependsOn(nonAndroidMain)
+ }
+ desktopTest {
+ dependsOn(jvmCommonTest)
+ dependsOn(nonAndroidTest)
+ }
+ androidMain {
+ dependsOn(jvmCommonMain)
+ dependencies {
+ api("androidx.lifecycle:lifecycle-runtime-ktx:2.9.0-alpha07")
+ api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.0-alpha07")
+ api("androidx.savedstate:savedstate-ktx:1.3.0-alpha05")
+ implementation("androidx.core:core-ktx:1.1.0")
+ implementation("androidx.profileinstaller:profileinstaller:1.4.0")
+ }
+ }
+
+ androidUnitTest {
+ dependsOn(commonTest)
+ dependencies {
+ implementation(project(":navigation:navigation-testing"))
+ implementation("androidx.arch.core:core-testing:2.2.0")
+ implementation(libs.junit)
+ implementation(libs.mockitoCore4)
+ implementation(libs.truth)
+ implementation(libs.kotlinCoroutinesCore)
+ implementation(libs.kotlinCoroutinesTest)
+ }
+ }
+
+ androidInstrumentedTest {
+ dependsOn(commonTest)
+ dependencies {
+ implementation(libs.junit)
+ implementation(libs.testExtJunit)
+ implementation(libs.testRunner)
+ implementation(libs.truth)
+ implementation(libs.mockitoCore)
+ implementation(libs.dexmakerMockito)
+ }
+ }
+
+ nonJvmCommonMain {
+ dependsOn(nonAndroidMain)
+ }
+
+ nonJvmCommonTest {
+ dependsOn(nonAndroidTest)
+ }
+
+ nativeMain {
+ dependsOn(nonJvmCommonMain)
+ }
+ linuxMain.dependsOn(nativeMain)
+ darwinMain.dependsOn(nativeMain)
+
+ nativeTest {
+ dependsOn(nonJvmCommonTest)
+ }
+ linuxTest.dependsOn(nativeTest)
+ darwinTest.dependsOn(nativeTest)
+
+ targets.configureEach { target ->
+ if (target.platformType == KotlinPlatformType.native) {
+ if (target.konanTarget.family.appleFamily) {
+ target.compilations["main"].defaultSourceSet.dependsOn(darwinMain)
+ target.compilations["test"].defaultSourceSet.dependsOn(darwinTest)
+ } else if (target.konanTarget.family == org.jetbrains.kotlin.konan.target.Family.LINUX) {
+ target.compilations["main"].defaultSourceSet.dependsOn(linuxMain)
+ target.compilations["test"].defaultSourceSet.dependsOn(linuxTest)
+ }
+ }
+ }
+ }
+}
+
android {
buildTypes.configureEach {
consumerProguardFiles "proguard-rules.pro"
@@ -40,39 +165,9 @@
}
dependencies {
- api("androidx.annotation:annotation:1.8.1")
- api("androidx.lifecycle:lifecycle-common:2.9.0-alpha07")
- api("androidx.lifecycle:lifecycle-runtime-ktx:2.9.0-alpha07")
- api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.0-alpha07")
- api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.0-alpha07")
- api("androidx.savedstate:savedstate-ktx:1.3.0-alpha05")
- api(libs.kotlinStdlib)
-
- implementation("androidx.core:core-ktx:1.1.0")
- implementation("androidx.collection:collection-ktx:1.4.2")
- implementation("androidx.profileinstaller:profileinstaller:1.4.0")
- implementation(libs.kotlinSerializationCore)
-
- testImplementation(project(":navigation:navigation-testing"))
- testImplementation("androidx.arch.core:core-testing:2.2.0")
- testImplementation(libs.junit)
- testImplementation(libs.mockitoCore4)
- testImplementation(libs.truth)
- testImplementation(libs.kotlinCoroutinesCore)
- testImplementation(libs.kotlinCoroutinesTest)
- testImplementation(libs.kotlinTest)
-
androidTestRuntimeOnly(libs.kotlinTestJunit)
androidTestRuntimeOnly(libs.testCore)
- androidTestImplementation(libs.junit)
- androidTestImplementation(libs.kotlinTest)
- androidTestImplementation(libs.testExtJunit)
- androidTestImplementation(libs.testRunner)
- androidTestImplementation(libs.truth)
- androidTestImplementation(libs.mockitoCore)
- androidTestImplementation(libs.dexmakerMockito)
-
lintPublish(project(":navigation:navigation-common-lint"))
}
diff --git a/navigation/navigation-common/src/androidTest/AndroidManifest.xml b/navigation/navigation-common/src/androidInstrumentedTest/AndroidManifest.xml
similarity index 100%
rename from navigation/navigation-common/src/androidTest/AndroidManifest.xml
rename to navigation/navigation-common/src/androidInstrumentedTest/AndroidManifest.xml
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/AddInDefaultArgsTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/AddInDefaultArgsTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavActionTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavActionTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavActionTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavActionTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavArgumentTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavArgumentTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkActionTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkActionTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkActionTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkActionTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkBuilderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkBuilderTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkMimeTypeTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkMimeTypeTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkMimeTypeTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkMimeTypeTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDeepLinkTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDestinationAndroidTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDestinationAndroidTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDestinationBuilderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavDestinationBuilderTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphAndroidTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphAndroidTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphBuilderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphBuilderTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavGraphTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavOptionsBuilderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavOptionsBuilderTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavTypeTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/NavTypeTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/RouteDecoderTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/RouteDecoderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/RouteDecoderTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/RouteDecoderTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/RouteFilledTest.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/RouteFilledTest.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/RouteFilledTest.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/RouteFilledTest.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/TestUtil.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/TestUtil.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/serialization/TestUtil.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/serialization/TestUtil.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/test/NavArgument.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/test/NavArgument.kt
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavDestination.kt b/navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/test/NavDestination.kt
similarity index 100%
rename from navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavDestination.kt
rename to navigation/navigation-common/src/androidInstrumentedTest/kotlin/androidx/navigation/test/NavDestination.kt
diff --git a/navigation/navigation-common/src/androidTest/res/values/ids.xml b/navigation/navigation-common/src/androidInstrumentedTest/res/values/ids.xml
similarity index 100%
rename from navigation/navigation-common/src/androidTest/res/values/ids.xml
rename to navigation/navigation-common/src/androidInstrumentedTest/res/values/ids.xml
diff --git a/navigation/navigation-common/src/main/AndroidManifest.xml b/navigation/navigation-common/src/androidMain/AndroidManifest.xml
similarity index 100%
rename from navigation/navigation-common/src/main/AndroidManifest.xml
rename to navigation/navigation-common/src/androidMain/AndroidManifest.xml
diff --git a/navigation/navigation-common/src/main/baseline-prof.txt b/navigation/navigation-common/src/androidMain/baseline-prof.txt
similarity index 100%
rename from navigation/navigation-common/src/main/baseline-prof.txt
rename to navigation/navigation-common/src/androidMain/baseline-prof.txt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/ActionOnlyNavDirections.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/ActionOnlyNavDirections.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/ActionOnlyNavDirections.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/ActionOnlyNavDirections.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/CollectionNavType.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/CollectionNavType.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/CollectionNavType.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/CollectionNavType.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/FloatingWindow.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/FloatingWindow.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/FloatingWindow.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/FloatingWindow.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NamedNavArgument.android.kt
similarity index 95%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NamedNavArgument.android.kt
index b8dce1c..7f26995 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NamedNavArgument.android.kt
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+@file:JvmName("NamedNavArgumentKt")
+@file:JvmMultifileClass
+
package androidx.navigation
/** Construct a new [NavArgument] */
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavAction.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavAction.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavAction.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavAction.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgs.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgs.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavArgs.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgs.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgsLazy.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgsLazy.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavArgsLazy.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgsLazy.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgument.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavArgument.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavBackStackEntry.android.kt
similarity index 98%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavBackStackEntry.android.kt
index 22ebc79..ea0139c 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavBackStackEntry.android.kt
@@ -13,6 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@file:JvmName("NavBackStackEntryKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import android.app.Application
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLink.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLink.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLinkDslBuilder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLinkDslBuilder.android.kt
similarity index 98%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLinkDslBuilder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLinkDslBuilder.android.kt
index 3739cf5..95b0e2a 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLinkDslBuilder.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLinkDslBuilder.android.kt
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+@file:JvmName("NavDeepLinkDslBuilderKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import androidx.navigation.serialization.generateRoutePattern
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLinkRequest.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLinkRequest.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLinkRequest.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDeepLinkRequest.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDestination.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDestination.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDestinationBuilder.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDestinationBuilder.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDirections.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDirections.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavDirections.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavDirections.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraph.android.kt
similarity index 99%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraph.android.kt
index 0528d54..dae2c7b 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraph.android.kt
@@ -13,6 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@file:JvmName("NavGraphKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import android.content.Context
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraphBuilder.android.kt
similarity index 98%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraphBuilder.android.kt
index 6a384a5..8aaef9e 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraphBuilder.android.kt
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+@file:JvmName("NavGraphBuilderKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import androidx.annotation.IdRes
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraphNavigator.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavGraphNavigator.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavOptions.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavOptions.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavOptionsBuilder.android.kt
similarity index 98%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavOptionsBuilder.android.kt
index 3e89268..d868d66 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavOptionsBuilder.android.kt
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+@file:JvmName("NavOptionsBuilderKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import androidx.annotation.AnimRes
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavType.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavViewModelStoreProvider.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavViewModelStoreProvider.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavViewModelStoreProvider.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavViewModelStoreProvider.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/Navigator.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/Navigator.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavigatorProvider.android.kt
similarity index 98%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavigatorProvider.android.kt
index 45e2de4..1e362ee 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavigatorProvider.android.kt
@@ -13,6 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@file:JvmName("NavigatorProviderKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import android.annotation.SuppressLint
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavigatorState.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NavigatorState.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NoOpNavigator.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NoOpNavigator.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/NoOpNavigator.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/NoOpNavigator.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/SavedStateHandle.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/SavedStateHandle.android.kt
similarity index 96%
rename from navigation/navigation-common/src/main/java/androidx/navigation/SavedStateHandle.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/SavedStateHandle.android.kt
index 936d04f..b0d2058 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/SavedStateHandle.kt
+++ b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/SavedStateHandle.android.kt
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+@file:JvmName("SavedStateHandleKt")
+@file:JvmMultifileClass
+
package androidx.navigation
import androidx.lifecycle.SavedStateHandle
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/SupportingPane.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/SupportingPane.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/SupportingPane.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/SupportingPane.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/NavTypeConverter.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/NavTypeConverter.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/NavTypeConverter.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/NavTypeConverter.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteBuilder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteBuilder.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteBuilder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteBuilder.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteDecoder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteDecoder.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteDecoder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteDecoder.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteDeserializer.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteDeserializer.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteDeserializer.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteDeserializer.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteEncoder.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteEncoder.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteEncoder.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteEncoder.android.kt
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteSerializer.kt b/navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteSerializer.android.kt
similarity index 100%
rename from navigation/navigation-common/src/main/java/androidx/navigation/serialization/RouteSerializer.kt
rename to navigation/navigation-common/src/androidMain/kotlin/androidx/navigation/serialization/RouteSerializer.android.kt
diff --git a/navigation/navigation-common/src/main/res-public/values/public_attrs.xml b/navigation/navigation-common/src/androidMain/res-public/values/public_attrs.xml
similarity index 100%
rename from navigation/navigation-common/src/main/res-public/values/public_attrs.xml
rename to navigation/navigation-common/src/androidMain/res-public/values/public_attrs.xml
diff --git a/navigation/navigation-common/src/main/res/values/attrs.xml b/navigation/navigation-common/src/androidMain/res/values/attrs.xml
similarity index 100%
rename from navigation/navigation-common/src/main/res/values/attrs.xml
rename to navigation/navigation-common/src/androidMain/res/values/attrs.xml
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/ActionOnlyNavDirectionsTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/ActionOnlyNavDirectionsTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/ActionOnlyNavDirectionsTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/ActionOnlyNavDirectionsTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavActionTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavActionTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/NavActionTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavActionTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavDestinationTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavDestinationTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavGraphNavigatorTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavGraphNavigatorTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavGraphTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavGraphTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavigatorProviderTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/NavigatorProviderTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavTypeConverterTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/NavTypeConverterTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavTypeConverterTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/NavTypeConverterTest.kt
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/serialization/RoutePatternTest.kt b/navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/RoutePatternTest.kt
similarity index 100%
rename from navigation/navigation-common/src/test/java/androidx/navigation/serialization/RoutePatternTest.kt
rename to navigation/navigation-common/src/androidUnitTest/kotlin/androidx/navigation/serialization/RoutePatternTest.kt
diff --git a/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/internal/SynchronizedObject.kt b/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/internal/SynchronizedObject.kt
new file mode 100644
index 0000000..b56f6af
--- /dev/null
+++ b/navigation/navigation-common/src/commonMain/kotlin/androidx/navigation/internal/SynchronizedObject.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.navigation.internal
+
+import kotlin.contracts.InvocationKind
+import kotlin.contracts.contract
+
+/**
+ * A [SynchronizedObject] provides a mechanism for thread coordination. Instances of this class are
+ * used within [synchronized] functions to establish mutual exclusion, guaranteeing that only one
+ * thread accesses a protected resource or code block at a time.
+ */
+internal expect class SynchronizedObject()
+
+/**
+ * Executes the given function [action] while holding the monitor of the given object [lock].
+ *
+ * The implementation is platform specific:
+ * - JVM: implemented via `synchronized`, `ReentrantLock` is avoided for performance reasons.
+ * - Native: implemented via POSIX mutex with `PTHREAD_MUTEX_RECURSIVE` flag.
+ */
+internal inline fun <T> synchronized(lock: SynchronizedObject, crossinline action: () -> T): T {
+ contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }
+ return synchronizedImpl(lock, action)
+}
+
+/**
+ * Executes the given function [action] while holding the monitor of the given object [lock].
+ *
+ * The implementation is platform specific:
+ * - JVM: implemented via `synchronized`, `ReentrantLock` is avoided for performance reasons.
+ * - Native: implemented via POSIX mutex with `PTHREAD_MUTEX_RECURSIVE` flag.
+ *
+ * **This is a private API and should not be used from general code.** This function exists
+ * primarily as a workaround for a Kotlin issue
+ * ([KT-29963](https://youtrack.jetbrains.com/issue/KT-29963)).
+ *
+ * You **MUST** use [synchronized] instead.
+ */
+internal expect inline fun <T> synchronizedImpl(
+ lock: SynchronizedObject,
+ crossinline action: () -> T,
+): T
diff --git a/navigation/navigation-common/src/darwinMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.darwin.kt b/navigation/navigation-common/src/darwinMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.darwin.kt
new file mode 100644
index 0000000..737eea9
--- /dev/null
+++ b/navigation/navigation-common/src/darwinMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.darwin.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.internal
+
+internal actual val PTHREAD_MUTEX_RECURSIVE: Int = platform.posix.PTHREAD_MUTEX_RECURSIVE.toInt()
diff --git a/navigation/navigation-common/src/jvmCommonMain/kotlin/androidx/navigation/internal/SynchronizedObject.jvmCommon.kt b/navigation/navigation-common/src/jvmCommonMain/kotlin/androidx/navigation/internal/SynchronizedObject.jvmCommon.kt
new file mode 100644
index 0000000..7e9a99d
--- /dev/null
+++ b/navigation/navigation-common/src/jvmCommonMain/kotlin/androidx/navigation/internal/SynchronizedObject.jvmCommon.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.internal
+
+internal actual class SynchronizedObject actual constructor()
+
+internal actual inline fun <T> synchronizedImpl(
+ lock: SynchronizedObject,
+ crossinline action: () -> T
+): T = kotlin.synchronized(lock, action)
diff --git a/navigation/navigation-common/src/linuxMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.linux.kt b/navigation/navigation-common/src/linuxMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.linux.kt
new file mode 100644
index 0000000..737eea9
--- /dev/null
+++ b/navigation/navigation-common/src/linuxMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.linux.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.internal
+
+internal actual val PTHREAD_MUTEX_RECURSIVE: Int = platform.posix.PTHREAD_MUTEX_RECURSIVE.toInt()
diff --git a/navigation/navigation-common/src/nativeMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.kt b/navigation/navigation-common/src/nativeMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.kt
new file mode 100644
index 0000000..fb32184
--- /dev/null
+++ b/navigation/navigation-common/src/nativeMain/kotlin/androidx/navigation/internal/SynchronizedObject.native.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.internal
+
+import kotlin.experimental.ExperimentalNativeApi
+import kotlin.native.ref.createCleaner
+import kotlinx.cinterop.Arena
+import kotlinx.cinterop.ExperimentalForeignApi
+import kotlinx.cinterop.alloc
+import kotlinx.cinterop.ptr
+import platform.posix.pthread_mutex_destroy
+import platform.posix.pthread_mutex_init
+import platform.posix.pthread_mutex_lock
+import platform.posix.pthread_mutex_t
+import platform.posix.pthread_mutex_unlock
+import platform.posix.pthread_mutexattr_destroy
+import platform.posix.pthread_mutexattr_init
+import platform.posix.pthread_mutexattr_settype
+import platform.posix.pthread_mutexattr_t
+
+/**
+ * Wrapper for platform.posix.PTHREAD_MUTEX_RECURSIVE which is represented as kotlin.Int on darwin
+ * platforms and kotlin.UInt on linuxX64 See: // https://youtrack.jetbrains.com/issue/KT-41509
+ */
+internal expect val PTHREAD_MUTEX_RECURSIVE: Int
+
+internal actual class SynchronizedObject actual constructor() {
+
+ private val resource = Resource()
+
+ @Suppress("unused") // The returned Cleaner must be assigned to a property
+ @OptIn(ExperimentalNativeApi::class)
+ private val cleaner = createCleaner(resource, Resource::dispose)
+
+ fun lock() {
+ resource.lock()
+ }
+
+ fun unlock() {
+ resource.unlock()
+ }
+
+ @OptIn(ExperimentalForeignApi::class)
+ private class Resource {
+ private val arena: Arena = Arena()
+ private val attr: pthread_mutexattr_t = arena.alloc()
+ private val mutex: pthread_mutex_t = arena.alloc()
+
+ init {
+ pthread_mutexattr_init(attr.ptr)
+ pthread_mutexattr_settype(attr.ptr, PTHREAD_MUTEX_RECURSIVE)
+ pthread_mutex_init(mutex.ptr, attr.ptr)
+ }
+
+ fun lock(): Int = pthread_mutex_lock(mutex.ptr)
+
+ fun unlock(): Int = pthread_mutex_unlock(mutex.ptr)
+
+ fun dispose() {
+ pthread_mutex_destroy(mutex.ptr)
+ pthread_mutexattr_destroy(attr.ptr)
+ arena.clear()
+ }
+ }
+}
+
+internal actual inline fun <T> synchronizedImpl(
+ lock: SynchronizedObject,
+ crossinline action: () -> T
+): T {
+ lock.lock()
+ return try {
+ action()
+ } finally {
+ lock.unlock()
+ }
+}