diff --git a/Dockerfile-Wasm b/Dockerfile-Wasm index fbf5d6c..9269aba 100644 --- a/Dockerfile-Wasm +++ b/Dockerfile-Wasm @@ -1,4 +1,4 @@ -FROM gradle:8.4.0-jdk17 AS builder +FROM gradle:8.4.0-jdk21 AS builder COPY --chown=gradle:gradle . /home/gradle/src WORKDIR /home/gradle/src diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index b16b08b..1a39407 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -1,10 +1,7 @@ -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.ExperimentalWasmDsl import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import java.util.* @@ -17,9 +14,28 @@ plugins { } kotlin { + androidTarget { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } + } + + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64() + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "ComposeApp" + isStatic = true + } + } + + jvm() + @OptIn(ExperimentalWasmDsl::class) wasmJs { - moduleName = "composeApp" + outputModuleName = "composeApp" browser { val rootDirPath = project.rootDir.path val projectDirPath = project.projectDir.path @@ -37,34 +53,6 @@ kotlin { binaries.executable() } - 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) @@ -72,7 +60,6 @@ kotlin { 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) @@ -140,20 +127,14 @@ android { applicationId = "dev.meloda.overseerr" 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" - } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" } } + signingConfigs { create("release") { val keystoreProperties = Properties() @@ -188,19 +169,15 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } } -//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") } - } + debugImplementation(compose.uiTooling) } compose.desktop { diff --git a/composeApp/src/androidMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.android.kt b/composeApp/src/androidMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.android.kt index e3f3756..8053a3b 100644 --- a/composeApp/src/androidMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.android.kt +++ b/composeApp/src/androidMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.android.kt @@ -3,11 +3,11 @@ package dev.meloda.overseerr.settings.model import dev.meloda.overseerr.appDir import io.github.xxfast.kstore.KStore import io.github.xxfast.kstore.file.storeOf -import okio.Path.Companion.toPath +import kotlinx.io.files.Path actual class SettingsStoreProvider actual constructor() { actual fun provideStore(): KStore { - return storeOf(file = "$appDir/app_settings.json".toPath()) + return storeOf(file = Path("$appDir/app_settings.json")) } } diff --git a/composeApp/src/commonMain/kotlin/dev/meloda/overseerr/screens/requests/presentation/RequestsScreen.kt b/composeApp/src/commonMain/kotlin/dev/meloda/overseerr/screens/requests/presentation/RequestsScreen.kt index ca7b784..d79e2d1 100644 --- a/composeApp/src/commonMain/kotlin/dev/meloda/overseerr/screens/requests/presentation/RequestsScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/meloda/overseerr/screens/requests/presentation/RequestsScreen.kt @@ -22,9 +22,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow -import dev.chrisbanes.haze.HazeState -import dev.chrisbanes.haze.haze -import dev.chrisbanes.haze.hazeChild +import dev.chrisbanes.haze.* import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.HazeMaterials import dev.meloda.overseerr.screens.requests.RequestsViewModel @@ -78,7 +76,7 @@ class RequestsScreen : Screen { }, colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent), modifier = Modifier - .hazeChild( + .hazeEffect( state = hazeState, style = hazeStyle ).fillMaxWidth(), @@ -106,7 +104,7 @@ class RequestsScreen : Screen { LazyColumn( modifier = Modifier .fillMaxSize() - .haze(state = hazeState) + .hazeSource(state = hazeState) .pullToRefresh( isRefreshing = screenState.isLoading, state = refreshState, @@ -159,7 +157,7 @@ class RequestsScreen : Screen { Box( modifier = Modifier .align(Alignment.BottomCenter) - .hazeChild( + .hazeEffect( state = hazeState, style = hazeStyle ) diff --git a/composeApp/src/iosMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.ios.kt b/composeApp/src/iosMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.ios.kt index 2da8c76..0991ef2 100644 --- a/composeApp/src/iosMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.ios.kt +++ b/composeApp/src/iosMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.ios.kt @@ -3,10 +3,10 @@ package dev.meloda.overseerr.settings.model import dev.meloda.overseerr.appDir import io.github.xxfast.kstore.KStore import io.github.xxfast.kstore.file.storeOf -import okio.Path.Companion.toPath +import kotlinx.io.files.Path actual class SettingsStoreProvider actual constructor() { actual fun provideStore(): KStore { - return storeOf(file = "$appDir/app_settings.json".toPath()) + return storeOf(file = Path("$appDir/app_settings.json")) } } diff --git a/composeApp/src/jvmMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.jvm.kt b/composeApp/src/jvmMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.jvm.kt index 2da8c76..0991ef2 100644 --- a/composeApp/src/jvmMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.jvm.kt +++ b/composeApp/src/jvmMain/kotlin/dev/meloda/overseerr/settings/model/SettingsStoreProvider.jvm.kt @@ -3,10 +3,10 @@ package dev.meloda.overseerr.settings.model import dev.meloda.overseerr.appDir import io.github.xxfast.kstore.KStore import io.github.xxfast.kstore.file.storeOf -import okio.Path.Companion.toPath +import kotlinx.io.files.Path actual class SettingsStoreProvider actual constructor() { actual fun provideStore(): KStore { - return storeOf(file = "$appDir/app_settings.json".toPath()) + return storeOf(file = Path("$appDir/app_settings.json")) } } diff --git a/composeApp/src/jvmMain/kotlin/main.kt b/composeApp/src/jvmMain/kotlin/main.kt index e9c9f72..2af9921 100644 --- a/composeApp/src/jvmMain/kotlin/main.kt +++ b/composeApp/src/jvmMain/kotlin/main.kt @@ -27,7 +27,7 @@ fun main() = application { state = rememberWindowState(width = 800.dp, height = 600.dp), onCloseRequest = ::exitApplication ) { - window.minimumSize = Dimension(350, 600) + window.minimumSize = Dimension(360, 600) App() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ac677b7..5ac05cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,31 +1,31 @@ [versions] -kotlin = "2.0.20-RC" -compose = "1.7.0-alpha02" -agp = "8.2.0" +kotlin = "2.1.20" +compose = "1.8.0-beta01" +agp = "8.7.3" androidx-lifecycle = "2.8.4" -androidx-activityCompose = "1.9.1" -androidx-uiTest = "1.6.8" -voyager = "1.1.0-beta02" +androidx-activity-compose = "1.10.1" +androidx-uitest = "1.7.8" +voyager = "1.1.0-beta03" coil = "3.0.4" -kotlinx-coroutines = "1.9.0" -ktor = "3.0.0-beta-2" -kotlinx-serialization = "1.7.1" -koin = "4.0.0-RC1" -viewmodel-compose = "2.8.0" -haze = "0.7.3" +kotlinx-coroutines = "1.10.1" +ktor = "3.0.1" +kotlinx-serialization = "1.8.0" +koin = "4.0.3" +viewmodel-compose = "2.8.3" +haze = "1.5.2" kstore = "0.9.1" appdirs = "1.2.2" napier = "2.7.1" [libraries] -androidx-activityCompose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" } +androidx-activityCompose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } androidx-lifecycle-viewmodel-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "viewmodel-compose" } androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "androidx-lifecycle" } androidx-lifecycle-runtime-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } -androidx-uitest-testManifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "androidx-uiTest" } -androidx-uitest-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "androidx-uiTest" } +androidx-uitest-testManifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "androidx-uitest" } +androidx-uitest-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "androidx-uitest" } voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } coil = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0..e2847c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME