diff --git a/feature/migration/qrcode/build.gradle.kts b/feature/migration/qrcode/build.gradle.kts index 725ac846edb..7a834136f4b 100644 --- a/feature/migration/qrcode/build.gradle.kts +++ b/feature/migration/qrcode/build.gradle.kts @@ -9,6 +9,8 @@ android { dependencies { implementation(projects.core.common) + implementation(projects.legacy.account) + implementation(projects.legacy.common) implementation(projects.legacy.ui.base) implementation(projects.core.ui.compose.designsystem) diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/QrCodeModule.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/QrCodeModule.kt index 3db65d75b35..cc0db31968a 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/QrCodeModule.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/QrCodeModule.kt @@ -3,6 +3,10 @@ package app.k9mail.feature.migration.qrcode import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodePayloadReader import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodeSettingsWriter +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadAdapter +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadMapper +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadParser +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadValidator import app.k9mail.feature.migration.qrcode.settings.DefaultUuidGenerator import app.k9mail.feature.migration.qrcode.settings.UuidGenerator import app.k9mail.feature.migration.qrcode.settings.XmlSettingWriter @@ -18,7 +22,23 @@ val qrCodeModule = module { ) } - factory { QrCodePayloadReader() } + factory { QrCodePayloadAdapter() } + factory { QrCodePayloadParser(qrCodePayloadAdapter = get()) } + factory { QrCodePayloadValidator() } + factory { + QrCodePayloadMapper( + qrCodePayloadValidator = get(), + deletePolicyProvider = get(), + ) + } + + factory { + QrCodePayloadReader( + parser = get(), + mapper = get(), + ) + } + factory { QrCodeSettingsWriter( context = get(), diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/entity/AccountData.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/entity/AccountData.kt index 1e46d1fdd1b..1dbf0f0ff51 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/entity/AccountData.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/entity/AccountData.kt @@ -3,6 +3,8 @@ package app.k9mail.feature.migration.qrcode.domain.entity import app.k9mail.core.common.mail.EmailAddress import app.k9mail.core.common.net.Hostname import app.k9mail.core.common.net.Port +import app.k9mail.legacy.account.Account +import app.k9mail.legacy.account.Account.DeletePolicy internal data class AccountData( val sequenceNumber: Int, @@ -11,6 +13,7 @@ internal data class AccountData( ) { data class Account( val accountName: String, + val deletePolicy: DeletePolicy, val incomingServer: IncomingServer, val outgoingServerGroups: List, ) diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReader.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReader.kt index ff62e216667..3a97a88141b 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReader.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReader.kt @@ -6,8 +6,8 @@ import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadMapper import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadParser internal class QrCodePayloadReader( - private val parser: QrCodePayloadParser = QrCodePayloadParser(), - private val mapper: QrCodePayloadMapper = QrCodePayloadMapper(), + private val parser: QrCodePayloadParser, + private val mapper: QrCodePayloadMapper, ) : UseCase.QrCodePayloadReader { override fun read(payload: String): AccountData? { val parsedData = parser.parse(payload) ?: return null diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapper.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapper.kt index 373744efbe7..40eab8f9950 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapper.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapper.kt @@ -1,12 +1,17 @@ package app.k9mail.feature.migration.qrcode.payload +import app.k9mail.core.common.mail.Protocols import app.k9mail.core.common.mail.toUserEmailAddress import app.k9mail.core.common.net.toHostname import app.k9mail.core.common.net.toPort import app.k9mail.feature.migration.qrcode.domain.entity.AccountData +import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.IncomingServerProtocol +import app.k9mail.legacy.account.Account.DeletePolicy +import com.fsck.k9.account.DeletePolicyProvider internal class QrCodePayloadMapper( - private val qrCodePayloadValidator: QrCodePayloadValidator = QrCodePayloadValidator(), + private val qrCodePayloadValidator: QrCodePayloadValidator, + private val deletePolicyProvider: DeletePolicyProvider, ) { fun toAccountData(data: QrCodeData): AccountData? { return if (qrCodePayloadValidator.isValid(data)) { @@ -31,9 +36,11 @@ internal class QrCodePayloadMapper( accountName = account.incomingServer.accountName, identity = outgoingServerGroups.first().identities.first(), ) + val deletePolicy = getDeletePolicy(incomingServer.protocol) return AccountData.Account( accountName = accountName, + deletePolicy = deletePolicy, incomingServer = incomingServer, outgoingServerGroups = outgoingServerGroups, ) @@ -92,4 +99,13 @@ internal class QrCodePayloadMapper( displayName = identity.displayName, ) } + + private fun getDeletePolicy(protocol: IncomingServerProtocol): DeletePolicy { + val accountType = when (protocol) { + IncomingServerProtocol.Imap -> Protocols.IMAP + IncomingServerProtocol.Pop3 -> Protocols.POP3 + } + + return deletePolicyProvider.getDeletePolicy(accountType) + } } diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParser.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParser.kt index d1207efc085..cf13e873bbf 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParser.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParser.kt @@ -5,7 +5,7 @@ import java.io.IOException import timber.log.Timber internal class QrCodePayloadParser( - private val qrCodePayloadAdapter: QrCodePayloadAdapter = QrCodePayloadAdapter(), + private val qrCodePayloadAdapter: QrCodePayloadAdapter, ) { /** * Parses the QR code payload as JSON and reads it into [QrCodeData]. diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriter.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriter.kt index 16d0cfbf0e1..1b015df1d17 100644 --- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriter.kt +++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriter.kt @@ -6,11 +6,13 @@ import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.Identity import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.IncomingServer import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.OutgoingServer import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.OutgoingServerGroup +import app.k9mail.legacy.account.Account.DeletePolicy import java.io.OutputStream import org.xmlpull.v1.XmlSerializer // TODO: This duplicates much of the code in SettingsExporter. Add an abstraction layer for the input data, so we can // use a single XML writer class for exporting accounts and writing QR code payloads to a settings file. +@Suppress("TooManyFunctions") internal class XmlSettingWriter( private val uuidGenerator: UuidGenerator, ) { @@ -56,12 +58,28 @@ internal class XmlSettingWriter( attribute(null, UUID_ATTRIBUTE, accountUuid) writeElement(NAME_ELEMENT, account.accountName) + writeSettings(account) writeIncomingServer(account.incomingServer) writeOutgoingServers(account.outgoingServerGroups) endTag(null, ACCOUNT_ELEMENT) } + private fun XmlSerializer.writeSettings(account: Account) { + startTag(null, SETTINGS_ELEMENT) + writeKeyValue("deletePolicy", account.deletePolicy.toSettingsFileValue()) + endTag(null, SETTINGS_ELEMENT) + } + + private fun XmlSerializer.writeKeyValue(key: String, value: String?) { + startTag(null, VALUE_ELEMENT) + attribute(null, KEY_ATTRIBUTE, key) + if (value != null) { + text(value) + } + endTag(null, VALUE_ELEMENT) + } + private fun XmlSerializer.writeIncomingServer(incomingServer: IncomingServer) { startTag(null, INCOMING_SERVER_ELEMENT) attribute(null, TYPE_ATTRIBUTE, incomingServer.protocol.mapToSettingsString()) @@ -139,6 +157,9 @@ internal class XmlSettingWriter( private const val ACCOUNTS_ELEMENT = "accounts" private const val ACCOUNT_ELEMENT = "account" private const val UUID_ATTRIBUTE = "uuid" + private const val SETTINGS_ELEMENT = "settings" + private const val VALUE_ELEMENT = "value" + private const val KEY_ATTRIBUTE = "key" private const val INCOMING_SERVER_ELEMENT = "incoming-server" private const val OUTGOING_SERVER_ELEMENT = "outgoing-server" private const val TYPE_ATTRIBUTE = "type" @@ -154,3 +175,12 @@ internal class XmlSettingWriter( private const val EMAIL_ELEMENT = "email" } } + +private fun DeletePolicy.toSettingsFileValue(): String { + return when (this) { + DeletePolicy.NEVER -> "NEVER" + DeletePolicy.SEVEN_DAYS -> error("Unsupported value") + DeletePolicy.ON_DELETE -> "DELETE" + DeletePolicy.MARK_AS_READ -> "MARK_AS_READ" + } +} diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReaderTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReaderTest.kt index 264d347c93a..992ccd873c1 100644 --- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReaderTest.kt +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/domain/usecase/QrCodePayloadReaderTest.kt @@ -4,6 +4,12 @@ import app.k9mail.core.common.mail.toUserEmailAddress import app.k9mail.core.common.net.toHostname import app.k9mail.core.common.net.toPort import app.k9mail.feature.migration.qrcode.domain.entity.AccountData +import app.k9mail.feature.migration.qrcode.payload.FakeDeletePolicyProvider +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadAdapter +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadMapper +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadParser +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadValidator +import app.k9mail.legacy.account.Account import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isNotNull @@ -12,7 +18,13 @@ import kotlin.test.Test @Suppress("LongMethod") class QrCodePayloadReaderTest { - private val reader = QrCodePayloadReader() + private val reader = QrCodePayloadReader( + parser = QrCodePayloadParser(QrCodePayloadAdapter()), + mapper = QrCodePayloadMapper( + qrCodePayloadValidator = QrCodePayloadValidator(), + deletePolicyProvider = FakeDeletePolicyProvider(), + ), + ) @Test fun `one account, one identity, no passwords`() { @@ -30,6 +42,7 @@ class QrCodePayloadReaderTest { accounts = listOf( AccountData.Account( accountName = "My Account", + deletePolicy = FakeDeletePolicyProvider.DELETE_POLICY, incomingServer = AccountData.IncomingServer( protocol = AccountData.IncomingServerProtocol.Imap, hostname = "imap.domain.example".toHostname(), @@ -85,6 +98,7 @@ class QrCodePayloadReaderTest { accounts = listOf( AccountData.Account( accountName = "user@domain.example", + deletePolicy = FakeDeletePolicyProvider.DELETE_POLICY, incomingServer = AccountData.IncomingServer( protocol = AccountData.IncomingServerProtocol.Imap, hostname = "imap.domain.example".toHostname(), @@ -120,6 +134,7 @@ class QrCodePayloadReaderTest { ), AccountData.Account( accountName = "user@company.example", + deletePolicy = FakeDeletePolicyProvider.DELETE_POLICY, incomingServer = AccountData.IncomingServer( protocol = AccountData.IncomingServerProtocol.Imap, hostname = "imap.company.example".toHostname(), diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/FakeDeletePolicyProvider.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/FakeDeletePolicyProvider.kt new file mode 100644 index 00000000000..f3c78453056 --- /dev/null +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/FakeDeletePolicyProvider.kt @@ -0,0 +1,14 @@ +package app.k9mail.feature.migration.qrcode.payload + +import app.k9mail.legacy.account.Account.DeletePolicy +import com.fsck.k9.account.DeletePolicyProvider + +class FakeDeletePolicyProvider : DeletePolicyProvider { + override fun getDeletePolicy(accountType: String): DeletePolicy { + return DELETE_POLICY + } + + companion object { + val DELETE_POLICY = DeletePolicy.ON_DELETE + } +} diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapperTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapperTest.kt index 92a025708f8..e8a58d9e1d9 100644 --- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapperTest.kt +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadMapperTest.kt @@ -5,6 +5,7 @@ import app.k9mail.core.common.net.toHostname import app.k9mail.core.common.net.toPort import app.k9mail.feature.migration.qrcode.domain.entity.AccountData import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.ConnectionSecurity +import app.k9mail.legacy.account.Account import assertk.assertThat import assertk.assertions.first import assertk.assertions.isEqualTo @@ -13,7 +14,10 @@ import assertk.assertions.prop import kotlin.test.Test class QrCodePayloadMapperTest { - private val mapper = QrCodePayloadMapper() + private val mapper = QrCodePayloadMapper( + qrCodePayloadValidator = QrCodePayloadValidator(), + deletePolicyProvider = FakeDeletePolicyProvider(), + ) @Test fun `valid input should be mapped to expected output`() { @@ -111,6 +115,7 @@ class QrCodePayloadMapperTest { accounts = listOf( AccountData.Account( accountName = "Account name", + deletePolicy = FakeDeletePolicyProvider.DELETE_POLICY, incomingServer = AccountData.IncomingServer( protocol = AccountData.IncomingServerProtocol.Imap, hostname = "imap.domain.example".toHostname(), diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParserTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParserTest.kt index 4555123133e..7b7837e666c 100644 --- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParserTest.kt +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/payload/QrCodePayloadParserTest.kt @@ -8,7 +8,7 @@ import kotlin.test.Test @Suppress("LongMethod") class QrCodePayloadParserTest { - private val parser = QrCodePayloadParser() + private val parser = QrCodePayloadParser(QrCodePayloadAdapter()) @Test fun `one account, one identity, no account name, no passwords`() { diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriterTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriterTest.kt index da9962acd50..51c1b09169d 100644 --- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriterTest.kt +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/settings/XmlSettingWriterTest.kt @@ -5,6 +5,8 @@ import app.k9mail.core.common.net.toHostname import app.k9mail.core.common.net.toPort import app.k9mail.feature.migration.qrcode.domain.entity.AccountData import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.ConnectionSecurity +import app.k9mail.legacy.account.Account +import app.k9mail.legacy.account.Account.DeletePolicy import assertk.assertThat import assertk.assertions.isEqualTo import kotlin.test.Test @@ -36,6 +38,7 @@ class XmlSettingWriterTest { companion object { private val ACCOUNT = AccountData.Account( accountName = "Account name", + deletePolicy = DeletePolicy.ON_DELETE, incomingServer = AccountData.IncomingServer( protocol = AccountData.IncomingServerProtocol.Imap, hostname = "imap.domain.example".toHostname(), @@ -73,6 +76,9 @@ class XmlSettingWriterTest { Account name + + DELETE + imap.domain.example 993 diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt index 08879ad2d04..057656ee9e2 100644 --- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt +++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt @@ -8,6 +8,11 @@ import app.k9mail.core.ui.compose.testing.mvi.runMviTest import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodePayloadReader +import app.k9mail.feature.migration.qrcode.payload.FakeDeletePolicyProvider +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadAdapter +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadMapper +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadParser +import app.k9mail.feature.migration.qrcode.payload.QrCodePayloadValidator import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.DisplayText import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Effect import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Event @@ -135,7 +140,13 @@ private class QrCodeScannerScreenRobot( ) { private val qrCodeSettingsWriter = FakeQrCodeSettingsWriter() private val viewModel = QrCodeScannerViewModel( - qrCodePayloadReader = QrCodePayloadReader(), + qrCodePayloadReader = QrCodePayloadReader( + parser = QrCodePayloadParser(QrCodePayloadAdapter()), + mapper = QrCodePayloadMapper( + qrCodePayloadValidator = QrCodePayloadValidator(), + deletePolicyProvider = FakeDeletePolicyProvider(), + ), + ), qrCodeSettingsWriter = qrCodeSettingsWriter, createCameraUseCaseProvider = { listener -> qrCodeListener = listener diff --git a/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt b/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt index 88c162a2226..ecf8564d4dc 100644 --- a/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt +++ b/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt @@ -33,6 +33,7 @@ class AccountCreator( private val preferences: Preferences, private val context: Context, private val messagingController: MessagingController, + private val deletePolicyProvider: DeletePolicyProvider, private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : AccountSetupExternalContract.AccountCreator { @@ -67,7 +68,7 @@ class AccountCreator( newAccount.automaticCheckIntervalMinutes = account.options.checkFrequencyInMinutes newAccount.displayCount = account.options.messageDisplayCount - newAccount.deletePolicy = DeletePolicyHelper.getDefaultDeletePolicy(newAccount.incomingServerSettings.type) + newAccount.deletePolicy = deletePolicyProvider.getDeletePolicy(newAccount.incomingServerSettings.type) newAccount.chipColor = accountColorPicker.pickColor() localFoldersCreator.createSpecialLocalFolders(newAccount) diff --git a/legacy/common/src/main/java/com/fsck/k9/account/AccountModule.kt b/legacy/common/src/main/java/com/fsck/k9/account/AccountModule.kt index 7977ace46e3..36709fd2ab2 100644 --- a/legacy/common/src/main/java/com/fsck/k9/account/AccountModule.kt +++ b/legacy/common/src/main/java/com/fsck/k9/account/AccountModule.kt @@ -27,6 +27,7 @@ val newAccountModule = module { localFoldersCreator = get(), preferences = get(), context = androidApplication(), + deletePolicyProvider = get(), messagingController = get(), ) } @@ -50,4 +51,6 @@ val newAccountModule = module { messagingController = get(), ) } + + factory { DefaultDeletePolicyProvider() } } diff --git a/legacy/common/src/main/java/com/fsck/k9/account/DefaultDeletePolicyProvider.kt b/legacy/common/src/main/java/com/fsck/k9/account/DefaultDeletePolicyProvider.kt new file mode 100644 index 00000000000..f95b72cde78 --- /dev/null +++ b/legacy/common/src/main/java/com/fsck/k9/account/DefaultDeletePolicyProvider.kt @@ -0,0 +1,15 @@ +package com.fsck.k9.account + +import app.k9mail.core.common.mail.Protocols +import app.k9mail.legacy.account.Account.DeletePolicy + +class DefaultDeletePolicyProvider : DeletePolicyProvider { + override fun getDeletePolicy(accountType: String): DeletePolicy { + return when (accountType) { + Protocols.IMAP -> DeletePolicy.ON_DELETE + Protocols.POP3 -> DeletePolicy.NEVER + "demo" -> DeletePolicy.ON_DELETE + else -> throw AssertionError("Unhandled case: $accountType") + } + } +} diff --git a/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyHelper.kt b/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyHelper.kt deleted file mode 100644 index a42f097135d..00000000000 --- a/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyHelper.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.fsck.k9.account - -import app.k9mail.core.common.mail.Protocols -import app.k9mail.legacy.account.Account - -object DeletePolicyHelper { - fun getDefaultDeletePolicy(type: String): Account.DeletePolicy { - return when (type) { - Protocols.IMAP -> Account.DeletePolicy.ON_DELETE - Protocols.POP3 -> Account.DeletePolicy.NEVER - "demo" -> Account.DeletePolicy.ON_DELETE - else -> throw AssertionError("Unhandled case: $type") - } - } -} diff --git a/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyProvider.kt b/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyProvider.kt new file mode 100644 index 00000000000..99f85904fd3 --- /dev/null +++ b/legacy/common/src/main/java/com/fsck/k9/account/DeletePolicyProvider.kt @@ -0,0 +1,16 @@ +package com.fsck.k9.account + +import app.k9mail.core.common.mail.Protocols +import app.k9mail.legacy.account.Account.DeletePolicy + +/** + * Decides which [DeletePolicy] an account uses by default. + */ +interface DeletePolicyProvider { + /** + * Returns the [DeletePolicy] an account of type [accountType] should use by default. + * + * @param accountType The protocol identifier of the incoming server of an account. See [Protocols]. + */ + fun getDeletePolicy(accountType: String): DeletePolicy +} diff --git a/legacy/common/src/test/java/com/fsck/k9/account/DefaultDeletePolicyProviderTest.kt b/legacy/common/src/test/java/com/fsck/k9/account/DefaultDeletePolicyProviderTest.kt new file mode 100644 index 00000000000..616ce860ffb --- /dev/null +++ b/legacy/common/src/test/java/com/fsck/k9/account/DefaultDeletePolicyProviderTest.kt @@ -0,0 +1,41 @@ +package com.fsck.k9.account + +import app.k9mail.core.common.mail.Protocols +import app.k9mail.legacy.account.Account +import assertk.assertFailure +import assertk.assertThat +import assertk.assertions.isEqualTo +import assertk.assertions.isInstanceOf +import org.junit.Test + +class DefaultDeletePolicyProviderTest { + private val deletePolicyProvider = DefaultDeletePolicyProvider() + + @Test + fun `getDeletePolicy with IMAP should return ON_DELETE`() { + val result = deletePolicyProvider.getDeletePolicy(Protocols.IMAP) + + assertThat(result).isEqualTo(Account.DeletePolicy.ON_DELETE) + } + + @Test + fun `getDeletePolicy with POP3 should return NEVER`() { + val result = deletePolicyProvider.getDeletePolicy(Protocols.POP3) + + assertThat(result).isEqualTo(Account.DeletePolicy.NEVER) + } + + @Test + fun `getDeletePolicy with demo should return ON_DELETE`() { + val result = deletePolicyProvider.getDeletePolicy("demo") + + assertThat(result).isEqualTo(Account.DeletePolicy.ON_DELETE) + } + + @Test + fun `getDeletePolicy with SMTP should fail`() { + assertFailure { + deletePolicyProvider.getDeletePolicy(Protocols.SMTP) + }.isInstanceOf() + } +} diff --git a/legacy/common/src/test/java/com/fsck/k9/account/DeletePolicyHelperTest.kt b/legacy/common/src/test/java/com/fsck/k9/account/DeletePolicyHelperTest.kt deleted file mode 100644 index 6f5e7feef2d..00000000000 --- a/legacy/common/src/test/java/com/fsck/k9/account/DeletePolicyHelperTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.fsck.k9.account - -import app.k9mail.core.common.mail.Protocols -import app.k9mail.legacy.account.Account -import assertk.assertFailure -import assertk.assertThat -import assertk.assertions.isEqualTo -import assertk.assertions.isInstanceOf -import org.junit.Test - -class DeletePolicyHelperTest { - - @Test - fun `getDefaultDeletePolicy with IMAP should return ON_DELETE`() { - val result = DeletePolicyHelper.getDefaultDeletePolicy(Protocols.IMAP) - - assertThat(result).isEqualTo(Account.DeletePolicy.ON_DELETE) - } - - @Test - fun `getDefaultDeletePolicy with POP3 should return NEVER`() { - val result = DeletePolicyHelper.getDefaultDeletePolicy(Protocols.POP3) - - assertThat(result).isEqualTo(Account.DeletePolicy.NEVER) - } - - @Test - fun `getDefaultDeletePolicy with demo should return ON_DELETE`() { - val result = DeletePolicyHelper.getDefaultDeletePolicy("demo") - - assertThat(result).isEqualTo(Account.DeletePolicy.ON_DELETE) - } - - @Test - fun `getDefaultDeletePolicy with SMTP should fail`() { - assertFailure { - DeletePolicyHelper.getDefaultDeletePolicy(Protocols.SMTP) - }.isInstanceOf() - } -}