Updated on 2026-08-14

This commit is contained in:
Tangem 2021-09-25 03:57:57 +03:00
parent 63eaedff8a
commit 34a364fca1
2 changed files with 32 additions and 6 deletions

View file

@ -3,9 +3,12 @@ package com.tangem.tap.common.images
import android.app.Application
import com.squareup.picasso.OkHttp3Downloader
import com.squareup.picasso.Picasso
import com.tangem.wallet.BuildConfig
import okhttp3.Cache
import okhttp3.CacheControl
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import timber.log.Timber
import java.io.File
import java.util.concurrent.TimeUnit
@ -17,6 +20,7 @@ class PicassoHelper {
val picasso = Picasso.Builder(application)
.downloader(OkHttp3Downloader(getOkHttpForPicasso(application)))
.build()
picasso.isLoggingEnabled = BuildConfig.DEBUG
Picasso.setSingletonInstance(picasso)
}
@ -24,6 +28,7 @@ class PicassoHelper {
val okHttpBuilder = OkHttpClient.Builder()
okHttpBuilder.cache(Cache(File(application.filesDir, "artworks"), Long.MAX_VALUE))
okHttpBuilder.callTimeout(15000, TimeUnit.MILLISECONDS)
okHttpBuilder.addInterceptor { chain ->
val cacheControl = CacheControl.Builder()
.maxStale(KEEP_CACHE_MAX_DAYS, TimeUnit.DAYS)
@ -34,7 +39,25 @@ class PicassoHelper {
.build()
chain.proceed(neverExpireRequest)
}
addDebugInterceptors(okHttpBuilder)
return okHttpBuilder.build()
}
private fun addDebugInterceptors(okHttpBuilder: OkHttpClient.Builder) {
if (!BuildConfig.DEBUG) return
val picassoInterceptor = HttpLoggingInterceptor(PicassoOkHttpLogger()).apply {
level = HttpLoggingInterceptor.Level.BODY
}
okHttpBuilder.addInterceptor(picassoInterceptor)
}
}
}
private class PicassoOkHttpLogger : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Timber.d(message)
}
}

View file

@ -5,38 +5,41 @@ import android.graphics.drawable.Drawable
import com.squareup.picasso.Picasso
import com.squareup.picasso.Target
import com.tangem.common.services.Result
import timber.log.Timber
/**
[REDACTED_AUTHOR]
*/
class UrlBitmapLoader {
fun loadBitmap(url: String, callback: (Result<Bitmap>) -> Unit) {
Picasso.get().load(url).into(DownloadTarget(callback))
val target = DownloadTarget(callback)
protectedFromGarbageCollectorTargets.add(target)
Picasso.get().load(url).into(target)
}
fun loadBitmap(url: String, target: DownloadTarget) {
protectedFromGarbageCollectorTargets.add(target)
Picasso.get().load(url).into(target)
}
}
private val protectedFromGarbageCollectorTargets = mutableListOf<Target>()
// It adds the ability to trigger multiple downloads with a unique callback.
open class DownloadTarget(
val callback: (Result<Bitmap>) -> Unit,
) : Target {
override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
Timber.d("onBitmapLoaded")
callback(Result.Success(bitmap))
protectedFromGarbageCollectorTargets.remove(this)
}
override fun onBitmapFailed(e: java.lang.Exception?, errorDrawable: Drawable?) {
Timber.d("onBitmapFailed")
callback.invoke(Result.Failure(e))
protectedFromGarbageCollectorTargets.remove(this)
}
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
Timber.d("onPrepareLoad")
}
}