/*
* Copyright (C) 2016 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.marshon.likequanmintv.librarys.http.rxjavacalladapter;
import java.lang.reflect.Type;
import retrofit2.Call;
import retrofit2.CallAdapter;
import retrofit2.Response;
import rx.Completable;
import rx.Completable.CompletableOnSubscribe;
import rx.Completable.CompletableSubscriber;
import rx.Scheduler;
import rx.Subscription;
import rx.exceptions.Exceptions;
import rx.functions.Action0;
import rx.subscriptions.Subscriptions;
final class CompletableHelper {
static CallAdapter<Completable> createCallAdapter(Scheduler scheduler) {
return new CompletableCallAdapter(scheduler);
}
private static final class CompletableCallOnSubscribe implements CompletableOnSubscribe {
private final Call originalCall;
CompletableCallOnSubscribe(Call originalCall) {
this.originalCall = originalCall;
}
@Override public void call(CompletableSubscriber subscriber) {
// Since Call is a one-shot type, clone it for each new subscriber.
final Call call = originalCall.clone();
// Attempt to cancel the call if it is still in-flight on unsubscription.
Subscription subscription = Subscriptions.create(new Action0() {
@Override public void call() {
call.cancel();
}
});
subscriber.onSubscribe(subscription);
try {
Response response = call.execute();
if (!subscription.isUnsubscribed()) {
if (response.isSuccessful()) {
subscriber.onCompleted();
} else {
subscriber.onError(new HttpException(response));
}
}
} catch (Throwable t) {
Exceptions.throwIfFatal(t);
if (!subscription.isUnsubscribed()) {
subscriber.onError(t);
}
}
}
}
static class CompletableCallAdapter implements CallAdapter<Completable> {
private final Scheduler scheduler;
CompletableCallAdapter(Scheduler scheduler) {
this.scheduler = scheduler;
}
@Override public Type responseType() {
return Void.class;
}
@Override public Completable adapt(Call call) {
Completable completable = Completable.create(new CompletableCallOnSubscribe(call));
if (scheduler != null) {
return completable.subscribeOn(scheduler);
}
return completable;
}
}
}