public void queryServerSearch(final String query) {
   if (query == null || query.length() < 5) {
     if (reqId != 0) {
       ConnectionsManager.getInstance().cancelRpc(reqId, true);
       reqId = 0;
     }
     globalSearch.clear();
     lastReqId = 0;
     notifyDataSetChanged();
     return;
   }
   TLRPC.TL_contacts_search req = new TLRPC.TL_contacts_search();
   req.q = query;
   req.limit = 50;
   final int currentReqId = ++lastReqId;
   reqId =
       ConnectionsManager.getInstance()
           .performRpc(
               req,
               new RPCRequest.RPCRequestDelegate() {
                 @Override
                 public void run(final TLObject response, final TLRPC.TL_error error) {
                   AndroidUtilities.RunOnUIThread(
                       new Runnable() {
                         @Override
                         public void run() {
                           if (currentReqId == lastReqId) {
                             if (error == null) {
                               TLRPC.TL_contacts_found res = (TLRPC.TL_contacts_found) response;
                               globalSearch = res.users;
                               lastFoundUsername = query;
                               notifyDataSetChanged();
                             }
                           }
                           reqId = 0;
                         }
                       });
                 }
               },
               true,
               RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors);
 }
    public void build(int width, int height) {
      CharSequence nameString = "";
      TextPaint currentNamePaint;

      drawNameBroadcast = false;
      drawNameLock = false;
      drawNameGroup = false;

      if (encryptedChat != null) {
        drawNameLock = true;
        if (!LocaleController.isRTL) {
          nameLockLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0));
          nameLeft =
              AndroidUtilities.dp(65 + (usePadding ? 11 : 0)) + lockDrawable.getIntrinsicWidth();
        } else {
          nameLockLeft =
              width
                  - AndroidUtilities.dp(63 + (usePadding ? 11 : 0))
                  - lockDrawable.getIntrinsicWidth();
          nameLeft = usePadding ? AndroidUtilities.dp(11) : 0;
        }
        nameLockTop = AndroidUtilities.dp(15);
      } else {
        if (chat != null) {
          nameLockTop = AndroidUtilities.dp(26);
          if (chat.id < 0) {
            drawNameBroadcast = true;
          } else {
            drawNameGroup = true;
          }
          if (!LocaleController.isRTL) {
            nameLockLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0));
            nameLeft =
                AndroidUtilities.dp(65 + (usePadding ? 11 : 0))
                    + (drawNameGroup
                        ? groupDrawable.getIntrinsicWidth()
                        : broadcastDrawable.getIntrinsicWidth());
          } else {
            nameLockLeft =
                width
                    - AndroidUtilities.dp(63 + (usePadding ? 11 : 0))
                    - (drawNameGroup
                        ? groupDrawable.getIntrinsicWidth()
                        : broadcastDrawable.getIntrinsicWidth());
            nameLeft = usePadding ? AndroidUtilities.dp(11) : 0;
          }
        } else {
          if (!LocaleController.isRTL) {
            nameLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0));
          } else {
            nameLeft = usePadding ? AndroidUtilities.dp(11) : 0;
          }
        }
      }

      if (currentName != null) {
        nameString = currentName;
      } else {
        String nameString2 = "";
        if (chat != null) {
          nameString2 = chat.title;
        } else if (user != null) {
          nameString2 = ContactsController.formatName(user.first_name, user.last_name);
        }
        nameString = nameString2.replace("\n", " ");
      }
      if (nameString.length() == 0) {
        if (user != null && user.phone != null && user.phone.length() != 0) {
          nameString = PhoneFormat.getInstance().format("+" + user.phone);
        } else {
          nameString = LocaleController.getString("HiddenName", R.string.HiddenName);
        }
      }
      if (encryptedChat != null) {
        currentNamePaint = nameEncryptedPaint;
      } else {
        currentNamePaint = namePaint;
      }

      if (!LocaleController.isRTL) {
        onlineWidth = nameWidth = width - nameLeft - AndroidUtilities.dp(3 + (usePadding ? 11 : 0));
      } else {
        onlineWidth =
            nameWidth = width - nameLeft - AndroidUtilities.dp(61 + (usePadding ? 11 : 0));
      }
      if (drawNameLock) {
        nameWidth -= AndroidUtilities.dp(6) + lockDrawable.getIntrinsicWidth();
      } else if (drawNameBroadcast) {
        nameWidth -= AndroidUtilities.dp(6) + broadcastDrawable.getIntrinsicWidth();
      }

      CharSequence nameStringFinal =
          TextUtils.ellipsize(
              nameString,
              currentNamePaint,
              nameWidth - AndroidUtilities.dp(12),
              TextUtils.TruncateAt.END);
      nameLayout =
          new StaticLayout(
              nameStringFinal,
              currentNamePaint,
              nameWidth,
              Layout.Alignment.ALIGN_NORMAL,
              1.0f,
              0.0f,
              false);

      if (chat == null) {
        if (!LocaleController.isRTL) {
          onlineLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0));
        } else {
          onlineLeft = usePadding ? AndroidUtilities.dp(11) : 0;
        }

        CharSequence onlineString = "";
        TextPaint currentOnlinePaint = offlinePaint;

        if (subLabel != null) {
          onlineString = subLabel;
        } else {
          onlineString = LocaleController.formatUserStatus(user);
          if (user != null
              && (user.id == UserConfig.getClientUserId()
                  || user.status != null
                      && user.status.expires > ConnectionsManager.getInstance().getCurrentTime())) {
            currentOnlinePaint = onlinePaint;
            onlineString = LocaleController.getString("Online", R.string.Online);
          }
        }

        CharSequence onlineStringFinal =
            TextUtils.ellipsize(
                onlineString,
                currentOnlinePaint,
                nameWidth - AndroidUtilities.dp(12),
                TextUtils.TruncateAt.END);
        onlineLayout =
            new StaticLayout(
                onlineStringFinal,
                currentOnlinePaint,
                nameWidth,
                Layout.Alignment.ALIGN_NORMAL,
                1.0f,
                0.0f,
                false);
        nameTop = AndroidUtilities.dp(12);
      } else {
        onlineLayout = null;
        nameTop = AndroidUtilities.dp(22);
      }

      if (!LocaleController.isRTL) {
        avatarLeft = usePadding ? AndroidUtilities.dp(11) : 0;
      } else {
        avatarLeft = width - AndroidUtilities.dp(50 + (usePadding ? 11 : 0));
      }
      avatarImage.setImageCoords(
          avatarLeft, avatarTop, AndroidUtilities.dp(50), AndroidUtilities.dp(50));

      double widthpx = 0;
      float left = 0;
      if (LocaleController.isRTL) {
        if (nameLayout.getLineCount() > 0) {
          left = nameLayout.getLineLeft(0);
          if (left == 0) {
            widthpx = Math.ceil(nameLayout.getLineWidth(0));
            if (widthpx < nameWidth) {
              nameLeft += (nameWidth - widthpx);
            }
          }
        }
        if (onlineLayout != null && onlineLayout.getLineCount() > 0) {
          left = onlineLayout.getLineLeft(0);
          if (left == 0) {
            widthpx = Math.ceil(onlineLayout.getLineWidth(0));
            if (widthpx < onlineWidth) {
              onlineLeft += (onlineWidth - widthpx);
            }
          }
        }
      } else {
        if (nameLayout.getLineCount() > 0) {
          left = nameLayout.getLineRight(0);
          if (left == nameWidth) {
            widthpx = Math.ceil(nameLayout.getLineWidth(0));
            if (widthpx < nameWidth) {
              nameLeft -= (nameWidth - widthpx);
            }
          }
        }
        if (onlineLayout != null && onlineLayout.getLineCount() > 0) {
          left = onlineLayout.getLineRight(0);
          if (left == onlineWidth) {
            widthpx = Math.ceil(onlineLayout.getLineWidth(0));
            if (widthpx < onlineWidth) {
              onlineLeft -= (onlineWidth - widthpx);
            }
          }
        }
      }
    }