package com.bigfat.gankio_ca.data.net;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import com.bigfat.gankio_ca.data.entity.DataEntity;
import com.bigfat.gankio_ca.data.entity.DayEntity;
import com.bigfat.gankio_ca.data.entity.GankEntity;
import com.bigfat.gankio_ca.data.exception.APIException;
import com.bigfat.gankio_ca.data.exception.NetworkConnectionException;
import com.bigfat.gankio_ca.data.net.di.DaggerRetrofitComponent;
import com.fernandocejas.frodo.annotation.RxLogObservable;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
/**
* API 实现类
*
* Created by yueban on 09:59 24/2/16.
* Email: fbzhh007@gmail.com
* QQ: 343278606
*/
@Singleton
public class GankApiImpl {
private Context mContext;
private GankApi service;
@Inject
public GankApiImpl(Context context) {
this.mContext = context;
service = DaggerRetrofitComponent.create().retrofit().create(GankApi.class);
}
@RxLogObservable
public Observable<List<GankEntity>> data(final String type, final int pageSize, final int pageIndex) {
return Observable.create(new Observable.OnSubscribe<List<GankEntity>>() {
@Override
public void call(Subscriber<? super List<GankEntity>> subscriber) {
if (GankApiImpl.this.isThereInternetConnection()) {
service
.data(type, pageSize, pageIndex)
.flatMap(new Func1<DataEntity, Observable<List<GankEntity>>>() {
@Override
public Observable<List<GankEntity>> call(DataEntity dataEntity) {
if (dataEntity.isError()) {
return Observable.error(new APIException());
} else {
return Observable.just(dataEntity.getResults());
}
}
}).subscribe(subscriber);
} else {
subscriber.onError(new NetworkConnectionException());
}
}
});
}
@RxLogObservable
public Observable<DayEntity> day(final String date) {
return Observable.create(new Observable.OnSubscribe<DayEntity>() {
@Override
public void call(Subscriber<? super DayEntity> subscriber) {
if (GankApiImpl.this.isThereInternetConnection()) {
service
.day(date)
.flatMap(new Func1<DayEntity, Observable<DayEntity>>() {
@Override
public Observable<DayEntity> call(DayEntity dayEntity) {
if (dayEntity.isError()) {
return Observable.error(new APIException());
} else {
return Observable.just(dayEntity);
}
}
})
.subscribe(subscriber);
} else {
subscriber.onError(new NetworkConnectionException());
}
}
});
}
private boolean isThereInternetConnection() {
ConnectivityManager connectivityManager =
(ConnectivityManager) this.mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnectedOrConnecting();
}
}