private static void checkResources(Context context) { if (isLoaded) { return; } StelsApplication application = (StelsApplication) context.getApplicationContext(); int fontSize; int fontSizeClock; switch (application.getUserSettings().getBubbleFontSizeId()) { default: case UserSettings.BUBBLE_FONT_NORMAL: fontSize = UserSettings.BUBBLE_FONT_NORMAL_VALUE; fontSizeClock = UserSettings.BUBBLE_FONT_NORMAL_VALUE_CLOCK; break; case UserSettings.BUBBLE_FONT_HUGE: fontSize = UserSettings.BUBBLE_FONT_HUGE_VALUE; fontSizeClock = UserSettings.BUBBLE_FONT_HUGE_VALUE_CLOCK; break; case UserSettings.BUBBLE_FONT_SMALL: fontSize = UserSettings.BUBBLE_FONT_SMALL_VALUE; fontSizeClock = UserSettings.BUBBLE_FONT_SMALL_VALUE_CLOCK; break; case UserSettings.BUBBLE_FONT_TINY: fontSize = UserSettings.BUBBLE_FONT_TINY_VALUE; fontSizeClock = UserSettings.BUBBLE_FONT_TINY_VALUE_CLOCK; break; case UserSettings.BUBBLE_FONT_LARGE: fontSize = UserSettings.BUBBLE_FONT_LARGE_VALUE; fontSizeClock = UserSettings.BUBBLE_FONT_LARGE_VALUE_CLOCK; break; } bodyPaint = initTextPaint(); bodyPaint.setTypeface(FontController.loadTypeface(context, "regular")); bodyPaint.setTextSize(sp(fontSize)); bodyPaint.setColor(0xff000000); clockOutPaint = initTextPaint(); clockOutPaint.setTypeface(FontController.loadTypeface(context, "regular")); clockOutPaint.setTextSize(sp(fontSizeClock)); clockOutPaint.setColor(0xff70B15C); senderPaintBase = initTextPaint(); senderPaintBase.setTypeface(FontController.loadTypeface(context, "regular")); senderPaintBase.setTextSize(sp(fontSize)); senderPaintBase.setColor(0xff000000); forwardingPaintBase = initTextPaint(); forwardingPaintBase.setTypeface(FontController.loadTypeface(context, "regular")); forwardingPaintBase.setTextSize(sp(fontSize)); forwardingPaintBase.setColor(0xff000000); Drawable inBubble = context.getResources().getDrawable(R.drawable.st_bubble_in); inBubblePadding = new Rect(); inBubble.getPadding(inBubblePadding); Drawable outBubble = context.getResources().getDrawable(R.drawable.st_bubble_out); outBubblePadding = new Rect(); outBubble.getPadding(outBubblePadding); isLoaded = true; }
public void build(MessageWireframe wireframe, int desiredWidth, StelsApplication application) { Logger.d(TAG, "Build layout start"); checkResources(application); senderPaint = initTextPaint(); senderPaint.setTypeface(FontController.loadTypeface(application, "regular")); senderPaint.setTextSize(bodyPaint.getTextSize()); senderPaint.setColor(0xff000000); forwardingPaint = initTextPaint(); forwardingPaint.setTypeface(FontController.loadTypeface(application, "light")); forwardingPaint.setTextSize(bodyPaint.getTextSize()); forwardingPaint.setColor(0xff000000); this.layoutDesiredWidth = desiredWidth; this.isOut = wireframe.message.isOut(); this.showState = isOut; this.isGroup = wireframe.message.getPeerType() == PeerType.PEER_CHAT && !isOut; if (isGroup) { User user = wireframe.senderUser; this.senderName = user.getDisplayName(); if (!wireframe.message.isForwarded()) { senderPaint.setColor( Placeholders.USER_PLACEHOLDERS_COLOR[ wireframe.message.getSenderId() % Placeholders.USER_PLACEHOLDERS_COLOR.length]); forwardingPaint.setColor( Placeholders.USER_PLACEHOLDERS_COLOR[ wireframe.message.getSenderId() % Placeholders.USER_PLACEHOLDERS_COLOR.length]); } } if (wireframe.message.isForwarded()) { isForwarded = true; this.forwarderName = wireframe.forwardUser.getDisplayName(); if (isOut) { forwardingPaint.setColor(0xff739f53); senderPaint.setColor(0xff739f53); } else { forwardingPaint.setColor(0xff4884cf); senderPaint.setColor(0xff4884cf); } } else { isForwarded = false; } if (isGroup) { User user = application.getEngine().getUser(wireframe.message.getSenderId()); this.senderName = user.getDisplayName(); } if (wireframe.message.isForwarded()) { isForwarded = true; this.forwarderName = wireframe.forwardUser.getDisplayName(); } else { isForwarded = false; } layoutDesiredWidth = desiredWidth; long start = SystemClock.uptimeMillis(); this.spannable = application .getEmojiProcessor() .processEmojiCompatMutable( wireframe.message.getMessage(), EmojiProcessor.CONFIGURATION_BUBBLES); // spannable = new SpannableString(wireframe.message.getMessage()); Logger.d(TAG, "Emoji processed in " + (SystemClock.uptimeMillis() - start) + " ms"); start = SystemClock.uptimeMillis(); Linkify.addLinks( this.spannable, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS | Linkify.EMAIL_ADDRESSES); fixLinks(spannable); Logger.d(TAG, "Added links in " + (SystemClock.uptimeMillis() - start) + " ms"); start = SystemClock.uptimeMillis(); layout = new StaticLayout( spannable, bodyPaint, desiredWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true); Logger.d(TAG, "Built base layout in " + (SystemClock.uptimeMillis() - start) + " ms"); if (layout.getLineCount() < 20) { int layoutTextWidth = 0; for (int i = 0; i < layout.getLineCount(); i++) { layoutTextWidth = (int) Math.max(layout.getLineWidth(i), layoutTextWidth); } if (layoutTextWidth < layout.getWidth() - px(10)) { layout = new StaticLayout( spannable, bodyPaint, layoutTextWidth + px(2), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true); } } layoutRealWidth = layout.getWidth(); timeWidth = (int) clockOutPaint.measureText(wireframe.date) + px((showState ? 23 : 0) + 6); if (layout.getLineCount() == 1) { boolean isLastRtl = layout.getParagraphDirection(0) == Layout.DIR_RIGHT_TO_LEFT; if (!isLastRtl && desiredWidth - layoutRealWidth > timeWidth) { layoutRealWidth += timeWidth; layoutHeight = layout.getHeight() + px(3); } else if (isLastRtl && desiredWidth - layout.getWidth() > timeWidth) { layoutRealWidth = layout.getWidth() + timeWidth; layoutHeight = layout.getHeight() + px(3); } else { if (isLastRtl) { layoutRealWidth = layout.getWidth(); } layoutHeight = layout.getHeight() + px(17); } } else { boolean isLastRtl = layout.getParagraphDirection(layout.getLineCount() - 1) == Layout.DIR_RIGHT_TO_LEFT; if (!isLastRtl && (desiredWidth - layout.getLineWidth(layout.getLineCount() - 1) > timeWidth)) { layoutRealWidth = (int) Math.max( layoutRealWidth, layout.getLineWidth(layout.getLineCount() - 1) + timeWidth); layoutHeight = layout.getHeight() + px(3); } else if (isLastRtl && (desiredWidth - layout.getWidth() > timeWidth)) { layoutRealWidth = (int) Math.max(layoutRealWidth, layout.getWidth() + timeWidth); layoutHeight = layout.getHeight() + px(3); } else { layoutHeight = layout.getHeight() + px(17); } } if (layoutRealWidth < timeWidth) { layoutRealWidth = timeWidth; } if (isForwarded) { layoutHeight += px(19) * 2; forwardOffset = (int) forwardingPaintBase.measureText("From "); layoutRealWidth = (int) Math.max(layoutRealWidth, forwardingPaintBase.measureText("Forwarded message")); forwarderNameMeasured = TextUtils.ellipsize( forwarderName, senderPaintBase, desiredWidth - forwardOffset, TextUtils.TruncateAt.END) .toString(); layoutRealWidth = (int) Math.max( layoutRealWidth, forwardOffset + senderPaintBase.measureText(forwarderNameMeasured)); } if (isGroup && !isOut && !isForwarded) { layoutHeight += px(19); senderNameMeasured = TextUtils.ellipsize(senderName, senderPaintBase, desiredWidth, TextUtils.TruncateAt.END) .toString(); int width = (int) senderPaintBase.measureText(senderNameMeasured); layoutRealWidth = Math.max(layoutRealWidth, width); } Logger.d(TAG, "Build layout end"); }