From 4b3dc69235342b813b0acfc85853fd8badcc01ec Mon Sep 17 00:00:00 2001 From: Ann Rose Date: Wed, 3 Jun 2026 17:12:05 +0530 Subject: [PATCH 1/2] Fix memory leak --- .../tv/data/repository/MediaRepository.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) 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..256d58ed 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,25 @@ 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 val detailsCache = LruCache>(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 = LruCache>>(150) + private val similarCache = LruCache>>(150) + private val logoCache = LruCache>(300) + private val reviewsCache = LruCache>>(100) + private val watchProvidersCache = LruCache>>(150) + private val seasonEpisodesCache = LruCache>>(200) + private val imdbRatingCache = LruCache>(500) private val imdbEpisodeRatingsCache = ConcurrentHashMap, String>>>() private val imdbRatingsByIdCache = ConcurrentHashMap>() private val episodeImdbIdCache = ConcurrentHashMap>() From e044c9dd0b9b0f09d763839c5c8b0bae63b1c654 Mon Sep 17 00:00:00 2001 From: Ann Rose Date: Wed, 3 Jun 2026 18:50:23 +0530 Subject: [PATCH 2/2] fix: replace LruCache with bounded LinkedHashMap to resolve build failure --- .../tv/data/repository/MediaRepository.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) 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 256d58ed..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 @@ -116,15 +116,20 @@ class MediaRepository @Inject constructor( @Volatile private var homeCategoriesFetchedAt = 0L private val HOME_CATEGORIES_CACHE_MS = 120_000L // 2 minutes - private val detailsCache = LruCache>(200) + 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 = LruCache>>(150) - private val similarCache = LruCache>>(150) - private val logoCache = LruCache>(300) - private val reviewsCache = LruCache>>(100) - private val watchProvidersCache = LruCache>>(150) - private val seasonEpisodesCache = LruCache>>(200) - private val imdbRatingCache = LruCache>(500) + 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>()