From 5936efea53b0c0c328e1928e3f5abb5305e8784d Mon Sep 17 00:00:00 2001 From: Warrick Corfe-Tan Date: Thu, 26 Aug 2021 10:38:05 +1000 Subject: [PATCH] Fixing quote cutoff when font is too large. --- .../securesms/conversation/v2/messages/QuoteView.kt | 7 +++++-- .../securesms/conversation/v2/utilities/TextUtilities.kt | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt index 0f6fe2773d..65af5edcee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -78,11 +78,14 @@ class QuoteView : LinearLayout { } val body = quoteViewBodyTextView.text val bodyTextViewIntrinsicHeight = TextUtilities.getIntrinsicHeight(body, quoteViewBodyTextView.paint, maxContentWidth) + val staticLayout = TextUtilities.getIntrinsicLayout(body, quoteViewBodyTextView.paint, maxContentWidth) result += bodyTextViewIntrinsicHeight if (!quoteViewAuthorTextView.isVisible) { // We want to at least be as high as the cancel button, and no higher than 56 DP (that's // approximately the height of 3 lines. - return min(max(result, toPx(32, resources)), toPx(56, resources)) + + // Calculating height based on proportion of the static layout. + return min((result / staticLayout.lineCount) * 3, result) } else { // Because we're showing the author text view, we should have a height of at least 32 DP // anyway, so there's no need to constrain to that. We constrain to a max height of 56 DP @@ -97,7 +100,7 @@ class QuoteView : LinearLayout { // and then center everything inside vertically. This effectively means we're applying padding. // Applying padding the regular way results in a clipping issue though due to a bug in // RelativeLayout. - return getIntrinsicContentHeight(maxContentWidth) + 2 * vPadding + return getIntrinsicContentHeight(maxContentWidth) + (2 * vPadding ) } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/TextUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/TextUtilities.kt index b7ced4abb3..800ace54c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/TextUtilities.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/TextUtilities.kt @@ -20,6 +20,14 @@ object TextUtilities { return layout.height } + fun getIntrinsicLayout(text: CharSequence, paint: TextPaint, width: Int): StaticLayout { + val builder = StaticLayout.Builder.obtain(text, 0, text.length, paint, width) + .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLineSpacing(0.0f, 1.0f) + .setIncludePad(false) + return builder.build() + } + fun TextView.getIntersectedModalSpans(event: MotionEvent): List { val xInt = event.rawX.toInt() val yInt = event.rawY.toInt()