@@ -2,20 +2,21 @@ package com.fsck.k9.controller
22
33import com.fsck.k9.backend.api.FolderInfo
44import com.fsck.k9.mailstore.LocalMessage
5- import java.util.Calendar
6- import java.util.Date
75import java.util.Locale
6+ import kotlin.time.Clock
7+ import kotlin.time.ExperimentalTime
8+ import kotlinx.datetime.LocalDate
9+ import kotlinx.datetime.TimeZone
10+ import kotlinx.datetime.toLocalDateTime
811import net.thunderbird.core.android.account.LegacyAccountDto
912import net.thunderbird.feature.mail.folder.api.ArchiveGranularity
10- import net.thunderbird.feature.mail.folder.api.FOLDER_DEFAULT_PATH_DELIMITER
1113import com.fsck.k9.mail.FolderType as LegacyFolderType
1214
1315internal class ArchiveFolderResolver (
1416 private val folderIdResolver : FolderIdResolver ,
1517 private val folderCreator : ArchiveFolderCreator ,
1618) {
1719
18- @Suppress(" ReturnCount" )
1920 fun resolveArchiveFolder (
2021 account : LegacyAccountDto ,
2122 message : LocalMessage ,
@@ -28,57 +29,52 @@ internal class ArchiveFolderResolver(
2829 }
2930
3031 ArchiveGranularity .PER_YEAR_ARCHIVE_FOLDERS -> {
31- val year = getYear(getMessageDate( message))
32- findOrCreateSubfolder(account, baseFolderId, year.toString())
32+ val year = message.messageDate.year
33+ findOrCreateSubfolder(account, baseFolderId, year.toString()) ? : baseFolderId
3334 }
3435
3536 ArchiveGranularity .PER_MONTH_ARCHIVE_FOLDERS -> {
36- val date = getMessageDate( message)
37- val year = getYear( date)
38- val month = String .format(Locale .ROOT , " %02d" , getMonth( date) )
37+ val date = message.messageDate
38+ val year = date.year
39+ val month = String .format(Locale .ROOT , " %02d" , date.monthNumber )
3940
40- val yearFolderId = findOrCreateSubfolder(account, baseFolderId, year.toString())
41- ? : return baseFolderId
42-
43- findOrCreateSubfolder(account, yearFolderId, month)
41+ findOrCreateSubfolder(account, baseFolderId, year.toString())?.let { yearFolderId ->
42+ findOrCreateSubfolder(account, yearFolderId, month)
43+ } ? : baseFolderId
4444 }
4545 }
4646 }
4747
48- @Suppress(" ReturnCount" )
4948 private fun findOrCreateSubfolder (
5049 account : LegacyAccountDto ,
5150 parentFolderId : Long ,
5251 subfolderName : String ,
5352 ): Long? {
5453 val parentServerId = folderIdResolver.getFolderServerId(account, parentFolderId) ? : return null
5554
56- val delimiter = FOLDER_DEFAULT_PATH_DELIMITER
55+ val delimiter = account.folderPathDelimiter
5756 val subfolderServerId = " $parentServerId$delimiter$subfolderName "
5857
59- folderIdResolver.getFolderId(account, subfolderServerId)?.let { return it }
60-
61- val folderInfo = FolderInfo (
62- serverId = subfolderServerId,
63- name = subfolderServerId,
64- type = LegacyFolderType .ARCHIVE ,
65- )
66- return folderCreator.createFolder(account, folderInfo)
67- }
68-
69- private fun getMessageDate (message : LocalMessage ): Date {
70- return message.internalDate ? : message.sentDate ? : Date ()
71- }
72-
73- private fun getYear (date : Date ): Int {
74- val calendar = Calendar .getInstance()
75- calendar.time = date
76- return calendar.get(Calendar .YEAR )
58+ val existingId = folderIdResolver.getFolderId(account, subfolderServerId)
59+ return if (existingId != null ) {
60+ existingId
61+ } else {
62+ val folderInfo = FolderInfo (
63+ serverId = subfolderServerId,
64+ name = subfolderServerId,
65+ type = LegacyFolderType .ARCHIVE ,
66+ )
67+ folderCreator.createFolder(account, folderInfo)
68+ }
7769 }
7870
79- private fun getMonth (date : Date ): Int {
80- val calendar = Calendar .getInstance()
81- calendar.time = date
82- return calendar.get(Calendar .MONTH ) + 1
83- }
71+ @OptIn(ExperimentalTime ::class )
72+ private val LocalMessage .messageDate: LocalDate
73+ get() {
74+ val epochMillis = (internalDate ? : sentDate)?.time
75+ val timeZone = TimeZone .currentSystemDefault()
76+ val instant = epochMillis?.let { kotlin.time.Instant .fromEpochMilliseconds(it) }
77+ ? : Clock .System .now()
78+ return instant.toLocalDateTime(timeZone).date
79+ }
8480}
0 commit comments