diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt index 3d5e53f20..6ccdb4af7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookSearchBar.kt @@ -29,8 +29,8 @@ fun ReadBookSearchBar( val searchVisible = state.isShowingSearchResult && !(state.menuVisible && state.menuState.currentRoute != ReadBookMenuRoute.Main) val hasResults = state.searchResultList.isNotEmpty() - val currentIndex = state.searchResultIndex val totalResults = state.searchResultList.size + val currentIndex = state.searchResultIndex.coerceIn(0, (totalResults - 1).coerceAtLeast(0)) Box(Modifier.fillMaxSize()) { // Left FAB - previous result @@ -45,9 +45,11 @@ fun ReadBookSearchBar( AppFloatingActionButton( onClick = { val prevIndex = currentIndex - 1 + val result = state.searchResultList.getOrNull(prevIndex) + ?: return@AppFloatingActionButton onIntent( ReadBookIntent.NavigateToSearchResult( - state.searchResultList[prevIndex], prevIndex + result, prevIndex ) ) }, @@ -75,9 +77,11 @@ fun ReadBookSearchBar( AppFloatingActionButton( onClick = { val nextIndex = currentIndex + 1 + val result = state.searchResultList.getOrNull(nextIndex) + ?: return@AppFloatingActionButton onIntent( ReadBookIntent.NavigateToSearchResult( - state.searchResultList[nextIndex], nextIndex + result, nextIndex ) ) }, diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 2503b6507..c6e943b61 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -231,9 +231,11 @@ class ReadBookViewModel( is ReadBookIntent.HideSearchMenu -> _uiState.update { it.copy(searchMenuVisible = false) } is ReadBookIntent.SetSearchResults -> { _uiState.update { + val results = intent.results.toImmutableList() + val index = intent.index.coerceSearchResultIndex(results.size) it.copy( - searchResultList = intent.results.toImmutableList(), - searchResultIndex = intent.index, + searchResultList = results, + searchResultIndex = index, isShowingSearchResult = true, searchMenuVisible = true, menuState = ReadBookMenuState(), @@ -243,7 +245,13 @@ class ReadBookViewModel( } is ReadBookIntent.SetSearchResultIndex -> { - _uiState.update { it.copy(searchResultIndex = intent.index) } + _uiState.update { + it.copy( + searchResultIndex = intent.index.coerceSearchResultIndex( + it.searchResultList.size + ) + ) + } } is ReadBookIntent.SetShowingSearchResult -> { @@ -252,7 +260,13 @@ class ReadBookViewModel( is ReadBookIntent.NavigateToSearchResult -> { ReadBook.saveCurrentBookProgress() - _uiState.update { it.copy(searchResultIndex = intent.index) } + _uiState.update { + it.copy( + searchResultIndex = intent.index.coerceSearchResultIndex( + it.searchResultList.size + ) + ) + } navigateToSearchResult(intent.result) } @@ -3466,3 +3480,7 @@ private const val TITLE_BAR_ICON_KEY = "icons" private const val TOOL_BUTTON_PREFS = "tool_button_config" private const val TOOL_BUTTON_KEY = "tool_buttons" private const val DEFAULT_ENABLED_BUTTON_COUNT = 5 + +private fun Int.coerceSearchResultIndex(resultSize: Int): Int { + return if (resultSize <= 0) 0 else coerceIn(0, resultSize - 1) +}