diff --git a/app/src/main/kotlin/com/arflix/tv/data/repository/MediaRepository.kt b/app/src/main/kotlin/com/arflix/tv/data/repository/MediaRepository.kt index 2a5a217f..1d9e45f7 100644 --- a/app/src/main/kotlin/com/arflix/tv/data/repository/MediaRepository.kt +++ b/app/src/main/kotlin/com/arflix/tv/data/repository/MediaRepository.kt @@ -53,6 +53,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale import java.util.concurrent.ConcurrentHashMap +import android.util.LruCache import com.arflix.tv.util.ParsedCatalogUrl import javax.inject.Inject import javax.inject.Singleton @@ -105,21 +106,30 @@ class MediaRepository @Inject constructor( private data class CacheEntry(val data: T, val timestamp: Long) private val CACHE_TTL_MS = 5 * 60 * 1000L // 5 minutes + private operator fun LruCache.set(key: K, value: V) { + put(key, value) + } + // Home categories cache - survives ViewModel recreation @Volatile var cachedHomeCategories: List = emptyList() private set @Volatile private var homeCategoriesFetchedAt = 0L private val HOME_CATEGORIES_CACHE_MS = 120_000L // 2 minutes - private val detailsCache = mutableMapOf>() + private fun createBoundedCache(maxSize: Int): MutableMap { + return object : java.util.LinkedHashMap(maxSize, 0.75f, true) { + override fun removeEldestEntry(eldest: MutableMap.MutableEntry?): Boolean = size > maxSize + } + } + private val detailsCache = createBoundedCache>(200) private val fullDetailsCacheKeys = mutableSetOf() - private val castCache = mutableMapOf>>() - private val similarCache = mutableMapOf>>() - private val logoCache = mutableMapOf>() - private val reviewsCache = mutableMapOf>>() - private val watchProvidersCache = mutableMapOf>() - private val seasonEpisodesCache = mutableMapOf>>() - private val imdbRatingCache = ConcurrentHashMap>() + private val castCache = createBoundedCache>>(150) + private val similarCache = createBoundedCache>>(150) + private val logoCache = createBoundedCache>(300) + private val reviewsCache = createBoundedCache>>(100) + private val watchProvidersCache = createBoundedCache>(150) + private val seasonEpisodesCache = createBoundedCache>>(200) + private val imdbRatingCache = java.util.Collections.synchronizedMap(createBoundedCache>(500)) private val imdbEpisodeRatingsCache = ConcurrentHashMap, String>>>() private val imdbRatingsByIdCache = ConcurrentHashMap>() private val episodeImdbIdCache = ConcurrentHashMap>()