package com.codeest.geeknews.presenter.gank;
import com.codeest.geeknews.app.Constants;
import com.codeest.geeknews.base.RxPresenter;
import com.codeest.geeknews.component.RxBus;
import com.codeest.geeknews.model.DataManager;
import com.codeest.geeknews.model.bean.GankItemBean;
import com.codeest.geeknews.model.bean.GankSearchItemBean;
import com.codeest.geeknews.model.event.SearchEvent;
import com.codeest.geeknews.model.http.response.GankHttpResponse;
import com.codeest.geeknews.base.contract.gank.TechContract;
import com.codeest.geeknews.ui.gank.fragment.GankMainFragment;
import com.codeest.geeknews.util.RxUtil;
import com.codeest.geeknews.widget.CommonSubscriber;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
/**
* Created by codeest on 16/8/20.
*/
public class TechPresenter extends RxPresenter<TechContract.View> implements TechContract.Presenter{
private DataManager mDataManager;
private static final int NUM_OF_PAGE = 20;
private int currentPage = 1;
private String queryStr = null;
private String currentTech = GankMainFragment.tabTitle[0];
private int currentType = Constants.TYPE_ANDROID;
@Inject
public TechPresenter(DataManager mDataManager) {
this.mDataManager = mDataManager;
}
@Override
public void attachView(TechContract.View view) {
super.attachView(view);
registerEvent();
}
private void registerEvent() {
addSubscribe(RxBus.getDefault().toFlowable(SearchEvent.class)
.compose(RxUtil.<SearchEvent>rxSchedulerHelper())
.filter(new Predicate<SearchEvent>() {
@Override
public boolean test(@NonNull SearchEvent searchEvent) throws Exception {
return searchEvent.getType() == currentType;
}
})
.map(new Function<SearchEvent, String>() {
@Override
public String apply(SearchEvent searchEvent) {
return searchEvent.getQuery();
}
})
.subscribeWith(new CommonSubscriber<String>(mView, "搜索失败") {
@Override
public void onNext(String s) {
queryStr = s;
getSearchTechData();
}
@Override
public void onError(Throwable e) {
super.onError(e);
registerEvent();
}
})
);
}
private void getSearchTechData() {
currentPage = 1;
addSubscribe(mDataManager.fetchGankSearchList(queryStr, currentTech, NUM_OF_PAGE, currentPage)
.compose(RxUtil.<GankHttpResponse<List<GankSearchItemBean>>>rxSchedulerHelper())
.compose(RxUtil.<List<GankSearchItemBean>>handleResult())
.map(new Function<List<GankSearchItemBean>, List<GankItemBean>>() {
@Override
public List<GankItemBean> apply(List<GankSearchItemBean> gankSearchItemBeen) {
List<GankItemBean> newList = new ArrayList<>();
for (GankSearchItemBean item : gankSearchItemBeen) {
GankItemBean bean = new GankItemBean();
bean.set_id(item.getGanhuo_id());
bean.setDesc(item.getDesc());
bean.setPublishedAt(item.getPublishedAt());
bean.setWho(item.getWho());
bean.setUrl(item.getUrl());
newList.add(bean);
}
return newList;
}
})
.subscribeWith(new CommonSubscriber<List<GankItemBean>>(mView) {
@Override
public void onNext(List<GankItemBean> gankItemBeen) {
mView.showContent(gankItemBeen);
}
})
);
}
@Override
public void getGankData(String tech, int type) {
queryStr = null;
currentPage = 1;
currentTech = tech;
currentType = type;
addSubscribe(mDataManager.fetchTechList(tech,NUM_OF_PAGE,currentPage)
.compose(RxUtil.<GankHttpResponse<List<GankItemBean>>>rxSchedulerHelper())
.compose(RxUtil.<List<GankItemBean>>handleResult())
.subscribeWith(new CommonSubscriber<List<GankItemBean>>(mView) {
@Override
public void onNext(List<GankItemBean> gankItemBeen) {
mView.showContent(gankItemBeen);
}
})
);
}
@Override
public void getMoreGankData(String tech) {
if(queryStr != null) {
getMoreSearchGankData();
return;
}
addSubscribe(mDataManager.fetchTechList(tech,NUM_OF_PAGE,++currentPage)
.compose(RxUtil.<GankHttpResponse<List<GankItemBean>>>rxSchedulerHelper())
.compose(RxUtil.<List<GankItemBean>>handleResult())
.subscribeWith(new CommonSubscriber<List<GankItemBean>>(mView, "加载更多数据失败ヽ(≧Д≦)ノ", false) {
@Override
public void onNext(List<GankItemBean> gankItemBeen) {
mView.showMoreContent(gankItemBeen);
}
})
);
}
private void getMoreSearchGankData() {
addSubscribe(mDataManager.fetchGankSearchList(queryStr, currentTech, NUM_OF_PAGE, ++currentPage)
.compose(RxUtil.<GankHttpResponse<List<GankSearchItemBean>>>rxSchedulerHelper())
.compose(RxUtil.<List<GankSearchItemBean>>handleResult())
.map(new Function<List<GankSearchItemBean>, List<GankItemBean>>() {
@Override
public List<GankItemBean> apply(List<GankSearchItemBean> gankSearchItemBeen) {
List<GankItemBean> newList = new ArrayList<>();
for (GankSearchItemBean item : gankSearchItemBeen) {
GankItemBean bean = new GankItemBean();
bean.set_id(item.getGanhuo_id());
bean.setDesc(item.getDesc());
bean.setPublishedAt(item.getPublishedAt());
bean.setWho(item.getWho());
bean.setUrl(item.getUrl());
newList.add(bean);
}
return newList;
}
})
.subscribeWith(new CommonSubscriber<List<GankItemBean>>(mView, false) {
@Override
public void onNext(List<GankItemBean> gankItemBeen) {
mView.showMoreContent(gankItemBeen);
}
})
);
}
@Override
public void getGirlImage() {
addSubscribe(mDataManager.fetchRandomGirl(1)
.compose(RxUtil.<GankHttpResponse<List<GankItemBean>>>rxSchedulerHelper())
.compose(RxUtil.<List<GankItemBean>>handleResult())
.subscribeWith(new CommonSubscriber<List<GankItemBean>>(mView, "加载封面失败", false) {
@Override
public void onNext(List<GankItemBean> gankItemBean) {
mView.showGirlImage(gankItemBean.get(0).getUrl(), gankItemBean.get(0).getWho());
}
})
);
}
}