diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index eef3455ae87..a316ec497e4 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -1,6 +1,8 @@ package org.schabi.newpipe.fragments.list.search; import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags; +import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.ALL; +import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.EXACT; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; @@ -845,7 +847,24 @@ private void search(@NonNull final String theSearchString, // prepare search lastSearchedString = this.searchString; - this.searchString = theSearchString; + searchString = theSearchString; + + // Always remove EXACT search initially so it doesn't persist over multiple searches + final List tempContentFilter = new ArrayList<>(Arrays.asList(contentFilter)); + tempContentFilter.remove(EXACT); + contentFilter = tempContentFilter.toArray(new String[0]); + + // If quotes are around the search string EXACT search is enabled + // Overrides ALL and is otherwise appended to existing filters + if (searchString.charAt(0) == '\"' + && searchString.charAt(searchString.length() - 1) == '\"') { + if (contentFilter.length == 0 || contentFilter[0].equals(ALL)) { + contentFilter = new String[]{EXACT}; + } else { + contentFilter = new String[]{contentFilter[0], EXACT}; + } + } + infoListAdapter.clearStreamItemList(); hideSuggestionsPanel(); showMetaInfoInTextView(null, searchBinding.searchMetaInfoTextView, @@ -867,6 +886,15 @@ private void search(@NonNull final String theSearchString, startLoading(false); } + /** + * Adjusts the search string from EXACT searches for queries (removes the surrounding quotes). + * @return The adjusted search string + */ + private String getExactSearchAdjustedString() { + return Arrays.asList(contentFilter).contains(EXACT) + ? searchString.substring(1, searchString.length() - 1) : searchString; + } + @Override public void startLoading(final boolean forceLoad) { super.startLoading(forceLoad); @@ -875,14 +903,13 @@ public void startLoading(final boolean forceLoad) { searchDisposable.dispose(); } searchDisposable = ExtractorHelper.searchFor(serviceId, - searchString, + getExactSearchAdjustedString(), Arrays.asList(contentFilter), sortFilter) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((searchResult, throwable) -> isLoading.set(false)) .subscribe(this::handleResult, this::onItemError); - } @Override @@ -897,7 +924,7 @@ protected void loadMoreItems() { } searchDisposable = ExtractorHelper.getMoreSearchItems( serviceId, - searchString, + getExactSearchAdjustedString(), asList(contentFilter), sortFilter, nextPage)