package com.caij.emore.present.imp;
import com.caij.emore.Analysis;
import com.caij.emore.EMApplication;
import com.caij.emore.Key;
import com.caij.emore.api.ex.ResponseSubscriber;
import com.caij.emore.bean.response.QueryStatusResponse;
import com.caij.emore.bean.wrap.StatusWrap;
import com.caij.emore.data.local.NotifyManager;
import com.caij.emore.data.local.StatusManager;
import com.caij.emore.database.bean.Status;
import com.caij.emore.database.bean.UnReadMessage;
import com.caij.emore.event.EventTag;
import com.caij.emore.present.FriendStatusPresent;
import com.caij.emore.data.remote.AttitudeApi;
import com.caij.emore.data.remote.StatusApi;
import com.caij.emore.ui.view.FriendStatusView;
import com.caij.lib.util.LogUtil;
import com.caij.lib.util.SPBuilder;
import com.caij.emore.utils.rxbus.RxBus;
import com.caij.emore.api.ex.ErrorCheckerTransformer;
import com.caij.emore.api.ex.SchedulerTransformer;
import com.caij.emore.utils.rxjava.RxUtil;
import com.caij.emore.utils.rxjava.SubscriberAdapter;
import com.caij.emore.utils.weibo.MessageUtil;
import java.util.List;
import rx.Observable;
import rx.Subscription;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func1;
/**
* Created by Caij on 2016/5/31.
*/
public class FriendStatusPresentImp extends AbsListTimeLinePresent<FriendStatusView> implements FriendStatusPresent {
private final static int PAGE_COUNT = 20;
private final static long STATUS_REFRESH_INTERVAL = 60 * 60 * 1000;
private NotifyManager mNotifyManager;
private Observable<Status> mPublishStatusObservable;
private long mUid;
private long mNextCursor;
public FriendStatusPresentImp(long uid, FriendStatusView view, StatusApi statusApi,
StatusManager statusManager, AttitudeApi attitudeApi,
NotifyManager notifyManager) {
super(view, statusApi, statusManager, attitudeApi);
mNotifyManager = notifyManager;
mUid = uid;
}
@Override
public void onCreate() {
super.onCreate();
registerEvent();
getLocalFriendStatus();
}
private void registerEvent() {
mPublishStatusObservable = RxBus.get().register(EventTag.EVENT_PUBLISH_WEIBO_SUCCESS);
mPublishStatusObservable.compose(StatusWrapTransformer.create(false))
.compose(SchedulerTransformer.<StatusWrap>create())
.subscribe(new Action1<StatusWrap>() {
@Override
public void call(StatusWrap statusWrap) {
mView.onStatusPublishSuccess(statusWrap);
}
});
}
private void getLocalFriendStatus() {
Subscription subscription = RxUtil.createDataObservable(new RxUtil.Provider<List<Status>>() {
@Override
public List<Status> getData() {
return mStatusManager.getFriendStatuses(mUid, 0, 0, PAGE_COUNT, 1);
}
}).flatMap(new Func1<List<Status>, Observable<Status>>() {
@Override
public Observable<Status> call(List<Status> statuses) {
return Observable.from(statuses);
}
})
.compose(StatusWrapTransformer.create(false))
.toList()
.compose(SchedulerTransformer.<List<StatusWrap>>create())
.subscribe(new SubscriberAdapter<List<StatusWrap>>() {
@Override
public void onError(Throwable e) {
mView.toRefresh();
}
@Override
public void onNext(List<StatusWrap> statusWraps) {
onGetLocalStatusSuccess(statusWraps);
}
});
addSubscription(subscription);
}
private void onGetLocalStatusSuccess(List<StatusWrap> statuses) {
mStatuses.addAll(statuses);
mView.notifyItemChanged(mStatuses);
mNextCursor = new SPBuilder(EMApplication.getInstance())
.openDefault()
.getLong(Key.FRIEND_STATUS_LOCAL_NEXT_CURSOR, 0);
LogUtil.d(this, "local next cursor %s", mNextCursor);
long preRefreshTime = new SPBuilder(EMApplication.getInstance())
.openDefault()
.getLong(Key.FRIEND_STATUS_UPDATE_TIME, -1);
mView.onLoadComplete(mNextCursor > 0);
if (System.currentTimeMillis() - preRefreshTime > STATUS_REFRESH_INTERVAL
|| statuses.size() <= 0) {
mView.toRefresh();
}
}
@Override
public void refresh() {
Analysis.logRefreshStatus();
Subscription subscription = getFriendStatusesObservable(0, true)
.doOnNext(new Action1<List<StatusWrap>>() {
@Override
public void call(List<StatusWrap> statuses) {
cacheAboutData();
}
})
.doOnTerminate(new Action0() {
@Override
public void call() {
mView.onRefreshComplete();
}
})
.subscribe(new ResponseSubscriber<List<StatusWrap>>(mView) {
@Override
protected void onFail(Throwable e) {
}
@Override
public void onNext(List<StatusWrap> statuses) {
mStatuses.clear();
mStatuses.addAll(statuses);
mView.notifyItemChanged(mStatuses);
mView.onLoadComplete(mNextCursor > 0);
MessageUtil.resetLocalUnReadMessage(UnReadMessage.TYPE_STATUS, 0, mUid, mNotifyManager);
}
});
addSubscription(subscription);
}
private void cacheAboutData() {
new SPBuilder(EMApplication.getInstance())
.openDefault().edit()
.putLong(Key.FRIEND_STATUS_UPDATE_TIME, System.currentTimeMillis())
.putLong(Key.FRIEND_STATUS_LOCAL_NEXT_CURSOR, mNextCursor)
.apply();
}
@Override
public void userFirstVisible() {
}
@Override
public void loadMore() {
Subscription subscription = getFriendStatusesObservable(mNextCursor, false)
.subscribe(new ResponseSubscriber<List<StatusWrap>>(mView) {
@Override
protected void onFail(Throwable e) {
mView.onLoadComplete(true);
}
@Override
public void onNext(List<StatusWrap> statuses) {
mStatuses.addAll(statuses);
mView.notifyItemRangeInserted(mStatuses, mStatuses.size() - statuses.size(), statuses.size());
mView.onLoadComplete(mNextCursor > 0);
}
});
addSubscription(subscription);
}
private Observable<List<StatusWrap>> getFriendStatusesObservable(long maxId, final boolean isRefresh) {
return mStatusApi.getFriendStatus(mUid, 0, maxId, PAGE_COUNT, 1)
.compose(ErrorCheckerTransformer.<QueryStatusResponse>create())
.flatMap(new Func1<QueryStatusResponse, Observable<Status>>() {
@Override
public Observable<Status> call(QueryStatusResponse response) {
mNextCursor = response.getNext_cursor();
processAds(response);
return Observable.from(response.getStatuses());
}
})
.doOnNext(new Action1<Status>() {
@Override
public void call(Status status) {
mStatusManager.insertOrReplace(status);
}
})
.compose(StatusWrapTransformer.create(false))
.filter(new Func1<StatusWrap, Boolean>() {
@Override