Ejemplo n.º 1
1
  @Override
  public void setMessageObject(MessageObject messageObject) {
    boolean dataChanged = currentMessageObject == messageObject && isUserDataChanged();
    if (currentMessageObject != messageObject || dataChanged) {
      if (AndroidUtilities.isTablet()) {
        backgroundWidth =
            Math.min(
                AndroidUtilities.getMinTabletSide()
                    - AndroidUtilities.dp(
                        isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50),
                AndroidUtilities.dp(300));
      } else {
        backgroundWidth =
            Math.min(
                AndroidUtilities.displaySize.x
                    - AndroidUtilities.dp(
                        isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50),
                AndroidUtilities.dp(300));
      }

      if (messageObject.isOutOwner()) {
        seekBar.type = 0;
        radialProgress.setProgressColor(theme.ChatMusicCell_radialProgress_color);
      } else {
        seekBar.type = 1;
        radialProgress.setProgressColor(theme.ChatMusicCell_radialProgress_color_2);
      }

      int maxWidth = backgroundWidth - AndroidUtilities.dp(86);

      CharSequence stringFinal =
          TextUtils.ellipsize(
              messageObject.getMusicTitle().replace("\n", " "),
              titlePaint,
              maxWidth,
              TextUtils.TruncateAt.END);
      titleLayout =
          new StaticLayout(
              stringFinal, titlePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
      if (titleLayout.getLineCount() > 0) {
        titleX = (int) Math.ceil(titleLayout.getLineLeft(0));
      }

      stringFinal =
          TextUtils.ellipsize(
              messageObject.getMusicAuthor().replace("\n", " "),
              authorPaint,
              maxWidth,
              TextUtils.TruncateAt.END);
      authorLayout =
          new StaticLayout(
              stringFinal, authorPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
      if (authorLayout.getLineCount() > 0) {
        authorX = (int) Math.ceil(authorLayout.getLineLeft(0));
      }

      super.setMessageObject(messageObject);
    }
    updateButtonState(dataChanged);
  }
Ejemplo n.º 2
0
 public void setText(String text) {
   if (text == null || text.length() == 0) {
     setVisibility(GONE);
     return;
   }
   if (text != null && oldText != null && text.equals(oldText)) {
     return;
   }
   oldText = text;
   setVisibility(VISIBLE);
   if (AndroidUtilities.isTablet()) {
     width = (int) (AndroidUtilities.getMinTabletSide() * 0.7f);
   } else {
     width =
         (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.7f);
   }
   SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
   String help = LocaleController.getString("BotInfoTitle", R.string.BotInfoTitle);
   stringBuilder.append(help);
   stringBuilder.append("\n\n");
   stringBuilder.append(text);
   MessageObject.addLinks(stringBuilder);
   stringBuilder.setSpan(
       new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")),
       0,
       help.length(),
       Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
   textLayout =
       new StaticLayout(
           stringBuilder, textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
   width = 0;
   height = textLayout.getHeight() + AndroidUtilities.dp(4 + 18);
   int count = textLayout.getLineCount();
   for (int a = 0; a < count; a++) {
     width =
         (int) Math.ceil(Math.max(width, textLayout.getLineWidth(a) - textLayout.getLineLeft(a)));
   }
   width += AndroidUtilities.dp(4 + 18);
 }
Ejemplo n.º 3
0
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    boolean result = false;
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      if (delegate != null) {
        if (currentMessageObject.type == 11 && imageReceiver.isInsideImage(x, y)) {
          imagePressed = true;
          result = true;
        }
        if (result) {
          startCheckLongPress();
        }
      }
    } else {
      if (event.getAction() != MotionEvent.ACTION_MOVE) {
        cancelCheckLongPress();
      }
      if (imagePressed) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
          imagePressed = false;
          if (delegate != null) {
            delegate.didClickedImage(this);
            playSoundEffect(SoundEffectConstants.CLICK);
          }
        } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
          imagePressed = false;
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
          if (!imageReceiver.isInsideImage(x, y)) {
            imagePressed = false;
          }
        }
      }
    }
    if (!result) {
      if (event.getAction() == MotionEvent.ACTION_DOWN
          || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) {
        if (x >= textX && y >= textY && x <= textX + textWidth && y <= textY + textHeight) {
          y -= textY;
          x -= textXLeft;

          final int line = textLayout.getLineForVertical((int) y);
          final int off = textLayout.getOffsetForHorizontal(line, x);
          final float left = textLayout.getLineLeft(line);
          if (left <= x
              && left + textLayout.getLineWidth(line) >= x
              && currentMessageObject.messageText instanceof Spannable) {
            Spannable buffer = (Spannable) currentMessageObject.messageText;
            URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);

            if (link.length != 0) {
              if (event.getAction() == MotionEvent.ACTION_DOWN) {
                pressedLink = link[0];
                result = true;
              } else {
                if (link[0] == pressedLink) {
                  if (delegate != null) {
                    delegate.needOpenUserProfile(Integer.parseInt(link[0].getURL()));
                  }
                  result = true;
                }
              }
            } else {
              pressedLink = null;
            }
          } else {
            pressedLink = null;
          }
        } else {
          pressedLink = null;
        }
      }
    }

    if (!result) {
      result = super.onTouchEvent(event);
    }

    return result;
  }
Ejemplo n.º 4
0
 public static StaticLayout createStaticLayout(
     CharSequence source,
     int bufstart,
     int bufend,
     TextPaint paint,
     int outerWidth,
     Layout.Alignment align,
     float spacingMult,
     float spacingAdd,
     boolean includePad,
     TextUtils.TruncateAt ellipsize,
     int ellipsisWidth,
     int maxLines) {
   /*if (Build.VERSION.SDK_INT >= 14) {
       init();
       try {
           sConstructorArgs[0] = source;
           sConstructorArgs[1] = bufstart;
           sConstructorArgs[2] = bufend;
           sConstructorArgs[3] = paint;
           sConstructorArgs[4] = outerWidth;
           sConstructorArgs[5] = align;
           sConstructorArgs[6] = sTextDirection;
           sConstructorArgs[7] = spacingMult;
           sConstructorArgs[8] = spacingAdd;
           sConstructorArgs[9] = includePad;
           sConstructorArgs[10] = ellipsize;
           sConstructorArgs[11] = ellipsisWidth;
           sConstructorArgs[12] = maxLines;
           return sConstructor.newInstance(sConstructorArgs);
       } catch (Exception e) {
           FileLog.e("tmessages", e);
       }
   }*/
   try {
     if (maxLines == 1) {
       CharSequence text =
           TextUtils.ellipsize(source, paint, ellipsisWidth, TextUtils.TruncateAt.END);
       return new StaticLayout(
           text, 0, text.length(), paint, outerWidth, align, spacingMult, spacingAdd, includePad);
     } else {
       StaticLayout layout =
           new StaticLayout(source, paint, outerWidth, align, spacingMult, spacingAdd, includePad);
       if (layout.getLineCount() <= maxLines) {
         return layout;
       } else {
         int off;
         float left = layout.getLineLeft(maxLines - 1);
         if (left != 0) {
           off = layout.getOffsetForHorizontal(maxLines - 1, left);
         } else {
           off = layout.getOffsetForHorizontal(maxLines - 1, layout.getLineWidth(maxLines - 1));
         }
         SpannableStringBuilder stringBuilder =
             new SpannableStringBuilder(source.subSequence(0, Math.max(0, off - 1)));
         stringBuilder.append("\u2026");
         return new StaticLayout(
             stringBuilder, paint, outerWidth, align, spacingMult, spacingAdd, includePad);
       }
     }
   } catch (Exception e) {
     FileLog.e("tmessages", e);
   }
   return null;
 }
Ejemplo n.º 5
0
  public void buildLayout() {
    CharSequence nameString;
    TextPaint currentNamePaint;

    drawNameBroadcast = false;
    drawNameLock = false;
    drawNameGroup = false;
    drawCheck = false;
    drawNameBot = false;

    if (encryptedChat != null) {
      drawNameLock = true;
      dialog_id = ((long) encryptedChat.id) << 32;
      if (!LocaleController.isRTL) {
        nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
        nameLeft =
            AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4)
                + lockDrawable.getIntrinsicWidth();
      } else {
        nameLockLeft =
            getMeasuredWidth()
                - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 2)
                - lockDrawable.getIntrinsicWidth();
        nameLeft = AndroidUtilities.dp(11);
      }
      nameLockTop = AndroidUtilities.dp(16.5f);
    } else {
      if (chat != null) {
        if (chat.id < 0) {
          dialog_id = AndroidUtilities.makeBroadcastId(chat.id);
          drawNameBroadcast = true;
          nameLockTop = AndroidUtilities.dp(28.5f);
        } else {
          dialog_id = -chat.id;
          if (ChatObject.isChannel(chat) && !chat.megagroup) {
            drawNameBroadcast = true;
            nameLockTop = AndroidUtilities.dp(28.5f);
          } else {
            drawNameGroup = true;
            nameLockTop = AndroidUtilities.dp(30);
          }
        }
        drawCheck = chat.verified;
        if (!LocaleController.isRTL) {
          nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
          nameLeft =
              AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4)
                  + (drawNameGroup
                      ? groupDrawable.getIntrinsicWidth()
                      : broadcastDrawable.getIntrinsicWidth());
        } else {
          nameLockLeft =
              getMeasuredWidth()
                  - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 2)
                  - (drawNameGroup
                      ? groupDrawable.getIntrinsicWidth()
                      : broadcastDrawable.getIntrinsicWidth());
          nameLeft = AndroidUtilities.dp(11);
        }
      } else {
        dialog_id = user.id;
        if (!LocaleController.isRTL) {
          nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
        } else {
          nameLeft = AndroidUtilities.dp(11);
        }
        if (user.bot) {
          drawNameBot = true;
          if (!LocaleController.isRTL) {
            nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
            nameLeft =
                AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4)
                    + botDrawable.getIntrinsicWidth();
          } else {
            nameLockLeft =
                getMeasuredWidth()
                    - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 2)
                    - botDrawable.getIntrinsicWidth();
            nameLeft = AndroidUtilities.dp(11);
          }
          nameLockTop = AndroidUtilities.dp(16.5f);
        } else {
          nameLockTop = AndroidUtilities.dp(17);
        }
        drawCheck = user.verified;
      }
    }

    if (currentName != null) {
      nameString = currentName;
    } else {
      String nameString2 = "";
      if (chat != null) {
        nameString2 = chat.title;
      } else if (user != null) {
        nameString2 = UserObject.getUserName(user);
      }
      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;
    }

    int onlineWidth;
    int nameWidth;
    if (!LocaleController.isRTL) {
      onlineWidth = nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(14);
    } else {
      onlineWidth =
          nameWidth =
              getMeasuredWidth() - nameLeft - AndroidUtilities.dp(AndroidUtilities.leftBaseline);
    }
    if (drawNameLock) {
      nameWidth -= AndroidUtilities.dp(6) + lockDrawable.getIntrinsicWidth();
    } else if (drawNameBroadcast) {
      nameWidth -= AndroidUtilities.dp(6) + broadcastDrawable.getIntrinsicWidth();
    } else if (drawNameGroup) {
      nameWidth -= AndroidUtilities.dp(6) + groupDrawable.getIntrinsicWidth();
    } else if (drawNameBot) {
      nameWidth -= AndroidUtilities.dp(6) + botDrawable.getIntrinsicWidth();
    }

    if (drawCount) {
      TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
      if (dialog != null && dialog.unread_count != 0) {
        lastUnreadCount = dialog.unread_count;
        String countString = String.format("%d", dialog.unread_count);
        countWidth =
            Math.max(AndroidUtilities.dp(12), (int) Math.ceil(countPaint.measureText(countString)));
        countLayout =
            new StaticLayout(
                countString,
                countPaint,
                countWidth,
                Layout.Alignment.ALIGN_CENTER,
                1.0f,
                0.0f,
                false);
        int w = countWidth + AndroidUtilities.dp(18);
        nameWidth -= w;
        if (!LocaleController.isRTL) {
          countLeft = getMeasuredWidth() - countWidth - AndroidUtilities.dp(19);
        } else {
          countLeft = AndroidUtilities.dp(19);
          nameLeft += w;
        }
      } else {
        lastUnreadCount = 0;
        countLayout = null;
      }
    } else {
      lastUnreadCount = 0;
      countLayout = null;
    }

    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 || subLabel != null) {
      if (!LocaleController.isRTL) {
        onlineLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
      } else {
        onlineLeft = AndroidUtilities.dp(11);
      }

      CharSequence onlineString = "";
      TextPaint currentOnlinePaint = offlinePaint;

      if (subLabel != null) {
        onlineString = subLabel;
      } else if (user != null) {
        if (user.bot) {
          onlineString = LocaleController.getString("Bot", R.string.Bot);
        } 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,
              onlineWidth - AndroidUtilities.dp(12),
              TextUtils.TruncateAt.END);
      onlineLayout =
          new StaticLayout(
              onlineStringFinal,
              currentOnlinePaint,
              onlineWidth,
              Layout.Alignment.ALIGN_NORMAL,
              1.0f,
              0.0f,
              false);
      nameTop = AndroidUtilities.dp(13);
      if (subLabel != null && chat != null) {
        nameLockTop -= AndroidUtilities.dp(12);
      }
    } else {
      onlineLayout = null;
      nameTop = AndroidUtilities.dp(25);
    }

    int avatarLeft;
    if (!LocaleController.isRTL) {
      avatarLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 13 : 9);
    } else {
      avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 65 : 61);
    }

    avatarImage.setImageCoords(
        avatarLeft, AndroidUtilities.dp(10), AndroidUtilities.dp(52), AndroidUtilities.dp(52));

    double widthpx;
    float left;
    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);
          }
        }
      }
    }
  }
Ejemplo n.º 6
0
    public void build(int width, int height) {
      CharSequence nameString = "";
      TextPaint currentNamePaint;

      if (encryptedChat != null) {
        drawNameLock = true;
        if (!LocaleController.isRTL) {
          nameLockLeft = Utilities.dp(61 + (usePadding ? 11 : 0));
          nameLeft = Utilities.dp(65 + (usePadding ? 11 : 0)) + lockDrawable.getIntrinsicWidth();
        } else {
          nameLockLeft =
              width - Utilities.dp(63 + (usePadding ? 11 : 0)) - lockDrawable.getIntrinsicWidth();
          nameLeft = usePadding ? Utilities.dp(11) : 0;
        }
      } else {
        drawNameLock = false;
        if (!LocaleController.isRTL) {
          nameLeft = Utilities.dp(61 + (usePadding ? 11 : 0));
        } else {
          nameLeft = usePadding ? Utilities.dp(11) : 0;
        }
      }

      if (currentName != null) {
        nameString = currentName;
      } else {
        String nameString2 = "";
        if (chat != null) {
          nameString2 = chat.title;
        } else if (user != null) {
          nameString2 = Utilities.formatName(user.first_name, user.last_name);
        }
        nameString = nameString2.replace("\n", " ");
      }
      if (nameString.length() == 0) {
        if (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 - Utilities.dp(3 + (usePadding ? 11 : 0));
      } else {
        onlineWidth = nameWidth = width - nameLeft - Utilities.dp(61 + (usePadding ? 11 : 0));
      }
      if (drawNameLock) {
        nameWidth -= Utilities.dp(6) + lockDrawable.getIntrinsicWidth();
      }

      CharSequence nameStringFinal =
          TextUtils.ellipsize(
              nameString, currentNamePaint, nameWidth - Utilities.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 = Utilities.dp(61 + (usePadding ? 11 : 0));
        } else {
          onlineLeft = usePadding ? Utilities.dp(11) : 0;
        }

        String onlineString = "";
        TextPaint currentOnlinePaint = offlinePaint;

        if (subLabel != null) {
          onlineString = subLabel;
        } else {
          if (user != null) {
            if (user.status == null) {
              onlineString = getResources().getString(R.string.Offline);
            } else {
              int currentTime = ConnectionsManager.getInstance().getCurrentTime();
              if (user.id == UserConfig.clientUserId || user.status.expires > currentTime) {
                currentOnlinePaint = onlinePaint;
                onlineString = getResources().getString(R.string.Online);
              } else {
                if (user.status.expires <= 10000) {
                  onlineString = getResources().getString(R.string.Invisible);
                } else {
                  onlineString = LocaleController.formatDateOnline(user.status.expires);
                }
              }
            }
          }
        }

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

      if (!LocaleController.isRTL) {
        avatarLeft = usePadding ? Utilities.dp(11) : 0;
      } else {
        avatarLeft = width - Utilities.dp(50 + (usePadding ? 11 : 0));
      }
      avatarImage.imageX = avatarLeft;
      avatarImage.imageY = avatarTop;
      avatarImage.imageW = Utilities.dp(50);
      avatarImage.imageH = Utilities.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);
            }
          }
        }
      }
    }
Ejemplo n.º 7
0
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    boolean result = false;
    int side = AndroidUtilities.dp(48);
    if (textLayout != null) {
      if (event.getAction() == MotionEvent.ACTION_DOWN
          || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          resetPressedLink();
          try {
            int x2 = (int) (x - textX);
            int y2 = (int) (y - textY);
            final int line = textLayout.getLineForVertical(y2);
            final int off = textLayout.getOffsetForHorizontal(line, x2);

            final float left = textLayout.getLineLeft(line);
            if (left <= x2 && left + textLayout.getLineWidth(line) >= x2) {
              Spannable buffer = (Spannable) textLayout.getText();
              ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
              if (link.length != 0) {
                resetPressedLink();
                pressedLink = link[0];
                result = true;
                try {
                  int start = buffer.getSpanStart(pressedLink);
                  urlPath.setCurrentLayout(textLayout, start);
                  textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath);
                } catch (Exception e) {
                  FileLog.e("tmessages", e);
                }
              } else {
                resetPressedLink();
              }
            } else {
              resetPressedLink();
            }
          } catch (Exception e) {
            resetPressedLink();
            FileLog.e("tmessages", e);
          }
        } else if (pressedLink != null) {
          try {
            if (pressedLink instanceof URLSpanNoUnderline) {
              String url = ((URLSpanNoUnderline) pressedLink).getURL();
              if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) {
                if (delegate != null) {
                  delegate.didPressUrl(url);
                }
              }
            } else {
              pressedLink.onClick(this);
            }
          } catch (Exception e) {
            FileLog.e("tmessages", e);
          }
          resetPressedLink();
          result = true;
        }
      } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
        resetPressedLink();
      }
    }
    return result || super.onTouchEvent(event);
  }
    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);
            }
          }
        }
      }
    }