Example #1
0
  @Override
  public int getItemViewType(int position) {
    try {
      /** 默认是失败类型 */
      RenderType type = RenderType.MESSAGE_TYPE_INVALID;

      Object obj = msgObjectList.get(position);
      if (obj instanceof Integer) {
        type = RenderType.MESSAGE_TYPE_TIME_TITLE;
      } else if (obj instanceof MessageEntity) {
        MessageEntity info = (MessageEntity) obj;
        boolean isMine = info.getFromId() == loginUser.getPeerId();
        switch (info.getDisplayType()) {
          case DBConstant.SHOW_AUDIO_TYPE:
            type =
                isMine ? RenderType.MESSAGE_TYPE_MINE_AUDIO : RenderType.MESSAGE_TYPE_OTHER_AUDIO;
            break;
          case DBConstant.SHOW_IMAGE_TYPE:
            ImageMessage imageMessage = (ImageMessage) info;
            if (CommonUtil.gifCheck(imageMessage.getUrl())) {
              type =
                  isMine
                      ? RenderType.MESSAGE_TYPE_MINE_GIF_IMAGE
                      : RenderType.MESSAGE_TYPE_OTHER_GIF_IMAGE;
            } else {
              type =
                  isMine ? RenderType.MESSAGE_TYPE_MINE_IMAGE : RenderType.MESSAGE_TYPE_OTHER_IMAGE;
            }

            break;
          case DBConstant.SHOW_ORIGIN_TEXT_TYPE:
            if (info.isGIfEmo()) {
              type = isMine ? RenderType.MESSAGE_TYPE_MINE_GIF : RenderType.MESSAGE_TYPE_OTHER_GIF;
            } else {
              type =
                  isMine ? RenderType.MESSAGE_TYPE_MINE_TETX : RenderType.MESSAGE_TYPE_OTHER_TEXT;
            }

            break;
          case DBConstant.SHOW_MIX_TEXT:
            //
            logger.e("混合的消息类型%s", obj);
          default:
            break;
        }
      }
      return type.ordinal();
    } catch (Exception e) {
      logger.e(e.getMessage());
      return RenderType.MESSAGE_TYPE_INVALID.ordinal();
    }
  }
Example #2
0
  /**
   * 1.头像事件 mine:事件 other事件 图片的状态 消息收到,没收到,图片展示成功,没有成功 触发图片的事件 【长按】
   *
   * <p>图片消息类型的render
   *
   * @param position
   * @param convertView
   * @param parent
   * @param isMine
   * @return
   */
  private View imageMsgRender(
      final int position, View convertView, final ViewGroup parent, final boolean isMine) {
    ImageRenderView imageRenderView;
    final ImageMessage imageMessage = (ImageMessage) msgObjectList.get(position);
    UserEntity userEntity = imService.getContactManager().findContact(imageMessage.getFromId());

    /** 保存在本地的path */
    final String imagePath = imageMessage.getPath();
    /** 消息中的image路径 */
    final String imageUrl = imageMessage.getUrl();

    if (null == convertView) {
      imageRenderView = ImageRenderView.inflater(ctx, parent, isMine);
    } else {
      imageRenderView = (ImageRenderView) convertView;
    }

    final ImageView messageImage = imageRenderView.getMessageImage();
    final int msgId = imageMessage.getMsgId();
    imageRenderView.setBtnImageListener(
        new ImageRenderView.BtnImageListener() {
          @Override
          public void onMsgFailure() {
            /**
             * 多端同步也不会拉到本地失败的数据 只有isMine才有的状态,消息发送失败 1. 图片上传失败。点击图片重新上传??[也是重新发送] 2. 图片上传成功,但是发送失败。
             * 点击重新发送??
             */
            if (FileUtil.isSdCardAvailuable()) {
              //
              // imageMessage.setLoadStatus(MessageStatus.IMAGE_UNLOAD);//如果是图片已经上传成功呢?
              imageMessage.setStatus(MessageConstant.MSG_SENDING);
              if (imService != null) {
                imService.getMessageManager().resendMessage(imageMessage);
              }
              updateItemState(msgId, imageMessage);
            } else {
              Toast.makeText(ctx, ctx.getString(R.string.sdcard_unavaluable), Toast.LENGTH_LONG)
                  .show();
            }
          }

          // DetailPortraitActivity 以前用的是DisplayImageActivity 这个类
          @Override
          public void onMsgSuccess() {
            Intent i = new Intent(ctx, PreviewMessageImagesActivity.class);
            Bundle bundle = new Bundle();
            bundle.putSerializable(IntentConstant.CUR_MESSAGE, imageMessage);
            i.putExtras(bundle);
            ctx.startActivity(i);
            ((Activity) ctx).overridePendingTransition(R.anim.tt_image_enter, R.anim.tt_stay);
          }
        });

    // 设定触发loadImage的事件
    imageRenderView.setImageLoadListener(
        new ImageRenderView.ImageLoadListener() {

          @Override
          public void onLoadComplete(String loaclPath) {
            logger.d("chat#pic#save image ok");
            logger.d("pic#setsavepath:%s", loaclPath);
            //                imageMessage.setPath(loaclPath);//下载的本地路径不再存储
            imageMessage.setLoadStatus(MessageConstant.IMAGE_LOADED_SUCCESS);
            updateItemState(imageMessage);
          }

          @Override
          public void onLoadFailed() {
            logger.d("chat#pic#onBitmapFailed");
            imageMessage.setLoadStatus(MessageConstant.IMAGE_LOADED_FAILURE);
            updateItemState(imageMessage);
            logger.d("download failed");
          }
        });

    final View messageLayout = imageRenderView.getMessageLayout();
    messageImage.setOnLongClickListener(
        new View.OnLongClickListener() {
          @Override
          public boolean onLongClick(View v) {
            // 创建一个pop对象,然后 分支判断状态,然后显示需要的内容
            MessageOperatePopup popup =
                getPopMenu(parent, new OperateItemClickListener(imageMessage, position));
            boolean bResend =
                (imageMessage.getStatus() == MessageConstant.MSG_FAILURE)
                    || (imageMessage.getLoadStatus() == MessageConstant.IMAGE_UNLOAD);
            popup.show(messageLayout, DBConstant.SHOW_IMAGE_TYPE, bResend, isMine);
            return true;
          }
        });

    /** 父类控件中的发送失败view */
    imageRenderView
        .getMessageFailed()
        .setOnClickListener(
            new View.OnClickListener() {
              @Override
              public void onClick(View arg0) {
                // 重发或者重新加载
                MessageOperatePopup popup =
                    getPopMenu(parent, new OperateItemClickListener(imageMessage, position));
                popup.show(messageLayout, DBConstant.SHOW_IMAGE_TYPE, true, isMine);
              }
            });
    imageRenderView.render(imageMessage, userEntity, ctx);

    return imageRenderView;
  }