/*
* Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.followship.content;
import android.content.Context;
import android.text.TextUtils;
import com.android.volley.VolleyError;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import me.zhanghai.android.douya.R;
import me.zhanghai.android.douya.content.ResourceWriter;
import me.zhanghai.android.douya.eventbus.EventBusUtils;
import me.zhanghai.android.douya.eventbus.UserUpdatedEvent;
import me.zhanghai.android.douya.eventbus.UserWriteFinishedEvent;
import me.zhanghai.android.douya.eventbus.UserWriteStartedEvent;
import me.zhanghai.android.douya.network.Request;
import me.zhanghai.android.douya.network.api.ApiContract.Response.Error.Codes;
import me.zhanghai.android.douya.network.api.ApiError;
import me.zhanghai.android.douya.network.api.ApiRequests;
import me.zhanghai.android.douya.network.api.info.apiv2.User;
import me.zhanghai.android.douya.util.LogUtils;
import me.zhanghai.android.douya.util.ToastUtils;
class FollowUserWriter extends ResourceWriter<FollowUserWriter, User> {
private String mUserIdOrUid;
private User mUser;
private boolean mFollow;
private FollowUserWriter(String userIdOrUid, User user, boolean follow,
FollowUserManager manager) {
super(manager);
mUserIdOrUid = userIdOrUid;
mUser = user;
mFollow = follow;
EventBusUtils.register(this);
}
FollowUserWriter(String userIdOrUid, boolean follow, FollowUserManager manager) {
this(userIdOrUid, null, follow, manager);
}
FollowUserWriter(User user, boolean follow, FollowUserManager manager) {
this(user.getIdOrUid(), user, follow, manager);
}
public String getUserIdOrUid() {
return mUserIdOrUid;
}
public boolean hasUserIdOrUid(String userIdOrUid) {
return mUser != null ? mUser.hasIdOrUid(userIdOrUid)
: TextUtils.equals(mUserIdOrUid, userIdOrUid);
}
public boolean isFollow() {
return mFollow;
}
@Override
protected Request<User> onCreateRequest() {
return ApiRequests.newFollowshipRequest(mUserIdOrUid, mFollow);
}
@Override
public void onStart() {
super.onStart();
EventBusUtils.postAsync(new UserWriteStartedEvent(mUserIdOrUid, this));
}
@Override
public void onDestroy() {
super.onDestroy();
EventBusUtils.unregister(this);
}
@Override
public void onResponse(User response) {
ToastUtils.show(mFollow ? R.string.user_follow_successful
: R.string.user_unfollow_successful, getContext());
EventBusUtils.postAsync(new UserUpdatedEvent(response, this));
stopSelf();
}
@Override
public void onErrorResponse(VolleyError error) {
LogUtils.e(error.toString());
Context context = getContext();
ToastUtils.show(context.getString(mFollow ? R.string.user_follow_failed_format
: R.string.user_unfollow_failed_format,
ApiError.getErrorString(error, context)), context);
boolean notified = false;
if (mUser != null && error instanceof ApiError) {
// Correct our local state if needed.
ApiError apiError = (ApiError) error;
Boolean shouldBeFollowed = null;
if (apiError.code == Codes.Followship.ALREADY_FOLLOWED) {
shouldBeFollowed = true;
} else if (apiError.code == Codes.Followship.NOT_FOLLOWED_YET) {
shouldBeFollowed = false;
}
if (shouldBeFollowed != null) {
mUser.fixFollowed(shouldBeFollowed);
EventBusUtils.postAsync(new UserUpdatedEvent(mUser, this));
notified = true;
}
}
if (!notified) {
// Must notify to reset pending status. Off-screen items also needs to be invalidated.
EventBusUtils.postAsync(new UserWriteFinishedEvent(mUserIdOrUid, this));
}
stopSelf();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUserUpdated(UserUpdatedEvent event) {
if (event.isFromMyself(this)) {
return;
}
//noinspection deprecation
if (event.mUser.hasIdOrUid(mUserIdOrUid)) {
mUserIdOrUid = event.mUser.getIdOrUid();
mUser = event.mUser;
}
}
}