package it.niedermann.nextcloud.deck.remote.api; import androidx.annotation.NonNull; import io.reactivex.Observable; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.util.ExecutorServiceProvider; public class RequestHelper { static { RxJavaPlugins.setErrorHandler(DeckLog::logError); } public static Disposable request(@NonNull final ApiProvider provider, @NonNull final ObservableProvider call, @NonNull final ResponseCallback callback) { if (provider.getDeckAPI() == null) { provider.initSsoApi(callback::onError); } final ResponseConsumer cb = new ResponseConsumer<>(callback); return call.getObservableFromCall() .subscribeOn(Schedulers.from(ExecutorServiceProvider.getExecutorService())) .subscribe(cb, cb.getExceptionConsumer()); } public interface ObservableProvider { Observable getObservableFromCall(); } public static class ResponseConsumer implements Consumer { @NonNull private final ResponseCallback callback; @NonNull private final Consumer exceptionConsumer = new Consumer<>() { @Override public void accept(final Throwable throwable) { callback.onError(ServerCommunicationErrorHandler.translateError(throwable)); } }; private ResponseConsumer(@NonNull ResponseCallback callback) { this.callback = callback; } @Override public void accept(final T t) { callback.fillAccountIDs(t); callback.onResponse(t); } @NonNull private Consumer getExceptionConsumer() { return exceptionConsumer; } } }