package com.gzsll.hupu.ui.messagelist;
import android.support.annotation.NonNull;
import com.gzsll.hupu.api.forum.ForumApi;
import com.gzsll.hupu.bean.BaseData;
import com.gzsll.hupu.bean.Message;
import com.gzsll.hupu.bean.MessageData;
import com.gzsll.hupu.injector.PerActivity;
import com.gzsll.hupu.otto.MessageReadEvent;
import com.gzsll.hupu.util.ToastUtil;
import com.squareup.otto.Bus;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
/**
* Created by sll on 2016/3/11.
*/
@PerActivity
public class MessageListPresenter implements MessageListContract.Presenter {
private ForumApi mForumApi;
private Bus mBus;
private Subscription mSubscription;
private MessageListContract.View mMessageListView;
private String lastTid = "";
private int page = 1;
private List<Message> messages = new ArrayList<>();
@Inject
public MessageListPresenter(ForumApi mForumApi, Bus mBus) {
this.mForumApi = mForumApi;
this.mBus = mBus;
}
@Override
public void onMessageListReceive() {
mMessageListView.showLoading();
loadMessageList(true);
}
private void loadMessageList(final boolean clear) {
mSubscription = mForumApi.getMessageList(lastTid, page)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Action1<MessageData>() {
@Override
public void call(MessageData messageData) {
if (clear) {
messages.clear();
}
}
})
.map(new Func1<MessageData, List<Message>>() {
@Override
public List<Message> call(MessageData messageData) {
if (messageData != null && messageData.status == 200) {
return addMessages(messageData.result.list);
}
return null;
}
})
.subscribe(new Action1<List<Message>>() {
@Override
public void call(List<Message> messages) {
if (messages != null) {
if (messages.isEmpty()) {
mMessageListView.onEmpty();
} else {
mMessageListView.hideLoading();
mMessageListView.onRefreshCompleted();
mMessageListView.onLoadCompleted(true);
mMessageListView.renderMessageList(messages);
}
} else {
loadError();
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
loadError();
}
});
}
private void loadError() {
if (messages.isEmpty()) {
mMessageListView.onError();
} else {
ToastUtil.showToast("数据加载失败,请重试");
mMessageListView.hideLoading();
mMessageListView.onRefreshCompleted();
mMessageListView.onLoadCompleted(true);
}
}
private List<Message> addMessages(List<Message> threadList) {
for (Message thread : threadList) {
if (!contains(thread)) {
messages.add(thread);
}
}
if (!messages.isEmpty()) {
lastTid = messages.get(messages.size() - 1).tid;
}
return messages;
}
private boolean contains(Message message) {
boolean isContain = false;
for (Message message1 : messages) {
if (message.tid.equals(message1.tid)) {
isContain = true;
break;
}
}
return isContain;
}
@Override
public void onRefresh() {
lastTid = "";
page = 1;
onMessageListReceive();
}
@Override
public void onReload() {
}
@Override
public void onLoadMore() {
page++;
loadMessageList(false);
}
@Override
public void onMessageClick(final Message message) {
mMessageListView.showContentUi(message.tid, message.pid, Integer.valueOf(message.page));
mForumApi.delMessage(message.id).subscribe(new Action1<BaseData>() {
@Override
public void call(BaseData baseData) {
if (baseData != null && baseData.status == 200) {
mMessageListView.removeMessage(message);
mBus.post(new MessageReadEvent());
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
});
}
@Override
public void attachView(@NonNull MessageListContract.View view) {
mMessageListView = view;
}
@Override
public void detachView() {
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
}
mMessageListView = null;
}
}