Skip to content

Commit

Permalink
Merge pull request #417 from qdsfdhvh/version_1.7.3
Browse files Browse the repository at this point in the history
Version 1.7.3
  • Loading branch information
qdsfdhvh authored Jan 8, 2024
2 parents 1897a6e + 5b9b470 commit 72c34bd
Show file tree
Hide file tree
Showing 49 changed files with 473 additions and 308 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ kotlin {
sourceSets {
val commonMain by getting {
dependencies {
+ api("io.github.qdsfdhvh:image-loader:1.7.2")
+ api("io.github.qdsfdhvh:image-loader:1.7.3")
// optional - Moko Resources Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.3")
// optional - Blur Interceptor (only support bitmap)
+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.3")
}
}
val jvmMain by getting {
dependencies {
// optional - ImageIO Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.3")
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions app/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ kotlin {
implementation(libs.ktor.client.js)
}
}
val filePickerMain by creating {
dependsOn(commonMain.get())
jvmMain.get().dependsOn(this)
iosMain.get().dependsOn(this)
jsMain.get().dependsOn(this)
dependencies {
implementation(libs.file.picker)
}
}
val noFilePickerMain by creating {
dependsOn(commonMain.get())
macosMain.get().dependsOn(this)
}
}
targets.withType<KotlinNativeTarget>().configureEach {
binaries.framework {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.seiko.imageloader.demo.scene.FilePickerScene
import com.seiko.imageloader.demo.scene.GifImagesScene
import com.seiko.imageloader.demo.scene.LocalResourceScene
import com.seiko.imageloader.demo.scene.NetworkImagesScene
Expand All @@ -46,6 +47,7 @@ fun App(modifier: Modifier = Modifier) {
Route.Pokemon -> PokemonScene(::onBack)
Route.LocalResource -> LocalResourceScene(::onBack)
Route.Other -> OtherImagesScene(::onBack)
Route.FilePicker -> FilePickerScene(::onBack)
}
}
}
Expand Down Expand Up @@ -91,4 +93,5 @@ private enum class Route {
Pokemon,
LocalResource,
Other,
FilePicker,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.seiko.imageloader.demo.scene

import androidx.compose.runtime.Composable

@Composable
expect fun FilePickerScene(onBack: () -> Unit)
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.seiko.imageloader.demo.scene

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.darkrockstudios.libraries.mpfilepicker.FilePicker
import com.seiko.imageloader.model.ImageAction
import com.seiko.imageloader.model.ImageRequest
import com.seiko.imageloader.rememberImageSuccessPainter
import com.seiko.imageloader.ui.AutoSizeBox

@Composable
actual fun FilePickerScene(onBack: () -> Unit) {
BackScene(
onBack = onBack,
title = { Text("FilePicker") },
) { innerPadding ->

val fileType = remember { listOf("jpg", "png") }
var selectPlatformFile by remember { mutableStateOf<Any?>(null) }

var pathSingleChosen by remember { mutableStateOf("") }
var showSingleFilePicker by remember { mutableStateOf(false) }
FilePicker(showSingleFilePicker, fileExtensions = fileType) { mpFile ->
if (mpFile != null) {
pathSingleChosen = mpFile.path
selectPlatformFile = mpFile.platformFile
}
showSingleFilePicker = false
}

Column(
modifier = Modifier.padding(innerPadding).fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Spacer(Modifier.height(16.dp))
Button(onClick = { showSingleFilePicker = true }) {
Text("Choose File")
}
Spacer(Modifier.height(6.dp))
Text("File Chosen: $pathSingleChosen")
Spacer(Modifier.height(6.dp))
selectPlatformFile?.let {
val imageRequest = remember(it) {
ImageRequest(it)
}
AutoSizeBox(
imageRequest,
modifier = Modifier.background(Color.Gray)
.fillMaxWidth()
.weight(1f),
) { state ->
when (state) {
is ImageAction.Loading -> Unit
is ImageAction.Success -> {
Image(
rememberImageSuccessPainter(state),
contentDescription = null,
modifier = Modifier.matchParentSize(),
)
}
is ImageAction.Failure -> {
Text(state.error.message.orEmpty())
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.seiko.imageloader.demo.scene

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier

@Composable
actual fun FilePickerScene(onBack: () -> Unit) {
BackScene(
onBack = onBack,
title = { Text("FilePicker") },
) { innerPadding ->
Box(Modifier.padding(innerPadding).fillMaxSize()) {
Text("compose-multiplatform-file-picker no support for current target.")
}
}
}
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ object ProjectVersion {
private const val monir = "7"

// backwards compatible bug fixes
private const val path = "2"
private const val path = "3"
const val version = "$major.$monir.$path"
}

Expand Down
10 changes: 5 additions & 5 deletions docs/docs/setup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ kotlin {
sourceSets {
val commonMain by getting {
dependencies {
+ api("io.github.qdsfdhvh:image-loader:1.7.2")
+ api("io.github.qdsfdhvh:image-loader:1.7.3")
// optional - Moko Resources Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.7.3")
// optional - Blur Interceptor (only support bitmap)
+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.7.3")
}
}
val jvmMain by getting {
dependencies {
// optional - ImageIO Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.2")
+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.7.3")
}
}
}
Expand All @@ -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.2"
image-loader = "1.7.3"

[libraries]
image-loader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "image-loader" }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.seiko.imageloader.component

import com.seiko.imageloader.component.fetcher.KtorUrlFetcher
import com.seiko.imageloader.component.keyer.KtorUrlKeyer
import com.seiko.imageloader.component.mapper.KtorUrlMapper
import io.ktor.client.HttpClient

fun ComponentRegistryBuilder.setupKtorComponents(
httpClient: () -> HttpClient = KtorUrlFetcher.defaultHttpEngineFactory,
) {
add(KtorUrlMapper())
add(KtorUrlKeyer())
add(KtorUrlFetcher.Factory(httpClient))
}
25 changes: 25 additions & 0 deletions extension/svg/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
plugins {
id("app.android.library")
id("app.kotlin.multiplatform")
alias(libs.plugins.publish)
alias(libs.plugins.dokka)
}

kotlin {
sourceSets {
commonMain {
dependencies {
implementation(projects.imageLoader)
}
}
androidMain {
dependencies {
implementation(libs.androidsvg)
}
}
}
}

android {
namespace = "io.github.qdsfdhvh.imageloader.svg"
}
1 change: 1 addition & 0 deletions extension/svg/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
POM_ARTIFACT_ID=image-loader-extension-svg
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.seiko.imageloader.component.decoder

import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.unit.Density
import com.caverock.androidsvg.PreserveAspectRatio
import com.caverock.androidsvg.SVG
import com.seiko.imageloader.option.Options
import com.seiko.imageloader.option.androidContext
import com.seiko.imageloader.util.SVGPainter
import okio.BufferedSource

/**
* A [Decoder] that uses [AndroidSVG](https://bigbadaboom.github.io/androidsvg/) to decode SVG
* files.
*/
@JvmInline
private value class AndroidSvgDom(
val dom: SVG,
) : SvgDom {
override val width: Float
get() = dom.documentWidth

override val height: Float
get() = dom.documentHeight

override fun draw(canvas: Canvas, size: Size) {
if (dom.documentViewBox == null) {
dom.setDocumentViewBox(0f, 0f, dom.documentWidth, dom.documentHeight)
}
dom.documentWidth = size.width
dom.documentHeight = size.height
dom.documentPreserveAspectRatio = PreserveAspectRatio.STRETCH
dom.renderToCanvas(canvas.nativeCanvas)
}
}

internal actual fun createSVGPainter(source: BufferedSource, density: Density, options: Options): SVGPainter {
val dom = source.use {
SVG.getFromInputStream(it.inputStream())
}
return SVGPainter(
dom = AndroidSvgDom(dom),
density = density,
requestSize = options.size,
)
}

internal actual fun defaultDensity(options: Options): Density {
return Density(options.androidContext)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.seiko.imageloader.component

import androidx.compose.ui.unit.Density
import com.seiko.imageloader.component.decoder.SvgDecoder

fun ComponentRegistryBuilder.setupSvgComponents(density: Density? = null) {
add(SvgDecoder.Factory(density))
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.seiko.imageloader.component.decoder

import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.unit.Density
import com.seiko.imageloader.model.mimeType
import com.seiko.imageloader.option.Options
import com.seiko.imageloader.util.SVGPainter
import com.seiko.imageloader.util.isSvg
import okio.BufferedSource
import okio.use
import org.jetbrains.skia.Data
import org.jetbrains.skia.svg.SVGDOM

class SvgDecoder private constructor(
private val source: BufferedSource,
Expand All @@ -17,22 +16,20 @@ class SvgDecoder private constructor(
) : Decoder {

override suspend fun decode(): DecodeResult {
val data = source.use {
Data.makeFromBytes(it.readByteArray())
}
return DecodeResult.OfPainter(
painter = SVGPainter(SVGDOM(data), density, options.size),
painter = createSVGPainter(source, density, options),
)
}

class Factory(
private val density: Density,
private val density: Density? = null,
) : Decoder.Factory {

override fun create(source: DecodeSource, options: Options): Decoder? {
if (!isApplicable(source)) return null
return SvgDecoder(
source = source.source,
density = density,
density = density ?: defaultDensity(options),
options = options,
)
}
Expand All @@ -46,3 +43,13 @@ class SvgDecoder private constructor(
private const val MIME_TYPE_SVG = "image/svg+xml"
}
}

interface SvgDom {
val width: Float
val height: Float
fun draw(canvas: Canvas, size: Size)
}

internal expect fun createSVGPainter(source: BufferedSource, density: Density, options: Options): SVGPainter

internal expect fun defaultDensity(options: Options): Density
Loading

0 comments on commit 72c34bd

Please sign in to comment.