Skip to content

Commit 6193d76

Browse files
Clean code before SuperCollapsedBlock feature
1 parent 9fe85e3 commit 6193d76

File tree

14 files changed

+126
-105
lines changed

14 files changed

+126
-105
lines changed

app/src/main/assets/icon_print_email.svg

+28-14
Loading

app/src/main/java/com/infomaniak/mail/data/api/ApiRoutes.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ object ApiRoutes {
6969
//endregion
7070

7171
//region Calendar
72-
fun calendarEvent(resource: String): String {
73-
return "${resource(resource)}?format=render"
74-
}
75-
7672
fun infomaniakCalendarEventReply(calendarEventId: Int): String {
7773
return "${pim()}/event/$calendarEventId/reply"
7874
}
7975

76+
fun calendarEvent(resource: String): String {
77+
return "${resource(resource)}?format=render"
78+
}
79+
8080
fun icsCalendarEventReply(resource: String): String {
8181
return "${resource(resource)}/reply"
8282
}

app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt

-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ import io.realm.kotlin.notifications.ResultsChange
3333
import io.realm.kotlin.query.RealmQuery
3434
import io.realm.kotlin.query.RealmSingleQuery
3535
import io.realm.kotlin.query.Sort
36-
import io.sentry.Sentry
37-
import io.sentry.SentryLevel
3836
import kotlinx.coroutines.flow.Flow
3937
import javax.inject.Inject
4038

app/src/main/java/com/infomaniak/mail/data/models/message/Message.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ class Message : RealmObject {
210210
draftLocalUuid?.let { this.draftLocalUuid = it }
211211
this.isFromSearch = isFromSearch
212212
this.messageIds = messageIds ?: computeMessageIds()
213-
shortUid = uid.toShortUid()
214213
this.latestCalendarEventResponse = latestCalendarEventResponse
214+
shortUid = uid.toShortUid()
215215
}
216216

217217
fun keepHeavyData(message: Message) {

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

+31-27
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,31 @@ class ThreadListAdapter @Inject constructor(
118118
this.recyclerView = recyclerView
119119
}
120120

121+
override fun getItemViewType(position: Int): Int = runCatchingRealm {
122+
val item = dataSet[position]
123+
return when {
124+
item is String -> DisplayType.DATE_SEPARATOR.layout
125+
item is FolderRole -> DisplayType.FLUSH_FOLDER_BUTTON.layout
126+
item is Unit -> DisplayType.LOAD_MORE_BUTTON.layout
127+
displaySeeAllButton -> DisplayType.SEE_ALL_BUTTON.layout
128+
else -> DisplayType.THREAD.layout
129+
}
130+
}.getOrDefault(super.getItemViewType(position))
131+
132+
override fun getItemId(position: Int): Long = runCatchingRealm {
133+
return when (val item = dataSet[position]) {
134+
is Thread -> item.uid.hashCode().toLong()
135+
is String -> item.hashCode().toLong()
136+
else -> super.getItemId(position)
137+
}
138+
}.getOrDefault(super.getItemId(position))
139+
140+
fun getItemPosition(threadUid: String): Int? {
141+
return dataSet
142+
.indexOfFirst { it is Thread && it.uid == threadUid }
143+
.takeIf { position -> position != -1 }
144+
}
145+
121146
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThreadListViewHolder {
122147
val layoutInflater = LayoutInflater.from(parent.context)
123148
val binding = when (viewType) {
@@ -132,13 +157,17 @@ class ThreadListAdapter @Inject constructor(
132157
}
133158

134159
override fun onBindViewHolder(holder: ThreadListViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
160+
135161
val payload = payloads.firstOrNull()
162+
if (payload !is NotificationType) {
163+
super.onBindViewHolder(holder, position, payloads)
164+
return@runCatchingRealm
165+
}
166+
136167
if (payload == NotificationType.SELECTED_STATE && holder.itemViewType == DisplayType.THREAD.layout) {
137168
val binding = holder.binding as CardviewThreadItemBinding
138169
val thread = dataSet[position] as Thread
139170
binding.updateSelectedUi(thread)
140-
} else {
141-
super.onBindViewHolder(holder, position, payloads)
142171
}
143172
}.getOrDefault(Unit)
144173

@@ -152,31 +181,6 @@ class ThreadListAdapter @Inject constructor(
152181
}
153182
}
154183

155-
override fun getItemViewType(position: Int): Int = runCatchingRealm {
156-
val item = dataSet[position]
157-
return when {
158-
item is String -> DisplayType.DATE_SEPARATOR.layout
159-
item is FolderRole -> DisplayType.FLUSH_FOLDER_BUTTON.layout
160-
item is Unit -> DisplayType.LOAD_MORE_BUTTON.layout
161-
displaySeeAllButton -> DisplayType.SEE_ALL_BUTTON.layout
162-
else -> DisplayType.THREAD.layout
163-
}
164-
}.getOrDefault(super.getItemViewType(position))
165-
166-
override fun getItemId(position: Int): Long = runCatchingRealm {
167-
return when (val item = dataSet[position]) {
168-
is Thread -> item.uid.hashCode().toLong()
169-
is String -> item.hashCode().toLong()
170-
else -> super.getItemId(position)
171-
}
172-
}.getOrDefault(super.getItemId(position))
173-
174-
fun getItemPosition(threadUid: String): Int? {
175-
return dataSet
176-
.indexOfFirst { it is Thread && it.uid == threadUid }
177-
.takeIf { position -> position != -1 }
178-
}
179-
180184
private fun CardviewThreadItemBinding.displayThread(thread: Thread, position: Int) {
181185

182186
refreshCachedSelectedPosition(thread.uid, position) // If item changed position, update cached position.

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

+2
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ abstract class TwoPaneFragment : Fragment() {
8686
}
8787

8888
private fun setupSlidingPane() = with(slidingPaneLayout) {
89+
8990
lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
91+
9092
addPanelSlideListener(object : SlidingPaneLayout.PanelSlideListener {
9193
override fun onPanelOpened(panel: View) = Unit
9294
override fun onPanelClosed(panel: View) = Unit

app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import androidx.navigation.fragment.navArgs
2929
import com.infomaniak.lib.core.utils.safeBinding
3030
import com.infomaniak.mail.R
3131
import com.infomaniak.mail.data.LocalSettings
32-
import com.infomaniak.mail.data.LocalSettings.*
32+
import com.infomaniak.mail.data.LocalSettings.AccentColor
3333
import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingBinding
3434
import dagger.hilt.android.AndroidEntryPoint
3535
import javax.inject.Inject

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

-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class PrintMailFragment : Fragment() {
4545
private val printMailViewModel: PrintMailViewModel by viewModels()
4646
private val threadAdapter inline get() = binding.messagesList.adapter as ThreadAdapter
4747

48-
4948
@Inject
5049
lateinit var localSettings: LocalSettings
5150

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

+44-42
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import com.infomaniak.mail.data.models.calendar.Attendee.AttendanceState
4646
import com.infomaniak.mail.data.models.correspondent.Recipient
4747
import com.infomaniak.mail.data.models.message.Message
4848
import com.infomaniak.mail.databinding.ItemMessageBinding
49-
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.ThreadViewHolder
49+
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.MessageViewHolder
5050
import com.infomaniak.mail.utils.*
5151
import com.infomaniak.mail.utils.AttachmentIntentUtils.AttachmentIntentType
5252
import com.infomaniak.mail.utils.MailDateFormatUtils.mailFormattedDate
@@ -69,19 +69,21 @@ class ThreadAdapter(
6969
private val isForPrinting: Boolean = false,
7070
private val isCalendarEventExpandedMap: MutableMap<String, Boolean> = mutableMapOf(),
7171
private var threadAdapterCallbacks: ThreadAdapterCallbacks? = null,
72-
) : ListAdapter<Message, ThreadViewHolder>(MessageDiffCallback()) {
72+
) : ListAdapter<Message, MessageViewHolder>(MessageDiffCallback()) {
7373

7474
inline val messages: MutableList<Message> get() = currentList
7575

7676
var isExpandedMap = mutableMapOf<String, Boolean>()
77+
78+
//region Auto-scroll at Thread opening
7779
var initialSetOfExpandedMessagesUids = setOf<String>()
7880
private val currentSetOfLoadedExpandedMessagesUids = mutableSetOf<String>()
7981
private var hasNotScrolledYet = true
82+
//endregion
8083

8184
private val manuallyAllowedMessageUids = mutableSetOf<String>()
8285
var isThemeTheSameMap = mutableMapOf<String, Boolean>()
8386

84-
8587
private lateinit var recyclerView: RecyclerView
8688
private val webViewUtils by lazy { WebViewUtils(recyclerView.context) }
8789

@@ -104,8 +106,8 @@ class ThreadAdapter(
104106

105107
override fun getItemCount(): Int = runCatchingRealm { messages.count() }.getOrDefault(0)
106108

107-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThreadViewHolder {
108-
return ThreadViewHolder(
109+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder {
110+
return MessageViewHolder(
109111
ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false),
110112
shouldLoadDistantResources,
111113
threadAdapterCallbacks?.onContactClicked,
@@ -114,12 +116,12 @@ class ThreadAdapter(
114116
)
115117
}
116118

117-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
119+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
118120
with(holder.binding) {
119121
val payload = payloads.firstOrNull()
120122
if (payload !is NotifyType) {
121123
super.onBindViewHolder(holder, position, payloads)
122-
return
124+
return@runCatchingRealm
123125
}
124126

125127
val message = messages[position]
@@ -143,7 +145,7 @@ class ThreadAdapter(
143145
}
144146
}.getOrDefault(Unit)
145147

146-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int) = with(holder) {
148+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int) = with(holder) {
147149
val message = messages[position]
148150

149151
initMapForNewMessage(message, position)
@@ -157,7 +159,7 @@ class ThreadAdapter(
157159
onExpandOrCollapseMessage(message, shouldTrack = false)
158160
}
159161

160-
private fun ThreadViewHolder.bindCalendarEvent(message: Message) {
162+
private fun MessageViewHolder.bindCalendarEvent(message: Message) {
161163
val calendarAttachment = message.calendarAttachment ?: return
162164
val calendarEvent = message.latestCalendarEventResponse?.calendarEvent
163165

@@ -200,14 +202,14 @@ class ThreadAdapter(
200202
if (isThemeTheSameMap[message.uid] == null) isThemeTheSameMap[message.uid] = true
201203
}
202204

203-
private fun ThreadViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
205+
private fun MessageViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
204206
val isThemeTheSame = isThemeTheSameMap[messageUid]!!
205207
bodyWebView.toggleWebViewTheme(isThemeTheSame)
206208
fullMessageWebView.toggleWebViewTheme(isThemeTheSame)
207209
toggleFrameLayoutsTheme(isThemeTheSame)
208210
}
209211

210-
private fun ThreadViewHolder.loadContentAndQuote(message: Message) {
212+
private fun MessageViewHolder.loadContentAndQuote(message: Message) {
211213
val body = message.body
212214
val splitBody = message.splitBody
213215

@@ -221,16 +223,16 @@ class ThreadAdapter(
221223
}
222224
}
223225

224-
private fun ThreadViewHolder.loadBodyInWebView(uid: String, body: String, type: String) = with(binding) {
226+
private fun MessageViewHolder.loadBodyInWebView(uid: String, body: String, type: String) = with(binding) {
225227
bodyWebView.applyWebViewContent(uid, body, type)
226228
}
227229

228-
private fun ThreadViewHolder.loadQuoteInWebView(uid: String, quote: String?, type: String) = with(binding) {
230+
private fun MessageViewHolder.loadQuoteInWebView(uid: String, quote: String?, type: String) = with(binding) {
229231
if (quote == null) return@with
230232
fullMessageWebView.applyWebViewContent(uid, quote, type)
231233
}
232234

233-
private fun ThreadViewHolder.toggleWebViews(message: Message) = with(binding) {
235+
private fun MessageViewHolder.toggleWebViews(message: Message) = with(binding) {
234236
isQuoteCollapsed = !isQuoteCollapsed
235237
loadContentAndQuote(message)
236238
}
@@ -279,7 +281,7 @@ class ThreadAdapter(
279281
}
280282
}
281283

282-
private fun ThreadViewHolder.bindHeader(message: Message) = with(binding) {
284+
private fun MessageViewHolder.bindHeader(message: Message) = with(binding) {
283285
val messageDate = message.date.toDate()
284286

285287
if (message.isDraft) {
@@ -321,7 +323,7 @@ class ThreadAdapter(
321323
bccGroup.isVisible = message.bcc.isNotEmpty()
322324
}
323325

324-
private fun ThreadViewHolder.handleHeaderClick(message: Message) = with(binding) {
326+
private fun MessageViewHolder.handleHeaderClick(message: Message) = with(binding) {
325327
messageHeader.setOnClickListener {
326328
if (isExpandedMap[message.uid] == true) {
327329
isExpandedMap[message.uid] = false
@@ -347,7 +349,7 @@ class ThreadAdapter(
347349
}
348350
}
349351

350-
private fun ThreadViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
352+
private fun MessageViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
351353

352354
fromAdapter.updateList(message.from.toList())
353355
toAdapter.updateList(message.to.toList())
@@ -363,7 +365,7 @@ class ThreadAdapter(
363365
detailedMessageDate.text = mostDetailedDate(context, messageDate)
364366
}
365367

366-
private fun ThreadViewHolder.bindAlerts(messageUid: String) = with(binding) {
368+
private fun MessageViewHolder.bindAlerts(messageUid: String) = with(binding) {
367369
distantImagesAlert.onAction1 {
368370
bodyWebViewClient.unblockDistantResources()
369371
fullMessageWebViewClient.unblockDistantResources()
@@ -388,7 +390,7 @@ class ThreadAdapter(
388390
private fun ItemMessageBinding.areOneOrMoreAlertsVisible() = alerts.children.any { it.isVisible }
389391

390392
@SuppressLint("SetTextI18n")
391-
private fun ThreadViewHolder.bindAttachment(message: Message) = with(binding) {
393+
private fun MessageViewHolder.bindAttachment(message: Message) = with(binding) {
392394
val attachments = message.attachments
393395
val fileSize = formatAttachmentFileSize(attachments)
394396
attachmentLayout.attachmentsSizeText.text = context.resources.getQuantityString(
@@ -413,12 +415,12 @@ class ThreadAdapter(
413415
return Formatter.formatShortFileSize(context, totalAttachmentsFileSizeInBytes)
414416
}
415417

416-
private fun ThreadViewHolder.bindContent(message: Message) {
418+
private fun MessageViewHolder.bindContent(message: Message) {
417419
binding.messageLoader.isVisible = message.splitBody == null
418420
message.splitBody?.let { splitBody -> bindBody(message, hasQuote = splitBody.quote != null) }
419421
}
420422

421-
private fun ThreadViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
423+
private fun MessageViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
422424
bodyWebView.setupLinkContextualMenu { data, type ->
423425
threadAdapterCallbacks?.promptLink?.invoke(data, type)
424426
}
@@ -495,7 +497,7 @@ class ThreadAdapter(
495497
}
496498
}
497499

498-
private fun ThreadViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
500+
private fun MessageViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
499501
val isExpanded = isExpandedMap[message.uid]!!
500502

501503
if (shouldTrack) context.trackMessageEvent("openMessage", isExpanded)
@@ -579,7 +581,7 @@ class ThreadAdapter(
579581
}
580582

581583
override fun getChangePayload(oldItem: Message, newItem: Message): Any? {
582-
// If everything but attendees is the same, then we know the only thing that could've changed is attendees
584+
// If everything but Attendees is the same, then we know the only thing that could've changed is Attendees.
583585
return if (everythingButAttendeesIsTheSame(oldItem, newItem)) NotifyType.ONLY_REBIND_CALENDAR_ATTENDANCE else null
584586
}
585587

@@ -600,7 +602,25 @@ class ThreadAdapter(
600602
}
601603
}
602604

603-
class ThreadViewHolder(
605+
data class ThreadAdapterCallbacks(
606+
var onBodyWebViewFinishedLoading: (() -> Unit)? = null,
607+
var onContactClicked: ((contact: Recipient) -> Unit)? = null,
608+
var onDeleteDraftClicked: ((message: Message) -> Unit)? = null,
609+
var onDraftClicked: ((message: Message) -> Unit)? = null,
610+
var onAttachmentClicked: ((attachment: Attachment) -> Unit)? = null,
611+
var onAttachmentOptionsClicked: ((attachment: Attachment) -> Unit)? = null,
612+
var onDownloadAllClicked: ((message: Message) -> Unit)? = null,
613+
var onReplyClicked: ((Message) -> Unit)? = null,
614+
var onMenuClicked: ((Message) -> Unit)? = null,
615+
var onAllExpandedMessagesLoaded: (() -> Unit)? = null,
616+
var navigateToNewMessageActivity: ((Uri) -> Unit)? = null,
617+
var navigateToAttendeeBottomSheet: ((List<Attendee>) -> Unit)? = null,
618+
var navigateToDownloadProgressDialog: ((Attachment, AttachmentIntentType) -> Unit)? = null,
619+
var replyToCalendarEvent: ((AttendanceState, Message) -> Unit)? = null,
620+
var promptLink: ((String, ContextMenuType) -> Unit)? = null,
621+
)
622+
623+
class MessageViewHolder(
604624
val binding: ItemMessageBinding,
605625
private val shouldLoadDistantResources: Boolean,
606626
onContactClicked: ((contact: Recipient) -> Unit)?,
@@ -674,24 +694,6 @@ class ThreadAdapter(
674694
}
675695
}
676696

677-
data class ThreadAdapterCallbacks(
678-
var onBodyWebViewFinishedLoading: (() -> Unit)? = null,
679-
var onContactClicked: ((contact: Recipient) -> Unit)? = null,
680-
var onDeleteDraftClicked: ((message: Message) -> Unit)? = null,
681-
var onDraftClicked: ((message: Message) -> Unit)? = null,
682-
var onAttachmentClicked: ((attachment: Attachment) -> Unit)? = null,
683-
var onAttachmentOptionsClicked: ((attachment: Attachment) -> Unit)? = null,
684-
var onDownloadAllClicked: ((message: Message) -> Unit)? = null,
685-
var onReplyClicked: ((Message) -> Unit)? = null,
686-
var onMenuClicked: ((Message) -> Unit)? = null,
687-
var onAllExpandedMessagesLoaded: (() -> Unit)? = null,
688-
var navigateToNewMessageActivity: ((Uri) -> Unit)? = null,
689-
var navigateToAttendeeBottomSheet: ((List<Attendee>) -> Unit)? = null,
690-
var navigateToDownloadProgressDialog: ((Attachment, AttachmentIntentType) -> Unit)? = null,
691-
var replyToCalendarEvent: ((AttendanceState, Message) -> Unit)? = null,
692-
var promptLink: ((String, ContextMenuType) -> Unit)? = null,
693-
)
694-
695697
companion object {
696698

697699
private val contextMenuTypeForHitTestResultType = mapOf(

0 commit comments

Comments
 (0)