package com.wangdaye.mysplash.user.presenter.widget;
import com.wangdaye.mysplash.common.data.entity.unsplash.User;
import com.wangdaye.mysplash.common.data.service.FollowingService;
import com.wangdaye.mysplash.common.data.service.UserService;
import com.wangdaye.mysplash.common.i.model.UserModel;
import com.wangdaye.mysplash.common.i.presenter.UserPresenter;
import com.wangdaye.mysplash.common.i.view.UserView;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;
/**
* User implementor.
* */
public class UserImplementor
implements UserPresenter {
private UserModel model;
private UserView view;
private OnRequestUserProfileListener requestUserProfileListener;
private OnFollowListener followListener;
public UserImplementor(UserModel model, UserView view) {
this.model = model;
this.view = view;
}
@Override
public void requestUser() {
view.initRefreshStart();
requestUserProfileListener = new OnRequestUserProfileListener();
model.getUserService().requestUserProfile(model.getUser().username, requestUserProfileListener);
}
@Override
public void followUser() {
followListener = new OnFollowListener();
model.getFollowingService().setFollowUser(model.getUser().username, true, followListener);
}
@Override
public void cancelFollowUser() {
followListener = new OnFollowListener();
model.getFollowingService().setFollowUser(model.getUser().username, true, followListener);
}
@Override
public void cancelRequest() {
if (requestUserProfileListener != null) {
requestUserProfileListener.cancel();
}
if (followListener != null) {
followListener.cancel();
}
model.getUserService().cancel();
// model.getFollowingService().cancel();
}
@Override
public void setUser(User u) {
model.setUser(u);
}
@Override
public User getUser() {
return model.getUser();
}
// interface.
// on request user profile swipeListener.
private class OnRequestUserProfileListener implements UserService.OnRequestUserProfileListener {
private boolean canceled;
OnRequestUserProfileListener() {
canceled = false;
}
public void cancel() {
canceled = true;
}
@Override
public void onRequestUserProfileSuccess(Call<User> call, Response<User> response) {
if (canceled) {
return;
}
if (response.isSuccessful()) {
User user = response.body();
user.complete = true;
model.setUser(user);
view.drawUserInfo(user);
} else {
requestUser();
}
}
@Override
public void onRequestUserProfileFailed(Call<User> call, Throwable t) {
if (canceled) {
return;
}
requestUser();
}
}
// on follow swipeListener.
private class OnFollowListener implements FollowingService.OnFollowListener {
private boolean canceled;
OnFollowListener() {
canceled = false;
}
public void cancel() {
canceled = true;
}
@Override
public void onFollowSuccess(Call<ResponseBody> call, Response<ResponseBody> response) {
if (canceled) {
return;
}
if (response.isSuccessful()) {
view.followRequestSuccess(true);
} else {
view.followRequestFailed(true);
}
}
@Override
public void onCancelFollowSuccess(Call<ResponseBody> call, Response<ResponseBody> response) {
if (canceled) {
return;
}
if (response.isSuccessful()) {
view.followRequestSuccess(false);
} else {
view.followRequestFailed(false);
}
}
@Override
public void onFollowFailed(Call<ResponseBody> call, Throwable t) {
if (canceled) {
return;
}
view.followRequestFailed(true);
}
@Override
public void onCancelFollowFailed(Call<ResponseBody> call, Throwable t) {
view.followRequestFailed(false);
}
}
}