diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryFilterBar.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryFilterBar.kt index dcaf5e524..60f4df207 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryFilterBar.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryFilterBar.kt @@ -1,6 +1,5 @@ package app.omnivore.omnivore.ui.library -import android.util.Log import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt index 0e3e0ff1e..611e4a9be 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt @@ -33,13 +33,10 @@ fun LibraryView( libraryViewModel: LibraryViewModel, navController: NavHostController ) { - val searchText: String by libraryViewModel.searchTextLiveData.observeAsState("") - Scaffold( topBar = { SearchBar( - searchText = searchText, - onSearchTextChanged = { libraryViewModel.updateSearchText(it) }, + libraryViewModel = libraryViewModel, onSettingsIconClick = { navController.navigate(Routes.Settings.route) } ) } @@ -84,8 +81,10 @@ fun LibraryViewContent(libraryViewModel: LibraryViewModel, modifier: Modifier) { .fillMaxSize() .padding(horizontal = 6.dp) ) { - item { - LibraryFilterBar(libraryViewModel) + if (searchText.isEmpty()) { + item { + LibraryFilterBar(libraryViewModel) + } } items(if (searchText.isNotEmpty()) searchedCardsData else cardsData) { cardDataWithLabels -> SavedItemCard( diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 32efeea18..7fb7767e3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -3,6 +3,7 @@ package app.omnivore.omnivore.ui.library import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -35,8 +36,8 @@ class LibraryViewModel @Inject constructor( val searchTextLiveData = MutableLiveData("") val searchItemsLiveData = MutableLiveData>(listOf()) val itemsLiveData = dataService.db.savedItemDao().getLibraryLiveDataWithLabels() - val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX) - val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST) + val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX) + val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST) var isRefreshing by mutableStateOf(false) var hasLoadedInitialFilters = false @@ -106,16 +107,24 @@ class LibraryViewModel @Inject constructor( fun updateSavedItemFilter(filter: SavedItemFilter) { viewModelScope.launch { datastoreRepo.putString(DatastoreKeys.lastUsedSavedItemFilter, filter.rawValue) - appliedFilterLiveData.postValue(filter) - // TODO: update Room query + appliedFilterLiveData.value = filter + handleFilterChanges() } } fun updateSavedItemSortFilter(filter: SavedItemSortFilter) { viewModelScope.launch { datastoreRepo.putString(DatastoreKeys.lastUsedSavedItemSortFilter, filter.rawValue) - appliedSortFilterLiveData.postValue(filter) - // TODO: update Room query + appliedSortFilterLiveData.value = filter + handleFilterChanges() + } + } + + suspend fun handleFilterChanges() { // TODO: implement + if (searchTextLiveData.value != "") { + performSearch(true) + } else { + // TODO: implement } } @@ -168,7 +177,7 @@ class LibraryViewModel @Inject constructor( searchIdx += 1 // Execute the search - val searchResult = networker.typeaheadSearch(searchTextLiveData.value ?: "") + val searchResult = networker.typeaheadSearch(searchQueryString()) // Search results aren't guaranteed to return in order so this // will discard old results that are returned while a user is typing. @@ -209,6 +218,18 @@ class LibraryViewModel @Inject constructor( } } } + + private fun searchQueryString(): String { + var query = "${appliedFilterLiveData.value?.queryString} ${appliedSortFilterLiveData.value?.queryString}" + val searchText = searchTextLiveData.value ?: "" + + if (searchText.isNotEmpty()) { + query += " $searchText" + } + + Log.d("sefi", "search query: $query") + return query + } } enum class SavedItemAction { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt index 63b0b91e9..c1bc57966 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt @@ -15,6 +15,7 @@ import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -27,16 +28,16 @@ import androidx.compose.ui.unit.dp @OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchBar( - searchText: String, - onSearchTextChanged: (String) -> Unit, + libraryViewModel: LibraryViewModel, onSettingsIconClick: () -> Unit ) { - var showSearchField by remember { mutableStateOf(searchText != "") } + var showSearchField by remember { mutableStateOf(false) } + val searchText: String by libraryViewModel.searchTextLiveData.observeAsState("") SmallTopAppBar( title = { if (showSearchField) { - SearchField(searchText, onSearchTextChanged) + SearchField(searchText) { libraryViewModel.updateSearchText(it) } } else { Text("Library") } @@ -50,7 +51,7 @@ fun SearchBar( text = "Cancel", modifier = Modifier .clickable { - onSearchTextChanged("") + libraryViewModel.updateSearchText("") showSearchField = false } .padding(horizontal = 6.dp)