@Override protected void onDraw(Canvas canvas) { if (processor.isLoaded()) { int offsetLeft = (getWidth() - countInRow * smileySize) / 2; for (int i = 0; i < smileyIds.length; i++) { int row = i / countInRow; int col = i % countInRow; rect.set( col * smileySize + smileyPadding + offsetLeft, row * smileySize + smileyPadding, (col + 1) * smileySize - smileyPadding + offsetLeft, (row + 1) * smileySize - smileyPadding); if (!canvas.quickReject(rect.left, rect.top, rect.right, rect.bottom, Canvas.EdgeType.AA)) { Bitmap img = processor.getSection(smileysSections[i]); if (img != null) { sectionRect.set( smileysX[i] * smileySrcSize, smileysY[i] * smileySrcSize, (smileysX[i] + 1) * smileySrcSize, (smileysY[i] + 1) * smileySrcSize); canvas.drawBitmap(img, sectionRect, rect, paint); } } } } }
public SmileysView( Context context, EmojiProcessor processor, long[] smileyIds, int smileysInRow, int smileySize, int smileyPadding) { super(context); this.rowCount = (int) Math.ceil((float) smileyIds.length / smileysInRow); this.processor = processor; this.smileyIds = smileyIds; this.countInRow = smileysInRow; this.smileySize = smileySize; this.smileyPadding = smileyPadding; this.smileySrcSize = processor.getRectSize(); smileysSections = new int[smileyIds.length]; smileysX = new int[smileyIds.length]; smileysY = new int[smileyIds.length]; for (int i = 0; i < smileyIds.length; i++) { smileysSections[i] = processor.getSectionIndex(smileyIds[i]); smileysX[i] = processor.getSectionX(smileyIds[i]); smileysY[i] = processor.getSectionY(smileyIds[i]); } this.paint.setAntiAlias(true); this.paint.setFlags(Paint.FILTER_BITMAP_FLAG); }
public void build(DialogWireframe description, int w, int h, TelegramApplication application) { layoutH = h; layoutW = w; if (description.getPeerType() == PeerType.PEER_USER) { if (description.getPeerId() == 333000) { isHighlighted = false; } else { User user = description.getDialogUser(); isHighlighted = user.getLinkType() == LinkType.FOREIGN; } isGroup = false; isEncrypted = false; } else if (description.getPeerType() == PeerType.PEER_CHAT) { isHighlighted = false; isGroup = true; isEncrypted = false; } else if (description.getPeerType() == PeerType.PEER_USER_ENCRYPTED) { isHighlighted = false; isGroup = false; isEncrypted = true; } isBodyHighlighted = description.getContentType() != ContentType.MESSAGE_TEXT; if (description.getUnreadCount() != 0 && !description.isMine()) { isUnreadIn = true; } else { isUnreadIn = false; } time = org.telegram.android.ui.TextUtil.formatDate(description.getDate(), application); isRtl = application.isRTL(); if (IS_LARGE) { layoutAvatarWidth = px(64); layoutPadding = application.getResources().getDimensionPixelSize(R.dimen.dialogs_padding); layoutBodyPadding = layoutAvatarWidth + layoutPadding + px(12); layoutAvatarTop = px(8); layoutTitleTop = px(34); layoutMainTop = px(60); layoutTimeTop = px(34); layoutMarkTop = px(44); layoutMarkBottom = layoutMarkTop + px(22); layoutMarkTextTop = layoutMarkTop + px(18); } else { layoutAvatarWidth = px(54); layoutPadding = application.getResources().getDimensionPixelSize(R.dimen.dialogs_padding); layoutBodyPadding = layoutAvatarWidth + layoutPadding + px(12); layoutAvatarTop = px(8); layoutTitleTop = px(30); layoutMainTop = px(54); layoutTimeTop = px(30); layoutMarkTop = px(38); layoutMarkBottom = layoutMarkTop + px(22); layoutMarkTextTop = layoutMarkTop + px(18); } layoutMainContentTop = (int) (layoutMainTop + bodyPaint.getFontMetrics().ascent); layoutTitleLayoutTop = (int) (layoutTitleTop + titlePaint.getFontMetrics().ascent); layoutStateTop = layoutTimeTop - px(10); layoutClockTop = layoutTimeTop - px(12); layoutEncryptedTop = layoutTimeTop - px(14); if (isRtl) { layoutAvatarLeft = w - layoutPadding - layoutAvatarWidth; } else { layoutAvatarLeft = layoutPadding; } int timeWidth = (int) unreadClockPaint.measureText(time); if (isRtl) { layoutTimeLeft = layoutPadding; layoutStateLeftDouble = layoutPadding + timeWidth + px(2); layoutStateLeft = layoutStateLeftDouble + px(6); layoutClockLeft = layoutPadding + timeWidth + px(2); } else { layoutTimeLeft = w - layoutPadding - timeWidth; layoutClockLeft = w - layoutPadding - timeWidth - px(14); layoutStateLeft = w - layoutPadding - timeWidth - px(16); layoutStateLeftDouble = w - layoutPadding - timeWidth - px(6 + 16); } layoutMarkRadius = px(2); if (description.isErrorState() || (description.getMessageState() == MessageState.FAILURE && description.isMine())) { layoutMarkWidth = px(22); if (isRtl) { layoutMarkLeft = layoutPadding; // getMeasuredWidth() - layoutMarkWidth - getPx(80); } else { layoutMarkLeft = w - layoutMarkWidth - layoutPadding; } } else { if (description.getUnreadCount() > 0) { if (description.getUnreadCount() >= 1000) { unreadCountText = I18nUtil.getInstance().correctFormatNumber(description.getUnreadCount() / 1000) + "K"; } else { unreadCountText = I18nUtil.getInstance().correctFormatNumber(description.getUnreadCount()); } int width = (int) counterTitlePaint.measureText(unreadCountText); Rect r = new Rect(); counterTitlePaint.getTextBounds(unreadCountText, 0, unreadCountText.length(), r); layoutMarkTextTop = layoutMarkTop + (layoutMarkBottom - layoutMarkTop + r.top) / 2 - r.top; if (width < px(22 - 14)) { layoutMarkWidth = px(22); } else { layoutMarkWidth = px(14) + width; } layoutMarkTextLeft = (layoutMarkWidth - width) / 2; if (isRtl) { layoutMarkLeft = layoutPadding; // getMeasuredWidth() - layoutMarkWidth - getPx(80); } else { layoutMarkLeft = w - layoutMarkWidth - layoutPadding; } } else { layoutMarkLeft = 0; layoutMarkWidth = 0; } } layoutMarkRect.set( layoutMarkLeft, layoutMarkTop, layoutMarkLeft + layoutMarkWidth, layoutMarkBottom); if (description.getPeerType() == PeerType.PEER_USER_ENCRYPTED) { if (isRtl) { if (description.isMine()) { layoutTitleLeft = timeWidth + px(16) + px(16); } else { layoutTitleLeft = timeWidth + px(12); } layoutTitleWidth = w - layoutTitleLeft - layoutBodyPadding - px(14) - px(6); layoutEncryptedLeft = w - layoutBodyPadding - px(12); } else { layoutTitleLeft = layoutBodyPadding + px(16); if (description.isMine()) { layoutTitleWidth = w - layoutTitleLeft - timeWidth - px(24); } else { layoutTitleWidth = w - layoutTitleLeft - timeWidth - px(12); } layoutEncryptedLeft = layoutBodyPadding + px(2); } } else { if (isRtl) { if (description.isMine()) { layoutTitleLeft = timeWidth + px(16) + px(16); } else { layoutTitleLeft = timeWidth + px(12); } layoutTitleWidth = w - layoutTitleLeft - layoutBodyPadding; } else { layoutTitleLeft = layoutBodyPadding; if (description.isMine()) { layoutTitleWidth = w - layoutTitleLeft - timeWidth - px(24) - px(12); } else { layoutTitleWidth = w - layoutTitleLeft - timeWidth - px(12); } } } layoutMainWidth = w - layoutBodyPadding - layoutPadding; if (isRtl) { layoutMainLeft = w - layoutMainWidth - layoutBodyPadding; if (layoutMarkWidth != 0) { layoutMainLeft += layoutMarkWidth + px(8); layoutMainWidth -= layoutMarkWidth + px(8); } } else { layoutMainLeft = layoutBodyPadding; if (layoutMarkWidth != 0) { layoutMainWidth -= layoutMarkWidth + px(8); } } avatarRect.set( layoutAvatarLeft, layoutAvatarTop, layoutAvatarLeft + layoutAvatarWidth, layoutAvatarTop + layoutAvatarWidth); // Building text layouts { String message = description.getMessage(); if (message.length() > 150) { message = message.substring(0, 150) + "..."; } message = message.replace("\n", " "); TextPaint bodyTextPaint; if (isBodyHighlighted) { bodyTextPaint = bodyHighlightPaint; } else { if (HIGHLIGHT_UNDEAD) { if (isUnreadIn) { bodyTextPaint = bodyUnreadPaint; } else { bodyTextPaint = bodyPaint; } } else { bodyTextPaint = bodyPaint; } } int nameLength = 0; if (description.getContentType() != ContentType.MESSAGE_SYSTEM) { if (description.isMine()) { String name = application.getResources().getString(R.string.st_dialog_you); nameLength = BidiFormatter.getInstance().unicodeWrap(name).length(); message = BidiFormatter.getInstance().unicodeWrap(name) + ": " + BidiFormatter.getInstance().unicodeWrap(message); } else { if (isGroup) { User user = description.getSender(); nameLength = BidiFormatter.getInstance().unicodeWrap(user.getFirstName()).length(); message = BidiFormatter.getInstance().unicodeWrap(user.getFirstName().replace("\n", " ")) + ": " + BidiFormatter.getInstance().unicodeWrap(message); } } } String preSequence = TextUtils.ellipsize(message, bodyTextPaint, layoutMainWidth, TextUtils.TruncateAt.END) .toString(); // Spannable sequence = // application.getEmojiProcessor().processEmojiCutMutable(preSequence, // EmojiProcessor.CONFIGURATION_DIALOGS); // if (nameLength != 0) { // sequence.setSpan(new ForegroundColorSpan(HIGHLIGHT_COLOR), 0, // Math.min(nameLength, sequence.length()), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); // } // CharSequence resSequence = TextUtils.ellipsize(sequence, bodyTextPaint, // layoutMainWidth, TextUtils.TruncateAt.END); // bodyLayout = new StaticLayout(resSequence, bodyTextPaint, layoutMainWidth, // Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); // bodyString = null; Spannable sequence = application .getEmojiProcessor() .processEmojiCutMutable(preSequence, EmojiProcessor.CONFIGURATION_DIALOGS); if (nameLength != 0) { sequence.setSpan( new ForegroundColorSpan(HIGHLIGHT_COLOR), 0, Math.min(nameLength, sequence.length()), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); } CharSequence resSequence = TextUtils.ellipsize(sequence, bodyTextPaint, layoutMainWidth, TextUtils.TruncateAt.END); bodyLayout = new StaticLayout( resSequence, bodyTextPaint, layoutMainWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); bodyString = null; // if (EmojiProcessor.containsEmoji(message)) { // Spannable sequence = // application.getEmojiProcessor().processEmojiCutMutable(preSequence, // EmojiProcessor.CONFIGURATION_DIALOGS); // if (nameLength != 0) { // sequence.setSpan(new ForegroundColorSpan(HIGHLIGHT_COLOR), 0, // Math.min(nameLength, sequence.length()), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); // } // // CharSequence resSequence = TextUtils.ellipsize(sequence, // bodyTextPaint, layoutMainWidth, TextUtils.TruncateAt.END); // bodyLayout = new StaticLayout(resSequence, bodyTextPaint, // layoutMainWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); // bodyString = null; // } else { // bodyString = preSequence; // bodyLayout = null; // } } // Title { String title = description.getDialogTitle(); if (title.length() > 150) { title = title.substring(150) + "..."; } title = title.replace("\n", " "); TextPaint paint = isEncrypted ? titleEncryptedPaint : (isHighlighted ? titleHighlightPaint : titlePaint); // Spannable preSequence = // application.getEmojiProcessor().processEmojiCutMutable(title, // EmojiProcessor.CONFIGURATION_DIALOGS); // CharSequence sequence = TextUtils.ellipsize(preSequence, paint, // layoutTitleWidth, TextUtils.TruncateAt.END); // titleLayout = new StaticLayout(sequence, paint, layoutTitleWidth, // Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); // titleString = null; if (EmojiProcessor.containsEmoji(title)) { Spannable preSequence = application .getEmojiProcessor() .processEmojiCutMutable(title, EmojiProcessor.CONFIGURATION_DIALOGS); CharSequence sequence = TextUtils.ellipsize(preSequence, paint, layoutTitleWidth, TextUtils.TruncateAt.END); titleLayout = new StaticLayout( sequence, paint, layoutTitleWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); titleString = null; } else { titleString = TextUtils.ellipsize(title, paint, layoutTitleWidth, TextUtils.TruncateAt.END) .toString(); titleLayout = null; } } // Placeholder placeHolderName = description.getDialogName(); placeHolderColor = Placeholders.getBgColor(description.getPeerId()); if (placeHolderName.length() > 0) { usePlaceholder = true; placeholderLeft = layoutAvatarLeft + layoutAvatarWidth / 2; Rect rect = new Rect(); placeholderTextPaint.getTextBounds(placeHolderName, 0, placeHolderName.length(), rect); placeholderTop = layoutAvatarTop + (layoutAvatarWidth / 2 + ((rect.bottom - rect.top) / 2)); } else { usePlaceholder = false; } }