Implement Glide image preload in RecyclerView

This commit is contained in:
Kirill Kamakin
2022-04-18 18:08:06 +02:00
parent 1ffd2d2359
commit 3079cd9588
23 changed files with 289 additions and 123 deletions

View File

@@ -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
}
}

View File

@@ -0,0 +1,6 @@
package gq.kirmanak.mealient.data.recipes.impl
interface RecipeImageUrlProvider {
suspend fun generateImageUrl(slug: String?): String?
}

View File

@@ -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"
}
}