package com.wangdaye.mysplash.me.presenter.widget; import android.content.Context; import android.support.design.widget.Snackbar; import com.wangdaye.mysplash.Mysplash; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common.data.entity.unsplash.User; import com.wangdaye.mysplash.common.data.service.UserService; import com.wangdaye.mysplash.common.i.model.MyFollowModel; import com.wangdaye.mysplash.common.i.presenter.MyFollowPresenter; import com.wangdaye.mysplash.common.i.view.MyFollowView; import com.wangdaye.mysplash.common._basic.MysplashActivity; import com.wangdaye.mysplash.common.ui.adapter.MyFollowAdapter; import com.wangdaye.mysplash.common.utils.helper.NotificationHelper; import com.wangdaye.mysplash.common.utils.manager.AuthManager; import com.wangdaye.mysplash.me.model.widget.MyFollowObject; import java.util.List; import retrofit2.Call; import retrofit2.Response; /** * My follow implementor. * */ public class MyFollowImplementor implements MyFollowPresenter { private MyFollowModel model; private MyFollowView view; private OnRequestUsersListener listener; public MyFollowImplementor(MyFollowModel model, MyFollowView view) { this.model = model; this.view = view; } @Override public void requestMyFollow(Context c, int page, boolean refresh) { if (!model.isRefreshing() && !model.isLoading()) { if (refresh) { model.setRefreshing(true); } else { model.setLoading(true); } switch (model.getFollowType()) { case MyFollowObject.FOLLOW_TYPE_FOLLOWERS: page = Math.max(1, refresh ? 1: page + 1); listener = new OnRequestUsersListener(c, page, refresh); model.getService() .requestFollowers( AuthManager.getInstance().getUsername(), page, Mysplash.DEFAULT_PER_PAGE, listener); break; case MyFollowObject.FOLLOW_TYPE_FOLLOWING: page = Math.max(1, refresh ? 1: page + 1); listener = new OnRequestUsersListener(c, page, refresh); model.getService() .requestFollowing( AuthManager.getInstance().getUsername(), page, Mysplash.DEFAULT_PER_PAGE, listener); break; } } } @Override public void cancelRequest() { if (listener != null) { listener.cancel(); } model.getService().cancel(); model.setRefreshing(false); model.setLoading(false); } @Override public void refreshNew(Context c, boolean notify) { if (notify) { view.setRefreshing(true); } requestMyFollow(c, model.getUsersPage(), true); } @Override public void loadMore(Context c, boolean notify) { if (notify) { view.setLoading(true); } requestMyFollow(c, model.getUsersPage(), false); } @Override public void initRefresh(Context c) { cancelRequest(); refreshNew(c, false); view.initRefreshStart(); } @Override public boolean canLoadMore() { return !model.isRefreshing() && !model.isLoading() && !model.isOver(); } @Override public boolean isRefreshing() { return model.isRefreshing(); } @Override public boolean isLoading() { return model.isLoading(); } @Override public int getDeltaValue() { return model.getDeltaValue(); } @Override public void setDeltaValue(int delta) { model.setDeltaValue(delta); } @Override public void setActivityForAdapter(MysplashActivity a) { model.getAdapter().setActivity(a); } @Override public MyFollowAdapter getAdapter() { return model.getAdapter(); } // interface. private class OnRequestUsersListener implements UserService.OnRequestUsersListener { private Context c; private int page; private boolean refresh; private boolean canceled; OnRequestUsersListener(Context c, int page, boolean refresh) { this.c = c; this.page = page; this.refresh = refresh; this.canceled = false; } public void cancel() { canceled = true; } @Override public void onRequestUsersSuccess(Call<List<User>> call, Response<List<User>> response) { if (canceled) { return; } model.setRefreshing(false); model.setLoading(false); if (refresh) { model.getAdapter().clearItem(); model.setOver(false); view.setRefreshing(false); view.setPermitLoading(true); } else { view.setLoading(false); } if (response.isSuccessful()) { model.setUsersPage(page); for (int i = 0; i < response.body().size(); i ++) { model.getAdapter().insertItem( response.body().get(i), model.getAdapter().getItemCount()); } if (response.body().size() < Mysplash.DEFAULT_PER_PAGE) { model.setOver(true); view.setPermitLoading(false); } view.requestMyFollowSuccess(); } else { view.requestMyFollowFailed(c.getString(R.string.feedback_load_nothing_tv)); } } @Override public void onRequestUsersFailed(Call<List<User>> call, Throwable t) { if (canceled) { return; } model.setRefreshing(false); model.setLoading(false); if (refresh) { view.setRefreshing(false); } else { view.setLoading(false); } NotificationHelper.showSnackbar( c.getString(R.string.feedback_load_failed_toast) + " (" + t.getMessage() + ")", Snackbar.LENGTH_SHORT); view.requestMyFollowFailed(c.getString(R.string.feedback_load_nothing_tv)); } } }