public MsgDetailReadWorker(WeiboDetailImageView view, MessageBean msg) {
    this.view = view;
    this.pb = this.view.getProgressBar();
    this.msg = msg;
    this.retry = view.getRetryButton();
    retry.setVisibility(View.INVISIBLE);

    oriPath =
        FileManager.getFilePathFromUrl(msg.getOriginal_pic(), FileLocationMethod.picture_large);

    if (ImageUtility.isThisBitmapCanRead(oriPath)
        && TaskCache.isThisUrlTaskFinished(msg.getOriginal_pic())) {

      onPostExecute(oriPath);
      cancel(true);
      return;
    }

    middlePath =
        FileManager.getFilePathFromUrl(msg.getBmiddle_pic(), FileLocationMethod.picture_bmiddle);

    if (ImageUtility.isThisBitmapCanRead(middlePath)
        && TaskCache.isThisUrlTaskFinished(msg.getBmiddle_pic())) {
      onPostExecute(middlePath);
      cancel(true);
      return;
    }

    pb.setVisibility(View.VISIBLE);
    pb.setIndeterminate(true);
  }
  /**
   * 1. this message has repost's message 2. this message is an original message
   *
   * <p>if this message has repost's message,try to include its content, if total word number above
   * 140,discard current msg content
   */
  private ItemBean repost() throws WeiboException {

    String content = ((EditText) findViewById(R.id.status_new_content)).getText().toString();

    if (msg.getRetweeted_status() != null) {
      String msgContent = "//@" + msg.getUser().getScreen_name() + ": " + msg.getText();
      String total = content + msgContent;
      if (total.length() < 140) {
        content = total;
      }
    }

    RepostNewMsgDao dao = new RepostNewMsgDao(token, msg.getId());

    boolean comment = true;
    boolean oriComment = enableCommentOri.isChecked();

    if (comment && oriComment) {
      dao.setIs_comment(RepostNewMsgDao.ENABLE_COMMENT_ALL);
    } else if (comment) {
      dao.setIs_comment(RepostNewMsgDao.ENABLE_COMMENT);
    } else if (oriComment) {
      dao.setIs_comment(RepostNewMsgDao.ENABLE_ORI_COMMENT);
    }

    dao.setStatus(content);

    return dao.sendNewMsg();
  }
  private PendingIntent getPendingIntent(
      Intent clickToOpenAppPendingIntentInner, Parcelable itemBean, AccountBean accountBean) {
    clickToOpenAppPendingIntentInner.setExtrasClassLoader(getClass().getClassLoader());

    UnreadTabIndex unreadTabIndex = UnreadTabIndex.NONE;

    if (itemBean instanceof MessageBean) {
      unreadTabIndex = UnreadTabIndex.MENTION_WEIBO;
    } else if (itemBean instanceof CommentBean) {
      CommentBean commentBean = (CommentBean) itemBean;
      MessageBean messageBean = commentBean.getStatus();
      if (messageBean != null) {
        UserBean userBean = messageBean.getUser();
        if (accountBean.getInfo().equals(userBean)) {
          unreadTabIndex = UnreadTabIndex.COMMENT_TO_ME;
        } else {
          unreadTabIndex = UnreadTabIndex.MENTION_COMMENT;
        }
      } else {
        unreadTabIndex = UnreadTabIndex.MENTION_COMMENT;
      }
    }
    clickToOpenAppPendingIntentInner.putExtra(
        BundleArgsConstants.OPEN_NAVIGATION_INDEX_EXTRA, unreadTabIndex);
    PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getBaseContext(),
            getMentionsWeiboNotificationId(accountBean),
            clickToOpenAppPendingIntentInner,
            PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
  }
 private RefreshReCmtCountTask(
     FriendsTimeLineFragment friendsTimeLineFragment, MessageListBean data) {
   fragmentWeakReference = new WeakReference<FriendsTimeLineFragment>(friendsTimeLineFragment);
   msgIds = new ArrayList<String>();
   List<MessageBean> msgList = data.getItemList();
   for (MessageBean msg : msgList) {
     if (msg != null) {
       msgIds.add(msg.getId());
     }
   }
 }
 @Override
 public boolean onPrepareOptionsMenu(Menu menu) {
   if (msg != null && msg.getRetweeted_status() != null) {
     enableCommentOri.setVisible(true);
   }
   return super.onPrepareOptionsMenu(menu);
 }
  private void updateTimeLineMessageCommentAndRepostData(List<MessageReCmtCountBean> value) {

    if (getList().getSize() <= value.size()) {
      return;
    }

    for (int i = 0; i < value.size(); i++) {
      MessageBean msg = getList().getItem(i);
      MessageReCmtCountBean count = value.get(i);
      if (msg != null && msg.getId().equals(count.getId())) {
        msg.setReposts_count(count.getReposts());
        msg.setComments_count(count.getComments());
      }
    }
    getAdapter().notifyDataSetChanged();
    FriendsTimeLineDBTask.asyncReplace(getList(), accountBean.getUid(), currentGroupId);
  }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getActionBar().setTitle(R.string.comments);
    getActionBar().setSubtitle(GlobalContext.getInstance().getCurrentAccountName());

    token = getIntent().getStringExtra("token");
    if (TextUtils.isEmpty(token)) token = GlobalContext.getInstance().getSpecialToken();

    msg = (MessageBean) getIntent().getSerializableExtra("msg");
    if (msg == null) {
      commentDraftBean = (CommentDraftBean) getIntent().getSerializableExtra("draft");
      msg = commentDraftBean.getMessageBean();
      getEditTextView().setText(commentDraftBean.getContent());
    }

    getEditTextView().setHint("@" + msg.getUser().getScreen_name() + ":" + msg.getText());
  }
  @Override
  protected String doInBackground(Void... arg) {
    if (isCancelled()) {
      return null;
    }

    if (Utility.isWifi(GlobalContext.getInstance())) {
      boolean result =
          TaskCache.waitForPictureDownload(
              msg.getOriginal_pic(), downloadListener, oriPath, FileLocationMethod.picture_large);
      return result ? oriPath : null;
    } else {
      boolean result =
          TaskCache.waitForPictureDownload(
              msg.getBmiddle_pic(),
              downloadListener,
              middlePath,
              FileLocationMethod.picture_bmiddle);
      return result ? middlePath : null;
    }
  }
  @Override
  protected ItemBean sendData() throws WeiboException {
    if (!enableRepost.isChecked()) {
      CommentNewMsgDao dao =
          new CommentNewMsgDao(
              token,
              msg.getId(),
              ((EditText) findViewById(R.id.status_new_content)).getText().toString());
      if (enableCommentOri.isChecked()) {
        dao.enableComment_ori(true);
      } else {
        dao.enableComment_ori(false);
      }

      return dao.sendNewMsg();
    } else {
      return repost();
    }
  }
 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
   // use Up instead of Back to reach this fragment
   if (data == null) {
     return;
   }
   final MessageBean msg = (MessageBean) data.getParcelableExtra("msg");
   if (msg != null) {
     for (int i = 0; i < getList().getSize(); i++) {
       if (msg.equals(getList().getItem(i))) {
         MessageBean ori = getList().getItem(i);
         if (ori.getComments_count() != msg.getComments_count()
             || ori.getReposts_count() != msg.getReposts_count()) {
           ori.setReposts_count(msg.getReposts_count());
           ori.setComments_count(msg.getComments_count());
           FriendsTimeLineDBTask.asyncUpdateCount(
               msg.getId(), msg.getComments_count(), msg.getReposts_count());
           getAdapter().notifyDataSetChanged();
         }
         break;
       }
     }
   }
 }
  private void buildRepostContent(
      MessageBean msg, final MessageBean repost_msg, ViewHolder holder, int position) {
    holder.repost_content.setVisibility(View.VISIBLE);
    if (!repost_msg.getId().equals((String) holder.repost_content.getTag())) {
      boolean haveCachedHeight = oriMsgHeights.get(msg.getIdLong()) != null;
      ViewGroup.LayoutParams layoutParams = holder.repost_content.getLayoutParams();
      if (haveCachedHeight) {
        layoutParams.height = oriMsgHeights.get(msg.getIdLong());
      } else {
        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
      }

      boolean haveCachedWidth = oriMsgWidths.get(msg.getIdLong()) != null;
      if (haveCachedWidth) {
        layoutParams.width = oriMsgWidths.get(msg.getIdLong());
      } else {
        layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
      }

      holder.repost_content.requestLayout();
      holder.repost_content.setText(repost_msg.getListViewSpannableString());

      if (!haveCachedHeight) {
        oriMsgHeights.append(msg.getIdLong(), layoutParams.height);
      }

      if (!haveCachedWidth) {
        oriMsgWidths.append(msg.getIdLong(), layoutParams.width);
      }

      holder.repost_content.setText(repost_msg.getListViewSpannableString());
      holder.repost_content.setTag(repost_msg.getId());
    }

    if (repost_msg.havePicture()) {
      if (repost_msg.isMultiPics()) {
        buildMultiPic(repost_msg, holder.repost_content_pic_multi);
      } else {
        buildPic(repost_msg, holder.repost_content_pic, position);
      }
    }
  }
  @Override
  protected void bindViewData(final ViewHolder holder, int position) {
    Drawable drawable = bg.get(holder);
    if (drawable != null) {
      holder.listview_root.setBackgroundDrawable(drawable);
    } else {
      drawable = holder.listview_root.getBackground();
      bg.put(holder, drawable);
    }

    if (listView.getCheckedItemPosition() == position + listView.getHeaderViewsCount()) {
      holder.listview_root.setBackgroundColor(checkedBG);
    }

    final MessageBean msg = bean.get(position);

    UserBean user = msg.getUser();
    if (user != null) {
      holder.username.setVisibility(View.VISIBLE);
      if (!TextUtils.isEmpty(user.getRemark())) {
        holder.username.setText(
            new StringBuilder(user.getScreen_name())
                .append("(")
                .append(user.getRemark())
                .append(")")
                .toString());
      } else {
        holder.username.setText(user.getScreen_name());
      }
      if (!showOriStatus && !SettingUtility.getEnableCommentRepostListAvatar()) {
        holder.avatar.setLayoutParams(new RelativeLayout.LayoutParams(0, 0));
      } else {
        buildAvatar(holder.avatar, position, user);
      }
    } else {
      holder.username.setVisibility(View.INVISIBLE);
      holder.avatar.setVisibility(View.INVISIBLE);
    }

    if (!TextUtils.isEmpty(msg.getListViewSpannableString())) {
      boolean haveCachedHeight = msgHeights.get(msg.getIdLong()) != null;
      ViewGroup.LayoutParams layoutParams = holder.content.getLayoutParams();
      if (haveCachedHeight) {
        layoutParams.height = msgHeights.get(msg.getIdLong());
      } else {
        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
      }

      boolean haveCachedWidth = msgWidths.get(msg.getIdLong()) != null;
      if (haveCachedWidth) {
        layoutParams.width = msgWidths.get(msg.getIdLong());
      } else {
        layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
      }

      holder.content.requestLayout();
      holder.content.setText(msg.getListViewSpannableString());
      if (!haveCachedHeight) {
        msgHeights.append(msg.getIdLong(), layoutParams.height);
      }

      if (!haveCachedWidth) {
        msgWidths.append(msg.getIdLong(), layoutParams.width);
      }
    } else {
      TimeLineUtility.addJustHighLightLinks(msg);
      holder.content.setText(msg.getListViewSpannableString());
    }

    holder.time.setTime(msg.getMills());
    if (holder.source != null) {
      holder.source.setText(msg.getSourceString());
    }

    if (showOriStatus) {
      boolean checkRepostsCount = (msg.getReposts_count() != 0);
      boolean checkCommentsCount = (msg.getComments_count() != 0);
      boolean checkPic =
          msg.havePicture()
              || (msg.getRetweeted_status() != null && msg.getRetweeted_status().havePicture());
      checkPic = (checkPic && !SettingUtility.isEnablePic());
      boolean checkGps = (msg.getGeo() != null);

      if (!checkRepostsCount && !checkCommentsCount && !checkPic && !checkGps) {
        holder.count_layout.setVisibility(View.INVISIBLE);
      } else {
        holder.count_layout.setVisibility(View.VISIBLE);

        if (checkPic) {
          holder.timeline_pic.setVisibility(View.VISIBLE);
        } else {
          holder.timeline_pic.setVisibility(View.GONE);
        }

        if (checkGps) {
          holder.timeline_gps.setVisibility(View.VISIBLE);
        } else {
          holder.timeline_gps.setVisibility(View.INVISIBLE);
        }

        if (checkRepostsCount) {
          holder.repost_count.setText(String.valueOf(msg.getReposts_count()));
          holder.repost_count.setVisibility(View.VISIBLE);
        } else {
          holder.repost_count.setVisibility(View.GONE);
        }

        if (checkCommentsCount) {
          holder.comment_count.setText(String.valueOf(msg.getComments_count()));
          holder.comment_count.setVisibility(View.VISIBLE);
        } else {
          holder.comment_count.setVisibility(View.GONE);
        }
      }
    }

    holder.repost_content.setVisibility(View.GONE);
    holder.repost_content_pic.setVisibility(View.GONE);
    holder.repost_content_pic_multi.setVisibility(View.GONE);

    holder.content_pic.setVisibility(View.GONE);
    holder.content_pic_multi.setVisibility(View.GONE);

    if (msg.havePicture()) {
      if (msg.isMultiPics()) {
        buildMultiPic(msg, holder.content_pic_multi);
      } else {
        buildPic(msg, holder.content_pic, position);
      }
    }

    MessageBean repost_msg = msg.getRetweeted_status();

    if (repost_msg != null && showOriStatus) {
      if (holder.repost_layout != null) {
        holder.repost_layout.setVisibility(View.VISIBLE);
      }
      holder.repost_flag.setVisibility(View.VISIBLE);
      // sina weibo official account can send repost message with picture, f**k sina weibo
      if (holder.content_pic.getVisibility() != View.GONE) {
        holder.content_pic.setVisibility(View.GONE);
      }
      buildRepostContent(msg, repost_msg, holder, position);

      if (holder.content_pic_multi != holder.repost_content_pic_multi) {
        interruptPicDownload(holder.content_pic_multi);
      }
      if (holder.repost_content_pic != holder.content_pic) {
        interruptPicDownload(holder.repost_content_pic);
      }
    } else {
      if (holder.content_pic_multi != holder.repost_content_pic_multi) {
        interruptPicDownload(holder.repost_content_pic_multi);
      }
      if (holder.repost_content_pic != holder.content_pic) {
        interruptPicDownload(holder.repost_content_pic);
      }
      if (holder.repost_layout != null) {
        holder.repost_layout.setVisibility(View.GONE);
      }
      holder.repost_flag.setVisibility(View.GONE);
    }

    boolean interruptPic = false;
    boolean interruptMultiPic = false;
    boolean interruptRepostPic = false;
    boolean interruptRepostMultiPic = false;

    if (msg.havePicture()) {
      if (msg.isMultiPics()) {
        interruptPic = true;
      } else {
        interruptMultiPic = true;
      }
    }

    if (repost_msg != null && showOriStatus) {

      if (repost_msg.havePicture()) {
        if (repost_msg.isMultiPics()) {
          interruptRepostPic = true;
        } else {
          interruptRepostMultiPic = true;
        }
      }
    }

    if (interruptPic && interruptRepostPic) {
      interruptPicDownload(holder.content_pic);
      interruptPicDownload(holder.repost_content_pic);
    }

    if (interruptMultiPic && interruptRepostMultiPic) {
      interruptPicDownload(holder.content_pic_multi);
      interruptPicDownload(holder.repost_content_pic_multi);
    }

    if (interruptPic && !interruptRepostPic) {
      if (holder.content_pic != holder.repost_content_pic) {
        interruptPicDownload(holder.content_pic);
      }
    }

    if (!interruptPic && interruptRepostPic) {
      if (holder.content_pic != holder.repost_content_pic) {
        interruptPicDownload(holder.repost_content_pic);
      }
    }

    if (interruptMultiPic && !interruptRepostMultiPic) {
      if (holder.content_pic_multi != holder.repost_content_pic_multi) {
        interruptPicDownload(holder.content_pic_multi);
      }
    }

    if (!interruptMultiPic && interruptRepostMultiPic) {
      if (holder.content_pic_multi != holder.repost_content_pic_multi) {
        interruptPicDownload(holder.repost_content_pic_multi);
      }
    }
  }