package net.dev123.yibo.service.task;
import java.util.ArrayList;
import java.util.List;
import net.dev123.commons.util.ListUtil;
import net.dev123.commons.util.StringUtil;
import net.dev123.entity.StatusUpdate;
import net.dev123.exception.LibException;
import net.dev123.mblog.MicroBlog;
import net.dev123.sns.Sns;
import net.dev123.yibo.EditMicroBlogActivity;
import net.dev123.yibo.R;
import net.dev123.yibo.common.Constants;
import net.dev123.yibo.common.GlobalVars;
import net.dev123.yibo.common.ResourceBook;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.listener.EditMicroBlogTweetCancelClickListener;
import net.dev123.yibo.service.listener.EditMicroBlogTweetRetryClickListener;
import net.dev123.yibo.widget.TweetProgressDialog;
import net.dev123.yibo.widget.TweetProgressDialog.State;
import android.app.Activity;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class UpdateStatusToMutiAccountsTask extends AbstractUpdateStatusTask<Void, ProgressHolder, Integer> {
private static final String TAG = "UpdateStatusToMutiAccountsTask";
private List<LocalAccount> listAccount;
private List<LocalAccount> listFailedAccount;
private boolean isRetry = true;
private TweetProgressDialog dialog;
private String resultMsg = null;
public UpdateStatusToMutiAccountsTask(EditMicroBlogActivity context,
StatusUpdate statusUpdate, List<LocalAccount> listAccount) {
super(context, statusUpdate);
this.listAccount = listAccount;
this.listFailedAccount = new ArrayList<LocalAccount>();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (dialog == null) {
View parent = ((Activity) context).findViewById(R.id.btnOperate);
dialog = new TweetProgressDialog(context, parent);
dialog.setListUpdateAccount(listAccount);
dialog.show();
}
dialog.setDialogTitle(R.string.title_tweet_progress);
dialog.setPositiveClickListener(null);
EditMicroBlogTweetCancelClickListener canelClickLister =
new EditMicroBlogTweetCancelClickListener(this, dialog);
dialog.setNegativeClickListener(canelClickLister);
}
@Override
protected Integer doInBackground(Void... params) {
if (statusUpdate == null
|| StringUtil.isBlank(statusUpdate.getStatus())
|| ListUtil.isEmpty(listAccount)) {
return 0;
}
if (statusUpdate.getImage() != null && isRetry) {
rotateImage();
compressImage();
}
String text = statusUpdate.getStatus();
net.dev123.mblog.entity.Status newStatus = null;
for (int i = 0; i < listAccount.size(); i++) {
LocalAccount account = listAccount.get(i);
if (account == null) {
continue;
}
ProgressHolder holder = new ProgressHolder();
holder.account = account;
holder.state = State.Loading;
newStatus = null;
this.publishProgress(holder);
try {
StatusUpdate toUpdate = new StatusUpdate(text);
toUpdate.setImage(statusUpdate.getImage());
toUpdate.setLocation(statusUpdate.getLocation());
if (account.isSnsAccount()) {
Sns sns = GlobalVars.getSns(account);
if (sns != null) {
boolean result = false;
if (statusUpdate.getImage() != null) {
result = sns.uploadPhoto(statusUpdate.getImage(), statusUpdate.getStatus());
} else {
result = sns.createStatus(statusUpdate.getStatus());
}
if (result) {
newStatus = new net.dev123.mblog.entity.Status();
}
}
} else {
MicroBlog microBlog = GlobalVars.getMicroBlog(account);
if (microBlog != null) {
newStatus = microBlog.updateStatus(toUpdate);
}
}
} catch (LibException e) {
if (Constants.DEBUG) Log.e(TAG, "Task", e);
resultMsg = ResourceBook.getStatusCodeValue(e.getExceptionCode(), context);
}
if (newStatus != null) {
holder.state = State.Success;
} else {
holder.state = State.Failed;
listFailedAccount.add(account);
}
this.publishProgress(holder);
}
if (listFailedAccount.size() < 1) {
SystemClock.sleep(1000);
}
return listAccount.size() - listFailedAccount.size();
}
@Override
protected void onProgressUpdate(ProgressHolder... values) {
super.onProgressUpdate(values);
if (values == null
|| values.length == 0
|| values[0] == null) {
return;
}
ProgressHolder holder = values[0];
if (dialog != null) {
dialog.updateState(holder.account, holder.state);
}
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
int successCount = result;
Button btnSend = (Button)((Activity)context).findViewById(R.id.btnOperate);
EditText etText = (EditText)((Activity)context).findViewById(R.id.etText);
if (successCount == listAccount.size()) {
String msg = context.getString(R.string.msg_status_success);
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
if (context.isUpdateSinaAndPauseOthers()) {
context.removeAllSinaAccount(listAccount);
context.updateSelectorText();
dialog.dismiss();
btnSend.setEnabled(true);
} else {
//退出onPause清空临时保存数据
if (etText != null) {
etText.setText("");
}
dialog.dismiss();
((Activity)context).finish();
}
// Activity activity = (Activity) context;
// dialog.dismiss();
// activity.finish();
} else if (successCount < listAccount.size() && successCount >= 0) {
btnSend.setEnabled(true);
UpdateStatusToMutiAccountsTask task = new UpdateStatusToMutiAccountsTask(
context, statusUpdate, listFailedAccount);
task.setDialog(dialog);
task.setRetry(false);
EditMicroBlogTweetRetryClickListener retryClickListener =
new EditMicroBlogTweetRetryClickListener(task);
dialog.setPositiveClickListener(retryClickListener);
dialog.setPositiveBtnText(R.string.btn_retry);
} else {
btnSend.setEnabled(true);
Toast.makeText(context, resultMsg, Toast.LENGTH_LONG).show();
}
}
public List<LocalAccount> getListAccount() {
return listAccount;
}
public void setListAccount(List<LocalAccount> listAccount) {
this.listAccount = listAccount;
}
public void setDialog(TweetProgressDialog dialog) {
this.dialog = dialog;
}
public boolean isRetry() {
return isRetry;
}
public void setRetry(boolean isRetry) {
this.isRetry = isRetry;
}
public TweetProgressDialog getDialog() {
return dialog;
}
}
class ProgressHolder {
LocalAccount account;
State state;
}