package it.niedermann.nextcloud.deck.api; import com.nextcloud.android.sso.api.NextcloudAPI; import io.reactivex.Observable; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; import it.niedermann.nextcloud.deck.DeckLog; public class RequestHelper { static { RxJavaPlugins.setErrorHandler(DeckLog::logError); } public static void request(final ApiProvider provider, final ObservableProvider call, final IResponseCallback callback) { if (provider.getDeckAPI() == null) { provider.initSsoApi(new NextcloudAPI.ApiConnectedListener() { @Override public void onConnected() { /* great, nothing to do. */} @Override public void onError(Exception e) { callback.onError(e); } }); } runRequest(call.getObservableFromCall(), callback); } private static void runRequest(final Observable request, final IResponseCallback callback) { ResponseConsumer cb = new ResponseConsumer<>(callback); request.subscribeOn(Schedulers.newThread()) .subscribe(cb, cb.getExceptionConsumer()); } public interface ObservableProvider { Observable getObservableFromCall(); } public static class ResponseConsumer implements Consumer { private IResponseCallback callback; private Consumer exceptionConsumer = new Consumer() { @Override public void accept(final Throwable throwable) { callback.onError(throwable); } }; private ResponseConsumer(IResponseCallback callback) { this.callback = callback; } @Override public void accept(final T t) { callback.fillAccountIDs(t); callback.onResponse(t); } private Consumer getExceptionConsumer() { return exceptionConsumer; } } }