From f1f2b398ab4157e0ac8c1a4ddae7d1c989a65233 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Wed, 14 Jan 2026 17:05:38 +0200 Subject: [PATCH] Fix bug of search history randomly not saved Don't create disposable from operation of storing search to history because we certainly want this to complete. But create disposable from subscriber functions which handles showing snackbar notifiying user about not being to save search Disposable was created in `search` method and then alsmost immediately was called `startLoading` which disposed "all" disposables including our operation of search storing (if it was unlucky enough to not finish before this moment) --- .../fragments/list/search/SearchFragment.java | 58 ++++++++++++++----- 1 file changed, 43 insertions(+), 15 deletions(-) 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 8cb5f6497..cf71e8a48 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 @@ -85,6 +85,8 @@ import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.observers.DisposableMaybeObserver; +import io.reactivex.rxjava3.observers.DisposableSingleObserver; import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.subjects.PublishSubject; @@ -707,12 +709,20 @@ public class SearchFragment extends BaseListFragment { final Disposable onDelete = historyRecordManager.deleteSearchHistory(query) .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - howManyDeleted -> suggestionPublisher - .onNext(getSearchEditString()), - throwable -> showSnackBarError(new ErrorInfo(throwable, + .subscribeWith(new DisposableSingleObserver() { + @Override + public void onSuccess(final Integer howManyDeleted) { + suggestionPublisher.onNext(getSearchEditString()); + } + + @Override + public void onError(final Throwable e) { + showSnackBarError(new ErrorInfo(e, UserAction.DELETE_FROM_HISTORY, - "Deleting item failed"))); + "Deleting item failed")); + } + }); + disposables.add(onDelete); }) .show(); @@ -865,13 +875,24 @@ public class SearchFragment extends BaseListFragment { - }, - throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.SEARCHED, - theSearchString, serviceId)) + .subscribeWith(new DisposableMaybeObserver() { + @Override + public void onError(final Throwable throwable) { + showSnackBarError(new ErrorInfo(throwable, UserAction.SEARCHED, + theSearchString, serviceId)); + } + + @Override + public void onComplete() { + } + + @Override + public void onSuccess(final Long ignored) { + } + } )); // load search results @@ -1154,11 +1175,18 @@ public class SearchFragment extends BaseListFragment suggestionPublisher - .onNext(getSearchEditString()), - throwable -> showSnackBarError(new ErrorInfo(throwable, - UserAction.DELETE_FROM_HISTORY, "Deleting item failed"))); + .subscribeWith(new DisposableSingleObserver() { + @Override + public void onSuccess(final Integer howManyDeleted) { + suggestionPublisher.onNext(getSearchEditString()); + } + + @Override + public void onError(final Throwable e) { + showSnackBarError(new ErrorInfo(e, + UserAction.DELETE_FROM_HISTORY, "Deleting item failed")); + } + }); disposables.add(onDelete); } }