18
18
package com.infomaniak.mail.ui.main.thread
19
19
20
20
import android.content.Context
21
- import android.content.res.Resources
22
21
import android.graphics.Paint
23
22
import android.text.StaticLayout
24
23
import android.text.TextPaint
@@ -29,20 +28,21 @@ import com.infomaniak.mail.MatomoMail.trackExternalEvent
29
28
import com.infomaniak.mail.R
30
29
import com.infomaniak.mail.data.models.thread.Thread
31
30
import com.infomaniak.mail.utils.ExternalUtils.findExternalRecipients
31
+ import com.infomaniak.mail.utils.Utils
32
32
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
33
33
import com.infomaniak.mail.utils.extensions.formatSubject
34
34
import com.infomaniak.mail.utils.extensions.postfixWithTag
35
35
import javax.inject.Inject
36
36
import javax.inject.Singleton
37
37
38
38
@Singleton
39
- class SubjectFormatter @Inject constructor(private val context : Context ) {
39
+ class SubjectFormatter @Inject constructor(private val appContext : Context ) {
40
40
41
41
fun generateSubjectContent (
42
42
subjectData : SubjectData ,
43
43
onExternalClicked : (String ) -> Unit ,
44
44
): Pair <String , CharSequence > = with (subjectData) {
45
- val subject = context .formatSubject(thread.subject)
45
+ val subject = appContext .formatSubject(thread.subject)
46
46
47
47
val spannedSubjectWithExternal = handleExternals(subject, onExternalClicked)
48
48
val spannedSubjectWithFolder = handleFolders(spannedSubjectWithExternal)
@@ -67,14 +67,14 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
67
67
externalRecipientQuantity : Int ,
68
68
externalRecipientEmail : String? ,
69
69
onExternalClicked : (String ) -> Unit ,
70
- ) = context .postfixWithTag(
70
+ ) = appContext .postfixWithTag(
71
71
previousContent,
72
72
R .string.externalTag,
73
73
TagColor (R .color.externalTagBackground, R .color.externalTagOnBackground),
74
74
) {
75
- context .trackExternalEvent(" threadTag" )
75
+ appContext .trackExternalEvent(" threadTag" )
76
76
77
- val description = context .resources.getQuantityString(
77
+ val description = appContext .resources.getQuantityString(
78
78
R .plurals.externalDialogDescriptionExpeditor,
79
79
externalRecipientQuantity,
80
80
externalRecipientEmail,
@@ -94,7 +94,7 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
94
94
previousContent : CharSequence ,
95
95
folderName : String ,
96
96
ellipsizeConfiguration : EllipsizeConfiguration ? ,
97
- ) = context .postfixWithTag(
97
+ ) = appContext .postfixWithTag(
98
98
previousContent,
99
99
folderName,
100
100
TagColor (R .color.folderTagBackground, R .color.folderTagTextColor),
@@ -104,14 +104,29 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
104
104
private fun getFolderName (thread : Thread ) = if (thread.messages.size > 1 ) " " else thread.folderName
105
105
106
106
private fun getEllipsizeConfiguration (tag : String ): EllipsizeConfiguration ? {
107
- val paddingsInPixels = (context .resources.getDimension(R .dimen.threadHorizontalMargin) * 2 ).toInt()
108
- val widthInPixels = Resources .getSystem() .displayMetrics.widthPixels - paddingsInPixels
107
+ val paddingsInPixels = (appContext .resources.getDimension(R .dimen.threadHorizontalMargin) * 2 ).toInt()
108
+ val containerWidth = appContext.resources .displayMetrics.widthPixels - paddingsInPixels
109
109
110
- val tagTextPaint = getTagsPaint(context)
111
- val layoutWithTag = StaticLayout .Builder .obtain(tag, 0 , tag.length, tagTextPaint, widthInPixels).build()
112
-
113
- return layoutWithTag.takeIf { it.lineCount > 1 }?.let {
114
- EllipsizeConfiguration (widthInPixels, TruncateAt .MIDDLE , withNewLine = true )
110
+ // spannedTagForMeasurement only contains the tag's text itself and its formatting, nothing more nothing less
111
+ val spannedTagForMeasurement = with (postFixWithFolder(" " , tag, null )) {
112
+ subSequence(Utils .TAG_SEPARATOR .length, length)
113
+ }
114
+ val layout = StaticLayout .Builder .obtain(
115
+ spannedTagForMeasurement,
116
+ 0 ,
117
+ spannedTagForMeasurement.length,
118
+ TextPaint (Paint .ANTI_ALIAS_FLAG ),
119
+ containerWidth,
120
+ ).build()
121
+ val tagWidth = layout.getLineWidth(0 )
122
+
123
+ return if (tagWidth >= containerWidth) {
124
+ val roundedBackgroundSpanHorizontalSpace = RoundedBackgroundSpan .getTotalHorizontalSpace()
125
+ val tagAvailableWidth = (containerWidth - roundedBackgroundSpanHorizontalSpace).toFloat()
126
+
127
+ EllipsizeConfiguration (tagAvailableWidth, TruncateAt .MIDDLE )
128
+ } else {
129
+ null
115
130
}
116
131
}
117
132
@@ -123,9 +138,8 @@ class SubjectFormatter @Inject constructor(private val context: Context) {
123
138
)
124
139
125
140
data class EllipsizeConfiguration (
126
- val maxWidth : Int ,
141
+ val maxWidth : Float ,
127
142
val truncateAt : TruncateAt = TruncateAt .MIDDLE ,
128
- val withNewLine : Boolean = false ,
129
143
)
130
144
131
145
data class TagColor (@ColorRes val backgroundColorRes : Int , @ColorRes val textColorRes : Int )
0 commit comments