/* * Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.broadcast.content; import android.content.Context; 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.BroadcastUpdatedEvent; import me.zhanghai.android.douya.eventbus.BroadcastWriteFinishedEvent; import me.zhanghai.android.douya.eventbus.BroadcastWriteStartedEvent; import me.zhanghai.android.douya.eventbus.EventBusUtils; 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.Broadcast; import me.zhanghai.android.douya.util.LogUtils; import me.zhanghai.android.douya.util.ToastUtils; class LikeBroadcastWriter extends ResourceWriter<LikeBroadcastWriter, Broadcast> { private long mBroadcastId; private Broadcast mBroadcast; private boolean mLike; private LikeBroadcastWriter(long broadcastId, Broadcast broadcast, boolean like, LikeBroadcastManager manager) { super(manager); mBroadcastId = broadcastId; mBroadcast = broadcast; mLike = like; EventBusUtils.register(this); } LikeBroadcastWriter(long broadcastId, boolean like, LikeBroadcastManager manager) { this(broadcastId, null, like, manager); } LikeBroadcastWriter(Broadcast broadcast, boolean like, LikeBroadcastManager manager) { this(broadcast.id, broadcast, like, manager); } public long getBroadcastId() { return mBroadcastId; } public boolean isLike() { return mLike; } @Override protected Request<Broadcast> onCreateRequest() { return ApiRequests.newLikeBroadcastRequest(mBroadcastId, mLike); } @Override public void onStart() { super.onStart(); EventBusUtils.postAsync(new BroadcastWriteStartedEvent(mBroadcastId, this)); } @Override public void onDestroy() { super.onDestroy(); EventBusUtils.unregister(this); } @Override public void onResponse(Broadcast response) { ToastUtils.show(mLike ? R.string.broadcast_like_successful : R.string.broadcast_unlike_successful, getContext()); EventBusUtils.postAsync(new BroadcastUpdatedEvent(response, this)); stopSelf(); } @Override public void onErrorResponse(VolleyError error) { LogUtils.e(error.toString()); Context context = getContext(); ToastUtils.show(context.getString(mLike ? R.string.broadcast_like_failed_format : R.string.broadcast_unlike_failed_format, ApiError.getErrorString(error, context)), context); boolean notified = false; if (mBroadcast != null && error instanceof ApiError) { // Correct our local state if needed. ApiError apiError = (ApiError) error; Boolean shouldBeLiked = null; if (apiError.code == Codes.LikeBroadcast.ALREADY_LIKED) { shouldBeLiked = true; } else if (apiError.code == Codes.LikeBroadcast.NOT_LIKED_YET) { shouldBeLiked = false; } if (shouldBeLiked != null) { mBroadcast.fixLiked(shouldBeLiked); EventBusUtils.postAsync(new BroadcastUpdatedEvent(mBroadcast, this)); notified = true; } } if (!notified) { // Must notify to reset pending status. Off-screen items also needs to be invalidated. EventBusUtils.postAsync(new BroadcastWriteFinishedEvent(mBroadcastId, this)); } stopSelf(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onBroadcastUpdated(BroadcastUpdatedEvent event) { if (event.isFromMyself(this)) { return; } if (event.broadcast.id == mBroadcast.id) { mBroadcast = event.broadcast; } } }