package net.dev123.yibo.service.task; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.yibo.EditMicroBlogActivity; import net.dev123.yibo.R; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.ResourceBook; import net.dev123.yibo.common.YiBoMeUtil; 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 net.dev123.yibome.YiBoMe; import net.dev123.yibome.entity.StatusSyncResult; 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; /** * @author Weiping Ye * @version 创建时间:2011-10-9 下午4:49:03 **/ public class UpdateStatusThroughServerTask extends AbstractUpdateStatusTask<Void, ProgressHolder, Integer> { private static final String TAG = UpdateStatusThroughServerTask.class.getSimpleName(); private List<LocalAccount> listAccount; private List<LocalAccount> listFailedAccount; private List<StatusSyncResult> syncResultList; private TweetProgressDialog dialog; private int successCount; private String resultMsg; public UpdateStatusThroughServerTask(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_server); dialog.setPositiveClickListener(null); EditMicroBlogTweetCancelClickListener canelClickLister = new EditMicroBlogTweetCancelClickListener(this, dialog); dialog.setNegativeClickListener(canelClickLister); initProgressHolder(); } @Override protected Integer doInBackground(Void... params) { if (statusUpdate == null || StringUtil.isBlank(statusUpdate.getStatus()) || ListUtil.isEmpty(listAccount)) { return successCount; } if (statusUpdate.getImage() != null) { rotateImage(); compressImage(); } YiBoMe yiboMe = YiBoMeUtil.getYiBoMeOAuth(context); if (yiboMe == null) { return successCount; } try { syncResultList = yiboMe.syncStatus(statusUpdate, listAccount); } catch (LibException e) { if (Constants.DEBUG) Log.d(TAG, e.getMessage()); resultMsg = ResourceBook.getStatusCodeValue(e.getExceptionCode(), context); } changeHolderStateAndSetSuccessCounter(); if (successCount == listAccount.size()) { SystemClock.sleep(1000); } return successCount; } private Map<LocalAccount, ProgressHolder> accountHolderMap = new HashMap<LocalAccount, ProgressHolder>(); private void initProgressHolder() { for (int i = 0; i < listAccount.size(); i++) { ProgressHolder holder = new ProgressHolder(); holder.account = listAccount.get(i); holder.state = State.Loading; accountHolderMap.put(listAccount.get(i), holder); this.publishProgress(holder); } } private void changeHolderStateAndSetSuccessCounter() { if (ListUtil.isEmpty(syncResultList)) { listFailedAccount.addAll(listAccount); for (int i = 0, size = listAccount.size(); i < size; i++) { ProgressHolder holder = accountHolderMap.get(listAccount.get(i)); holder.state = State.Failed; publishProgress(holder); } return; } StatusSyncResult syncResult = null; boolean failedFlag = false; LocalAccount account = null; for (int i = 0, size = listAccount.size(); i < size; i++) { account = listAccount.get(i); ProgressHolder holder = accountHolderMap.get(account); int resultListSize = syncResultList.size(); for (int j = 0; j < resultListSize; j++) { syncResult = syncResultList.get(j); if (syncResult.getErrorCode() != null && account.getUserId().equals(syncResult.getUserId()) && account.getServiceProviderNo() == syncResult.getServiceProviderNo()) { failedFlag = true; break; } } if (failedFlag) { failedFlag = false; holder.state = State.Failed; listFailedAccount.add(account); } else { successCount++; holder.state = State.Success; } publishProgress(holder); } } @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); Button btnSend = (Button)((Activity)context).findViewById(R.id.btnOperate); EditText etText = (EditText)((Activity)context).findViewById(R.id.etText); if (successCount == listAccount.size()) { //退出onPause清空临时保存数据 if (etText != null) { etText.setText(""); } String msg = context.getString(R.string.msg_status_success); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); 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(); } } }