import org.jetbrains.compose.ExperimentalComposeLibrary import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.util.* plugins { alias(libs.plugins.multiplatform) alias(libs.plugins.compose.compiler) alias(libs.plugins.compose) alias(libs.plugins.compose.hot.reload) alias(libs.plugins.android.application) alias(libs.plugins.kotlinx.serialization) } kotlin { androidTarget { compilerOptions { jvmTarget.set(JvmTarget.JVM_21) } } jvm() listOf( iosArm64(), iosSimulatorArm64() ).forEach { iosTarget -> iosTarget.binaries.framework { baseName = "ComposeApp" isStatic = true } } js { browser() binaries.executable() } @OptIn(ExperimentalWasmDsl::class) wasmJs { browser() binaries.executable() } sourceSets { androidMain.dependencies { implementation(compose.preview) implementation(libs.androidx.activityCompose) implementation(libs.kotlinx.coroutines.android) implementation(libs.ktor.client.okhttp) implementation(libs.kstore.file) } commonMain.dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) implementation(compose.materialIconsExtended) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) implementation(libs.androidx.navigation.compose) implementation(libs.coil) implementation(libs.coil.network.ktor) implementation(libs.kotlinx.coroutines.core) implementation(libs.ktor.client.core) implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.json) implementation(libs.koin.core) implementation(libs.koin.compose) implementation(libs.koin.compose.viewmodel) implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.haze) implementation(libs.haze.materials) implementation(libs.kstore) implementation(libs.napier) } commonTest.dependencies { implementation(libs.kotlin.test) @OptIn(ExperimentalComposeLibrary::class) implementation(compose.uiTest) implementation(libs.kotlinx.coroutines.test) } jvmMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutines.swing) implementation(libs.ktor.client.okhttp) implementation(libs.appdirs) implementation(libs.kstore.file) } iosMain.dependencies { implementation(libs.ktor.client.darwin) implementation(libs.kstore.file) } webMain.dependencies { implementation(libs.kstore.storage) implementation(libs.ktor.client.js) } } } android { namespace = "dev.meloda.overseerr" compileSdk = 36 defaultConfig { minSdk = 26 targetSdk = 36 applicationId = "dev.meloda.overseerr" versionCode = 1 versionName = "1.0.0" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } signingConfigs { create("release") { val keystoreProperties = Properties() val keystorePropertiesFile = file("./src/androidMain/keystore/keystore.properties") storeFile = file("./src/androidMain/keystore/keystore.jks") if (keystorePropertiesFile.exists()) { keystorePropertiesFile.inputStream().let(keystoreProperties::load) storePassword = keystoreProperties.getProperty("storePassword") keyAlias = keystoreProperties.getProperty("keyAlias") keyPassword = keystoreProperties.getProperty("keyPassword") } else { storePassword = System.getenv("KEYSTORE_PASSWORD") keyAlias = System.getenv("RELEASE_SIGN_KEY_ALIAS") keyPassword = System.getenv("RELEASE_SIGN_KEY_PASSWORD") } } create("debugSigning") { initWith(getByName("release")) } } buildTypes { getByName("debug") { signingConfig = signingConfigs.getByName("debugSigning") } getByName("release") { signingConfig = signingConfigs.getByName("release") // signingConfig = signingConfigs.getByName("debug") isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } } dependencies { androidTestImplementation(libs.androidx.uitest.junit4) debugImplementation(libs.androidx.uitest.testManifest) debugImplementation(compose.uiTooling) } compose.resources { nameOfResClass = "R" } compose.desktop { application { mainClass = "MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "dev.meloda.overseerr" packageVersion = "1.0.0" } } } kotlin { compilerOptions.freeCompilerArgs.addAll( "-opt-in=kotlin.RequiresOptIn", "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", "-opt-in=kotlinx.coroutines.FlowPreview", "-Xexpect-actual-classes" ) }