From 3b4a5d29fa7e91646125b23390eafa5a0845bb6d Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Wed, 13 Aug 2025 17:53:24 +0530 Subject: [PATCH] =?UTF-8?q?Fixed:=20Online=20library=20was=20not=20retriev?= =?UTF-8?q?ing=20after=20clicking=20=E2=80=9CAllow=20downloading=20via=20m?= =?UTF-8?q?obile=20network=E2=80=9D=20in=20the=20confirmation=20dialog.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Cause: The request object emitted after user confirmation was identical to the previous one, so the flow collector skipped it and the fetch was never triggered. * Solution: Added a `System.nanoTime()` field to the request to ensure a unique emission while still preserving existing values. * Refactored the `updateOnlineLibraryFilters updates onlineLibraryRequest` according to this new change. --- .../zimManager/ZimManageViewModel.kt | 19 +++++++++++-- .../zimManager/ZimManageViewModelTest.kt | 28 +++++++++++-------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt index e3a2018f1..465154e20 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt @@ -155,7 +155,9 @@ class ZimManageViewModel @Inject constructor( val category: String? = null, val lang: String? = null, val isLoadMoreItem: Boolean, - val page: Int + val page: Int, + // Bug Fix #4381 + val version: Long = System.nanoTime() ) data class OnlineLibraryResult( @@ -371,7 +373,20 @@ class ZimManageViewModel @Inject constructor( category = newRequest.category ?: current.category, lang = newRequest.lang ?: current.lang, page = newRequest.page, - isLoadMoreItem = newRequest.isLoadMoreItem + isLoadMoreItem = newRequest.isLoadMoreItem, + version = if (isUnitTestCase) { + // In unit tests, we want predictable and testable values, + // so use the provided version instead of a dynamic timestamp. + newRequest.version + } else { + // Bug Fix #4381: + // Force StateFlow to emit even if all other fields are unchanged. + // Without this, identical requests may not trigger observers, + // causing the UI not to refresh. + // Using System.nanoTime() ensures a unique value each time, + // guaranteeing that collectors receive an update. + System.nanoTime() + } ) } } diff --git a/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt index fca3a5fbf..47ac8d5b7 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt @@ -302,18 +302,22 @@ class ZimManageViewModelTest { } @Test - fun `updateOnlineLibraryFilters updates onlineLibraryRequest`() = runTest { - val newRequest = ZimManageViewModel.OnlineLibraryRequest( - query = "test", - category = "cat", - lang = "en", - page = 2, - isLoadMoreItem = true - ) - viewModel.onlineLibraryRequest.test { - skipItems(1) - viewModel.updateOnlineLibraryFilters(newRequest) - assertThat(awaitItem()).isEqualTo(newRequest) + fun `updateOnlineLibraryFilters updates onlineLibraryRequest`() = flakyTest { + runTest { + viewModel.setIsUnitTestCase() + val newRequest = ZimManageViewModel.OnlineLibraryRequest( + query = "test", + category = "cat", + lang = "en", + page = 2, + isLoadMoreItem = true, + version = 100L + ) + viewModel.onlineLibraryRequest.test { + skipItems(1) + viewModel.updateOnlineLibraryFilters(newRequest) + assertThat(awaitItem()).isEqualTo(newRequest) + } } }