Skip to content

Commit 9105cdc

Browse files
authored
SES-4614 : Read More Indicator Appears Erroneously (#1548)
* Modify ellipsis for short texts for 25th line * Default limit to 5
1 parent bf9dd96 commit 9105cdc

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

app/src/main/java/org/session/libsession/utilities/ViewUtils.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import android.view.ViewGroup
1515
import android.widget.TextView
1616
import androidx.annotation.AttrRes
1717
import androidx.annotation.ColorInt
18+
import kotlin.math.ceil
1819

1920
@ColorInt
2021
fun Context.getColorFromAttr(
@@ -59,7 +60,7 @@ fun TextView.needsCollapsing(
5960
.setHyphenationFrequency(hyphenationFrequency)
6061
.setAlignment(alignment)
6162
.setTextDirection(direction)
62-
.setMaxLines(maxLines) // cap at maxLines
63+
.setMaxLines(maxLines) // cap at maxLines
6364
.setEllipsize(ellipsize) // compute ellipsis
6465

6566
builder.setJustificationMode(justificationMode)
@@ -74,4 +75,28 @@ fun TextView.needsCollapsing(
7475
// Exactly maxLines: truncated if last line is ellipsized or characters were cut
7576
val last = (maxLines - 1).coerceAtMost(layout.lineCount - 1)
7677
return layout.getEllipsisCount(last) > 0 || layout.getLineEnd(last) < textForLayout.length
78+
}
79+
80+
fun TextView.applyCollapsedEllipsisMinWidth(
81+
widthCapPx: Int,
82+
maxCharsBeforeEllipsis: Int = 5, // will truncate after this many characters for short texts
83+
sampleGlyph: Char = '0'
84+
) {
85+
if (widthCapPx <= 0) return
86+
87+
val ellipsis = '\u2026'
88+
89+
val paint = paint
90+
val sample = sampleGlyph.toString().repeat(maxCharsBeforeEllipsis)
91+
val minContent =
92+
ceil(paint.measureText(sample) + paint.measureText(ellipsis.toString())).toInt()
93+
val neededTotal = minContent + paddingLeft + paddingRight
94+
val applied = neededTotal.coerceAtMost(widthCapPx)
95+
if (applied > 0 && minWidth != applied) {
96+
minWidth = applied
97+
}
98+
}
99+
100+
fun TextView.clearCollapsedMinWidth() {
101+
if (minWidth != 0) minWidth = 0
77102
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
3131
import org.session.libsession.messaging.sending_receiving.attachments.AttachmentState
3232
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
3333
import org.session.libsession.utilities.ThemeUtil
34+
import org.session.libsession.utilities.applyCollapsedEllipsisMinWidth
35+
import org.session.libsession.utilities.clearCollapsedMinWidth
3436
import org.session.libsession.utilities.getColorFromAttr
3537
import org.session.libsession.utilities.modifyLayoutParams
3638
import org.session.libsession.utilities.needsCollapsing
@@ -361,6 +363,7 @@ class VisibleMessageContentView : ConstraintLayout {
361363
availableWidthPx = binding.bodyTextView.maxWidth,
362364
maxLines = MAX_COLLAPSED_LINE_COUNT)
363365
){
366+
binding.bodyTextView.applyCollapsedEllipsisMinWidth( binding.bodyTextView.maxWidth)
364367
// show the "Read mode" button
365368
binding.readMore.setTextColor(color)
366369
binding.readMore.isVisible = true
@@ -371,12 +374,14 @@ class VisibleMessageContentView : ConstraintLayout {
371374
binding.readMore.getGlobalVisibleRect(r)
372375
if (r.contains(event.rawX.roundToInt(), event.rawY.roundToInt())) {
373376
binding.bodyTextView.maxLines = Int.MAX_VALUE
377+
binding.bodyTextView.clearCollapsedMinWidth()
374378
binding.readMore.isVisible = false
375379
onTextExpanded?.invoke(message.messageId) // Notify that text was expanded
376380
}
377381
}
378382
onContentClick.add(readMoreClickHandler)
379383
} else {
384+
binding.bodyTextView.clearCollapsedMinWidth()
380385
binding.readMore.isVisible = false
381386
}
382387
}

0 commit comments

Comments
 (0)