diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt index 77c29dd4a..3e68a3a33 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt @@ -64,6 +64,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ActivityResultReceived import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ClickedSearchInText import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ExitedSearch +import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnOpenInNewTabClick @@ -222,7 +223,7 @@ class SearchFragment : BaseFragment() { searchView?.setOnQueryTextListener( SimpleTextListener { if (it.isNotEmpty()) { - searchViewModel.searchResults(it) + searchViewModel.actions.trySend(Filter(it)).isSuccess } } ) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt index ec4b95a35..f284a0422 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt @@ -88,20 +88,10 @@ class SearchViewModel @Inject constructor( val actions = Channel(Channel.UNLIMITED) private val filter = ConflatedBroadcastChannel("") private val searchOrigin = ConflatedBroadcastChannel(FromWebView) - private val debouncedSearchQuery = MutableStateFlow("") init { viewModelScope.launch { reducer() } viewModelScope.launch { actionMapper() } - viewModelScope.launch { debouncedSearchQuery() } - } - - private suspend fun debouncedSearchQuery() { - // Observe and collect the debounced search query - debouncedSearchQuery - .collect { query -> - actions.trySend(Filter(query)).isSuccess - } } @Suppress("DEPRECATION") @@ -211,10 +201,6 @@ class SearchViewModel @Inject constructor( }, LATEST) .subscribeOn(Schedulers.io()) } - - fun searchResults(query: String) { - debouncedSearchQuery.value = query - } } data class SearchResultsWithTerm(val searchTerm: String, val suggestionSearch: SuggestionSearch?) diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt index 91bcdc36d..7fbf39190 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt @@ -29,12 +29,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.test.TestCoroutineDispatcher -import kotlinx.coroutines.test.TestCoroutineScheduler import kotlinx.coroutines.test.TestCoroutineScope import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.resetMain @@ -59,6 +57,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ClickedSearchInText import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ConfirmedDelete import org.kiwix.kiwixmobile.core.search.viewmodel.Action.CreatedWithArguments import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ExitedSearch +import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnOpenInNewTabClick @@ -110,54 +109,6 @@ internal class SearchViewModelTest { viewModel = SearchViewModel(recentSearchDao, zimReaderContainer, searchResultGenerator) } - @Nested - inner class DebouncedTest { - @Test - fun `Search action is debounced`() = runTest { - val searchTerm1 = "query1" - val searchTerm2 = "query2" - val searchTerm3 = "query3" - val searchOrigin = FromWebView - val suggestionSearch: SuggestionSearch = mockk() - - viewModel.state - .test(this) - .also { - searchResult(searchTerm1, suggestionSearch, testScheduler) - delay(100) - searchResult(searchTerm2, suggestionSearch, testScheduler) - delay(100) - searchResult(searchTerm3, suggestionSearch, testScheduler) - it.assertValue( - SearchState( - searchTerm3, - SearchResultsWithTerm(searchTerm3, suggestionSearch), - emptyList(), - searchOrigin - ) - ) - } - .finish() - } - - private fun searchResult( - searchTerm: String, - suggestionSearch: SuggestionSearch, - testScheduler: TestCoroutineScheduler - ) { - coEvery { - searchResultGenerator.generateSearchResults(searchTerm, zimFileReader) - } returns suggestionSearch - viewModel.searchResults(searchTerm) - recentsFromDb.trySend(emptyList()).isSuccess - viewModel.actions.trySend(ScreenWasStartedFrom(FromWebView)).isSuccess - testScheduler.apply { - advanceTimeBy(400) - runCurrent() - } - } - } - @Nested inner class StateTests { @Test @@ -301,7 +252,7 @@ internal class SearchViewModelTest { coEvery { searchResultGenerator.generateSearchResults(searchTerm, zimFileReader) } returns suggestionSearch - viewModel.searchResults(searchTerm) + viewModel.actions.trySend(Filter(searchTerm)).isSuccess recentsFromDb.trySend(databaseResults).isSuccess viewModel.actions.trySend(ScreenWasStartedFrom(searchOrigin)).isSuccess testScheduler.apply {