82 lines
2.4 KiB
Kotlin
82 lines
2.4 KiB
Kotlin
package it.vfsfitvnm.vimusic.service
|
|
|
|
import android.content.Context
|
|
import android.content.res.Configuration
|
|
import android.graphics.Bitmap
|
|
import android.graphics.drawable.BitmapDrawable
|
|
import android.net.Uri
|
|
import androidx.core.graphics.applyCanvas
|
|
import coil.imageLoader
|
|
import coil.request.Disposable
|
|
import coil.request.ImageRequest
|
|
import it.vfsfitvnm.vimusic.utils.thumbnail
|
|
|
|
context(Context)
|
|
class BitmapProvider(
|
|
private val bitmapSize: Int,
|
|
private val colorProvider: (isSystemInDarkMode: Boolean) -> Int
|
|
) {
|
|
private var lastUri: Uri? = null
|
|
var lastBitmap: Bitmap? = null
|
|
private var lastIsSystemInDarkMode = false
|
|
|
|
private var lastEnqueued: Disposable? = null
|
|
|
|
private lateinit var defaultBitmap: Bitmap
|
|
|
|
val bitmap: Bitmap
|
|
get() = lastBitmap ?: defaultBitmap
|
|
|
|
var listener: ((Bitmap?) -> Unit)? = null
|
|
set(value) {
|
|
field = value
|
|
value?.invoke(lastBitmap)
|
|
}
|
|
|
|
init {
|
|
setDefaultBitmap()
|
|
}
|
|
|
|
fun setDefaultBitmap(): Boolean {
|
|
val isSystemInDarkMode = resources.configuration.uiMode and
|
|
Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
|
|
|
|
if (::defaultBitmap.isInitialized && isSystemInDarkMode == lastIsSystemInDarkMode) return false
|
|
|
|
lastIsSystemInDarkMode = isSystemInDarkMode
|
|
|
|
defaultBitmap =
|
|
Bitmap.createBitmap(bitmapSize, bitmapSize, Bitmap.Config.ARGB_8888).applyCanvas {
|
|
drawColor(colorProvider(isSystemInDarkMode))
|
|
}
|
|
|
|
return lastBitmap == null
|
|
}
|
|
|
|
fun load(uri: Uri?, onDone: (Bitmap) -> Unit) {
|
|
if (lastUri == uri) return
|
|
|
|
lastEnqueued?.dispose()
|
|
lastUri = uri
|
|
|
|
lastEnqueued = applicationContext.imageLoader.enqueue(
|
|
ImageRequest.Builder(applicationContext)
|
|
.data(uri.thumbnail(bitmapSize))
|
|
.allowHardware(false)
|
|
.listener(
|
|
onError = { _, _ ->
|
|
lastBitmap = null
|
|
onDone(bitmap)
|
|
listener?.invoke(lastBitmap)
|
|
},
|
|
onSuccess = { _, result ->
|
|
lastBitmap = (result.drawable as BitmapDrawable).bitmap
|
|
onDone(bitmap)
|
|
listener?.invoke(lastBitmap)
|
|
}
|
|
)
|
|
.build()
|
|
)
|
|
}
|
|
}
|