Saving retrieved images to disk on Android and Desktop

This commit is contained in:
dankito 2024-09-12 11:05:07 +02:00
parent 802a96e6dd
commit bd9229bb64
4 changed files with 67 additions and 8 deletions

View File

@ -9,11 +9,14 @@ import app.cash.sqldelight.async.coroutines.synchronous
import app.cash.sqldelight.driver.android.AndroidSqliteDriver import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import net.codinux.banking.dataaccess.BankmeisterDb import net.codinux.banking.dataaccess.BankmeisterDb
import net.codinux.banking.ui.config.DI import net.codinux.banking.ui.config.DI
import net.codinux.banking.ui.service.ImageService
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
ImageService.context = this.applicationContext
DI.setRepository(AndroidSqliteDriver(BankmeisterDb.Schema.synchronous(), this, "Bankmeister.db")) DI.setRepository(AndroidSqliteDriver(BankmeisterDb.Schema.synchronous(), this, "Bankmeister.db"))
setContent { setContent {

View File

@ -1,12 +1,45 @@
package net.codinux.banking.ui.service package net.codinux.banking.ui.service
import android.content.Context
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import net.codinux.log.Log
import java.io.File
import java.net.URL import java.net.URL
import java.security.MessageDigest
object ImageService {
lateinit var context: Context
}
private val cacheDir by lazy { File(ImageService.context.cacheDir, "imageCache").also { it.mkdirs() } }
private val messageDigest = MessageDigest.getInstance("SHA-256")
actual fun createImageBitmap(imageBytes: ByteArray): ImageBitmap = actual fun createImageBitmap(imageBytes: ByteArray): ImageBitmap =
BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size).asImageBitmap() BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size).asImageBitmap()
actual suspend fun fetchBytesFromUrl(url: String): ByteArray = actual suspend fun fetchBytesFromUrl(url: String): ByteArray {
URL(url).openStream().buffered().use { it.readBytes() } var imageFile: File? = null
try {
val urlHash = messageDigest.digest(url.toByteArray())
.joinToString("") { "%02x".format(it) }
imageFile = File(cacheDir, urlHash)
if (imageFile.exists()) {
return imageFile.readBytes()
}
} catch (e: Throwable) {
Log.error(e) { "Could not create SHA-256 or read image bytes from file for url '$url'" }
}
val imageBytes = URL(url).openStream().buffered().use { it.readBytes() }
imageFile?.writeBytes(imageBytes)
return imageBytes
}

View File

@ -5,10 +5,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.LocalContentAlpha import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor import androidx.compose.material.LocalContentColor
import androidx.compose.runtime.Composable import androidx.compose.runtime.*
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector

View File

@ -2,11 +2,37 @@ package net.codinux.banking.ui.service
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.toComposeImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap
import net.codinux.log.Log
import org.jetbrains.skia.Image import org.jetbrains.skia.Image
import java.io.File
import java.net.URL import java.net.URL
import java.security.MessageDigest
private val cacheDir = File("data/imageCache").also { it.mkdirs() }
private val messageDigest = MessageDigest.getInstance("SHA-256")
actual fun createImageBitmap(imageBytes: ByteArray): ImageBitmap = actual fun createImageBitmap(imageBytes: ByteArray): ImageBitmap =
Image.makeFromEncoded(imageBytes).toComposeImageBitmap() Image.makeFromEncoded(imageBytes).toComposeImageBitmap()
actual suspend fun fetchBytesFromUrl(url: String): ByteArray = actual suspend fun fetchBytesFromUrl(url: String): ByteArray {
URL(url).openStream().buffered().use { it.readAllBytes() } var imageFile: File? = null
try {
val urlHash = messageDigest.digest(url.toByteArray())
.joinToString("") { "%02x".format(it) }
imageFile = File(cacheDir, urlHash)
if (imageFile.exists()) {
return imageFile.readBytes()
}
} catch (e: Throwable) {
Log.error(e) { "Could not create SHA-256 or read image bytes from file for url '$url'" }
}
val imageBytes = URL(url).openStream().buffered().use { it.readAllBytes() }
imageFile?.writeBytes(imageBytes)
return imageBytes
}