Skip to content

Commit 16b0812

Browse files
Clean code before SuperCollapsedBlock feature
1 parent 5f44b97 commit 16b0812

File tree

5 files changed

+82
-73
lines changed

5 files changed

+82
-73
lines changed

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/thread/ThreadAdapter.kt

+40-37
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,17 @@ class ThreadAdapter(
8080
navigateToDownloadProgressDialog: (Int, Bundle) -> Unit,
8181
replyToCalendarEvent: (AttendanceState, Message) -> Unit,
8282
promptLink: (String, ContextMenuType) -> Unit,
83-
) : ListAdapter<Message, ThreadViewHolder>(MessageDiffCallback()) {
83+
) : ListAdapter<Message, MessageViewHolder>(MessageDiffCallback()) {
8484

8585
inline val messages: MutableList<Message> get() = currentList
8686

8787
var isExpandedMap = mutableMapOf<String, Boolean>()
88+
89+
//region Auto-scroll at Thread opening
8890
var initialSetOfExpandedMessagesUids = setOf<String>()
8991
private val currentSetOfLoadedExpandedMessagesUids = mutableSetOf<String>()
9092
private var hasNotScrolledYet = true
93+
//endregion
9194

9295
private val manuallyAllowedMessageUids = mutableSetOf<String>()
9396
var isThemeTheSameMap = mutableMapOf<String, Boolean>()
@@ -134,21 +137,21 @@ class ThreadAdapter(
134137

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

137-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThreadViewHolder {
138-
return ThreadViewHolder(
140+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder {
141+
return MessageViewHolder(
139142
ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false),
140143
shouldLoadDistantResources,
141144
threadAdapterCallbacks?.onContactClicked,
142145
threadAdapterCallbacks?.onAttachmentClicked,
143146
)
144147
}
145148

146-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
149+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
147150
with(holder.binding) {
148151
val payload = payloads.firstOrNull()
149152
if (payload !is NotifyType) {
150153
super.onBindViewHolder(holder, position, payloads)
151-
return
154+
return@runCatchingRealm
152155
}
153156

154157
val message = messages[position]
@@ -172,7 +175,7 @@ class ThreadAdapter(
172175
}
173176
}.getOrDefault(Unit)
174177

175-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int) = with(holder) {
178+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int) = with(holder) {
176179
val message = messages[position]
177180

178181
initMapForNewMessage(message, position)
@@ -186,7 +189,7 @@ class ThreadAdapter(
186189
onExpandOrCollapseMessage(message, shouldTrack = false)
187190
}
188191

189-
private fun ThreadViewHolder.bindCalendarEvent(message: Message) {
192+
private fun MessageViewHolder.bindCalendarEvent(message: Message) {
190193
val attachment = message.calendarAttachment ?: return
191194
val calendarEvent = message.latestCalendarEventResponse?.calendarEvent
192195

@@ -232,14 +235,14 @@ class ThreadAdapter(
232235
if (isThemeTheSameMap[message.uid] == null) isThemeTheSameMap[message.uid] = true
233236
}
234237

235-
private fun ThreadViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
238+
private fun MessageViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
236239
val isThemeTheSame = isThemeTheSameMap[messageUid]!!
237240
bodyWebView.toggleWebViewTheme(isThemeTheSame)
238241
fullMessageWebView.toggleWebViewTheme(isThemeTheSame)
239242
toggleFrameLayoutsTheme(isThemeTheSame)
240243
}
241244

242-
private fun ThreadViewHolder.loadContentAndQuote(message: Message) {
245+
private fun MessageViewHolder.loadContentAndQuote(message: Message) {
243246
val body = message.body
244247
val splitBody = message.splitBody
245248

@@ -253,16 +256,16 @@ class ThreadAdapter(
253256
}
254257
}
255258

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) {
257260
bodyWebView.applyWebViewContent(uid, body, type)
258261
}
259262

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) {
261264
if (quote == null) return@with
262265
fullMessageWebView.applyWebViewContent(uid, quote, type)
263266
}
264267

265-
private fun ThreadViewHolder.toggleWebViews(message: Message) = with(binding) {
268+
private fun MessageViewHolder.toggleWebViews(message: Message) = with(binding) {
266269
isQuoteCollapsed = !isQuoteCollapsed
267270
loadContentAndQuote(message)
268271
}
@@ -307,7 +310,7 @@ class ThreadAdapter(
307310
}
308311
}
309312

310-
private fun ThreadViewHolder.bindHeader(message: Message) = with(binding) {
313+
private fun MessageViewHolder.bindHeader(message: Message) = with(binding) {
311314
val messageDate = message.date.toDate()
312315

313316
if (message.isDraft) {
@@ -374,7 +377,7 @@ class ThreadAdapter(
374377
bccGroup.isVisible = message.bcc.isNotEmpty()
375378
}
376379

377-
private fun ThreadViewHolder.handleHeaderClick(message: Message) = with(binding) {
380+
private fun MessageViewHolder.handleHeaderClick(message: Message) = with(binding) {
378381
messageHeader.setOnClickListener {
379382
if (isExpandedMap[message.uid] == true) {
380383
isExpandedMap[message.uid] = false
@@ -400,7 +403,7 @@ class ThreadAdapter(
400403
}
401404
}
402405

403-
private fun ThreadViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
406+
private fun MessageViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
404407

405408
fromAdapter.updateList(message.from.toList())
406409
toAdapter.updateList(message.to.toList())
@@ -416,7 +419,7 @@ class ThreadAdapter(
416419
detailedMessageDate.text = context.mostDetailedDate(messageDate)
417420
}
418421

419-
private fun ThreadViewHolder.bindAlerts(messageUid: String) = with(binding) {
422+
private fun MessageViewHolder.bindAlerts(messageUid: String) = with(binding) {
420423
distantImagesAlert.onAction1 {
421424
bodyWebViewClient.unblockDistantResources()
422425
fullMessageWebViewClient.unblockDistantResources()
@@ -441,7 +444,7 @@ class ThreadAdapter(
441444
private fun ItemMessageBinding.areOneOrMoreAlertsVisible() = alerts.children.any { it.isVisible }
442445

443446
@SuppressLint("SetTextI18n")
444-
private fun ThreadViewHolder.bindAttachment(message: Message) = with(binding) {
447+
private fun MessageViewHolder.bindAttachment(message: Message) = with(binding) {
445448
val attachments = message.attachments
446449
val fileSize = formatAttachmentFileSize(attachments)
447450
attachmentLayout.attachmentsSizeText.text = context.resources.getQuantityString(
@@ -466,12 +469,12 @@ class ThreadAdapter(
466469
return Formatter.formatShortFileSize(context, totalAttachmentsFileSizeInBytes)
467470
}
468471

469-
private fun ThreadViewHolder.bindContent(message: Message) {
472+
private fun MessageViewHolder.bindContent(message: Message) {
470473
binding.messageLoader.isVisible = message.splitBody == null
471474
message.splitBody?.let { splitBody -> bindBody(message, hasQuote = splitBody.quote != null) }
472475
}
473476

474-
private fun ThreadViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
477+
private fun MessageViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
475478
bodyWebView.setupLinkContextualMenu { data, type ->
476479
threadAdapterCallbacks?.promptLink?.invoke(data, type)
477480
}
@@ -547,7 +550,7 @@ class ThreadAdapter(
547550
}
548551
}
549552

550-
private fun ThreadViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
553+
private fun MessageViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
551554
val isExpanded = isExpandedMap[message.uid]!!
552555

553556
if (shouldTrack) context.trackMessageEvent("openMessage", isExpanded)
@@ -652,7 +655,23 @@ class ThreadAdapter(
652655
}
653656
}
654657

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(
656675
val binding: ItemMessageBinding,
657676
private val shouldLoadDistantResources: Boolean,
658677
onContactClicked: ((contact: Recipient) -> Unit)?,
@@ -719,22 +738,6 @@ class ThreadAdapter(
719738
}
720739
}
721740

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-
738741
companion object {
739742
private const val FORMAT_EMAIL_DATE_HOUR = "HH:mm"
740743
private const val FORMAT_EMAIL_DATE_SHORT_DATE = "d MMM"

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,6 @@ class ThreadFragment : Fragment() {
306306

307307
displayThreadView()
308308

309-
reassignThreadLive(threadUid)
310-
reassignMessagesLive(threadUid)
311-
312309
openThread(threadUid).observe(viewLifecycleOwner) { result ->
313310

314311
if (result == null) {
@@ -318,6 +315,9 @@ class ThreadFragment : Fragment() {
318315

319316
initUi(threadUid, folderRole = mainViewModel.getActionFolderRole(result.thread))
320317
initAdapter(result)
318+
319+
reassignThreadLive(threadUid)
320+
reassignMessagesLive(threadUid)
321321
}
322322
}
323323
}

app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ class NewMessageFragment : Fragment() {
242242
addressListPopupWindow = ListPopupWindow(binding.root.context)
243243

244244
toolbar.setNavigationOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() }
245+
245246
changeToolbarColorOnScroll(
246247
toolbar = toolbar,
247248
nestedScrollView = compositionNestedScrollView,

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -458,14 +458,15 @@ fun Fragment.changeToolbarColorOnScroll(
458458
var oldColor = requireContext().getColor(loweredColor)
459459
var headerColorState = HeaderState.LOWERED
460460

461-
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
462-
override fun onStateChanged(source: LifecycleOwner, event: Event) {
463-
if (event == Event.ON_DESTROY) valueAnimator?.cancel()
464-
}
465-
})
461+
viewLifecycleOwner.lifecycle.addObserver(
462+
object : LifecycleEventObserver {
463+
override fun onStateChanged(source: LifecycleOwner, event: Event) {
464+
if (event == Event.ON_DESTROY) valueAnimator?.cancel()
465+
}
466+
},
467+
)
466468

467469
nestedScrollView.setOnScrollChangeListener { view, _, _, _, _ ->
468-
469470
val isAtTheTop = view.isAtTheTop()
470471
if (!isAtTheTop && headerColorState == HeaderState.ELEVATED) return@setOnScrollChangeListener
471472

0 commit comments

Comments
 (0)