diff --git a/.github/workflows/CompareScreenshot.yml b/.github/workflows/CompareScreenshot.yml index 06e0ab7a..964fadfc 100644 --- a/.github/workflows/CompareScreenshot.yml +++ b/.github/workflows/CompareScreenshot.yml @@ -30,7 +30,7 @@ jobs: java-version: 17 - name: Setup Gradle - uses: gradle/gradle-build-action@3b1b3b9a2104c2b47fbae53f3938079c00c9bb87 # v3.0.0 + uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e # v3.1.0 with: gradle-version: wrapper diff --git a/.github/workflows/StoreScreenshot.yml b/.github/workflows/StoreScreenshot.yml index 0b22a5cd..7e6d9a9e 100644 --- a/.github/workflows/StoreScreenshot.yml +++ b/.github/workflows/StoreScreenshot.yml @@ -33,7 +33,7 @@ jobs: # Better than caching and/or extensions of actions/setup-java - name: Setup Gradle - uses: gradle/gradle-build-action@3b1b3b9a2104c2b47fbae53f3938079c00c9bb87 # v3.0.0 + uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e # v3.1.0 with: gradle-version: wrapper diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index 5b67d2a8..00000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -java zulu-17.40.19 \ No newline at end of file diff --git a/README.md b/README.md index b2a4ff5c..3008531d 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,17 @@ kotlin { sourceSets { val commonMain by getting { dependencies { -+ api("io.github.qdsfdhvh:image-loader:1.7.4") ++ api("io.github.qdsfdhvh:image-loader:1.7.5") // optional - Moko Resources Decoder -+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.5") // optional - Blur Interceptor (only support bitmap) -+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.5") } } val jvmMain by getting { dependencies { // optional - ImageIO Decoder -+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.5") } } } diff --git a/app/common/build.gradle.kts b/app/common/build.gradle.kts index 935c044c..42e578b1 100644 --- a/app/common/build.gradle.kts +++ b/app/common/build.gradle.kts @@ -9,6 +9,11 @@ plugins { kotlin { sourceSets { + all { + languageSettings { + optIn("org.jetbrains.compose.resources.ExperimentalResourceApi") + } + } commonMain { dependencies { api(compose.runtime) diff --git a/app/common/gradle.properties b/app/common/gradle.properties new file mode 100644 index 00000000..d2529bc5 --- /dev/null +++ b/app/common/gradle.properties @@ -0,0 +1,2 @@ +# https://github.com/JetBrains/compose-multiplatform/pull/3961 +compose.resources.always.generate.accessors=true diff --git a/app/common/src/commonMain/resources/composeRes/images/car_black.svg b/app/common/src/commonMain/composeResources/drawable/car_black.svg similarity index 100% rename from app/common/src/commonMain/resources/composeRes/images/car_black.svg rename to app/common/src/commonMain/composeResources/drawable/car_black.svg diff --git a/app/common/src/commonMain/resources/composeRes/images/cat.jpg b/app/common/src/commonMain/composeResources/drawable/cat.jpg similarity index 100% rename from app/common/src/commonMain/resources/composeRes/images/cat.jpg rename to app/common/src/commonMain/composeResources/drawable/cat.jpg diff --git a/app/common/src/commonMain/resources/composeRes/images/chat_from_bg_normal_9.png b/app/common/src/commonMain/composeResources/drawable/chat_from_bg_normal_9.png similarity index 100% rename from app/common/src/commonMain/resources/composeRes/images/chat_from_bg_normal_9.png rename to app/common/src/commonMain/composeResources/drawable/chat_from_bg_normal_9.png diff --git a/app/common/src/commonMain/resources/composeRes/images/collection_logo.gif b/app/common/src/commonMain/composeResources/drawable/collection_logo.gif similarity index 100% rename from app/common/src/commonMain/resources/composeRes/images/collection_logo.gif rename to app/common/src/commonMain/composeResources/drawable/collection_logo.gif diff --git a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/MR.kt b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/MR.kt index 57950496..47612cd2 100644 --- a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/MR.kt +++ b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/MR.kt @@ -1,7 +1,9 @@ package com.seiko.imageloader.demo -import io.github.qdsfdhvh.generated.resources.Res +import io.github.qdsfdhvh.common.generated.resources.Res internal object MR { - val images get() = Res.images + val images get() = Res.drawable + + val colors get() = Res.drawable } diff --git a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/Common.kt b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/Common.kt index 74591bbe..d338ae53 100644 --- a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/Common.kt +++ b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/Common.kt @@ -12,7 +12,7 @@ import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf @@ -38,7 +38,7 @@ import kotlinx.coroutines.withContext @Composable fun BackButton(onBack: () -> Unit) { IconButton(onBack) { - Icon(Icons.Default.ArrowBack, "back") + Icon(Icons.AutoMirrored.Filled.ArrowBack, "back") } } diff --git a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/OtherImagesScene.kt b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/OtherImagesScene.kt index 6b3433ac..45a74316 100644 --- a/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/OtherImagesScene.kt +++ b/app/common/src/commonMain/kotlin/com/seiko/imageloader/demo/scene/OtherImagesScene.kt @@ -29,9 +29,10 @@ import co.touchlab.kermit.Logger import com.seiko.imageloader.demo.data.imageJsonData import com.seiko.imageloader.rememberImagePainter import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.InternalResourceApi import org.jetbrains.compose.resources.readResourceBytes -@OptIn(ExperimentalResourceApi::class) +@OptIn(ExperimentalResourceApi::class, InternalResourceApi::class) @Composable fun OtherImagesScene( onBack: () -> Unit, @@ -107,7 +108,7 @@ fun OtherImagesScene( } item { val imageBytes by produceState(null) { - value = readResourceBytes("composeRes/images/cat.jpg") + value = readResourceBytes("drawable/cat.jpg") } imageBytes?.let { ImageItem(it) diff --git a/app/common/src/commonMain/resources/composeRes/colors/colors.xml b/app/common/src/commonMain/resources/colors/colors.xml similarity index 100% rename from app/common/src/commonMain/resources/composeRes/colors/colors.xml rename to app/common/src/commonMain/resources/colors/colors.xml diff --git a/build.gradle.kts b/build.gradle.kts index 1a952b26..a4e49dbe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -76,6 +76,16 @@ allprojects { } } } + + // fix order of android release lint tasks + listOf( + "generateReleaseLintVitalModel", + "lintVitalAnalyzeRelease", + ).forEach { name -> + tasks.matching { it.name == name }.configureEach { + dependsOn(tasks.matching { it.name == "copyFontsToAndroidAssets" }) + } + } } tasks.dokkaHtmlMultiModule { @@ -91,7 +101,7 @@ object ProjectVersion { private const val monir = "7" // backwards compatible bug fixes - private const val path = "4" + private const val path = "5" const val version = "$major.$monir.$path" } diff --git a/docs/docs/setup.mdx b/docs/docs/setup.mdx index 3cfd7d38..4ac9d651 100644 --- a/docs/docs/setup.mdx +++ b/docs/docs/setup.mdx @@ -15,17 +15,17 @@ kotlin { sourceSets { val commonMain by getting { dependencies { -+ api("io.github.qdsfdhvh:image-loader:1.7.4") ++ api("io.github.qdsfdhvh:image-loader:1.7.5") // optional - Moko Resources Decoder -+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.5") // optional - Blur Interceptor (only support bitmap) -+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.5") } } val jvmMain by getting { dependencies { // optional - ImageIO Decoder -+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.4") ++ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.5") } } } @@ -38,7 +38,7 @@ Copy the following snippets if you are using [gradle version catalog](https://do ```xml title="libs.versions.toml" [versions] -image-loader = "1.7.4" +image-loader = "1.7.5" [libraries] image-loader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "image-loader" } diff --git a/extension/compose-resources/src/commonMain/kotlin/com/seiko/imageloader/component/fetcher/ComposeResourceFetcher.kt b/extension/compose-resources/src/commonMain/kotlin/com/seiko/imageloader/component/fetcher/ComposeResourceFetcher.kt index 3b640d0b..8326aed6 100644 --- a/extension/compose-resources/src/commonMain/kotlin/com/seiko/imageloader/component/fetcher/ComposeResourceFetcher.kt +++ b/extension/compose-resources/src/commonMain/kotlin/com/seiko/imageloader/component/fetcher/ComposeResourceFetcher.kt @@ -4,27 +4,30 @@ package com.seiko.imageloader.component.fetcher import com.seiko.imageloader.option.Options import okio.Buffer +import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.ExperimentalResourceApi -import org.jetbrains.compose.resources.ImageResource +import org.jetbrains.compose.resources.InternalResourceApi import org.jetbrains.compose.resources.getPathByEnvironment +import org.jetbrains.compose.resources.getSystemEnvironment import org.jetbrains.compose.resources.readResourceBytes +@OptIn(ExperimentalResourceApi::class) class ComposeResourceFetcher { class Factory : Fetcher.Factory { override fun create(data: Any, options: Options): Fetcher? { - if (data is ImageResource) { - return ImageResourceFetcher(data) + if (data is DrawableResource) { + return DrawableResourceFetcher(data) } return null } } - private class ImageResourceFetcher( - private val resource: ImageResource, + private class DrawableResourceFetcher( + private val resource: DrawableResource, ) : Fetcher { - @OptIn(ExperimentalResourceApi::class) + @OptIn(InternalResourceApi::class) override suspend fun fetch(): FetchResult { - val path = resource.getPathByEnvironment() + val path = resource.getPathByEnvironment(getSystemEnvironment()) return FetchResult.OfSource( source = Buffer().apply { write(readResourceBytes(path)) diff --git a/extension/moko-resources/src/iosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.ios.kt b/extension/moko-resources/src/iosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.ios.kt index aea29635..fc4575f2 100644 --- a/extension/moko-resources/src/iosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.ios.kt +++ b/extension/moko-resources/src/iosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.ios.kt @@ -63,6 +63,7 @@ internal actual suspend fun FileResource.toFetchResult(options: Options): FetchR } @OptIn(ExperimentalForeignApi::class) +@Suppress("INVISIBLE_MEMBER") internal actual suspend fun ImageResource.toFetchResult(options: Options): FetchResult? { val uiImage: UIImage = this.toUIImage() ?: throw IllegalArgumentException("can't read UIImage of $this") diff --git a/extension/moko-resources/src/macosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.macos.kt b/extension/moko-resources/src/macosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.macos.kt index bd96e573..21e57bf1 100644 --- a/extension/moko-resources/src/macosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.macos.kt +++ b/extension/moko-resources/src/macosMain/kotlin/com/seiko/imageloader/component/fetcher/MokoResourceFetcher.macos.kt @@ -48,6 +48,7 @@ internal actual suspend fun FileResource.toFetchResult(options: Options): FetchR } @OptIn(ExperimentalForeignApi::class) +@Suppress("INVISIBLE_MEMBER") internal actual suspend fun ImageResource.toFetchResult(options: Options): FetchResult? { val nsImage: NSImage = this.toNSImage() ?: throw IllegalArgumentException("can't read NSImage of $this") diff --git a/gradle.properties b/gradle.properties index 7c7ba57b..fda6be35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,5 +20,3 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 org.jetbrains.compose.experimental.uikit.enabled=true org.jetbrains.compose.experimental.jscanvas.enabled=true org.jetbrains.compose.experimental.macos.enabled=true -# https://github.com/JetBrains/compose-multiplatform/pull/3961 -compose.resources.always.generate.accessors=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index be6ec332..50c95338 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -agp = "8.2.1" -compose-multiplatform = "1.6.0-dev1334" -kotlin = "1.9.21" +agp = "8.2.2" +compose-multiplatform = "1.6.0-rc01" +kotlin = "1.9.22" kotlinx-coroutines = "1.8.0-RC2" kotlinx-serialization = "1.6.2" androidx-core-ktx = "1.12.0" @@ -15,7 +15,7 @@ ktlint = "0.50.0" publish = "0.27.0" dokka = "1.9.10" ktor = "2.3.8" -okio = "3.7.0" +okio = "3.8.0" uri-kmp = "0.0.16" kermit = "2.0.3" androidsvg = "1.4" diff --git a/image-loader/src/androidMain/kotlin/com/seiko/imageloader/Image.android.kt b/image-loader/src/androidMain/kotlin/com/seiko/imageloader/Image.android.kt index fde3afea..04107050 100644 --- a/image-loader/src/androidMain/kotlin/com/seiko/imageloader/Image.android.kt +++ b/image-loader/src/androidMain/kotlin/com/seiko/imageloader/Image.android.kt @@ -9,6 +9,7 @@ import android.os.Looper import android.view.View import androidx.compose.runtime.RememberObserver import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.geometry.Size @@ -41,7 +42,7 @@ actual fun Image.toPainter(): Painter { private class DrawablePainter( val drawable: Drawable, ) : Painter(), RememberObserver { - private var drawInvalidateTick by mutableStateOf(0) + private var drawInvalidateTick by mutableIntStateOf(0) private var drawableIntrinsicSize by mutableStateOf(drawable.intrinsicSize) private val callback: Drawable.Callback by lazy { diff --git a/image-loader/src/androidMain/kotlin/com/seiko/imageloader/component/mapper/ResourceUriMapper.kt b/image-loader/src/androidMain/kotlin/com/seiko/imageloader/component/mapper/ResourceUriMapper.kt index 1a12b8fc..33913ac9 100644 --- a/image-loader/src/androidMain/kotlin/com/seiko/imageloader/component/mapper/ResourceUriMapper.kt +++ b/image-loader/src/androidMain/kotlin/com/seiko/imageloader/component/mapper/ResourceUriMapper.kt @@ -1,5 +1,6 @@ package com.seiko.imageloader.component.mapper +import android.annotation.SuppressLint import android.content.ContentResolver.SCHEME_ANDROID_RESOURCE import android.content.Context import com.eygraber.uri.Uri @@ -15,6 +16,7 @@ class ResourceUriMapper( private val context: Context? = null, ) : Mapper { + @SuppressLint("DiscouragedApi") override fun map(data: Any, options: Options): Uri? { if (data !is Uri) return null if (!isApplicable(data)) return null diff --git a/lint.xml b/lint.xml new file mode 100644 index 00000000..b4c0c36c --- /dev/null +++ b/lint.xml @@ -0,0 +1,25 @@ + + + + + + + + + + +