package com.joker.rxweather.presenter;
import android.content.Context;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.util.SparseArray;
import com.fernandocejas.frodo.annotation.RxLogSubscriber;
import com.joker.rxweather.common.Constants;
import com.joker.rxweather.exception.ErrorHanding;
import com.joker.rxweather.model.entities.AddressEntity;
import com.joker.rxweather.model.entities.MainEntity;
import com.joker.rxweather.model.entities.RequestCitiesEntity;
import com.joker.rxweather.model.request.ListRequest;
import com.joker.rxweather.model.request.PrepareRequest;
import com.joker.rxweather.views.ListView;
import com.rxweather.domain.usercase.ListUseCase;
import com.rxweather.domain.usercase.PrepareCase;
import com.rxweather.domain.usercase.UseCase;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
/**
* Created by Joker on 2015/10/29.
*/
public class ListPresenterImp implements ListPresenter<ListView<Observable<List<MainEntity>>>> {
private static final String TAG = ListPresenterImp.class.getSimpleName();
private ListView<Observable<List<MainEntity>>> listView;
private UseCase<SparseArray, PrepareRequest> prepareCase;
private UseCase<List<MainEntity>, ListRequest> listUseCase;
private PrepareRequest prepareRequest;
public ListPresenterImp() {
}
@Override public void attachView(@NonNull ListView<Observable<List<MainEntity>>> view) {
this.listView = view;
this.prepareRequest = new PrepareRequest(
(LocationManager) this.listView.getContext().getSystemService(Context.LOCATION_SERVICE),
this.listView.getContext().getAssets());
this.prepareCase = new PrepareCase();
this.listUseCase = new ListUseCase();
}
@Override public void loadData() {
ListPresenterImp.this.showLoading();
this.prepareCase.subscribe(new PrepareSubscriber(), prepareRequest);
}
private void showLoading() {
if (!listView.isContent()) {
this.listView.showLoading();
}
}
private void showContent(List<MainEntity> mainEntities) {
/*这和.publish().replay()有些不同,如果考虑GC pressure,还是换一种实现比较好:)
https://raw.githubusercontent.com/wiki/ReactiveX/RxJava/images/rx-operators/cache.png*/
this.listView.showForecasts(Observable.just(mainEntities).cache());
}
private void showError(int messageId) {
this.listView.showError(messageId);
}
/*准备工作Subscriber,位置,城市列表等*/
@RxLogSubscriber private final class PrepareSubscriber extends Subscriber<SparseArray> {
private ListRequest listRequest;
@Override public void onCompleted() {
ListPresenterImp.this.listUseCase.subscribe(new ListSubscriber(), listRequest);
}
@Override public void onError(Throwable e) {
ListPresenterImp.this.showError(ErrorHanding.propagate(e));
}
@Override public void onNext(SparseArray sparseArray) {
listRequest = new ListRequest(((AddressEntity) sparseArray.get(Constants.LOCATION_TAG)),
(List<RequestCitiesEntity.RequestCity>) sparseArray.get(Constants.FORECAST_TAG));
}
}
/*城市天气预报表*/
@RxLogSubscriber private final class ListSubscriber extends Subscriber<List<MainEntity>> {
@Override public void onCompleted() {
ListPresenterImp.this.listView.showContent();
}
@Override public void onError(Throwable e) {
ListPresenterImp.this.showError(ErrorHanding.propagate(e));
}
@Override public void onNext(List<MainEntity> mainEntities) {
ListPresenterImp.this.showContent(mainEntities);
}
}
@Override public void detachView() {
this.prepareCase.unsubscribe();
this.listUseCase.unsubscribe();
}
}