Skip to content

Commit 1cf5529

Browse files
Clean code before SuperCollapsedBlock feature
1 parent 8925609 commit 1cf5529

File tree

13 files changed

+122
-102
lines changed

13 files changed

+122
-102
lines changed

Diff for: app/src/main/assets/icon_print_email.svg

+28-14
Loading

Diff for: 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
}

Diff for: 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

Diff for: 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) {

Diff for: 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.

Diff for: 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

Diff for: 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

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

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

47-
4847
@Inject
4948
lateinit var localSettings: LocalSettings
5049

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

+42-40
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import com.infomaniak.mail.data.models.calendar.Attendee.AttendanceState
4747
import com.infomaniak.mail.data.models.correspondent.Recipient
4848
import com.infomaniak.mail.data.models.message.Message
4949
import com.infomaniak.mail.databinding.ItemMessageBinding
50-
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.ThreadViewHolder
50+
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.MessageViewHolder
5151
import com.infomaniak.mail.utils.*
5252
import com.infomaniak.mail.utils.AttachmentIntentUtils.AttachmentIntentType
5353
import com.infomaniak.mail.utils.AttachmentIntentUtils.createDownloadDialogNavArgs
@@ -71,19 +71,21 @@ class ThreadAdapter(
7171
private val isForPrinting: Boolean = false,
7272
private val isCalendarEventExpandedMap: MutableMap<String, Boolean> = mutableMapOf(),
7373
private var threadAdapterCallbacks: ThreadAdapterCallbacks? = null,
74-
) : ListAdapter<Message, ThreadViewHolder>(MessageDiffCallback()) {
74+
) : ListAdapter<Message, MessageViewHolder>(MessageDiffCallback()) {
7575

7676
inline val messages: MutableList<Message> get() = currentList
7777

7878
var isExpandedMap = mutableMapOf<String, Boolean>()
79+
80+
//region Auto-scroll at Thread opening
7981
var initialSetOfExpandedMessagesUids = setOf<String>()
8082
private val currentSetOfLoadedExpandedMessagesUids = mutableSetOf<String>()
8183
private var hasNotScrolledYet = true
84+
//endregion
8285

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

86-
8789
private lateinit var recyclerView: RecyclerView
8890
private val webViewUtils by lazy { WebViewUtils(recyclerView.context) }
8991

@@ -106,21 +108,21 @@ class ThreadAdapter(
106108

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

109-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThreadViewHolder {
110-
return ThreadViewHolder(
111+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder {
112+
return MessageViewHolder(
111113
ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false),
112114
shouldLoadDistantResources,
113115
threadAdapterCallbacks?.onContactClicked,
114116
threadAdapterCallbacks?.onAttachmentClicked,
115117
)
116118
}
117119

118-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
120+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int, payloads: MutableList<Any>) = runCatchingRealm {
119121
with(holder.binding) {
120122
val payload = payloads.firstOrNull()
121123
if (payload !is NotifyType) {
122124
super.onBindViewHolder(holder, position, payloads)
123-
return
125+
return@runCatchingRealm
124126
}
125127

126128
val message = messages[position]
@@ -144,7 +146,7 @@ class ThreadAdapter(
144146
}
145147
}.getOrDefault(Unit)
146148

147-
override fun onBindViewHolder(holder: ThreadViewHolder, position: Int) = with(holder) {
149+
override fun onBindViewHolder(holder: MessageViewHolder, position: Int) = with(holder) {
148150
val message = messages[position]
149151

150152
initMapForNewMessage(message, position)
@@ -158,7 +160,7 @@ class ThreadAdapter(
158160
onExpandOrCollapseMessage(message, shouldTrack = false)
159161
}
160162

161-
private fun ThreadViewHolder.bindCalendarEvent(message: Message) {
163+
private fun MessageViewHolder.bindCalendarEvent(message: Message) {
162164
val attachment = message.calendarAttachment ?: return
163165
val calendarEvent = message.latestCalendarEventResponse?.calendarEvent
164166

@@ -204,14 +206,14 @@ class ThreadAdapter(
204206
if (isThemeTheSameMap[message.uid] == null) isThemeTheSameMap[message.uid] = true
205207
}
206208

207-
private fun ThreadViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
209+
private fun MessageViewHolder.toggleContentAndQuoteTheme(messageUid: String) = with(binding) {
208210
val isThemeTheSame = isThemeTheSameMap[messageUid]!!
209211
bodyWebView.toggleWebViewTheme(isThemeTheSame)
210212
fullMessageWebView.toggleWebViewTheme(isThemeTheSame)
211213
toggleFrameLayoutsTheme(isThemeTheSame)
212214
}
213215

214-
private fun ThreadViewHolder.loadContentAndQuote(message: Message) {
216+
private fun MessageViewHolder.loadContentAndQuote(message: Message) {
215217
val body = message.body
216218
val splitBody = message.splitBody
217219

@@ -225,16 +227,16 @@ class ThreadAdapter(
225227
}
226228
}
227229

228-
private fun ThreadViewHolder.loadBodyInWebView(uid: String, body: String, type: String) = with(binding) {
230+
private fun MessageViewHolder.loadBodyInWebView(uid: String, body: String, type: String) = with(binding) {
229231
bodyWebView.applyWebViewContent(uid, body, type)
230232
}
231233

232-
private fun ThreadViewHolder.loadQuoteInWebView(uid: String, quote: String?, type: String) = with(binding) {
234+
private fun MessageViewHolder.loadQuoteInWebView(uid: String, quote: String?, type: String) = with(binding) {
233235
if (quote == null) return@with
234236
fullMessageWebView.applyWebViewContent(uid, quote, type)
235237
}
236238

237-
private fun ThreadViewHolder.toggleWebViews(message: Message) = with(binding) {
239+
private fun MessageViewHolder.toggleWebViews(message: Message) = with(binding) {
238240
isQuoteCollapsed = !isQuoteCollapsed
239241
loadContentAndQuote(message)
240242
}
@@ -283,7 +285,7 @@ class ThreadAdapter(
283285
}
284286
}
285287

286-
private fun ThreadViewHolder.bindHeader(message: Message) = with(binding) {
288+
private fun MessageViewHolder.bindHeader(message: Message) = with(binding) {
287289
val messageDate = message.date.toDate()
288290

289291
if (message.isDraft) {
@@ -325,7 +327,7 @@ class ThreadAdapter(
325327
bccGroup.isVisible = message.bcc.isNotEmpty()
326328
}
327329

328-
private fun ThreadViewHolder.handleHeaderClick(message: Message) = with(binding) {
330+
private fun MessageViewHolder.handleHeaderClick(message: Message) = with(binding) {
329331
messageHeader.setOnClickListener {
330332
if (isExpandedMap[message.uid] == true) {
331333
isExpandedMap[message.uid] = false
@@ -351,7 +353,7 @@ class ThreadAdapter(
351353
}
352354
}
353355

354-
private fun ThreadViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
356+
private fun MessageViewHolder.bindRecipientDetails(message: Message, messageDate: Date) = with(binding) {
355357

356358
fromAdapter.updateList(message.from.toList())
357359
toAdapter.updateList(message.to.toList())
@@ -367,7 +369,7 @@ class ThreadAdapter(
367369
detailedMessageDate.text = mostDetailedDate(context, messageDate)
368370
}
369371

370-
private fun ThreadViewHolder.bindAlerts(messageUid: String) = with(binding) {
372+
private fun MessageViewHolder.bindAlerts(messageUid: String) = with(binding) {
371373
distantImagesAlert.onAction1 {
372374
bodyWebViewClient.unblockDistantResources()
373375
fullMessageWebViewClient.unblockDistantResources()
@@ -392,7 +394,7 @@ class ThreadAdapter(
392394
private fun ItemMessageBinding.areOneOrMoreAlertsVisible() = alerts.children.any { it.isVisible }
393395

394396
@SuppressLint("SetTextI18n")
395-
private fun ThreadViewHolder.bindAttachment(message: Message) = with(binding) {
397+
private fun MessageViewHolder.bindAttachment(message: Message) = with(binding) {
396398
val attachments = message.attachments
397399
val fileSize = formatAttachmentFileSize(attachments)
398400
attachmentLayout.attachmentsSizeText.text = context.resources.getQuantityString(
@@ -417,12 +419,12 @@ class ThreadAdapter(
417419
return Formatter.formatShortFileSize(context, totalAttachmentsFileSizeInBytes)
418420
}
419421

420-
private fun ThreadViewHolder.bindContent(message: Message) {
422+
private fun MessageViewHolder.bindContent(message: Message) {
421423
binding.messageLoader.isVisible = message.splitBody == null
422424
message.splitBody?.let { splitBody -> bindBody(message, hasQuote = splitBody.quote != null) }
423425
}
424426

425-
private fun ThreadViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
427+
private fun MessageViewHolder.bindBody(message: Message, hasQuote: Boolean) = with(binding) {
426428
bodyWebView.setupLinkContextualMenu { data, type ->
427429
threadAdapterCallbacks?.promptLink?.invoke(data, type)
428430
}
@@ -499,7 +501,7 @@ class ThreadAdapter(
499501
}
500502
}
501503

502-
private fun ThreadViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
504+
private fun MessageViewHolder.onExpandOrCollapseMessage(message: Message, shouldTrack: Boolean = true) = with(binding) {
503505
val isExpanded = isExpandedMap[message.uid]!!
504506

505507
if (shouldTrack) context.trackMessageEvent("openMessage", isExpanded)
@@ -604,7 +606,24 @@ class ThreadAdapter(
604606
}
605607
}
606608

607-
class ThreadViewHolder(
609+
data class ThreadAdapterCallbacks(
610+
var onBodyWebViewFinishedLoading: (() -> Unit)? = null,
611+
var onContactClicked: ((contact: Recipient) -> Unit)? = null,
612+
var onDeleteDraftClicked: ((message: Message) -> Unit)? = null,
613+
var onDraftClicked: ((message: Message) -> Unit)? = null,
614+
var onAttachmentClicked: ((attachment: Attachment) -> Unit)? = null,
615+
var onDownloadAllClicked: ((message: Message) -> Unit)? = null,
616+
var onReplyClicked: ((Message) -> Unit)? = null,
617+
var onMenuClicked: ((Message) -> Unit)? = null,
618+
var onAllExpandedMessagesLoaded: (() -> Unit)? = null,
619+
var navigateToNewMessageActivity: ((Uri) -> Unit)? = null,
620+
var navigateToAttendeeBottomSheet: ((List<Attendee>) -> Unit)? = null,
621+
var navigateToDownloadProgressDialog: ((Int, Bundle) -> Unit)? = null,
622+
var replyToCalendarEvent: ((AttendanceState, Message) -> Unit)? = null,
623+
var promptLink: ((String, ContextMenuType) -> Unit)? = null,
624+
)
625+
626+
class MessageViewHolder(
608627
val binding: ItemMessageBinding,
609628
private val shouldLoadDistantResources: Boolean,
610629
onContactClicked: ((contact: Recipient) -> Unit)?,
@@ -674,23 +693,6 @@ class ThreadAdapter(
674693
}
675694
}
676695

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 onDownloadAllClicked: ((message: Message) -> Unit)? = null,
684-
var onReplyClicked: ((Message) -> Unit)? = null,
685-
var onMenuClicked: ((Message) -> Unit)? = null,
686-
var onAllExpandedMessagesLoaded: (() -> Unit)? = null,
687-
var navigateToNewMessageActivity: ((Uri) -> Unit)? = null,
688-
var navigateToAttendeeBottomSheet: ((List<Attendee>) -> Unit)? = null,
689-
var navigateToDownloadProgressDialog: ((Int, Bundle) -> Unit)? = null,
690-
var replyToCalendarEvent: ((AttendanceState, Message) -> Unit)? = null,
691-
var promptLink: ((String, ContextMenuType) -> Unit)? = null,
692-
)
693-
694696
companion object {
695697

696698
private val contextMenuTypeForHitTestResultType = mapOf(

0 commit comments

Comments
 (0)