From 7a491570afd4f107184544aab7ffe8dfe2b0b187 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sun, 2 Aug 2026 16:35:47 +0530 Subject: [PATCH] fix: skip redundant Trakt watched refresh (NUVIO-MOBILE-Q3) --- .../app/features/watched/WatchedRepository.kt | 10 +++++++++- .../features/watched/WatchedRepositoryTest.kt | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt index 5d3f179b2..8a389782f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt @@ -113,6 +113,11 @@ internal suspend fun watchedProviderRefreshOrNull( null } +internal fun extraWatchedKeysChanged( + previous: Set?, + current: Set, +): Boolean = previous.orEmpty() != current + object WatchedRepository { private data class WatchedRefreshOperation( val profileId: Int, @@ -1099,7 +1104,10 @@ object WatchedRepository { adapter.observeExtraWatchedKeys(currentProfileId) .distinctUntilChanged() .collectLatest { extraKeys -> - val keysChanged = providerExtraWatchedKeys[providerId] != extraKeys + val keysChanged = extraWatchedKeysChanged( + previous = providerExtraWatchedKeys[providerId], + current = extraKeys, + ) if (keysChanged) { val freshItems = watchedProviderRefreshOrNull( refresh = { diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watched/WatchedRepositoryTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watched/WatchedRepositoryTest.kt index 86f320b00..3eebb57dd 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watched/WatchedRepositoryTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watched/WatchedRepositoryTest.kt @@ -14,6 +14,26 @@ import kotlin.test.assertNull import kotlin.test.assertTrue class WatchedRepositoryTest { + @Test + fun emptyProviderExtraKeys_doNotTriggerInitialRefresh() { + assertFalse(extraWatchedKeysChanged(previous = null, current = emptySet())) + } + + @Test + fun populatedProviderExtraKeys_triggerRefreshFromEmptyState() { + assertTrue(extraWatchedKeysChanged(previous = null, current = setOf("series:tt1:-1:-1"))) + } + + @Test + fun changedProviderExtraKeys_triggerRefresh() { + assertTrue( + extraWatchedKeysChanged( + previous = setOf("series:tt1:-1:-1"), + current = setOf("series:tt2:-1:-1"), + ), + ) + } + @Test fun providerRefreshFailure_isContainedWithoutReplacingState() = runBlocking { val failure = IllegalStateException("rate limited")