@WebMethod("friend/contactset")
  public Record setContactFriends(QueryParams qp, HttpServletRequest req)
      throws UnsupportedEncodingException {
    FriendshipLogic fs = GlobalLogics.getFriendship();
    AccountLogic account = GlobalLogics.getAccount();

    Context ctx = WutongContext.getContext(qp, true);

    Record rec = account.findUidLoginNameNotInID(ctx, qp.checkGetString("content"));
    String fid = "";
    String hasVirtualFriendId =
        fs.getUserFriendHasVirtualFriendId(
            ctx, ctx.getViewerIdString(), qp.checkGetString("content"));
    if (rec.isEmpty() && hasVirtualFriendId.equals("0")) {
      fid =
          fs.setContactFriendP(
              ctx,
              ctx.getViewerIdString(),
              qp.checkGetString("name"),
              qp.checkGetString("content"),
              qp.checkGetString("circleIds"),
              Constants.FRIEND_REASON_MANUALSELECT);
      return account.getUser(
          ctx,
          ctx.getViewerIdString(),
          fid,
          qp.getString("columns", AccountLogic.USER_LIGHT_COLUMNS));
    } else {
      fid = !rec.isEmpty() ? rec.getString("user_id") : hasVirtualFriendId;
      return fs.setFriendP(
          ctx,
          ctx.getViewerIdString(),
          fid,
          qp.checkGetString("circleIds"),
          Constants.FRIEND_REASON_MANUALSELECT);
    }
  }
  @Override
  protected List<Long> getScope(Context ctx, String senderId, Object... args) {
    List<Long> userIds = new ArrayList<Long>();
    RecordSet liked_Users = new RecordSet();
    if (getSettingKey(ctx).equals(Constants.NTF_MY_APP_LIKE)) {
      /*
          RecordSet es_shared_Users = p.findWhoSharedApp((String)args[0], 200);
          for (Record ue : es_shared_Users) {
          if (!userIds.contains(Long.parseLong(ue.getString("source"))) && !ue.getString("source").equals("0") && !ue.getString("source").equals("")) {
              userIds.add(Long.parseLong(ue.getString("source")));
          }


          liked_Users = p.likedUsers(Constants.APK_OBJECT, (String)args[0], 0, 200);
      }
      */

      // =========================new send to ,from conversation=========================

      String packageName = (String) args[0].toString().trim();
      String[] a = StringUtils.split(packageName, "-");
      if (a.length > 1) packageName = a[0];

      List<String> reasons = new ArrayList<String>();
      reasons.add(String.valueOf(Constants.C_APK_SHARE));
      ConversationLogic conversation = GlobalLogics.getConversation();
      RecordSet conversation_users =
          conversation.getConversation(ctx, Constants.APK_OBJECT, packageName, reasons, 0, 0, 100);
      for (Record r : conversation_users) {
        if (!userIds.contains(Long.parseLong(r.getString("from_"))))
          userIds.add(Long.parseLong(r.getString("from_")));
      }

      List<String> reasons1 = new ArrayList<String>();
      reasons1.add(String.valueOf(Constants.C_APK_LIKE));
      RecordSet conversation_users1 =
          conversation.getConversation(ctx, Constants.APK_OBJECT, packageName, reasons1, 0, 0, 100);

      AccountLogic account = GlobalLogics.getAccount();
      liked_Users.addAll(
          account.getUsers(
              ctx,
              (String) args[1],
              conversation_users1.joinColumnValues("from_", ","),
              "user_id,display_name",
              false));

      // =========================new send to ,from conversation end ====================
    }
    if (userIds.contains(Long.parseLong((String) args[1])))
      userIds.remove(Long.parseLong((String) args[1]));

    // exclude sender
    if (StringUtils.isNotBlank(senderId)) {
      userIds.remove(Long.parseLong(senderId));
    }

    try {
      IgnoreLogic ignore = GlobalLogics.getIgnore();
      userIds = ignore.formatIgnoreUserListP(ctx, userIds, "", "");
      List<Long> lu = new ArrayList<Long>();
      for (Record r : liked_Users) {
        lu.add(Long.parseLong(r.getString("user_id")));
      }
      lu = ignore.formatIgnoreUserListP(ctx, lu, "", "");
      for (int i = liked_Users.size() - 1; i >= 0; i--) {
        if (!lu.contains(Long.parseLong(liked_Users.get(i).getString("user_id"))))
          liked_Users.remove(i);
      }
    } catch (Exception e) {
    }

    List<String> l = new ArrayList<String>();
    int i = 0;
    for (Record user : liked_Users) {
      if (i > 3) break;

      String userId = user.getString("user_id");
      String displayName = user.getString("display_name");
      if (StringUtils.contains(displayNames, displayName)) {
        continue;
      } else {
        displayNames += displayName + ", ";
        l.add(
            "<a href=\"borqs://profile/details?uid=" + userId + "&tab=2\">" + displayName + "</a>");
        i++;
      }
    }

    nameLinks = StringUtils.join(l, ", ");
    if (StringUtils.isNotBlank(displayNames)) {
      displayNames = StringUtils.substringBeforeLast(displayNames, ",");
    }

    return userIds;
  }