package org.cnodejs.android.md.presenter.implement; import android.app.Activity; import android.support.annotation.NonNull; import android.text.TextUtils; import org.cnodejs.android.md.model.api.ApiClient; import org.cnodejs.android.md.model.api.ApiDefine; import org.cnodejs.android.md.model.api.ForegroundCallback; import org.cnodejs.android.md.model.entity.Result; import org.cnodejs.android.md.model.entity.TabType; import org.cnodejs.android.md.model.entity.Topic; import org.cnodejs.android.md.model.entity.User; import org.cnodejs.android.md.model.storage.LoginShared; import org.cnodejs.android.md.presenter.contract.IMainPresenter; import org.cnodejs.android.md.ui.util.ToastUtils; import org.cnodejs.android.md.ui.view.IMainView; import org.cnodejs.android.md.ui.viewholder.LoadMoreFooter; import java.util.List; import okhttp3.Headers; import retrofit2.Call; public class MainPresenter implements IMainPresenter { private static final int PAGE_LIMIT = 20; private final Activity activity; private final IMainView mainView; private TabType tab = TabType.all; private Call<Result.Data<List<Topic>>> refreshCall = null; private Call<Result.Data<List<Topic>>> loadMoreCall = null; public MainPresenter(@NonNull Activity activity, @NonNull IMainView mainView) { this.activity = activity; this.mainView = mainView; } private void cancelRefreshCall() { if (refreshCall != null) { if (!refreshCall.isCanceled()) { refreshCall.cancel(); } refreshCall = null; } } private void cancelLoadMoreCall() { if (loadMoreCall != null) { if (!loadMoreCall.isCanceled()) { loadMoreCall.cancel(); } loadMoreCall = null; } } @Override public void switchTab(@NonNull TabType tab) { if (this.tab != tab) { this.tab = tab; cancelRefreshCall(); cancelLoadMoreCall(); mainView.onSwitchTabOk(tab); } } @Override public void refreshTopicListAsyncTask() { if (refreshCall == null) { refreshCall = ApiClient.service.getTopicList(tab, 1, PAGE_LIMIT, ApiDefine.MD_RENDER); refreshCall.enqueue(new ForegroundCallback<Result.Data<List<Topic>>>(activity) { @Override public boolean onResultOk(int code, Headers headers, Result.Data<List<Topic>> result) { cancelLoadMoreCall(); mainView.onRefreshTopicListOk(result.getData()); return false; } @Override public boolean onResultError(int code, Headers headers, Result.Error error) { ToastUtils.with(getActivity()).show(error.getErrorMessage()); return false; } @Override public boolean onCallException(Throwable t, Result.Error error) { ToastUtils.with(getActivity()).show(error.getErrorMessage()); return false; } @Override public boolean onCallCancel() { return true; } @Override public void onFinish() { refreshCall = null; mainView.onRefreshTopicListFinish(); } }); } } @Override public void loadMoreTopicListAsyncTask(int page) { if (loadMoreCall == null) { loadMoreCall = ApiClient.service.getTopicList(tab, page, PAGE_LIMIT, ApiDefine.MD_RENDER); loadMoreCall.enqueue(new ForegroundCallback<Result.Data<List<Topic>>>(activity) { @Override public boolean onResultOk(int code, Headers headers, Result.Data<List<Topic>> result) { if (result.getData().size() > 0) { mainView.onLoadMoreTopicListOk(result.getData()); mainView.onLoadMoreTopicListFinish(LoadMoreFooter.STATE_ENDLESS); } else { mainView.onLoadMoreTopicListFinish(LoadMoreFooter.STATE_FINISHED); } return false; } @Override public boolean onResultError(int code, Headers headers, Result.Error error) { mainView.onLoadMoreTopicListFinish(LoadMoreFooter.STATE_FAILED); ToastUtils.with(getActivity()).show(error.getErrorMessage()); return false; } @Override public boolean onCallException(Throwable t, Result.Error error) { mainView.onLoadMoreTopicListFinish(LoadMoreFooter.STATE_FAILED); ToastUtils.with(getActivity()).show(error.getErrorMessage()); return false; } @Override public boolean onCallCancel() { return true; } @Override public void onFinish() { loadMoreCall = null; } }); } } @Override public void getUserAsyncTask() { final String accessToken = LoginShared.getAccessToken(activity); if (!TextUtils.isEmpty(accessToken)) { ApiClient.service.getUser(LoginShared.getLoginName(activity)).enqueue(new ForegroundCallback<Result.Data<User>>(activity) { @Override public boolean onResultOk(int code, Headers headers, Result.Data<User> result) { if (TextUtils.equals(accessToken, LoginShared.getAccessToken(getActivity()))) { LoginShared.update(getActivity(), result.getData()); mainView.updateUserInfoViews(); } return false; } }); } } @Override public void getMessageCountAsyncTask() { final String accessToken = LoginShared.getAccessToken(activity); if (!TextUtils.isEmpty(accessToken)) { ApiClient.service.getMessageCount(accessToken).enqueue(new ForegroundCallback<Result.Data<Integer>>(activity) { @Override public boolean onResultOk(int code, Headers headers, Result.Data<Integer> result) { if (TextUtils.equals(accessToken, LoginShared.getAccessToken(getActivity()))) { mainView.updateMessageCountViews(result.getData()); } return false; } }); } } }