@@ -80,14 +80,17 @@ class ThreadAdapter(
80
80
navigateToDownloadProgressDialog : (Int , Bundle ) -> Unit ,
81
81
replyToCalendarEvent : (AttendanceState , Message ) -> Unit ,
82
82
promptLink : (String , ContextMenuType ) -> Unit ,
83
- ) : ListAdapter<Message, ThreadViewHolder >(MessageDiffCallback ()) {
83
+ ) : ListAdapter<Message, MessageViewHolder >(MessageDiffCallback ()) {
84
84
85
85
inline val messages: MutableList <Message > get() = currentList
86
86
87
87
var isExpandedMap = mutableMapOf<String , Boolean >()
88
+
89
+ // region Auto-scroll at Thread opening
88
90
var initialSetOfExpandedMessagesUids = setOf<String >()
89
91
private val currentSetOfLoadedExpandedMessagesUids = mutableSetOf<String >()
90
92
private var hasNotScrolledYet = true
93
+ // endregion
91
94
92
95
private val manuallyAllowedMessageUids = mutableSetOf<String >()
93
96
var isThemeTheSameMap = mutableMapOf<String , Boolean >()
@@ -134,21 +137,21 @@ class ThreadAdapter(
134
137
135
138
override fun getItemCount (): Int = runCatchingRealm { messages.count() }.getOrDefault(0 )
136
139
137
- override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): ThreadViewHolder {
138
- return ThreadViewHolder (
140
+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): MessageViewHolder {
141
+ return MessageViewHolder (
139
142
ItemMessageBinding .inflate(LayoutInflater .from(parent.context), parent, false ),
140
143
shouldLoadDistantResources,
141
144
threadAdapterCallbacks?.onContactClicked,
142
145
threadAdapterCallbacks?.onAttachmentClicked,
143
146
)
144
147
}
145
148
146
- override fun onBindViewHolder (holder : ThreadViewHolder , position : Int , payloads : MutableList <Any >) = runCatchingRealm {
149
+ override fun onBindViewHolder (holder : MessageViewHolder , position : Int , payloads : MutableList <Any >) = runCatchingRealm {
147
150
with (holder.binding) {
148
151
val payload = payloads.firstOrNull()
149
152
if (payload !is NotifyType ) {
150
153
super .onBindViewHolder(holder, position, payloads)
151
- return
154
+ return @runCatchingRealm
152
155
}
153
156
154
157
val message = messages[position]
@@ -172,7 +175,7 @@ class ThreadAdapter(
172
175
}
173
176
}.getOrDefault(Unit )
174
177
175
- override fun onBindViewHolder (holder : ThreadViewHolder , position : Int ) = with (holder) {
178
+ override fun onBindViewHolder (holder : MessageViewHolder , position : Int ) = with (holder) {
176
179
val message = messages[position]
177
180
178
181
initMapForNewMessage(message, position)
@@ -186,7 +189,7 @@ class ThreadAdapter(
186
189
onExpandOrCollapseMessage(message, shouldTrack = false )
187
190
}
188
191
189
- private fun ThreadViewHolder .bindCalendarEvent (message : Message ) {
192
+ private fun MessageViewHolder .bindCalendarEvent (message : Message ) {
190
193
val attachment = message.calendarAttachment ? : return
191
194
val calendarEvent = message.latestCalendarEventResponse?.calendarEvent
192
195
@@ -232,14 +235,14 @@ class ThreadAdapter(
232
235
if (isThemeTheSameMap[message.uid] == null ) isThemeTheSameMap[message.uid] = true
233
236
}
234
237
235
- private fun ThreadViewHolder .toggleContentAndQuoteTheme (messageUid : String ) = with (binding) {
238
+ private fun MessageViewHolder .toggleContentAndQuoteTheme (messageUid : String ) = with (binding) {
236
239
val isThemeTheSame = isThemeTheSameMap[messageUid]!!
237
240
bodyWebView.toggleWebViewTheme(isThemeTheSame)
238
241
fullMessageWebView.toggleWebViewTheme(isThemeTheSame)
239
242
toggleFrameLayoutsTheme(isThemeTheSame)
240
243
}
241
244
242
- private fun ThreadViewHolder .loadContentAndQuote (message : Message ) {
245
+ private fun MessageViewHolder .loadContentAndQuote (message : Message ) {
243
246
val body = message.body
244
247
val splitBody = message.splitBody
245
248
@@ -253,16 +256,16 @@ class ThreadAdapter(
253
256
}
254
257
}
255
258
256
- private fun ThreadViewHolder .loadBodyInWebView (uid : String , body : String , type : String ) = with (binding) {
259
+ private fun MessageViewHolder .loadBodyInWebView (uid : String , body : String , type : String ) = with (binding) {
257
260
bodyWebView.applyWebViewContent(uid, body, type)
258
261
}
259
262
260
- private fun ThreadViewHolder .loadQuoteInWebView (uid : String , quote : String? , type : String ) = with (binding) {
263
+ private fun MessageViewHolder .loadQuoteInWebView (uid : String , quote : String? , type : String ) = with (binding) {
261
264
if (quote == null ) return @with
262
265
fullMessageWebView.applyWebViewContent(uid, quote, type)
263
266
}
264
267
265
- private fun ThreadViewHolder .toggleWebViews (message : Message ) = with (binding) {
268
+ private fun MessageViewHolder .toggleWebViews (message : Message ) = with (binding) {
266
269
isQuoteCollapsed = ! isQuoteCollapsed
267
270
loadContentAndQuote(message)
268
271
}
@@ -307,7 +310,7 @@ class ThreadAdapter(
307
310
}
308
311
}
309
312
310
- private fun ThreadViewHolder .bindHeader (message : Message ) = with (binding) {
313
+ private fun MessageViewHolder .bindHeader (message : Message ) = with (binding) {
311
314
val messageDate = message.date.toDate()
312
315
313
316
if (message.isDraft) {
@@ -374,7 +377,7 @@ class ThreadAdapter(
374
377
bccGroup.isVisible = message.bcc.isNotEmpty()
375
378
}
376
379
377
- private fun ThreadViewHolder .handleHeaderClick (message : Message ) = with (binding) {
380
+ private fun MessageViewHolder .handleHeaderClick (message : Message ) = with (binding) {
378
381
messageHeader.setOnClickListener {
379
382
if (isExpandedMap[message.uid] == true ) {
380
383
isExpandedMap[message.uid] = false
@@ -400,7 +403,7 @@ class ThreadAdapter(
400
403
}
401
404
}
402
405
403
- private fun ThreadViewHolder .bindRecipientDetails (message : Message , messageDate : Date ) = with (binding) {
406
+ private fun MessageViewHolder .bindRecipientDetails (message : Message , messageDate : Date ) = with (binding) {
404
407
405
408
fromAdapter.updateList(message.from.toList())
406
409
toAdapter.updateList(message.to.toList())
@@ -416,7 +419,7 @@ class ThreadAdapter(
416
419
detailedMessageDate.text = context.mostDetailedDate(messageDate)
417
420
}
418
421
419
- private fun ThreadViewHolder .bindAlerts (messageUid : String ) = with (binding) {
422
+ private fun MessageViewHolder .bindAlerts (messageUid : String ) = with (binding) {
420
423
distantImagesAlert.onAction1 {
421
424
bodyWebViewClient.unblockDistantResources()
422
425
fullMessageWebViewClient.unblockDistantResources()
@@ -441,7 +444,7 @@ class ThreadAdapter(
441
444
private fun ItemMessageBinding.areOneOrMoreAlertsVisible () = alerts.children.any { it.isVisible }
442
445
443
446
@SuppressLint(" SetTextI18n" )
444
- private fun ThreadViewHolder .bindAttachment (message : Message ) = with (binding) {
447
+ private fun MessageViewHolder .bindAttachment (message : Message ) = with (binding) {
445
448
val attachments = message.attachments
446
449
val fileSize = formatAttachmentFileSize(attachments)
447
450
attachmentLayout.attachmentsSizeText.text = context.resources.getQuantityString(
@@ -466,12 +469,12 @@ class ThreadAdapter(
466
469
return Formatter .formatShortFileSize(context, totalAttachmentsFileSizeInBytes)
467
470
}
468
471
469
- private fun ThreadViewHolder .bindContent (message : Message ) {
472
+ private fun MessageViewHolder .bindContent (message : Message ) {
470
473
binding.messageLoader.isVisible = message.splitBody == null
471
474
message.splitBody?.let { splitBody -> bindBody(message, hasQuote = splitBody.quote != null ) }
472
475
}
473
476
474
- private fun ThreadViewHolder .bindBody (message : Message , hasQuote : Boolean ) = with (binding) {
477
+ private fun MessageViewHolder .bindBody (message : Message , hasQuote : Boolean ) = with (binding) {
475
478
bodyWebView.setupLinkContextualMenu { data, type ->
476
479
threadAdapterCallbacks?.promptLink?.invoke(data, type)
477
480
}
@@ -547,7 +550,7 @@ class ThreadAdapter(
547
550
}
548
551
}
549
552
550
- private fun ThreadViewHolder .onExpandOrCollapseMessage (message : Message , shouldTrack : Boolean = true) = with (binding) {
553
+ private fun MessageViewHolder .onExpandOrCollapseMessage (message : Message , shouldTrack : Boolean = true) = with (binding) {
551
554
val isExpanded = isExpandedMap[message.uid]!!
552
555
553
556
if (shouldTrack) context.trackMessageEvent(" openMessage" , isExpanded)
@@ -652,7 +655,23 @@ class ThreadAdapter(
652
655
}
653
656
}
654
657
655
- class ThreadViewHolder (
658
+ private data class ThreadAdapterCallbacks (
659
+ var onContactClicked : (contact: Recipient ) -> Unit ,
660
+ var onDeleteDraftClicked : (message: Message ) -> Unit ,
661
+ var onDraftClicked : (message: Message ) -> Unit ,
662
+ var onAttachmentClicked : (attachment: Attachment ) -> Unit ,
663
+ var onDownloadAllClicked : (message: Message ) -> Unit ,
664
+ var onReplyClicked : (Message ) -> Unit ,
665
+ var onMenuClicked : (Message ) -> Unit ,
666
+ var onAllExpandedMessagesLoaded : () -> Unit ,
667
+ var navigateToNewMessageActivity : (Uri ) -> Unit ,
668
+ var navigateToAttendeeBottomSheet : (List <Attendee >) -> Unit ,
669
+ var navigateToDownloadProgressDialog : (Int , Bundle ) -> Unit ,
670
+ var replyToCalendarEvent : (AttendanceState , Message ) -> Unit ,
671
+ var promptLink : (String , ContextMenuType ) -> Unit ,
672
+ )
673
+
674
+ class MessageViewHolder (
656
675
val binding : ItemMessageBinding ,
657
676
private val shouldLoadDistantResources : Boolean ,
658
677
onContactClicked : ((contact: Recipient ) -> Unit )? ,
@@ -719,22 +738,6 @@ class ThreadAdapter(
719
738
}
720
739
}
721
740
722
- private data class ThreadAdapterCallbacks (
723
- var onContactClicked : (contact: Recipient ) -> Unit ,
724
- var onDeleteDraftClicked : (message: Message ) -> Unit ,
725
- var onDraftClicked : (message: Message ) -> Unit ,
726
- var onAttachmentClicked : (attachment: Attachment ) -> Unit ,
727
- var onDownloadAllClicked : (message: Message ) -> Unit ,
728
- var onReplyClicked : (Message ) -> Unit ,
729
- var onMenuClicked : (Message ) -> Unit ,
730
- var onAllExpandedMessagesLoaded : () -> Unit ,
731
- var navigateToNewMessageActivity : (Uri ) -> Unit ,
732
- var navigateToAttendeeBottomSheet : (List <Attendee >) -> Unit ,
733
- var navigateToDownloadProgressDialog : (Int , Bundle ) -> Unit ,
734
- var replyToCalendarEvent : (AttendanceState , Message ) -> Unit ,
735
- var promptLink : (String , ContextMenuType ) -> Unit ,
736
- )
737
-
738
741
companion object {
739
742
private const val FORMAT_EMAIL_DATE_HOUR = " HH:mm"
740
743
private const val FORMAT_EMAIL_DATE_SHORT_DATE = " d MMM"
0 commit comments