Skip to content

Commit ef64989

Browse files
committed
Simplify code to ellipsize or not tags in subject
1 parent 424301f commit ef64989

File tree

3 files changed

+26
-45
lines changed

3 files changed

+26
-45
lines changed

app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ class ThreadListAdapter @Inject constructor(
260260
ellipsizeConfiguration = SubjectFormatter.EllipsizeConfiguration(
261261
maxWidth = context.resources.getDimension(R.dimen.folderNameTagMaxSize).toInt(),
262262
truncateAt = TruncateAt.END,
263-
tagTextPaint = SubjectFormatter.getTagsPaint(context),
264263
),
265264
)
266265
}

app/src/main/java/com/infomaniak/mail/ui/main/thread/SubjectFormatter.kt

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import android.content.res.Resources
2222
import android.graphics.Paint
2323
import android.text.StaticLayout
2424
import android.text.TextPaint
25-
import android.text.TextUtils.*
25+
import android.text.TextUtils.TruncateAt
2626
import androidx.annotation.ColorRes
2727
import androidx.core.content.res.ResourcesCompat
2828
import com.infomaniak.mail.MatomoMail.trackExternalEvent
@@ -34,7 +34,6 @@ import com.infomaniak.mail.utils.extensions.formatSubject
3434
import com.infomaniak.mail.utils.extensions.postfixWithTag
3535
import javax.inject.Inject
3636
import javax.inject.Singleton
37-
import com.infomaniak.lib.core.R as RCore
3837

3938
@Singleton
4039
class SubjectFormatter @Inject constructor(private val context: Context) {
@@ -87,14 +86,14 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
8786
val folderName = getFolderName(thread)
8887
if (folderName.isEmpty()) return previousContent
8988

90-
val ellipsizeTag = getEllipsizeConfiguration(previousContent, folderName)
89+
val ellipsizeTag = getEllipsizeConfiguration(folderName)
9190
return postFixWithFolder(previousContent, folderName, ellipsizeTag)
9291
}
9392

9493
private fun postFixWithFolder(
9594
previousContent: CharSequence,
9695
folderName: String,
97-
ellipsizeConfiguration: EllipsizeConfiguration,
96+
ellipsizeConfiguration: EllipsizeConfiguration?,
9897
) = context.postfixWithTag(
9998
previousContent,
10099
folderName,
@@ -104,33 +103,16 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
104103

105104
private fun getFolderName(thread: Thread) = if (thread.messages.size > 1) "" else thread.folderName
106105

107-
private fun getEllipsizeConfiguration(previousContent: CharSequence, tag: String): EllipsizeConfiguration {
106+
private fun getEllipsizeConfiguration(tag: String): EllipsizeConfiguration? {
108107
val paddingsInPixels = (context.resources.getDimension(R.dimen.threadHorizontalMargin) * 2).toInt()
109108
val width = Resources.getSystem().displayMetrics.widthPixels - paddingsInPixels
110-
val tagsTextPaint = getTagsPaint(context)
111-
112-
val layoutBeforeAddingTag = StaticLayout.Builder.obtain(
113-
previousContent,
114-
0,
115-
previousContent.length,
116-
tagsTextPaint,
117-
width,
118-
).build()
119-
120-
// Colors are not taken into account here. We only call postfixWithTag to compute the layout size
121-
val stringAfterAddingTag = context.postfixWithTag(
122-
previousContent,
123-
tag,
124-
TagColor(RCore.color.black, RCore.color.black),
125-
)
126109

127-
val layoutAfterAddingTag =
128-
StaticLayout.Builder.obtain(stringAfterAddingTag, 0, stringAfterAddingTag.length, tagsTextPaint, width).build()
110+
val tagTextPaint = getTagsPaint(context)
111+
val layoutWithTag = StaticLayout.Builder.obtain(tag, 0, tag.length, tagTextPaint, width).build()
129112

130-
val positionLastChar = layoutBeforeAddingTag.getPrimaryHorizontal(previousContent.length).toInt()
131-
val isLinesCountDifferent = layoutAfterAddingTag.lineCount != layoutBeforeAddingTag.lineCount
132-
val maxWidth = if (isLinesCountDifferent) width else width - positionLastChar
133-
return EllipsizeConfiguration(maxWidth, TruncateAt.MIDDLE, isLinesCountDifferent, tagsTextPaint)
113+
return layoutWithTag.takeIf { it.lineCount > 1 }?.let {
114+
EllipsizeConfiguration(width, TruncateAt.MIDDLE, withNewLine = true)
115+
}
134116
}
135117

136118
data class SubjectData(
@@ -144,7 +126,6 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
144126
val maxWidth: Int,
145127
val truncateAt: TruncateAt = TruncateAt.MIDDLE,
146128
val withNewLine: Boolean = false,
147-
val tagTextPaint: TextPaint,
148129
)
149130

150131
data class TagColor(@ColorRes val backgroundColorRes: Int, @ColorRes val textColorRes: Int)

app/src/main/java/com/infomaniak/mail/utils/extensions/Extensions.kt

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import android.content.res.Configuration
2828
import android.content.res.TypedArray
2929
import android.net.Uri
3030
import android.os.Build
31-
import android.text.*
31+
import android.text.Html
32+
import android.text.Spannable
33+
import android.text.Spanned
34+
import android.text.TextUtils
3235
import android.text.style.ClickableSpan
3336
import android.util.Patterns
3437
import android.view.View
@@ -82,8 +85,9 @@ import com.infomaniak.mail.ui.main.folder.HeaderItemDecoration
8285
import com.infomaniak.mail.ui.main.folder.ThreadListAdapter
8386
import com.infomaniak.mail.ui.main.thread.MessageWebViewClient
8487
import com.infomaniak.mail.ui.main.thread.RoundedBackgroundSpan
85-
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.*
8688
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.Companion.getTagsPaint
89+
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.EllipsizeConfiguration
90+
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.TagColor
8791
import com.infomaniak.mail.ui.main.thread.ThreadFragment.HeaderState
8892
import com.infomaniak.mail.utils.*
8993
import com.infomaniak.mail.utils.Utils
@@ -515,20 +519,17 @@ fun Context.postfixWithTag(
515519
onClicked: (() -> Unit)? = null,
516520
): Spannable {
517521

518-
fun getEllipsizedTag(): String {
519-
return if (ellipsizeConfiguration != null) {
520-
val textPaint = getTagsPaint(this)
521-
with(ellipsizeConfiguration) {
522-
val tagNameLayout = StaticLayout.Builder.obtain(tag, 0, tag.length, textPaint, maxWidth)
523-
.setEllipsizedWidth(maxWidth)
524-
.setEllipsize(truncateAt)
525-
.setMaxLines(1)
526-
.build()
527-
if (withNewLine) "$TAG_SEPARATOR\n${tagNameLayout.text}" else "$TAG_SEPARATOR${tagNameLayout.text}"
528-
}
529-
} else {
530-
"$TAG_SEPARATOR$tag"
531-
}
522+
fun getEllipsizedTag(): CharSequence {
523+
val baseTag = "$TAG_SEPARATOR$tag"
524+
return ellipsizeConfiguration?.let {
525+
val modifiedTag = if (ellipsizeConfiguration.withNewLine) "\n$baseTag" else baseTag
526+
TextUtils.ellipsize(
527+
modifiedTag,
528+
getTagsPaint(this),
529+
ellipsizeConfiguration.maxWidth.toFloat(),
530+
ellipsizeConfiguration.truncateAt
531+
)
532+
} ?: baseTag
532533
}
533534

534535
val ellipsizedTag = getEllipsizedTag()

0 commit comments

Comments
 (0)