Implement Glide image preload in RecyclerView
This commit is contained in:
@@ -1,44 +0,0 @@
|
||||
package gq.kirmanak.mealient.data.recipes.impl
|
||||
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import androidx.fragment.app.Fragment
|
||||
import dagger.hilt.android.scopes.FragmentScoped
|
||||
import gq.kirmanak.mealient.R
|
||||
import gq.kirmanak.mealient.data.baseurl.BaseURLStorage
|
||||
import gq.kirmanak.mealient.extensions.launchWhenViewResumed
|
||||
import gq.kirmanak.mealient.ui.images.ImageLoader
|
||||
import gq.kirmanak.mealient.ui.recipes.RecipeImageLoader
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
@FragmentScoped
|
||||
class RecipeImageLoaderImpl @Inject constructor(
|
||||
private val imageLoader: ImageLoader,
|
||||
private val baseURLStorage: BaseURLStorage,
|
||||
private val fragment: Fragment,
|
||||
): RecipeImageLoader {
|
||||
|
||||
override fun loadRecipeImage(view: ImageView, slug: String?) {
|
||||
Timber.v("loadRecipeImage() called with: view = $view, slug = $slug")
|
||||
fragment.launchWhenViewResumed {
|
||||
imageLoader.loadImage(generateImageUrl(slug), R.drawable.placeholder_recipe, view)
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
suspend fun generateImageUrl(slug: String?): String? {
|
||||
Timber.v("generateImageUrl() called with: slug = $slug")
|
||||
val result = baseURLStorage.getBaseURL()
|
||||
?.takeIf { it.isNotBlank() }
|
||||
?.takeUnless { slug.isNullOrBlank() }
|
||||
?.toHttpUrlOrNull()
|
||||
?.newBuilder()
|
||||
?.addPathSegments("api/media/recipes/$slug/images/original.webp")
|
||||
?.build()
|
||||
?.toString()
|
||||
Timber.v("generateImageUrl() returned: $result")
|
||||
return result
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package gq.kirmanak.mealient.data.recipes.impl
|
||||
|
||||
interface RecipeImageUrlProvider {
|
||||
|
||||
suspend fun generateImageUrl(slug: String?): String?
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package gq.kirmanak.mealient.data.recipes.impl
|
||||
|
||||
import gq.kirmanak.mealient.data.baseurl.BaseURLStorage
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class RecipeImageUrlProviderImpl @Inject constructor(
|
||||
private val baseURLStorage: BaseURLStorage,
|
||||
) : RecipeImageUrlProvider {
|
||||
|
||||
override suspend fun generateImageUrl(slug: String?): String? {
|
||||
Timber.v("generateImageUrl() called with: slug = $slug")
|
||||
slug?.takeUnless { it.isBlank() } ?: return null
|
||||
val imagePath = IMAGE_PATH_FORMAT.format(slug)
|
||||
val baseUrl = baseURLStorage.getBaseURL()?.takeUnless { it.isEmpty() }
|
||||
val result = baseUrl?.toHttpUrlOrNull()
|
||||
?.newBuilder()
|
||||
?.addPathSegments(imagePath)
|
||||
?.build()
|
||||
?.toString()
|
||||
Timber.v("getRecipeImageUrl() returned: $result")
|
||||
return result
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val IMAGE_PATH_FORMAT = "api/media/recipes/%s/images/original.webp"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user