/* * 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.content.ResourceWriterManager; import me.zhanghai.android.douya.eventbus.BroadcastDeletedEvent; 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 RebroadcastBroadcastWriter extends ResourceWriter<RebroadcastBroadcastWriter, Broadcast> { private long mBroadcastId; private Broadcast mBroadcast; private boolean mRebroadcast; private RebroadcastBroadcastWriter(long broadcastId, Broadcast broadcast, boolean rebroadcast, ResourceWriterManager<RebroadcastBroadcastWriter> manager) { super(manager); mBroadcastId = broadcastId; mBroadcast = broadcast; mRebroadcast = rebroadcast; EventBusUtils.register(this); } RebroadcastBroadcastWriter(long broadcastId, boolean rebroadcast, ResourceWriterManager<RebroadcastBroadcastWriter> manager) { this(broadcastId, null, rebroadcast, manager); } RebroadcastBroadcastWriter(Broadcast broadcast, boolean rebroadcast, ResourceWriterManager<RebroadcastBroadcastWriter> manager) { this(broadcast.id, broadcast, rebroadcast, manager); } public long getBroadcastId() { return mBroadcastId; } public boolean isRebroadcast() { return mRebroadcast; } @Override protected Request<Broadcast> onCreateRequest() { return ApiRequests.newRebroadcastBroadcastRequest(mBroadcastId, mRebroadcast); } @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(mRebroadcast ? R.string.broadcast_rebroadcast_successful : R.string.broadcast_unrebroadcast_successful, getContext()); if (!mRebroadcast) { // Delete the rebroadcast broadcast by user. Must be done before we // update the broadcast so that we can retrieve rebroadcastId for the // old one. if (mBroadcast != null && mBroadcast.rebroadcastId != null) { EventBusUtils.postAsync(new BroadcastDeletedEvent(mBroadcast.rebroadcastId, this)); } } EventBusUtils.postAsync(new BroadcastUpdatedEvent(response, this)); stopSelf(); } @Override public void onErrorResponse(VolleyError error) { LogUtils.e(error.toString()); Context context = getContext(); ToastUtils.show(context.getString(mRebroadcast ? R.string.broadcast_rebroadcast_failed_format : R.string.broadcast_unrebroadcast_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 shouldBeRebroadcasted = null; if (apiError.code == Codes.RebroadcastBroadcast.ALREADY_REBROADCASTED) { shouldBeRebroadcasted = true; } else if (apiError.code == Codes.RebroadcastBroadcast.NOT_REBROADCASTED_YET) { shouldBeRebroadcasted = false; } if (shouldBeRebroadcasted != null) { mBroadcast.fixRebroadcasted(shouldBeRebroadcasted); 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; } } }