From 89e55a7133e834eb8e038fb1a34bec7209c8c2be Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 23 Nov 2021 11:27:09 -0500 Subject: [PATCH] Fix truncated text on View Badges bottom sheet. --- .../securesms/badges/models/LargeBadge.kt | 7 ++++-- .../ViewBadgeBottomSheetDialogFragment.kt | 22 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/models/LargeBadge.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/models/LargeBadge.kt index a7cb1eab4b..47a62b2d2e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/models/LargeBadge.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/models/LargeBadge.kt @@ -12,13 +12,13 @@ data class LargeBadge( val badge: Badge ) { - class Model(val largeBadge: LargeBadge, val shortName: String) : MappingModel { + class Model(val largeBadge: LargeBadge, val shortName: String, val maxLines: Int) : MappingModel { override fun areItemsTheSame(newItem: Model): Boolean { return newItem.largeBadge.badge.id == largeBadge.badge.id } override fun areContentsTheSame(newItem: Model): Boolean { - return newItem.largeBadge == largeBadge && newItem.shortName == shortName + return newItem.largeBadge == largeBadge && newItem.shortName == shortName && newItem.maxLines == maxLines } } @@ -43,6 +43,9 @@ data class LargeBadge( name.text = model.largeBadge.badge.name description.text = model.largeBadge.badge.resolveDescription(model.shortName) + description.setLines(model.maxLines) + description.maxLines = model.maxLines + description.minLines = model.maxLines } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt index 386631c7df..f97680d775 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt @@ -1,5 +1,7 @@ package org.thoughtcrime.securesms.badges.view +import android.graphics.Paint +import android.graphics.Rect import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -24,7 +26,10 @@ import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.MappingAdapter import org.thoughtcrime.securesms.util.PlayServicesUtil +import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible +import kotlin.math.ceil +import kotlin.math.max class ViewBadgeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { @@ -32,6 +37,13 @@ class ViewBadgeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFr override val peekHeightPercentage: Float = 1f + private val textWidth: Float + get() = (resources.displayMetrics.widthPixels - ViewUtil.dpToPx(64)).toFloat() + private val textBounds: Rect = Rect() + private val textPaint: Paint = Paint().apply { + textSize = ViewUtil.spToPx(16f).toFloat() + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.view_badge_bottom_sheet_dialog_fragment, container, false) } @@ -95,9 +107,17 @@ class ViewBadgeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFr tabs.visible = state.allBadgesVisibleOnProfile.size > 1 + var maxLines = 3 + state.allBadgesVisibleOnProfile.forEach { badge -> + val text = badge.resolveDescription(state.recipient.getShortDisplayName(requireContext())) + textPaint.getTextBounds(text, 0, text.length, textBounds) + val estimatedLines = ceil(textBounds.width().toFloat() / textWidth).toInt() + maxLines = max(maxLines, estimatedLines) + } + adapter.submitList( state.allBadgesVisibleOnProfile.map { - LargeBadge.Model(LargeBadge(it), state.recipient.getShortDisplayName(requireContext())) + LargeBadge.Model(LargeBadge(it), state.recipient.getShortDisplayName(requireContext()), maxLines + 1) } ) { val stateSelectedIndex = state.allBadgesVisibleOnProfile.indexOf(state.selectedBadge)