import com.android.build.api.dsl.ManagedVirtualDevice import org.jetbrains.compose.ExperimentalComposeLibrary import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree plugins { alias(libs.plugins.multiplatform) alias(libs.plugins.compose.compiler) alias(libs.plugins.compose) alias(libs.plugins.android.application) alias(libs.plugins.kotlinx.serialization) } kotlin { // export correct artifact to use all classes of library directly from Swift targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java).all { binaries.withType(org.jetbrains.kotlin.gradle.plugin.mpp.Framework::class.java).all { export("dev.icerock.moko:mvvm-core:0.16.1") export("dev.icerock.moko:mvvm-state:0.16.1") } } androidTarget { compilations.all { compileTaskProvider { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) //https://jakewharton.com/gradle-toolchains-are-rarely-a-good-idea/#what-do-i-do freeCompilerArgs.add("-Xjdk-release=${JavaVersion.VERSION_17}") } } } //https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-test.html @OptIn(ExperimentalKotlinGradlePluginApi::class) instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) } jvm() listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "ComposeApp" isStatic = true } } sourceSets { commonMain.dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) implementation(compose.materialIconsExtended) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) implementation(libs.voyager.navigator) implementation(libs.voyager.transitions) implementation(libs.coil) implementation(libs.coil.network.ktor) implementation(libs.kotlinx.coroutines.core) implementation(libs.ktor.core) implementation(libs.ktor.client.cio) implementation(libs.kotlinx.serialization.json) implementation(libs.multiplatformSettings) implementation(libs.koin.core) implementation(libs.koin.compose) implementation("org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0") } commonTest.dependencies { implementation(kotlin("test")) @OptIn(ExperimentalComposeLibrary::class) implementation(compose.uiTest) implementation(libs.kotlinx.coroutines.test) } androidMain.dependencies { implementation(compose.uiTooling) implementation(libs.androidx.activityCompose) implementation(libs.kotlinx.coroutines.android) implementation(libs.ktor.client.okhttp) } jvmMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutines.swing) implementation(libs.ktor.client.okhttp) } iosMain.dependencies { implementation(libs.ktor.client.darwin) } } } android { namespace = "dev.meloda.overseerr" compileSdk = 34 defaultConfig { minSdk = 26 targetSdk = 34 applicationId = "dev.meloda.overseerr.androidApp" versionCode = 1 versionName = "1.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } //https://developer.android.com/studio/test/gradle-managed-devices @Suppress("UnstableApiUsage") testOptions { managedDevices.devices { maybeCreate("pixel5").apply { device = "Pixel 5" apiLevel = 34 systemImageSource = "aosp" } } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } } //https://developer.android.com/develop/ui/compose/testing#setup dependencies { androidTestImplementation(libs.androidx.uitest.junit4) debugImplementation(libs.androidx.uitest.testManifest) //temporary fix: https://youtrack.jetbrains.com/issue/CMP-5864 androidTestImplementation("androidx.test:monitor") { version { strictly("1.6.1") } } } compose.desktop { application { mainClass = "MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "dev.meloda.overseerr.desktopApp" packageVersion = "1.0.0" } } }