private void handleGroupChangeMsg(Message msg, ViewHolder holder, TextView msgTime) {
   UserInfo myInfo = JMessageClient.getMyInfo();
   GroupInfo groupInfo = (GroupInfo) msg.getTargetInfo();
   String content = ((EventNotificationContent) msg.getContent()).getEventText();
   EventNotificationContent.EventNotificationType type =
       ((EventNotificationContent) msg.getContent()).getEventNotificationType();
   switch (type) {
     case group_member_added:
       holder.groupChange.setText(content);
       holder.groupChange.setVisibility(View.VISIBLE);
       break;
     case group_member_exit:
       holder.groupChange.setVisibility(View.GONE);
       msgTime.setVisibility(View.GONE);
       break;
     case group_member_removed:
       List<String> userNames = ((EventNotificationContent) msg.getContent()).getUserNames();
       // 被删除的人显示EventNotification
       if (userNames.contains(myInfo.getNickname()) || userNames.contains(myInfo.getUserName())) {
         holder.groupChange.setText(content);
         holder.groupChange.setVisibility(View.VISIBLE);
         // 群主亦显示
       } else if (myInfo.getUserName().equals(groupInfo.getGroupOwner())) {
         holder.groupChange.setText(content);
         holder.groupChange.setVisibility(View.VISIBLE);
       } else {
         holder.groupChange.setVisibility(View.GONE);
         msgTime.setVisibility(View.GONE);
       }
       break;
   }
 }
  public void getAllSingleConversation(JSONArray data, CallbackContext callbackContext) {
    Log.i(TAG, "  getAllSingleConversation \n" + data);

    List<Conversation> list = JMessageClient.getConversationList();

    Log.i(TAG, "JMessageGetAllSingleConversation" + list.size());

    JSONArray jsonRusult = new JSONArray();

    for (int i = 0; i < list.size(); ++i) {
      Conversation conv = list.get(i);

      if (conv.getType() == ConversationType.single) {

        UserInfo info = (UserInfo) conv.getTargetInfo();
        Message msg = conv.getLatestMessage();
        String contentText = "";
        if (msg != null) {
          switch (msg.getContentType()) {
            case text:
              {
                contentText = ((TextContent) msg.getContent()).getText();
              }
              break;
            default:
              break;
          }
        }

        JSONObject jsonItem = new JSONObject();
        try {
          jsonItem.put("username", info.getUserName());
          jsonItem.put("nickname", info.getNickname());
          // jsonItem.put("avatar", info.getAvatar());
          jsonItem.put("lastMessage", contentText);
          jsonItem.put("unreadCount", conv.getUnReadMsgCnt());

          jsonRusult.put(jsonItem);

        } catch (JSONException e) {
          e.printStackTrace();
        }
      }
    }

    callbackContext.success(jsonRusult);
  }
 public void getUserInfo(JSONArray data, CallbackContext callbackContext) {
   Log.i(TAG, " getUserInfo \n" + data);
   UserInfo info = JMessageClient.getMyInfo();
   try {
     if (info != null && info.getUserName() != null) {
       JSONObject jsonItem = new JSONObject();
       jsonItem.put("username", info.getUserName());
       jsonItem.put("nickname", info.getNickname());
       jsonItem.put("gender", "unknow");
       callbackContext.success(jsonItem);
     } else {
       JSONObject jsonItem = new JSONObject();
       jsonItem.put("errorCode", 863004);
       jsonItem.put("errorDscription", "not found");
       callbackContext.error(jsonItem);
     }
   } catch (JSONException e) {
     e.printStackTrace();
   }
 }
  private JSONObject getJSonFormMessage(Message msg) {
    String contentText = "";
    String msgType = ""; // 上传给js 层的类型,请和ios 保持一致

    switch (msg.getContentType()) {
      case text:
        contentText = ((TextContent) msg.getContent()).getText();
        msgType = "text";
        break;
      default:
        break;
    }
    Log.i(TAG, "msg " + contentText);

    JSONObject jsonItem = new JSONObject();
    try {
      MessageContent content = msg.getContent();
      UserInfo targetUser = (UserInfo) msg.getTargetInfo();
      UserInfo fromUser = (UserInfo) msg.getFromUser();

      jsonItem.put("target_type", "single");
      jsonItem.put("target_id", targetUser.getUserName());
      jsonItem.put("target_name", targetUser.getNickname());
      jsonItem.put("from_id", fromUser.getUserName());
      // jsonItem.put("from_name", fromUser.getNickname());
      jsonItem.put("from_name", msg.getFromName());
      jsonItem.put("create_time", msg.getCreateTime());
      jsonItem.put("msg_type", msgType);
      // jsonItem.put("text", contentText);

      JSONObject contentBody = new JSONObject();
      contentBody.put("text", contentText);
      jsonItem.put("msg_body", contentBody);

    } catch (JSONException e) {
      e.printStackTrace();
    }
    return jsonItem;
  }
  /**
   * 接收消息类事件
   *
   * @param event 消息事件
   */
  public void onEvent(MessageEvent event) {
    final Message msg = event.getMessage();
    // 若为群聊相关事件,如添加、删除群成员
    Log.i(TAG, event.getMessage().toString());
    if (msg.getContentType() == ContentType.eventNotification) {
      GroupInfo groupInfo = (GroupInfo) msg.getTargetInfo();
      long groupID = groupInfo.getGroupID();
      UserInfo myInfo = JMessageClient.getMyInfo();
      EventNotificationContent.EventNotificationType type =
          ((EventNotificationContent) msg.getContent()).getEventNotificationType();
      if (groupID == mChatController.getGroupId()) {
        switch (type) {
          case group_member_added:
            // 添加群成员事件
            List<String> userNames = ((EventNotificationContent) msg.getContent()).getUserNames();
            // 群主把当前用户添加到群聊,则显示聊天详情按钮
            refreshGroupNum();
            if (userNames.contains(myInfo.getNickname())
                || userNames.contains(myInfo.getUserName())) {
              runOnUiThread(
                  new Runnable() {
                    @Override
                    public void run() {
                      mChatView.showRightBtn();
                    }
                  });
            }

            break;
          case group_member_removed:
            // 删除群成员事件
            userNames = ((EventNotificationContent) msg.getContent()).getUserNames();
            // 群主删除了当前用户,则隐藏聊天详情按钮
            if (userNames.contains(myInfo.getNickname())
                || userNames.contains(myInfo.getUserName())) {
              runOnUiThread(
                  new Runnable() {
                    @Override
                    public void run() {
                      mChatView.dismissRightBtn();
                      GroupInfo groupInfo =
                          (GroupInfo) mChatController.getConversation().getTargetInfo();
                      if (TextUtils.isEmpty(groupInfo.getGroupName())) {
                        mChatView.setChatTitle(ChatActivity.this.getString(R.string.group));
                      } else {
                        mChatView.setChatTitle(groupInfo.getGroupName());
                      }
                      mChatView.dismissGroupNum();
                    }
                  });
            } else {
              refreshGroupNum();
            }

            break;
          case group_member_exit:
            refreshGroupNum();
            break;
        }
      }
    }
    // 刷新消息
    runOnUiThread(
        new Runnable() {
          @Override
          public void run() {
            // 收到消息的类型为单聊
            if (msg.getTargetType().equals(ConversationType.single)) {
              String targetID = ((UserInfo) msg.getTargetInfo()).getUserName();
              // 判断消息是否在当前会话中
              if (!mChatController.isGroup() && targetID.equals(mChatController.getTargetId())) {
                Message lastMsg = mChatController.getAdapter().getLastMsg();
                if (lastMsg == null || msg.getId() != lastMsg.getId()) {
                  mChatController.getAdapter().addMsgToList(msg);
                } else {
                  mChatController.getAdapter().notifyDataSetChanged();
                }
              }
            } else {
              long groupID = ((GroupInfo) msg.getTargetInfo()).getGroupID();
              if (mChatController.isGroup() && groupID == mChatController.getGroupId()) {
                Message lastMsg = mChatController.getAdapter().getLastMsg();
                if (lastMsg == null || msg.getId() != lastMsg.getId()) {
                  mChatController.getAdapter().addMsgToList(msg);
                } else {
                  mChatController.getAdapter().notifyDataSetChanged();
                }
              }
            }
          }
        });
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ItemViewTag viewTag;
    Bitmap bitmap;
    if (convertView == null) {
      convertView = mInflater.inflate(R.layout.group_grid_view_item, null);
      viewTag =
          new ItemViewTag(
              (CircleImageView) convertView.findViewById(R.id.grid_avatar),
              (TextView) convertView.findViewById(R.id.grid_name),
              (ImageView) convertView.findViewById(R.id.grid_delete_icon));
      convertView.setTag(viewTag);
    } else {
      viewTag = (ItemViewTag) convertView.getTag();
    }

    if (position < mCurrentNum) {
      UserInfo userInfo = mMemberList.get(position);
      viewTag = (ItemViewTag) convertView.getTag();
      viewTag.icon.setVisibility(View.VISIBLE);
      viewTag.name.setVisibility(View.VISIBLE);
      bitmap = NativeImageLoader.getInstance().getBitmapFromMemCache(userInfo.getUserName());
      if (bitmap != null) viewTag.icon.setImageBitmap(bitmap);
      else {
        // 如果mediaID为空,表明用户没有设置过头像,用默认头像
        if (TextUtils.isEmpty(userInfo.getAvatar())) {
          viewTag.icon.setImageResource(R.drawable.head_icon);
        } else {
          File file = userInfo.getAvatarFile();
          // 如果本地存在头像
          if (file != null && file.isFile()) {
            bitmap =
                BitmapLoader.getBitmapFromFile(file.getAbsolutePath(), mDefaultSize, mDefaultSize);
            NativeImageLoader.getInstance().updateBitmapFromCache(userInfo.getUserName(), bitmap);
            viewTag.icon.setImageBitmap(bitmap);
            // 从网上拿头像
          } else {
            viewTag.icon.setImageResource(R.drawable.head_icon);
            final String userName = userInfo.getUserName();
            userInfo.getAvatarFileAsync(
                new DownloadAvatarCallback() {
                  @Override
                  public void gotResult(int status, String desc, File file) {
                    if (status == 0) {
                      Bitmap bitmap =
                          BitmapLoader.getBitmapFromFile(
                              file.getAbsolutePath(), mDefaultSize, mDefaultSize);
                      NativeImageLoader.getInstance().updateBitmapFromCache(userName, bitmap);
                      notifyDataSetChanged();
                    }
                  }
                });
          }
        }
      }

      if (TextUtils.isEmpty(userInfo.getNickname())) {
        viewTag.name.setText(userInfo.getUserName());
      } else {
        viewTag.name.setText(userInfo.getNickname());
      }
    }
    // 是Delete状态
    if (mIsShowDelete) {
      if (position < mCurrentNum) {
        UserInfo userInfo = mMemberList.get(position);
        // 群主不能删除自己
        if (userInfo.getUserName().equals(JMessageClient.getMyInfo().getUserName()))
          viewTag.deleteIcon.setVisibility(View.GONE);
        else viewTag.deleteIcon.setVisibility(View.VISIBLE);

      } else {
        viewTag.deleteIcon.setVisibility(View.INVISIBLE);
        viewTag.icon.setVisibility(View.INVISIBLE);
        viewTag.name.setVisibility(View.INVISIBLE);
      }
      // 非Delete状态
    } else {
      viewTag.deleteIcon.setVisibility(View.INVISIBLE);
      if (position < mCurrentNum) {
        viewTag.icon.setVisibility(View.VISIBLE);
        viewTag.name.setVisibility(View.VISIBLE);
      } else if (position == mCurrentNum) {
        viewTag = (ItemViewTag) convertView.getTag();
        viewTag.icon.setImageResource(R.drawable.chat_detail_add);
        viewTag.icon.setVisibility(View.VISIBLE);
        viewTag.name.setVisibility(View.INVISIBLE);

        // 设置删除群成员按钮
      } else if (position == mCurrentNum + 1) {
        if (mIsCreator && mCurrentNum > 1) {
          viewTag = (ItemViewTag) convertView.getTag();
          viewTag.icon.setImageResource(R.drawable.chat_detail_del);
          viewTag.icon.setVisibility(View.VISIBLE);
          viewTag.name.setVisibility(View.INVISIBLE);
        } else {
          viewTag = (ItemViewTag) convertView.getTag();
          viewTag.icon.setVisibility(View.GONE);
          viewTag.name.setVisibility(View.GONE);
        }
        // 空白项
      } else {
        viewTag = (ItemViewTag) convertView.getTag();
        viewTag.icon.setVisibility(View.INVISIBLE);
        viewTag.name.setVisibility(View.INVISIBLE);
      }
    }

    return convertView;
  }
  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
      LayoutInflater inflater = LayoutInflater.from(mContext);
      convertView = inflater.inflate(R.layout.all_member_item, null);
      viewHolder =
          new ViewHolder(
              (CircleImageView) convertView.findViewById(R.id.icon_iv),
              (TextView) convertView.findViewById(R.id.name),
              (CheckBox) convertView.findViewById(R.id.check_box_cb));
      convertView.setTag(viewHolder);
    } else {
      viewHolder = (ViewHolder) convertView.getTag();
    }

    final UserInfo userInfo = mMemberList.get(position);
    if (mIsDeleteMode) {
      if (position > 0) {
        viewHolder.checkBox.setVisibility(View.VISIBLE);
        viewHolder.checkBox.setOnClickListener(
            new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                if (viewHolder.checkBox.isChecked()) {
                  mSelectedList.add(userInfo.getUserName());
                  mSelectMap.put(position, true);
                  addAnimation(viewHolder.checkBox);
                } else {
                  mSelectedList.remove(userInfo.getUserName());
                  mSelectMap.delete(position);
                }
              }
            });
        viewHolder.checkBox.setChecked(mSelectMap.get(position));
      } else {
        viewHolder.checkBox.setVisibility(View.INVISIBLE);
      }

    } else {
      viewHolder.checkBox.setVisibility(View.GONE);
    }

    if (!TextUtils.isEmpty(userInfo.getAvatar())) {
      userInfo.getAvatarBitmap(
          new GetAvatarBitmapCallback() {
            @Override
            public void gotResult(int status, String desc, Bitmap bitmap) {
              if (status == 0) {
                viewHolder.icon.setImageBitmap(bitmap);
              } else {
                viewHolder.icon.setImageResource(R.drawable.head_icon);
                HandleResponseCode.onHandle(mContext, status, false);
              }
            }
          });
    } else {
      viewHolder.icon.setImageResource(R.drawable.head_icon);
    }
    String displayName = userInfo.getNickname();
    if (TextUtils.isEmpty(displayName)) {
      viewHolder.displayName.setText(userInfo.getUserName());
    } else {
      viewHolder.displayName.setText(displayName);
    }

    return convertView;
  }