package com.caij.emore.present.imp;
import com.caij.emore.EMApplication;
import com.caij.emore.account.UserPrefs;
import com.caij.emore.api.ex.ErrorCheckerTransformer;
import com.caij.emore.api.ex.ResponseSubscriber;
import com.caij.emore.api.ex.SchedulerTransformer;
import com.caij.emore.bean.MessageAttachInfo;
import com.caij.emore.bean.response.UserMessageResponse;
import com.caij.emore.bean.wrap.DirectMessageWrap;
import com.caij.emore.database.bean.DirectMessage;
import com.caij.emore.database.bean.UnReadMessage;
import com.caij.emore.data.local.NotifyManager;
import com.caij.emore.present.StrangerMessagePresent;
import com.caij.emore.data.remote.MessageApi;
import com.caij.emore.data.remote.NotifyApi;
import com.caij.emore.ui.view.RefreshListView;
import com.caij.emore.utils.rxjava.SubscriberAdapter;
import com.caij.emore.utils.weibo.MessageUtil;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscription;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func1;
/**
* Created by Ca1j on 2016/12/26.
*/
public class StrangerMessagePresentImp extends AbsBasePresent implements StrangerMessagePresent {
private static final int PAGE_COUNT = 20;
private MessageApi mMessageApi;
private NotifyApi mNotifyApi;
private NotifyManager mNotifyManager;
private RefreshListView<DirectMessageWrap> mRefreshListView;
private List<DirectMessageWrap> mDirectMessages;
public StrangerMessagePresentImp(MessageApi messageApi, NotifyApi notifyApi, NotifyManager notifyManager, RefreshListView<DirectMessageWrap> refreshListView) {
mMessageApi = messageApi;
mRefreshListView = refreshListView;
mNotifyApi = notifyApi;
mNotifyManager = notifyManager;
mDirectMessages = new ArrayList<>();
}
@Override
public void onCreate() {
}
@Override
public void refresh() {
Subscription subscription = loadMessage(Long.MAX_VALUE)
.doOnTerminate(new Action0() {
@Override
public void call() {
mRefreshListView.onRefreshComplete();
}
}).subscribe(new ResponseSubscriber<List<DirectMessageWrap>>(mRefreshListView) {
@Override
protected void onFail(Throwable e) {
}
@Override
public void onNext(List<DirectMessageWrap> directMessages) {
mDirectMessages.clear();
mDirectMessages.addAll(directMessages);
mRefreshListView.notifyItemChanged(mDirectMessages);
mRefreshListView.onLoadComplete(directMessages.size() >= PAGE_COUNT);
MessageUtil.resetUnReadMessage(UnReadMessage.TYPE_MSG_BOX, UserPrefs.get(EMApplication.getInstance()).getToken().getUid(),
mNotifyApi, mNotifyManager);
}
});
addSubscription(subscription);
}
@Override
public void userFirstVisible() {
}
@Override
public void loadMore() {
long maxId = Long.MAX_VALUE;
if (mDirectMessages.size() > 0) {
maxId = mDirectMessages.get(mDirectMessages.size() - 1).directMessage.getId();
}
Subscription subscription = loadMessage(maxId)
.subscribe(new ResponseSubscriber<List<DirectMessageWrap>>(mRefreshListView) {
@Override
protected void onFail(Throwable e) {
mRefreshListView.onLoadComplete(true);
}
@Override
public void onNext(List<DirectMessageWrap> directMessages) {
mDirectMessages.addAll(directMessages);
mRefreshListView.notifyItemRangeInserted(mDirectMessages,
mDirectMessages.size() - directMessages.size() - 1, directMessages.size());
mRefreshListView.onLoadComplete(directMessages.size() >= PAGE_COUNT);
}
});
addSubscription(subscription);
}
private Observable<List<DirectMessageWrap>> loadMessage(long max_id) {
return mMessageApi.getStrangerMessages(0, max_id, PAGE_COUNT, 1)
.compose(ErrorCheckerTransformer.<UserMessageResponse>create())
.flatMap(new Func1<UserMessageResponse, Observable<DirectMessage>>() {
@Override
public Observable<DirectMessage> call(UserMessageResponse userMessageResponse) {
return Observable.from(userMessageResponse.getDirect_messages());
}
})
.doOnNext(new Action1<DirectMessage>() {
@Override
public void call(final DirectMessage directMessage) {
if (directMessage.getAtt_ids() != null && directMessage.getAtt_ids().size() > 0) {
mMessageApi.getMessageAttach(directMessage.getAtt_ids().get(0))
.subscribe(new SubscriberAdapter<MessageAttachInfo>() {
@Override
public void onNext(MessageAttachInfo messageAttachInfo) {
List<MessageAttachInfo> messageAttachInfos = new ArrayList<MessageAttachInfo>(1);
messageAttachInfos.add(messageAttachInfo);
directMessage.setAttachinfo(messageAttachInfos);
}
});
}
}
})
.compose(new ChatPresentImp.MessageTransformer())
.toList()
.compose(SchedulerTransformer.<List<DirectMessageWrap>>create());
}
}