Repo created

This commit is contained in:
Fr4nz D13trich 2025-11-22 13:56:56 +01:00
parent 75dc487a7a
commit 39c29d175b
6317 changed files with 388324 additions and 2 deletions

View file

@ -0,0 +1,10 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ForbiddenComment:BackendFolder.kt$BackendFolder$// FIXME: add documentation</ID>
<ID>TooManyFunctions:Backend.kt$Backend</ID>
<ID>TooManyFunctions:BackendFolder.kt$BackendFolder</ID>
<ID>TooManyFunctions:SyncListener.kt$SyncListener</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>TooManyFunctions:DemoBackend.kt$DemoBackend : Backend</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CyclomaticComplexMethod:ImapSync.kt$ImapSync$private fun synchronizeMailboxSynchronous(folder: String, syncConfig: SyncConfig, listener: SyncListener)</ID>
<ID>LongMethod:ImapSync.kt$ImapSync$private fun downloadMessages( syncConfig: SyncConfig, remoteFolder: ImapFolder, backendFolder: BackendFolder, inputMessages: List&lt;ImapMessage&gt;, highestKnownUid: Long?, listener: SyncListener, )</ID>
<ID>LongMethod:ImapSync.kt$ImapSync$private fun synchronizeMailboxSynchronous(folder: String, syncConfig: SyncConfig, listener: SyncListener)</ID>
<ID>LongParameterList:ImapSync.kt$ImapSync$( remoteFolder: ImapFolder, backendFolder: BackendFolder, largeMessages: List&lt;ImapMessage&gt;, progress: AtomicInteger, downloadedMessageCount: AtomicInteger, todo: Int, highestKnownUid: Long?, listener: SyncListener, maxDownloadSize: Int, )</ID>
<ID>LongParameterList:ImapSync.kt$ImapSync$( remoteFolder: ImapFolder, backendFolder: BackendFolder, smallMessages: List&lt;ImapMessage&gt;, progress: AtomicInteger, downloadedMessageCount: AtomicInteger, todo: Int, highestKnownUid: Long?, listener: SyncListener, )</ID>
<ID>LongParameterList:ImapSync.kt$ImapSync$( syncConfig: SyncConfig, remoteFolder: ImapFolder, unsyncedMessages: List&lt;ImapMessage&gt;, smallMessages: MutableList&lt;ImapMessage&gt;, largeMessages: MutableList&lt;ImapMessage&gt;, progress: AtomicInteger, todo: Int, listener: SyncListener, )</ID>
<ID>MagicNumber:ImapBackendPusher.kt$ImapBackendPusher$1000L</ID>
<ID>MagicNumber:ImapBackendPusher.kt$ImapBackendPusher$15</ID>
<ID>MagicNumber:ImapBackendPusher.kt$ImapBackendPusher$60</ID>
<ID>MaxLineLength:ImapSync.kt$ImapSync.&lt;no name provided&gt;$// TODO: This might be the source of poll count errors in the UI. Is todo always the same as ofTotal</ID>
<ID>NestedBlockDepth:ImapSync.kt$ImapSync$private fun synchronizeMailboxSynchronous(folder: String, syncConfig: SyncConfig, listener: SyncListener)</ID>
<ID>ReturnCount:ImapSync.kt$ImapSync$private fun isOldMessage(messageServerId: String, highestKnownUid: Long?): Boolean</ID>
<ID>ReturnCount:ImapSync.kt$ImapSync$private fun syncFlags(syncConfig: SyncConfig, backendFolder: BackendFolder, remoteMessage: ImapMessage): Boolean</ID>
<ID>ReturnCount:UidReverseComparator.kt$UidReverseComparator$override fun compare(messageLeft: Message, messageRight: Message): Int</ID>
<ID>TooGenericExceptionCaught:ImapFolderPusher.kt$ImapFolderPusher$e: Exception</ID>
<ID>TooGenericExceptionCaught:ImapSync.kt$ImapSync$e: Exception</ID>
<ID>TooGenericExceptionCaught:ImapSync.kt$ImapSync.&lt;no name provided&gt;$e: Exception</ID>
<ID>TooGenericExceptionThrown:ImapSync.kt$ImapSync$throw Exception("Message count $remoteMessageCount for folder $folder")</ID>
<ID>TooManyFunctions:ImapBackend.kt$ImapBackend : Backend</ID>
<ID>TooManyFunctions:ImapBackendPusher.kt$ImapBackendPusher : BackendPusherImapPusherCallback</ID>
<ID>TooManyFunctions:ImapSync.kt$ImapSync</ID>
<ID>TooManyFunctions:SimpleSyncListener.kt$SimpleSyncListener : SyncListener</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ForbiddenComment:CommandSync.kt$CommandSync$// FIXME: Add sort parameter</ID>
<ID>ReturnCount:JmapAccountDiscovery.kt$JmapAccountDiscovery$fun discover(emailAddress: String, password: String): JmapDiscoveryResult</ID>
<ID>SwallowedException:JmapAccountDiscovery.kt$JmapAccountDiscovery$e: EndpointNotFoundException</ID>
<ID>SwallowedException:JmapAccountDiscovery.kt$JmapAccountDiscovery$e: UnauthorizedException</ID>
<ID>SwallowedException:JmapAccountDiscovery.kt$JmapAccountDiscovery$e: UnknownHostException</ID>
<ID>ThrowsCount:CommandRefreshFolderList.kt$CommandRefreshFolderList$fun refreshFolderList()</ID>
<ID>TooGenericExceptionCaught:CommandRefreshFolderList.kt$CommandRefreshFolderList$e: Exception</ID>
<ID>TooGenericExceptionCaught:CommandSync.kt$CommandSync$e: Exception</ID>
<ID>TooGenericExceptionCaught:JmapAccountDiscovery.kt$JmapAccountDiscovery$e: Exception</ID>
<ID>TooManyFunctions:CommandSync.kt$CommandSync</ID>
<ID>TooManyFunctions:JmapBackend.kt$JmapBackend : Backend</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>TooManyFunctions:Pop3Backend.kt$Pop3Backend : Backend</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>MagicNumber:InMemoryBackendFolder.kt$InMemoryBackendFolder$25</ID>
<ID>TooManyFunctions:InMemoryBackendFolder.kt$InMemoryBackendFolder : BackendFolder</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>MatchingDeclarationName:Main.kt$HtmlCleaner : CliktCommand</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$AccountOAuthView( onOAuthResult = { result -&gt; onEvent(Event.OnOAuthResult(result)) }, viewModel = oAuthViewModel, isEnabled = isAutoDiscoverySettingsTrusted || isConfigurationApproved, )</ID>
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$AutoDiscoveryContent( state = state, onEvent = onEvent, oAuthViewModel = oAuthViewModel, )</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>MagicNumber:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$143</ID>
<ID>MagicNumber:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$465</ID>
<ID>MagicNumber:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$587</ID>
<ID>MagicNumber:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$993</ID>
<ID>NestedBlockDepth:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$private fun parseProviders(xml: XmlResourceParser, domain: String): Provider?</ID>
<ID>ReturnCount:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$override fun discover(email: String): DiscoveryResults?</ID>
<ID>ReturnCount:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$private fun Provider.toIncomingServerSettings(email: String): DiscoveredServerSettings?</ID>
<ID>ReturnCount:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$private fun Provider.toOutgoingServerSettings(email: String): DiscoveredServerSettings?</ID>
<ID>TooGenericExceptionCaught:ProvidersXmlDiscovery.kt$ProvidersXmlDiscovery$e: Exception</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>LongMethod:SrvServiceDiscoveryTest.kt$SrvServiceDiscoveryTest$@Test fun discover_withRequiredServices_shouldCorrectlyPrioritize()</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CyclomaticComplexMethod:SettingsImportFragment.kt$SettingsImportFragment$private fun ViewHolder.updateUi(model: SettingsImportUiModel)</ID>
<ID>MagicNumber:SettingsImportListItems.kt$ImportListItem$3</ID>
<ID>MagicNumber:SettingsImportListItems.kt$ImportListItem$4</ID>
<ID>SwallowedException:AuthViewModel.kt$AuthViewModel$e: ActivityNotFoundException</ID>
<ID>TooGenericExceptionCaught:AuthViewModel.kt$AuthViewModel$e: Exception</ID>
<ID>TooGenericExceptionCaught:SettingsImportViewModel.kt$SettingsImportViewModel$e: Exception</ID>
<ID>TooManyFunctions:SettingsImportFragment.kt$SettingsImportFragment : Fragment</ID>
<ID>TooManyFunctions:SettingsImportUiModel.kt$SettingsImportUiModel</ID>
<ID>TooManyFunctions:SettingsImportViewModel.kt$SettingsImportViewModel : ViewModel</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>TooManyFunctions:K9CoreResourceProvider.kt$K9CoreResourceProvider : CoreResourceProvider</ID>
<ID>TooManyFunctions:K9NotificationActionCreator.kt$K9NotificationActionCreator : NotificationActionCreator</ID>
<ID>TooManyFunctions:K9NotificationResourceProvider.kt$K9NotificationResourceProvider : NotificationResourceProvider</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,100 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CastToNullableType:SettingsExporter.kt$SettingsExporter$as</ID>
<ID>CyclomaticComplexMethod:HttpUriParser.kt$HttpUriParser$private fun tryMatchIpv6Address(text: CharSequence, startPos: Int): Int</ID>
<ID>ForbiddenComment:K9BackendFolderTest.kt$K9BackendFolderTest$// FIXME: This is a hack to get Preferences into a state where it's safe to call newAccount()</ID>
<ID>ForbiddenComment:K9BackendStorageTest.kt$K9BackendStorageTest$// FIXME: This is a hack to get Preferences into a state where it's safe to call newAccount()</ID>
<ID>FunctionOnlyReturningConstant:DisplayHtml.kt$DisplayHtml$private fun cssStyleSignature(): String</ID>
<ID>LongMethod:MessageListRepositoryTest.kt$MessageListRepositoryTest$@Test fun `getThread() should use flag values from the cache`()</ID>
<ID>LongMethod:TextBodyBuilderTest.kt$TextBodyBuilderTest.Companion$@JvmStatic @Parameterized.Parameters(name = "{index}: {0}") fun data(): Collection&lt;TestData&gt;</ID>
<ID>LoopWithTooManyJumpStatements:HttpUriParser.kt$HttpUriParser$while</ID>
<ID>LoopWithTooManyJumpStatements:SettingsExporter.kt$SettingsExporter$for</ID>
<ID>MagicNumber:AccountPreferenceSerializer.kt$AccountPreferenceSerializer$10</ID>
<ID>MagicNumber:AccountPreferenceSerializer.kt$AccountPreferenceSerializer$24</ID>
<ID>MagicNumber:AccountPreferenceSerializer.kt$AccountPreferenceSerializer$5</ID>
<ID>MagicNumber:CollectionExtensions.kt$0.75F</ID>
<ID>MagicNumber:CollectionExtensions.kt$3</ID>
<ID>MagicNumber:EmailTextToHtml.kt$EmailTextToHtml$3</ID>
<ID>MagicNumber:EmailTextToHtml.kt$EmailTextToHtml$4</ID>
<ID>MagicNumber:EmailTextToHtml.kt$EmailTextToHtml$5</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$10</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$255</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$4</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$5</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$6</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$65535</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$7</ID>
<ID>MagicNumber:HttpUriParser.kt$HttpUriParser$8</ID>
<ID>MagicNumber:MailSyncWorkerManager.kt$MailSyncWorkerManager$1000L</ID>
<ID>MagicNumber:MailSyncWorkerManager.kt$MailSyncWorkerManager$60L</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0x0000FF</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0x00FF00</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0x00FFFF</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0x00FFFFFF</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0xFF0000</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0xFF00FF</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0xFFFF00</ID>
<ID>MagicNumber:NotificationLightDecoder.kt$NotificationLightDecoder$0xFFFFFF</ID>
<ID>MagicNumber:ServerSettingsSerializer.kt$ServerSettingsAdapter$3</ID>
<ID>MagicNumber:ServerSettingsSerializer.kt$ServerSettingsAdapter$4</ID>
<ID>MagicNumber:ServerSettingsSerializer.kt$ServerSettingsAdapter$5</ID>
<ID>MagicNumber:ServerSettingsSerializer.kt$ServerSettingsAdapter$6</ID>
<ID>MagicNumber:ServerSettingsSerializer.kt$ServerSettingsAdapter$7</ID>
<ID>MagicNumber:SettingsExporter.kt$SettingsExporter$3</ID>
<ID>MagicNumber:TimberLogger.kt$TimberLogger$26</ID>
<ID>MayBeConst:SummaryNotificationDataCreatorTest.kt$private val TIMESTAMP = 0L</ID>
<ID>MemberNameEqualsClassName:HtmlModification.kt$HtmlModification.Replace$abstract fun replace(textToHtml: TextToHtml)</ID>
<ID>NestedBlockDepth:HttpUriParser.kt$HttpUriParser$private fun tryMatchIpv6Address(text: CharSequence, startPos: Int): Int</ID>
<ID>NestedBlockDepth:SettingsExporter.kt$SettingsExporter$private fun writeIdentity( serializer: XmlSerializer, accountUuid: String, identity: String, prefs: Map&lt;String, Any&gt;, )</ID>
<ID>NestedBlockDepth:SingleMessageNotificationCreator.kt$SingleMessageNotificationCreator$private fun NotificationBuilder.setWearActions(notificationData: SingleNotificationData)</ID>
<ID>ReturnCount:AutocryptDraftStateHeaderParser.kt$AutocryptDraftStateHeaderParser$fun parseAutocryptDraftStateHeader(headerValue: String): AutocryptDraftStateHeader?</ID>
<ID>ReturnCount:EmailSection.kt$EmailSection$override fun subSequence(startIndex: Int, endIndex: Int): CharSequence</ID>
<ID>ReturnCount:HtmlSignatureRemover.kt$HtmlSignatureRemover.StripSignatureFilter$override fun head(node: Node, depth: Int): HeadFilterDecision</ID>
<ID>ReturnCount:HtmlSignatureRemover.kt$HtmlSignatureRemover.StripSignatureFilter$private fun Node.findPrecedingLineBreak(): Node?</ID>
<ID>ReturnCount:HtmlSignatureRemover.kt$HtmlSignatureRemover.StripSignatureFilter$private fun Node.isFollowedByLineBreak(): Boolean</ID>
<ID>ReturnCount:HttpUriParser.kt$HttpUriParser$override fun parseUri(text: CharSequence, startPos: Int): UriMatch?</ID>
<ID>ReturnCount:HttpUriParser.kt$HttpUriParser$private fun tryMatchAuthority(text: CharSequence, startPos: Int): Int</ID>
<ID>ReturnCount:HttpUriParser.kt$HttpUriParser$private fun tryMatchDomainName(text: CharSequence, startPos: Int): Int</ID>
<ID>ReturnCount:HttpUriParser.kt$HttpUriParser$private fun tryMatchIpv4Address(text: CharSequence, startPos: Int, portAllowed: Boolean): Int</ID>
<ID>ReturnCount:HttpUriParser.kt$HttpUriParser$private fun tryMatchIpv6Address(text: CharSequence, startPos: Int): Int</ID>
<ID>ReturnCount:ListUnsubscribeHelper.kt$ListUnsubscribeHelper$fun getPreferredListUnsubscribeUri(message: Message): UnsubscribeUri?</ID>
<ID>ReturnCount:ListUnsubscribeHelper.kt$ListUnsubscribeHelper$private fun extractUri(headerValue: String?): Uri?</ID>
<ID>ReturnCount:MailSyncWorker.kt$MailSyncWorker$override fun doWork(): Result</ID>
<ID>ReturnCount:MessageHelper.kt$MessageHelper.Companion$@JvmStatic fun toFriendly( address: Address, contactRepository: ContactRepository?, showCorrespondentNames: Boolean, changeContactNameColor: Boolean, contactNameColor: Int, ): CharSequence</ID>
<ID>ReturnCount:MessageRepository.kt$MessageRepository$private fun List&lt;Header&gt;.parseDate(headerName: String): MessageDate</ID>
<ID>ReturnCount:PreviewTextExtractor.kt$PreviewTextExtractor$private fun extractUnquotedText(text: String): String</ID>
<ID>ReturnCount:TextPartFinder.kt$TextPartFinder$private fun findTextPartInMultipart(multipart: Multipart): Part?</ID>
<ID>ReturnCount:TextPartFinder.kt$TextPartFinder$private fun findTextPartInMultipartAlternative(multipart: Multipart): Part?</ID>
<ID>SwallowedException:MessageRepository.kt$MessageRepository$e: Exception</ID>
<ID>SwallowedException:QuoteDateFormatter.kt$QuoteDateFormatter$e: Exception</ID>
<ID>SwallowedException:SettingsExporter.kt$SettingsExporter$e: InvalidSettingValueException</ID>
<ID>ThrowingExceptionsWithoutMessageOrCause:TimberLogger.kt$TimberLogger$Throwable()</ID>
<ID>TooGenericExceptionCaught:BootCompleteReceiver.kt$BootCompleteManager$e: Exception</ID>
<ID>TooGenericExceptionCaught:K9.kt$K9$e: Exception</ID>
<ID>TooGenericExceptionCaught:MessageRepository.kt$MessageRepository$e: Exception</ID>
<ID>TooGenericExceptionCaught:PushServiceManager.kt$PushServiceManager$e: Exception</ID>
<ID>TooGenericExceptionCaught:QuoteDateFormatter.kt$QuoteDateFormatter$e: Exception</ID>
<ID>TooGenericExceptionCaught:SettingsExporter.kt$SettingsExporter$e: Exception</ID>
<ID>TooManyFunctions:CoreResourceProvider.kt$CoreResourceProvider</ID>
<ID>TooManyFunctions:HttpUriParser.kt$HttpUriParser : UriParser</ID>
<ID>TooManyFunctions:K9.kt$K9 : KoinComponent</ID>
<ID>TooManyFunctions:K9BackendFolder.kt$K9BackendFolder : BackendFolder</ID>
<ID>TooManyFunctions:MessageListCache.kt$MessageListCache</ID>
<ID>TooManyFunctions:NotificationActionCreator.kt$NotificationActionCreator</ID>
<ID>TooManyFunctions:NotificationChannelManager.kt$NotificationChannelManager</ID>
<ID>TooManyFunctions:NotificationController.kt$NotificationController</ID>
<ID>TooManyFunctions:NotificationResourceProvider.kt$NotificationResourceProvider</ID>
<ID>TooManyFunctions:NotifierMessageStore.kt$NotifierMessageStore : MessageStore</ID>
<ID>TooManyFunctions:Preferences.kt$Preferences : AccountManager</ID>
<ID>TooManyFunctions:PushController.kt$PushController</ID>
<ID>TooManyFunctions:SettingsExporter.kt$SettingsExporter</ID>
<ID>TooManyFunctions:SingleMessageNotificationCreator.kt$SingleMessageNotificationCreator</ID>
<ID>TooManyFunctions:SummaryNotificationCreator.kt$SummaryNotificationCreator</ID>
<ID>TooManyFunctions:TimberLogger.kt$TimberLogger : Logger</ID>
<ID>UnusedParameter:Contacts.kt$Contacts$addresses: Array&lt;Address?&gt;?</ID>
<ID>UnusedPrivateProperty:HttpUriParser.kt$HttpUriParser$i</ID>
<ID>UseCheckOrError:OutboxStateRepository.kt$OutboxStateRepository$throw IllegalStateException("No outbox_state entry for message with id $messageId")</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,96 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ComplexCondition:StorageMigrationTo19.kt$StorageMigrationTo19$incomingServerSettings["type"] == "imap" &amp;&amp; incomingServerSettings["host"] in setOf("imap.gmail.com", "imap.googlemail.com") &amp;&amp; incomingServerSettings["authenticationType"] != "XOAUTH2" || outgoingServerSettings["host"] in setOf("smtp.gmail.com", "smtp.googlemail.com") &amp;&amp; outgoingServerSettings["authenticationType"] != "XOAUTH2"</ID>
<ID>CyclomaticComplexMethod:MessagePartDatabaseHelpers.kt$MessagePartEntry$override fun equals(other: Any?): Boolean</ID>
<ID>CyclomaticComplexMethod:MessagePartDatabaseHelpers.kt$MessagePartEntry$override fun hashCode(): Int</ID>
<ID>CyclomaticComplexMethod:Migrations.kt$Migrations$@JvmStatic fun upgradeDatabase(db: SQLiteDatabase, migrationsHelper: MigrationsHelper)</ID>
<ID>LongMethod:CopyMessageOperations.kt$CopyMessageOperations$private fun readMessageToContentValues(database: SQLiteDatabase, messageId: Long): ContentValues</ID>
<ID>LongMethod:CopyMessageOperationsTest.kt$CopyMessageOperationsTest$@Test fun `copy message into an existing thread`()</ID>
<ID>LongMethod:CopyMessageOperationsTest.kt$CopyMessageOperationsTest$@Test fun `copy message that is part of a thread`()</ID>
<ID>LongMethod:MoveMessageOperationsTest.kt$MoveMessageOperationsTest$@Test fun `move message when destination has empty message entry`()</ID>
<ID>LongMethod:RetrieveMessageListOperations.kt$RetrieveMessageListOperations$fun &lt;T&gt; getThreadedMessages( selection: String, selectionArgs: Array&lt;String&gt;, sortOrder: String, mapper: MessageMapper&lt;out T?&gt;, ): List&lt;T&gt;</ID>
<ID>LongMethod:SaveMessageOperationsTest.kt$SaveMessageOperationsTest$@Test fun `save local message`()</ID>
<ID>LongMethod:SaveMessageOperationsTest.kt$SaveMessageOperationsTest$@Test fun `save message with multipart body`()</ID>
<ID>LongMethod:SaveMessageOperationsTest.kt$SaveMessageOperationsTest$@Test fun `save message with text_plain body`()</ID>
<ID>LongMethod:ThreadMessageOperationsTest.kt$ThreadMessageOperationsTest$@Test fun `merge two existing threads`()</ID>
<ID>LongParameterList:CopyMessageOperations.kt$DatabaseMessagePart$( val id: Long, val type: Int, val root: Long, val parent: Long, val seq: Int, val mimeType: String?, val decodedBodySize: Long?, val displayName: String?, val header: ByteArray?, val encoding: String?, val charset: String?, val dataLocation: Int, val data: ByteArray?, val preamble: ByteArray?, val epilogue: ByteArray?, val boundary: String?, val contentId: String?, val serverExtra: String?, )</ID>
<ID>MagicNumber:ChunkedDatabaseOperations.kt$1000</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$10</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$11</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$12</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$13</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$14</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$15</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$16</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$17</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$18</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$19</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$20</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$21</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$3</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$4</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$5</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$6</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$7</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$8</ID>
<ID>MagicNumber:CopyMessageOperations.kt$CopyMessageOperations$9</ID>
<ID>MagicNumber:MigrationTo76.kt$MigrationTo76$25</ID>
<ID>MagicNumber:MigrationTo84.kt$MigrationTo84$3</ID>
<ID>MagicNumber:MigrationTo84.kt$MigrationTo84$4</ID>
<ID>MagicNumber:MigrationTo84.kt$MigrationTo84$5</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$10</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$11</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$12</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$13</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$14</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$15</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$3</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$4</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$5</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$6</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$7</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$8</ID>
<ID>MagicNumber:RetrieveFolderOperations.kt$CursorFolderAccessor$9</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$10</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$11</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$12</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$13</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$14</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$15</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$16</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$17</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$3</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$4</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$5</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$6</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$7</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$8</ID>
<ID>MagicNumber:RetrieveMessageListOperations.kt$CursorMessageAccessor$9</ID>
<ID>MagicNumber:RetrieveMessageOperations.kt$RetrieveMessageOperations$3</ID>
<ID>MagicNumber:RetrieveMessageOperations.kt$RetrieveMessageOperations$4</ID>
<ID>MagicNumber:RetrieveMessageOperations.kt$RetrieveMessageOperations$5</ID>
<ID>MagicNumber:StorageMigrationTo11.kt$StorageMigrationTo11$3</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0x0000FF</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0x00FF00</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0x00FFFF</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0x00FFFFFF</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0xFF0000</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0xFF00FF</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0xFFFF00</ID>
<ID>MagicNumber:StorageMigrationTo17.kt$StorageMigrationTo17$0xFFFFFF</ID>
<ID>MagicNumber:ThreadMessageOperations.kt$ThreadMessageOperations$3</ID>
<ID>MaxLineLength:RetrieveMessageListOperationsTest.kt$RetrieveMessageListOperationsTest$fun</ID>
<ID>ReturnCount:SaveMessageOperationsTest.kt$SaveMessageOperationsTest$private fun Message.getDownloadState(): MessageDownloadState</ID>
<ID>ReturnCount:StorageMigrationTo19.kt$StorageMigrationTo19$private fun markIfGmailAccount(accountUuid: String)</ID>
<ID>SwallowedException:SaveMessageOperations.kt$SaveMessageOperations$e: IOException</ID>
<ID>TooManyFunctions:DeleteMessageOperations.kt$DeleteMessageOperations</ID>
<ID>TooManyFunctions:K9MessageStore.kt$K9MessageStore : MessageStore</ID>
<ID>TooManyFunctions:MigrationTo73.kt$MigrationTo73</ID>
<ID>TooManyFunctions:RetrieveFolderOperations.kt$RetrieveFolderOperations</ID>
<ID>TooManyFunctions:SaveMessageOperations.kt$SaveMessageOperations</ID>
<ID>TooManyFunctions:ThreadMessageOperations.kt$ThreadMessageOperations</ID>
<ID>TooManyFunctions:UpdateFolderOperations.kt$UpdateFolderOperations</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>MagicNumber:AppLanguageManager.kt$AppLanguageManager$3</ID>
<ID>MagicNumber:AppLanguageManager.kt$AppLanguageManager$5</ID>
<ID>MagicNumber:ConfigurationExtensions.kt$24</ID>
<ID>MagicNumber:K9Activity.kt$K9Activity$31</ID>
<ID>SpreadOperator:ConfigurationExtensions.kt$(*locales.toTypedArray())</ID>
<ID>TooGenericExceptionCaught:LiveDataLoader.kt$e: Exception</ID>
<ID>TooGenericExceptionCaught:SystemLocaleManager.kt$SystemLocaleManager$e: Exception</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,152 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CastToNullableType:MessageList.kt$MessageList$as</ID>
<ID>CastToNullableType:MessageViewFragment.kt$MessageViewFragment$as</ID>
<ID>CastToNullableType:VibrationPreference.kt$VibrationPreference$as</ID>
<ID>CyclomaticComplexMethod:AccountSettingsDataStore.kt$AccountSettingsDataStore$override fun getBoolean(key: String, defValue: Boolean): Boolean</ID>
<ID>CyclomaticComplexMethod:AccountSettingsDataStore.kt$AccountSettingsDataStore$override fun getString(key: String, defValue: String?): String?</ID>
<ID>CyclomaticComplexMethod:AccountSettingsDataStore.kt$AccountSettingsDataStore$override fun putBoolean(key: String, value: Boolean)</ID>
<ID>CyclomaticComplexMethod:AccountSettingsDataStore.kt$AccountSettingsDataStore$override fun putString(key: String, value: String?)</ID>
<ID>CyclomaticComplexMethod:GeneralSettingsDataStore.kt$GeneralSettingsDataStore$override fun getBoolean(key: String, defValue: Boolean): Boolean</ID>
<ID>CyclomaticComplexMethod:GeneralSettingsDataStore.kt$GeneralSettingsDataStore$override fun getString(key: String, defValue: String?): String?</ID>
<ID>CyclomaticComplexMethod:GeneralSettingsDataStore.kt$GeneralSettingsDataStore$override fun getStringSet(key: String, defValues: Set&lt;String&gt;?): Set&lt;String&gt;?</ID>
<ID>CyclomaticComplexMethod:GeneralSettingsDataStore.kt$GeneralSettingsDataStore$override fun putBoolean(key: String, value: Boolean)</ID>
<ID>CyclomaticComplexMethod:GeneralSettingsDataStore.kt$GeneralSettingsDataStore$override fun putString(key: String, value: String?)</ID>
<ID>CyclomaticComplexMethod:MessageList.kt$MessageList$private fun decodeExtrasToLaunchData(intent: Intent): LaunchData</ID>
<ID>CyclomaticComplexMethod:MessageList.kt$MessageList$private fun onCustomKeyDown(event: KeyEvent): Boolean</ID>
<ID>CyclomaticComplexMethod:MessageListAdapter.kt$MessageListAdapter$private fun bindMessageViewHolder(holder: MessageViewHolder, messageListItem: MessageListItem)</ID>
<ID>CyclomaticComplexMethod:MessageListFragment.kt$MessageListFragment$override fun onOptionsItemSelected(item: MenuItem): Boolean</ID>
<ID>CyclomaticComplexMethod:MessageViewFragment.kt$MessageViewFragment$override fun onOptionsItemSelected(item: MenuItem): Boolean</ID>
<ID>CyclomaticComplexMethod:SortTypeToastProvider.kt$SortTypeToastProvider$fun getToast(sortType: SortType, ascending: Boolean): Int</ID>
<ID>CyclomaticComplexMethod:TouchInterceptView.kt$TouchInterceptView$private fun handleOnInterceptTouchEvent(event: MotionEvent)</ID>
<ID>ForbiddenComment:MessageDetailsFragment.kt$MessageDetailsFragment$// FIXME: Replace this with a mechanism that survives process death</ID>
<ID>ForbiddenComment:MessageListFragment.kt$MessageListFragment$// FIXME: Don't save the changes in the UI thread</ID>
<ID>ImplicitDefaultLocale:MessageListAdapter.kt$MessageListAdapter$String.format("%d", threadCount)</ID>
<ID>LargeClass:MessageList.kt$MessageList : K9ActivityMessageListFragmentListenerMessageViewFragmentListenerMessageViewContainerListenerOnBackStackChangedListenerOnSwitchCompleteListener</ID>
<ID>LargeClass:MessageListFragment.kt$MessageListFragment : FragmentConfirmationDialogFragmentListenerMessageListItemActionListener</ID>
<ID>LongMethod:MessageContainerView.kt$MessageContainerView$private fun createImageMenu(menu: ContextMenu, imageUrl: String?)</ID>
<ID>LongMethod:MessageList.kt$MessageList$private fun decodeExtrasToLaunchData(intent: Intent): LaunchData</ID>
<ID>LongMethod:MessageList.kt$MessageList$private fun onCustomKeyDown(event: KeyEvent): Boolean</ID>
<ID>LongMethod:MessageListAdapter.kt$MessageListAdapter$private fun bindMessageViewHolder(holder: MessageViewHolder, messageListItem: MessageListItem)</ID>
<ID>LongMethod:MessageViewFragment.kt$MessageViewFragment$override fun onPrepareOptionsMenu(menu: Menu)</ID>
<ID>LongMethod:RecipientNamesView.kt$RecipientNamesView$override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int)</ID>
<ID>LongParameterList:MessageDetailsViewModel.kt$MessageDetailsViewModel$( private val resources: Resources, private val messageRepository: MessageRepository, private val folderRepository: FolderRepository, private val contactSettingsProvider: ContactSettingsProvider, private val contactRepository: ContactRepository, private val contactPermissionResolver: ContactPermissionResolver, private val clipboardManager: ClipboardManager, private val accountManager: AccountManager, private val participantFormatter: MessageDetailsParticipantFormatter, private val folderNameFormatter: FolderNameFormatter, )</ID>
<ID>MagicNumber:AccountItem.kt$AccountItem$200L</ID>
<ID>MagicNumber:AutocryptSetupTransferLiveEvent.kt$AutocryptSetupTransferLiveEvent$2000</ID>
<ID>MagicNumber:ContactLetterBitmapCreator.kt$ContactLetterBitmapCreator$0.65f</ID>
<ID>MagicNumber:ContactLetterBitmapCreator.kt$ContactLetterBitmapCreator$255</ID>
<ID>MagicNumber:MessageContainerView.kt$MessageContainerView$29</ID>
<ID>MagicNumber:MessageListItemAnimator.kt$MessageListItemAnimator$120</ID>
<ID>MagicNumber:MessageListItemMapper.kt$MessageListItemMapper$52</ID>
<ID>MagicNumber:RecipientLayoutCreator.kt$RecipientLayoutCreator$10</ID>
<ID>MagicNumber:RecipientMvpView.kt$RecipientMvpView$100.0f</ID>
<ID>MagicNumber:RecipientMvpView.kt$RecipientMvpView$15</ID>
<ID>MagicNumber:RecipientNamesView.kt$RecipientNamesView$8</ID>
<ID>MagicNumber:ReplyToView.kt$ReplyToView$15</ID>
<ID>MagicNumber:SettingsViewModel.kt$SettingsViewModel$500</ID>
<ID>MagicNumber:SimpleHighlightView.kt$SimpleHighlightView$0xFFFFFF</ID>
<ID>MagicNumber:SimpleHighlightView.kt$SimpleHighlightView$100</ID>
<ID>MagicNumber:SimpleHighlightView.kt$SimpleHighlightView$128</ID>
<ID>MagicNumber:SimpleHighlightView.kt$SimpleHighlightView$80</ID>
<ID>MagicNumber:SizeFormatter.kt$SizeFormatter$1000L</ID>
<ID>MagicNumber:SizeFormatter.kt$SizeFormatter$1000f</ID>
<ID>MagicNumber:SizeFormatter.kt$SizeFormatter$1_000_000L</ID>
<ID>MagicNumber:SizeFormatter.kt$SizeFormatter$999_950L</ID>
<ID>MagicNumber:SizeFormatter.kt$SizeFormatter$999_950_000L</ID>
<ID>MemberNameEqualsClassName:ReplyToView.kt$ReplyToView$private val replyToView: RecipientSelectView = activity.findViewById(R.id.reply_to)</ID>
<ID>NestedBlockDepth:MessageList.kt$MessageList$override fun onBackPressed()</ID>
<ID>NestedBlockDepth:MessageList.kt$MessageList$override fun onOptionsItemSelected(item: MenuItem): Boolean</ID>
<ID>NestedBlockDepth:MessageList.kt$MessageList$private fun decodeExtrasToLaunchData(intent: Intent): LaunchData</ID>
<ID>ReturnCount:ChooseFolderActivity.kt$ChooseFolderActivity$private fun decodeArguments(savedInstanceState: Bundle?): Boolean</ID>
<ID>ReturnCount:EditIdentity.kt$EditIdentity$override fun onOptionsItemSelected(item: MenuItem): Boolean</ID>
<ID>ReturnCount:MessageList.kt$MessageList$private fun decodeExtrasToLaunchData(intent: Intent): LaunchData</ID>
<ID>ReturnCount:MessageList.kt$MessageList$private fun onCustomKeyDown(event: KeyEvent): Boolean</ID>
<ID>ReturnCount:MessageList.kt$MessageList$public override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>ReturnCount:MessageList.kt$MessageList$public override fun onNewIntent(intent: Intent)</ID>
<ID>ReturnCount:MessageListAdapter.kt$MessageListAdapter$private fun buildStatusHolder(forwarded: Boolean, answered: Boolean): Drawable?</ID>
<ID>ReturnCount:MessageListAdapter.kt$MessageListAdapter$private fun calculateSelectionCount(): Int</ID>
<ID>ReturnCount:MessageListFragment.kt$MessageListFragment$override fun onFooterClicked()</ID>
<ID>ReturnCount:MessageListFragment.kt$MessageListFragment$private fun checkCopyOrMovePossible(messages: List&lt;MessageReference&gt;, operation: FolderOperation): Boolean</ID>
<ID>ReturnCount:MessageListFragment.kt$MessageListFragment$private fun isSpecialFolder(specialFolderId: Long?): Boolean</ID>
<ID>ReturnCount:MessageListFragment.kt$MessageListFragment$private fun rememberSortOverride(messageReference: MessageReference?)</ID>
<ID>ReturnCount:MessageListFragment.kt$MessageListFragment$private fun scrollToMessage(messageReference: MessageReference)</ID>
<ID>ReturnCount:MessageListSwipeCallback.kt$MessageListSwipeCallback$override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int</ID>
<ID>ReturnCount:MessageTopView.kt$MessageTopView$private fun shouldShowPicturesFromSender(showPicturesSetting: ShowPictures, message: Message): Boolean</ID>
<ID>ReturnCount:MessageViewFragment.kt$MessageViewFragment$override fun onOptionsItemSelected(item: MenuItem): Boolean</ID>
<ID>ReturnCount:RecipientLayoutCreator.kt$RecipientLayoutCreator$fun createRecipientLayout( recipientNames: List&lt;CharSequence&gt;, totalNumberOfRecipients: Int, availableWidth: Int, ): RecipientLayoutData</ID>
<ID>ReturnCount:RecipientPresenter.kt$RecipientPresenter$fun checkRecipientsOkForSending(): Boolean</ID>
<ID>ReturnCount:RecipientPresenter.kt$RecipientPresenter$private fun toggleEncryptionState(showGotIt: Boolean)</ID>
<ID>ReturnCount:ShareIntentBuilder.kt$ShareIntentBuilder$private fun extractBodyText(message: LocalMessage): String</ID>
<ID>ReturnCount:TouchInterceptView.kt$TouchInterceptView$private fun handleOnInterceptTouchEvent(event: MotionEvent)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*Address.parse(trustId))</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*bccAddresses)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*ccAddresses)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*mailTo.bcc)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*mailTo.cc)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*mailTo.to)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*message.getRecipients(RecipientType.BCC))</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*message.getRecipients(RecipientType.CC))</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*message.getRecipients(RecipientType.TO))</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*replyToAddresses.cc)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*replyToAddresses.to)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter$(*toAddresses)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter.&lt;no name provided&gt;$(*recipientArray)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter.&lt;no name provided&gt;$(context, account.openPgpProvider, *alwaysBccAddresses)</ID>
<ID>SpreadOperator:RecipientPresenter.kt$RecipientPresenter.&lt;no name provided&gt;$(recipientType, *recipientArray)</ID>
<ID>SpreadOperator:ReplyToView.kt$ReplyToView$(*recipients)</ID>
<ID>SwallowedException:AboutFragment.kt$e: ActivityNotFoundException</ID>
<ID>SwallowedException:ContactPictureLoader.kt$ContactPictureLoader$e: Exception</ID>
<ID>SwallowedException:MessageContainerView.kt$MessageContainerView$e: ActivityNotFoundException</ID>
<ID>SwallowedException:MessageDetailsViewModel.kt$MessageDetailsViewModel$e: Exception</ID>
<ID>SwallowedException:MessageListFragment.kt$MessageListFragment$e: ClassCastException</ID>
<ID>SwallowedException:MessageListFragment.kt$MessageListFragment$e: MessagingException</ID>
<ID>SwallowedException:MessageViewContainerFragment.kt$MessageViewContainerFragment$e: ClassCastException</ID>
<ID>SwallowedException:MessageViewFragment.kt$MessageViewFragment$e: ActivityNotFoundException</ID>
<ID>SwallowedException:MessageViewFragment.kt$MessageViewFragment$e: ClassCastException</ID>
<ID>SwallowedException:PushInfoFragment.kt$PushInfoFragment$e: ActivityNotFoundException</ID>
<ID>SwallowedException:SettingsListFragment.kt$SettingsListFragment$e: ActivityNotFoundException</ID>
<ID>TooGenericExceptionCaught:AccountRemover.kt$AccountRemover$e: Exception</ID>
<ID>TooGenericExceptionCaught:AutocryptSetupTransferLiveEvent.kt$AutocryptSetupTransferLiveEvent$e: Exception</ID>
<ID>TooGenericExceptionCaught:ContactPhotoLoader.kt$ContactPhotoLoader$e: Exception</ID>
<ID>TooGenericExceptionCaught:ContactPictureLoader.kt$ContactPictureLoader$e: Exception</ID>
<ID>TooGenericExceptionCaught:GeneralSettingsViewModel.kt$GeneralSettingsViewModel$e: Exception</ID>
<ID>TooGenericExceptionCaught:MessageDetailsViewModel.kt$MessageDetailsViewModel$e: Exception</ID>
<ID>TooGenericExceptionCaught:MessageListFragment.kt$MessageListFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:MessageListLoader.kt$MessageListLoader$e: Exception</ID>
<ID>TooGenericExceptionCaught:SettingsExportViewModel.kt$SettingsExportViewModel$e: Exception</ID>
<ID>TooGenericExceptionThrown:AccountSettingsActivity.kt$AccountSettingsActivity$throw RuntimeException("getSupportActionBar() == null")</ID>
<ID>TooGenericExceptionThrown:GeneralSettingsActivity.kt$GeneralSettingsActivity$throw RuntimeException("getSupportActionBar() == null")</ID>
<ID>TooGenericExceptionThrown:MessageListFragment.kt$MessageListFragment$throw RuntimeException("Called showDialog(int) with unknown dialog id.")</ID>
<ID>TooGenericExceptionThrown:MessageViewFragment.kt$MessageViewFragment$throw RuntimeException("Called showDialog(int) with unknown dialog id.")</ID>
<ID>TooManyFunctions:AccountSettingsDataStore.kt$AccountSettingsDataStore : PreferenceDataStore</ID>
<ID>TooManyFunctions:AccountSettingsFragment.kt$AccountSettingsFragment : PreferenceFragmentCompatConfirmationDialogFragmentListener</ID>
<ID>TooManyFunctions:AutocryptKeyTransferActivity.kt$AutocryptKeyTransferActivity : K9Activity</ID>
<ID>TooManyFunctions:ChooseFolderActivity.kt$ChooseFolderActivity : K9Activity</ID>
<ID>TooManyFunctions:FolderSettingsFragment.kt$FolderSettingsFragment : PreferenceFragmentCompatConfirmationDialogFragmentListener</ID>
<ID>TooManyFunctions:GeneralSettingsDataStore.kt$GeneralSettingsDataStore : PreferenceDataStore</ID>
<ID>TooManyFunctions:GeneralSettingsFragment.kt$GeneralSettingsFragment : PreferenceFragmentCompat</ID>
<ID>TooManyFunctions:ManageFoldersFragment.kt$ManageFoldersFragment : Fragment</ID>
<ID>TooManyFunctions:MessageContainerView.kt$MessageContainerView : LinearLayoutOnCreateContextMenuListenerKoinComponent</ID>
<ID>TooManyFunctions:MessageDetailsFragment.kt$MessageDetailsFragment : ToolbarBottomSheetDialogFragment</ID>
<ID>TooManyFunctions:MessageList.kt$MessageList : K9ActivityMessageListFragmentListenerMessageViewFragmentListenerMessageViewContainerListenerOnBackStackChangedListenerOnSwitchCompleteListener</ID>
<ID>TooManyFunctions:MessageList.kt$MessageList$Companion : KoinComponent</ID>
<ID>TooManyFunctions:MessageListAdapter.kt$MessageListAdapter : Adapter</ID>
<ID>TooManyFunctions:MessageListFragment.kt$MessageListFragment : FragmentConfirmationDialogFragmentListenerMessageListItemActionListener</ID>
<ID>TooManyFunctions:MessageListFragment.kt$MessageListFragment$MessageListActivityListener : SimpleMessagingListener</ID>
<ID>TooManyFunctions:MessageListSwipeCallback.kt$MessageListSwipeCallback : Callback</ID>
<ID>TooManyFunctions:MessageTopView.kt$MessageTopView : LinearLayoutKoinComponent</ID>
<ID>TooManyFunctions:MessageViewContainerFragment.kt$MessageViewContainerFragment : Fragment</ID>
<ID>TooManyFunctions:MessageViewFragment.kt$MessageViewFragment : FragmentConfirmationDialogFragmentListenerAttachmentViewCallback</ID>
<ID>TooManyFunctions:RecipientMvpView.kt$RecipientMvpView : OnFocusChangeListenerOnClickListener</ID>
<ID>TooManyFunctions:RecipientPresenter.kt$RecipientPresenter</ID>
<ID>TooManyFunctions:ReplyToView.kt$ReplyToView</ID>
<ID>TooManyFunctions:SettingsExportViewModel.kt$SettingsExportViewModel : ViewModel</ID>
<ID>TooManyFunctions:SettingsListFragment.kt$SettingsListFragment : FragmentItemTouchCallback</ID>
<ID>TooManyFunctions:SimpleHighlightView.kt$SimpleHighlightView : FrameLayout</ID>
<ID>TooManyFunctions:VibrationDialogFragment.kt$VibrationDialogFragment$VibrationPatternAdapter : BaseAdapter</ID>
<ID>UnusedParameter:MessageViewFragment.kt$MessageViewFragment$requestKey: String</ID>
<ID>UseCheckOrError:ThemeExtensions.kt$throw IllegalStateException("Couldn't resolve attribute ($attrId)")</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ImplicitDefaultLocale:MessageListItemMapper.kt$MessageListItemMapper$String.format("%d %s", dayOfMonth, month)</ID>
<ID>MagicNumber:MessageListItemMapper.kt$MessageListItemMapper$52</ID>
<ID>TooGenericExceptionCaught:MessageListLoader.kt$MessageListLoader$e: Exception</ID>
<ID>TooGenericExceptionCaught:MessageListWidgetManager.kt$MessageListWidgetManager$e: RuntimeException</ID>
<ID>TooManyFunctions:MessageListRemoteViewFactory.kt$MessageListRemoteViewFactory : RemoteViewsFactoryKoinComponent</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CyclomaticComplexMethod:FlowedMessageUtils.kt$FlowedMessageUtils$@JvmStatic fun deflow(text: String, delSp: Boolean): String</ID>
<ID>CyclomaticComplexMethod:MimeParameterDecoder.kt$MimeParameterDecoder$private fun convertToParameterSection(parameterName: String, parameterValue: ParameterValue): ParameterSection?</ID>
<ID>LongMethod:MessageTest.kt$MessageTest$@Test fun toBodyPart()</ID>
<ID>LongMethod:MessageTest.kt$MessageTest$@Test fun writeTo_withNestedMessage()</ID>
<ID>MagicNumber:BoundaryGenerator.kt$BoundaryGenerator$36</ID>
<ID>MagicNumber:BoundaryGenerator.kt$BoundaryGenerator$4</ID>
<ID>MagicNumber:DecoderUtil.kt$DecoderUtil$0x1B</ID>
<ID>MagicNumber:DecoderUtil.kt$DecoderUtil$0x28</ID>
<ID>MagicNumber:DecoderUtil.kt$DecoderUtil$0x42</ID>
<ID>MagicNumber:Hex.kt$Hex$4</ID>
<ID>MagicNumber:MimeExtensions.kt$126</ID>
<ID>MagicNumber:MimeExtensions.kt$33</ID>
<ID>MagicNumber:MimeExtensions.kt$39</ID>
<ID>MagicNumber:MimeExtensions.kt$42</ID>
<ID>MagicNumber:MimeExtensions.kt$90</ID>
<ID>MagicNumber:MimeExtensions.kt$91</ID>
<ID>MagicNumber:MimeExtensions.kt$93</ID>
<ID>MagicNumber:MimeExtensions.kt$94</ID>
<ID>MagicNumber:MimeHeader.kt$MimeHeader$1024</ID>
<ID>MagicNumber:MimeHeaderChecker.kt$UnstructuredHeaderChecker$1000</ID>
<ID>MagicNumber:MimeHeaderChecker.kt$UnstructuredHeaderChecker$998</ID>
<ID>MagicNumber:MimeHeaderParser.kt$MimeHeaderParser$10</ID>
<ID>MagicNumber:MimeHeaderParser.kt$MimeHeaderParser$4</ID>
<ID>MagicNumber:MimeParameterDecoder.kt$MimeParameterDecoder$3</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$126</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$3</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$33</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$35</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$91</ID>
<ID>MagicNumber:MimeParameterEncoder.kt$MimeParameterEncoder$93</ID>
<ID>MagicNumber:Utf8.kt$0x010000</ID>
<ID>MagicNumber:Utf8.kt$0x10000</ID>
<ID>MagicNumber:Utf8.kt$0x3f</ID>
<ID>MagicNumber:Utf8.kt$0x80</ID>
<ID>MagicNumber:Utf8.kt$0x800</ID>
<ID>MagicNumber:Utf8.kt$0xc0</ID>
<ID>MagicNumber:Utf8.kt$0xd800</ID>
<ID>MagicNumber:Utf8.kt$0xdbff</ID>
<ID>MagicNumber:Utf8.kt$0xdc00</ID>
<ID>MagicNumber:Utf8.kt$0xdfff</ID>
<ID>MagicNumber:Utf8.kt$0xe0</ID>
<ID>MagicNumber:Utf8.kt$0xe000</ID>
<ID>MagicNumber:Utf8.kt$0xf0</ID>
<ID>MagicNumber:Utf8.kt$10</ID>
<ID>MagicNumber:Utf8.kt$12</ID>
<ID>MagicNumber:Utf8.kt$18</ID>
<ID>MagicNumber:Utf8.kt$3</ID>
<ID>MagicNumber:Utf8.kt$4</ID>
<ID>MagicNumber:Utf8.kt$6</ID>
<ID>ReturnCount:DecoderUtil.kt$DecoderUtil$@JvmStatic fun decodeEncodedWords(body: String, message: Message?): String</ID>
<ID>ReturnCount:DecoderUtil.kt$DecoderUtil$private fun extractEncodedWord(body: String, begin: Int, end: Int, message: Message?): EncodedWord?</ID>
<ID>ReturnCount:FormatFlowedHelper.kt$FormatFlowedHelper$@JvmStatic fun checkFormatFlowed(contentTypeHeaderValue: String?): FormatFlowedResult</ID>
<ID>ReturnCount:MimeParameterDecoder.kt$MimeParameterDecoder$private fun areParameterSectionsValid(parameterSections: MutableList&lt;ParameterSection&gt;): Boolean</ID>
<ID>ReturnCount:MimeParameterDecoder.kt$MimeParameterDecoder$private fun convertToParameterSection(parameterName: String, parameterValue: ParameterValue): ParameterSection?</ID>
<ID>SwallowedException:DecoderUtil.kt$DecoderUtil$e: IOException</ID>
<ID>SwallowedException:DecoderUtil.kt$DecoderUtil$e: MessagingException</ID>
<ID>SwallowedException:LocalKeyStore.kt$LocalKeyStore$e: FileNotFoundException</ID>
<ID>SwallowedException:LocalKeyStore.kt$LocalKeyStore$e: KeyStoreException</ID>
<ID>SwallowedException:MimeParameterDecoder.kt$MimeParameterDecoder$e: IllegalCharsetNameException</ID>
<ID>SwallowedException:MimeParameterDecoder.kt$MimeParameterDecoder$e: MimeHeaderParserException</ID>
<ID>SwallowedException:MimeType.kt$MimeType.Companion$e: IllegalArgumentException</ID>
<ID>ThrowsCount:LocalKeyStore.kt$LocalKeyStore$private fun writeCertificateFile()</ID>
<ID>ThrowsCount:MimeHeaderChecker.kt$UnstructuredHeaderChecker$fun checkHeaderValue()</ID>
<ID>TooGenericExceptionCaught:LocalKeyStore.kt$LocalKeyStore$e: Exception</ID>
<ID>TooManyFunctions:Logger.kt$Logger</ID>
<ID>TooManyFunctions:MessageIdParser.kt$MessageIdParser</ID>
<ID>TooManyFunctions:MimeExtensions.kt$com.fsck.k9.mail.internet.MimeExtensions.kt</ID>
<ID>TooManyFunctions:MimeHeader.kt$MimeHeader</ID>
<ID>TooManyFunctions:MimeHeaderChecker.kt$UnstructuredHeaderChecker</ID>
<ID>TooManyFunctions:MimeHeaderParser.kt$MimeHeaderParser</ID>
<ID>TooManyFunctions:MimeParameterDecoder.kt$MimeParameterDecoder</ID>
<ID>TooManyFunctions:MimeParameterEncoder.kt$MimeParameterEncoder</ID>
<ID>TooManyFunctions:NoOpLogger.kt$NoOpLogger : Logger</ID>
<ID>TooManyFunctions:Timber.kt$Timber</ID>
<ID>UseRequire:MimeParameterEncoder.kt$MimeParameterEncoder$throw IllegalArgumentException("Unsupported character: $c")</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,61 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CastToNullableType:RealImapFolder.kt$RealImapFolder$as</ID>
<ID>CyclomaticComplexMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun appendMessages(messages: List&lt;Message&gt;): Map&lt;String, String&gt;?</ID>
<ID>CyclomaticComplexMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun fetch( messages: List&lt;ImapMessage&gt;, fetchProfile: FetchProfile, listener: FetchListener?, maxDownloadSize: Int, )</ID>
<ID>CyclomaticComplexMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun handleFetchResponse(message: ImapMessage, fetchList: ImapList): Any?</ID>
<ID>CyclomaticComplexMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun parseBodyStructure(bs: ImapList, part: Part, id: String)</ID>
<ID>CyclomaticComplexMethod:RealImapStore.kt$RealImapStore$@Throws(IOException::class, MessagingException::class) private fun listFolders(connection: ImapConnection, subscribedOnly: Boolean): List&lt;FolderListItem&gt;</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format( "%s 1:* %sFLAGS.SILENT (%s)", Commands.UID_STORE, if (value) "+" else "-", combinedFlags, )</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("%s %s", openCommand, escapedFolderName)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("%sFLAGS.SILENT (%s)", if (value) "+" else "-", combinedFlags)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format(";\r\n %s=%s", paramName, encodedValue)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("BODY.PEEK[%s]", partId)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("CREATE %s", escapedFolderName)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("STATUS %s (UIDVALIDITY)", escapedFolderName)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("UID FETCH %s (%s)", commaSeparatedUids, spaceSeparatedFetchFields)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("UID FETCH %s (UID %s)", message.uid, fetch)</ID>
<ID>ImplicitDefaultLocale:RealImapFolder.kt$RealImapFolder$String.format("UID SEARCH HEADER MESSAGE-ID %s", ImapUtility.encodeString(messageId))</ID>
<ID>LargeClass:RealImapConnection.kt$RealImapConnection : ImapConnection</ID>
<ID>LargeClass:RealImapConnectionTest.kt$RealImapConnectionTest</ID>
<ID>LargeClass:RealImapFolder.kt$RealImapFolder : ImapFolder</ID>
<ID>LargeClass:RealImapFolderTest.kt$RealImapFolderTest</ID>
<ID>LongMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun appendMessages(messages: List&lt;Message&gt;): Map&lt;String, String&gt;?</ID>
<ID>LongMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun fetch( messages: List&lt;ImapMessage&gt;, fetchProfile: FetchProfile, listener: FetchListener?, maxDownloadSize: Int, )</ID>
<ID>LongMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun handleFetchResponse(message: ImapMessage, fetchList: ImapList): Any?</ID>
<ID>LongMethod:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun parseBodyStructure(bs: ImapList, part: Part, id: String)</ID>
<ID>LongMethod:RealImapFolderIdler.kt$RealImapFolderIdler$private fun ImapFolder.idle(): IdleResult</ID>
<ID>LoopWithTooManyJumpStatements:RealImapStore.kt$RealImapStore$for</ID>
<ID>MagicNumber:RealImapConnection.kt$RealImapConnection$4</ID>
<ID>MagicNumber:RealImapFolder.kt$RealImapFolder$3</ID>
<ID>MagicNumber:RealImapFolder.kt$RealImapFolder$5</ID>
<ID>MagicNumber:RealImapFolder.kt$RealImapFolder$6</ID>
<ID>MagicNumber:RealImapFolder.kt$RealImapFolder$8</ID>
<ID>MagicNumber:RealImapFolder.kt$RealImapFolder$9</ID>
<ID>MagicNumber:UidValidityResponse.kt$UidValidityResponse.Companion$0xFFFFFFFFL</ID>
<ID>MaxLineLength:RealImapFolder.kt$RealImapFolder$// [MESSAGE, RFC822, [NAME, Fwd: [#HTR-517941]: update plans at 1am Friday - Memory allocation - displayware.eml], NIL, NIL, 7BIT, 5974, NIL, [INLINE, [FILENAME*0, Fwd: [#HTR-517941]: update plans at 1am Friday - Memory all, FILENAME*1, ocation - displayware.eml]], NIL]</ID>
<ID>MaxLineLength:RealImapStoreTest.kt$RealImapStoreTest$fun</ID>
<ID>NestedBlockDepth:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun appendMessages(messages: List&lt;Message&gt;): Map&lt;String, String&gt;?</ID>
<ID>NestedBlockDepth:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun fetch( messages: List&lt;ImapMessage&gt;, fetchProfile: FetchProfile, listener: FetchListener?, maxDownloadSize: Int, )</ID>
<ID>NestedBlockDepth:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) override fun fetchPart( message: ImapMessage, part: Part, bodyFactory: BodyFactory, maxDownloadSize: Int, )</ID>
<ID>NestedBlockDepth:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun handleFetchResponse(message: ImapMessage, fetchList: ImapList): Any?</ID>
<ID>NestedBlockDepth:RealImapFolder.kt$RealImapFolder$@Throws(MessagingException::class) private fun parseBodyStructure(bs: ImapList, part: Part, id: String)</ID>
<ID>ReturnCount:RealImapFolder.kt$RealImapFolder$@Throws(IOException::class, MessagingException::class) override fun areMoreMessagesAvailable(indexOfOldestMessage: Int, earliestDate: Date?): Boolean</ID>
<ID>ReturnCount:RealImapFolderIdler.kt$RealImapFolderIdler$private fun ImapFolder.idle(): IdleResult</ID>
<ID>ReturnCount:RealImapStore.kt$RealImapStore$private fun removePrefixFromFolderName(folderName: String): String?</ID>
<ID>ReturnCount:UidValidityResponse.kt$UidValidityResponse.Companion$@JvmStatic fun parse(response: ImapResponse): UidValidityResponse?</ID>
<ID>SwallowedException:RealImapFolder.kt$RealImapFolder$e: NegativeImapResponseException</ID>
<ID>SwallowedException:RealImapStore.kt$RealImapStore$e: CharacterCodingException</ID>
<ID>SwallowedException:RealImapStore.kt$RealImapStore$ioe: IOException</ID>
<ID>ThrowingExceptionsWithoutMessageOrCause:RealImapConnection.kt$RealImapConnection$Exception()</ID>
<ID>ThrowsCount:RealImapConnection.kt$RealImapConnection$private fun authenticate(): List&lt;ImapResponse&gt;</ID>
<ID>TooGenericExceptionCaught:RealImapConnection.kt$RealImapConnection$e: Exception</ID>
<ID>TooManyFunctions:ImapConnection.kt$ImapConnection</ID>
<ID>TooManyFunctions:ImapFolder.kt$ImapFolder</ID>
<ID>TooManyFunctions:RealImapConnection.kt$RealImapConnection : ImapConnection</ID>
<ID>TooManyFunctions:RealImapFolder.kt$RealImapFolder : ImapFolder</ID>
<ID>TooManyFunctions:RealImapStore.kt$RealImapStore : ImapStoreImapConnectionManagerInternalImapStore</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues></CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CyclomaticComplexMethod:SmtpTransport.kt$SmtpTransport$@VisibleForTesting @Throws(MessagingException::class) internal fun open()</ID>
<ID>ForbiddenComment:SmtpTransportTest.kt$SmtpTransportTest$// FIXME: Make sure connection was closed</ID>
<ID>ImplicitDefaultLocale:SmtpTransport.kt$SmtpTransport$String.format("MAIL FROM:&lt;%s&gt; BODY=8BITMIME", fromAddress)</ID>
<ID>ImplicitDefaultLocale:SmtpTransport.kt$SmtpTransport$String.format("MAIL FROM:&lt;%s&gt;", fromAddress)</ID>
<ID>ImplicitDefaultLocale:SmtpTransport.kt$SmtpTransport$String.format("RCPT TO:&lt;%s&gt;", address)</ID>
<ID>LargeClass:SmtpTransportTest.kt$SmtpTransportTest</ID>
<ID>LongMethod:SmtpResponseParser.kt$SmtpResponseParser$fun readHelloResponse(): SmtpHelloResponse</ID>
<ID>LongMethod:SmtpTransport.kt$SmtpTransport$@Throws(MessagingException::class) fun sendMessage(message: Message)</ID>
<ID>LongMethod:SmtpTransport.kt$SmtpTransport$@VisibleForTesting @Throws(MessagingException::class) internal fun open()</ID>
<ID>MagicNumber:NegativeSmtpReplyException.kt$500</ID>
<ID>MagicNumber:NegativeSmtpReplyException.kt$599</ID>
<ID>MagicNumber:SmtpResponse.kt$SmtpResponse$400</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$10</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$100</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$126</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$250</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$32</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$33</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$4</ID>
<ID>MagicNumber:SmtpResponseParser.kt$SmtpResponseParser$5</ID>
<ID>MagicNumber:SmtpTransport.kt$SmtpTransport$1000</ID>
<ID>MagicNumber:SmtpTransport.kt$SmtpTransport$1024</ID>
<ID>MagicNumber:StatusCodeClass.kt$StatusCodeClass.PERMANENT_FAILURE$5</ID>
<ID>MagicNumber:StatusCodeClass.kt$StatusCodeClass.PERSISTENT_TRANSIENT_FAILURE$4</ID>
<ID>ReturnCount:SmtpResponseParser.kt$SmtpResponseParser$fun readHelloResponse(): SmtpHelloResponse</ID>
<ID>SwallowedException:SmtpTransport.kt$SmtpTransport$e: NegativeSmtpReplyException</ID>
<ID>ThrowingExceptionsWithoutMessageOrCause:SmtpTransport.kt$SmtpTransport$RuntimeException()</ID>
<ID>ThrowsCount:SmtpTransport.kt$SmtpTransport$@Throws(MessagingException::class) fun sendMessage(message: Message)</ID>
<ID>ThrowsCount:SmtpTransport.kt$SmtpTransport$@VisibleForTesting @Throws(MessagingException::class) internal fun open()</ID>
<ID>TooGenericExceptionCaught:SmtpTransport.kt$SmtpTransport$e: Exception</ID>
<ID>TooManyFunctions:SmtpResponseParser.kt$SmtpResponseParser</ID>
<ID>TooManyFunctions:SmtpTransport.kt$SmtpTransport</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>MagicNumber:MessageBuilderDsl.kt$PartBuilder$1024</ID>
<ID>MagicNumber:MessageBuilderDsl.kt$PartBuilder$20</ID>
<ID>TooManyFunctions:SystemOutLogger.kt$SystemOutLogger : Logger</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>CastToNullableType:ToolbarBottomSheetDialogFragment.kt$ToolbarBottomSheetDialogFragment$as</ID>
<ID>TooManyFunctions:ToolbarBottomSheetDialog.kt$ToolbarBottomSheetDialog : AppCompatDialog</ID>
</CurrentIssues>
</SmellBaseline>

850
config/detekt/detekt.yml Normal file
View file

@ -0,0 +1,850 @@
build:
maxIssues: 0
excludeCorrectable: false
weights:
# complexity: 2
# LongParameterList: 1
# style: 1
# comments: 1
config:
validation: true
warningsAsErrors: false
checkExhaustiveness: false
# when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
excludes: ''
processors:
active: true
exclude:
- 'DetektProgressListener'
# - 'KtFileCountProcessor'
# - 'PackageCountProcessor'
# - 'ClassCountProcessor'
# - 'FunctionCountProcessor'
# - 'PropertyCountProcessor'
# - 'ProjectComplexityProcessor'
# - 'ProjectCognitiveComplexityProcessor'
# - 'ProjectLLOCProcessor'
# - 'ProjectCLOCProcessor'
# - 'ProjectLOCProcessor'
# - 'ProjectSLOCProcessor'
# - 'LicenseHeaderLoaderExtension'
console-reports:
active: true
exclude:
- 'ProjectStatisticsReport'
- 'ComplexityReport'
- 'NotificationReport'
- 'FindingsReport'
- 'FileBasedFindingsReport'
# - 'LiteFindingsReport'
output-reports:
active: true
exclude:
# - 'TxtOutputReport'
# - 'XmlOutputReport'
# - 'HtmlOutputReport'
# - 'MdOutputReport'
# - 'SarifOutputReport'
comments:
active: true
AbsentOrWrongFileLicense:
active: false
licenseTemplateFile: 'license.template'
licenseTemplateIsRegex: false
CommentOverPrivateFunction:
active: false
CommentOverPrivateProperty:
active: false
DeprecatedBlockTag:
active: false
EndOfSentenceFormat:
active: false
endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
KDocReferencesNonPublicProperty:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
OutdatedDocumentation:
active: false
matchTypeParameters: true
matchDeclarationsOrder: true
allowParamOnConstructorProperties: false
UndocumentedPublicClass:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
searchInNestedClass: true
searchInInnerClass: true
searchInInnerObject: true
searchInInnerInterface: true
searchInProtectedClass: false
UndocumentedPublicFunction:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
searchProtectedFunction: false
UndocumentedPublicProperty:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
searchProtectedProperty: false
complexity:
active: true
CognitiveComplexMethod:
active: false
threshold: 15
ComplexCondition:
active: true
threshold: 5
ComplexInterface:
active: false
threshold: 10
includeStaticDeclarations: false
includePrivateDeclarations: false
ignoreOverloaded: false
CyclomaticComplexMethod:
active: true
threshold: 15
ignoreSingleWhenExpression: false
ignoreSimpleWhenEntries: false
ignoreNestingFunctions: false
nestingFunctions:
- 'also'
- 'apply'
- 'forEach'
- 'isNotNull'
- 'ifNull'
- 'let'
- 'run'
- 'use'
- 'with'
LabeledExpression:
active: false
ignoredLabels: []
LargeClass:
active: true
threshold: 600
LongMethod:
active: true
threshold: 60
ignoreAnnotated:
- 'Preview'
- 'PreviewLightDark'
- 'PreviewLightDarkLandscape'
LongParameterList:
active: true
functionThreshold: 8
constructorThreshold: 8
ignoreDefaultParameters: true
ignoreDataClasses: true
ignoreAnnotatedParameter: []
MethodOverloading:
active: false
threshold: 6
NamedArguments:
active: true
threshold: 3
ignoreArgumentsMatchingNames: true
NestedBlockDepth:
active: true
threshold: 4
NestedScopeFunctions:
active: false
threshold: 1
functions:
- 'kotlin.apply'
- 'kotlin.run'
- 'kotlin.with'
- 'kotlin.let'
- 'kotlin.also'
ReplaceSafeCallChainWithRun:
active: false
StringLiteralDuplication:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
threshold: 3
ignoreAnnotation: true
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'
TooManyFunctions:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
thresholdInFiles: 11
thresholdInClasses: 11
thresholdInInterfaces: 11
thresholdInObjects: 11
thresholdInEnums: 11
ignoreDeprecated: false
ignorePrivate: false
ignoreOverridden: false
coroutines:
active: true
GlobalCoroutineUsage:
active: false
InjectDispatcher:
active: true
dispatcherNames:
- 'IO'
- 'Default'
- 'Unconfined'
RedundantSuspendModifier:
active: true
SleepInsteadOfDelay:
active: true
SuspendFunSwallowedCancellation:
active: true
SuspendFunWithCoroutineScopeReceiver:
active: true
SuspendFunWithFlowReturnType:
active: true
empty-blocks:
active: true
EmptyCatchBlock:
active: true
allowedExceptionNameRegex: '_|(ignore|expected).*'
EmptyClassBlock:
active: true
EmptyDefaultConstructor:
active: true
EmptyDoWhileBlock:
active: true
EmptyElseBlock:
active: true
EmptyFinallyBlock:
active: true
EmptyForBlock:
active: true
EmptyFunctionBlock:
active: true
ignoreOverridden: false
EmptyIfBlock:
active: true
EmptyInitBlock:
active: true
EmptyKtFile:
active: true
EmptySecondaryConstructor:
active: true
EmptyTryBlock:
active: true
EmptyWhenBlock:
active: true
EmptyWhileBlock:
active: true
exceptions:
active: true
ExceptionRaisedInUnexpectedLocation:
active: true
methodNames:
- 'equals'
- 'finalize'
- 'hashCode'
- 'toString'
InstanceOfCheckForException:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
NotImplementedDeclaration:
active: false
ObjectExtendsThrowable:
active: false
PrintStackTrace:
active: true
RethrowCaughtException:
active: true
ReturnFromFinally:
active: true
ignoreLabeled: false
SwallowedException:
active: true
ignoredExceptionTypes:
- 'InterruptedException'
- 'MalformedURLException'
- 'NumberFormatException'
- 'ParseException'
allowedExceptionNameRegex: '_|(ignore|expected).*'
ThrowingExceptionFromFinally:
active: true
ThrowingExceptionInMain:
active: false
ThrowingExceptionsWithoutMessageOrCause:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
exceptions:
- 'ArrayIndexOutOfBoundsException'
- 'Exception'
- 'IllegalArgumentException'
- 'IllegalMonitorStateException'
- 'IllegalStateException'
- 'IndexOutOfBoundsException'
- 'NullPointerException'
- 'RuntimeException'
- 'Throwable'
ThrowingNewInstanceOfSameException:
active: true
TooGenericExceptionCaught:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
exceptionNames:
- 'ArrayIndexOutOfBoundsException'
- 'Error'
- 'Exception'
- 'IllegalMonitorStateException'
- 'IndexOutOfBoundsException'
- 'NullPointerException'
- 'RuntimeException'
- 'Throwable'
allowedExceptionNameRegex: '_|(ignore|expected).*'
TooGenericExceptionThrown:
active: true
exceptionNames:
- 'Error'
- 'Exception'
- 'RuntimeException'
- 'Throwable'
naming:
active: true
BooleanPropertyNaming:
active: false
allowedPattern: '^(is|has|are)'
ClassNaming:
active: true
classPattern: '[A-Z][a-zA-Z0-9]*'
ConstructorParameterNaming:
active: true
parameterPattern: '[a-z][A-Za-z0-9]*'
privateParameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
EnumNaming:
active: true
enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'
ForbiddenClassName:
active: false
forbiddenName: []
FunctionMaxLength:
active: false
maximumFunctionNameLength: 30
FunctionMinLength:
active: false
minimumFunctionNameLength: 3
FunctionNaming:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
functionPattern: '[a-z][a-zA-Z0-9]*'
excludeClassPattern: '$^'
ignoreAnnotated:
- 'Composable'
FunctionParameterNaming:
active: true
parameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
InvalidPackageDeclaration:
active: true
rootPackage: ''
requireRootInDeclaration: false
LambdaParameterNaming:
active: false
parameterPattern: '[a-z][A-Za-z0-9]*|_'
MatchingDeclarationName:
active: true
mustBeFirst: true
MemberNameEqualsClassName:
active: true
ignoreOverridden: true
NoNameShadowing:
active: true
NonBooleanPropertyPrefixedWithIs:
active: false
ObjectPropertyNaming:
active: true
constantPattern: '[A-Za-z][_A-Za-z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'
PackageNaming:
active: true
packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*'
TopLevelPropertyNaming:
active: true
constantPattern: '[A-Z][_A-Z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*'
VariableMaxLength:
active: false
maximumVariableNameLength: 64
VariableMinLength:
active: false
minimumVariableNameLength: 1
VariableNaming:
active: true
variablePattern: '[a-z][A-Za-z0-9]*'
privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
performance:
active: true
ArrayPrimitive:
active: true
CouldBeSequence:
active: false
threshold: 3
ForEachOnRange:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
SpreadOperator:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
UnnecessaryPartOfBinaryExpression:
active: false
UnnecessaryTemporaryInstantiation:
active: true
potential-bugs:
active: true
AvoidReferentialEquality:
active: true
forbiddenTypePatterns:
- 'kotlin.String'
CastNullableToNonNullableType:
active: true
CastToNullableType:
active: true
Deprecation:
active: true
DontDowncastCollectionTypes:
active: true
DoubleMutabilityForCollection:
active: true
mutableTypes:
- 'kotlin.collections.MutableList'
- 'kotlin.collections.MutableMap'
- 'kotlin.collections.MutableSet'
- 'java.util.ArrayList'
- 'java.util.LinkedHashSet'
- 'java.util.HashSet'
- 'java.util.LinkedHashMap'
- 'java.util.HashMap'
ElseCaseInsteadOfExhaustiveWhen:
active: true
ignoredSubjectTypes: []
EqualsAlwaysReturnsTrueOrFalse:
active: true
EqualsWithHashCodeExist:
active: true
ExitOutsideMain:
active: true
ExplicitGarbageCollectionCall:
active: true
HasPlatformType:
active: true
IgnoredReturnValue:
active: true
restrictToConfig: true
returnValueAnnotations:
- 'CheckResult'
- '*.CheckResult'
- 'CheckReturnValue'
- '*.CheckReturnValue'
ignoreReturnValueAnnotations:
- 'CanIgnoreReturnValue'
- '*.CanIgnoreReturnValue'
returnValueTypes:
- 'kotlin.sequences.Sequence'
- 'kotlinx.coroutines.flow.*Flow'
- 'java.util.stream.*Stream'
ignoreFunctionCall: []
ImplicitDefaultLocale:
active: true
ImplicitUnitReturnType:
active: false
allowExplicitReturnType: true
InvalidRange:
active: true
IteratorHasNextCallsNextMethod:
active: true
IteratorNotThrowingNoSuchElementException:
active: true
LateinitUsage:
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
ignoreOnClassesPattern: ''
MapGetWithNotNullAssertionOperator:
active: true
MissingPackageDeclaration:
active: false
excludes: ['**/*.kts']
NullCheckOnMutableProperty:
active: false
NullableToStringCall:
active: false
PropertyUsedBeforeDeclaration:
active: false
UnconditionalJumpStatementInLoop:
active: false
UnnecessaryNotNullCheck:
active: false
UnnecessaryNotNullOperator:
active: true
UnnecessarySafeCall:
active: true
UnreachableCatchBlock:
active: true
UnreachableCode:
active: true
UnsafeCallOnNullableType:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
UnsafeCast:
active: true
UnusedUnaryOperator:
active: true
UselessPostfixExpression:
active: true
WrongEqualsTypeParameter:
active: true
style:
active: true
AlsoCouldBeApply:
active: true
BracesOnIfStatements:
active: false
singleLine: 'never'
multiLine: 'always'
BracesOnWhenStatements:
active: false
singleLine: 'necessary'
multiLine: 'consistent'
CanBeNonNullable:
active: false
CascadingCallWrapping:
active: false
includeElvis: true
ClassOrdering:
active: false
CollapsibleIfStatements:
active: false
DataClassContainsFunctions:
active: false
conversionFunctionPrefix:
- 'to'
allowOperators: false
DataClassShouldBeImmutable:
active: true
DestructuringDeclarationWithTooManyEntries:
active: true
maxDestructuringEntries: 3
DoubleNegativeLambda:
active: false
negativeFunctions:
- reason: 'Use `takeIf` instead.'
value: 'takeUnless'
- reason: 'Use `all` instead.'
value: 'none'
negativeFunctionNameParts:
- 'not'
- 'non'
EqualsNullCall:
active: true
EqualsOnSignatureLine:
active: false
ExplicitCollectionElementAccessMethod:
active: true
ExplicitItLambdaParameter:
active: true
ExpressionBodySyntax:
active: false
includeLineWrapping: false
ForbiddenAnnotation:
active: false
annotations:
- reason: 'it is a java annotation. Use `Suppress` instead.'
value: 'java.lang.SuppressWarnings'
- reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.'
value: 'java.lang.Deprecated'
- reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.'
value: 'java.lang.annotation.Documented'
- reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.'
value: 'java.lang.annotation.Target'
- reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.'
value: 'java.lang.annotation.Retention'
- reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.'
value: 'java.lang.annotation.Repeatable'
- reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265'
value: 'java.lang.annotation.Inherited'
ForbiddenComment:
active: true
comments:
- reason: 'Forbidden FIXME todo marker in comment, please fix the problem.'
value: 'FIXME:'
- reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.'
value: 'STOPSHIP:'
allowedPatterns: ''
ForbiddenImport:
active: false
imports: []
forbiddenPatterns: ''
ForbiddenMethodCall:
active: false
methods:
- reason: 'print does not allow you to configure the output stream. Use a logger instead.'
value: 'kotlin.io.print'
- reason: 'println does not allow you to configure the output stream. Use a logger instead.'
value: 'kotlin.io.println'
ForbiddenSuppress:
active: false
rules: []
ForbiddenVoid:
active: true
ignoreOverridden: false
ignoreUsageInGenerics: false
FunctionOnlyReturningConstant:
active: true
ignoreOverridableFunction: true
ignoreActualFunction: true
excludedFunctions: []
LoopWithTooManyJumpStatements:
active: true
maxJumpCount: 1
MagicNumber:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts']
ignoreNumbers:
- '-1'
- '0'
- '1'
- '2'
ignoreHashCodeFunction: true
ignorePropertyDeclaration: false
ignoreLocalVariableDeclaration: false
ignoreConstantDeclaration: true
ignoreCompanionObjectPropertyDeclaration: true
ignoreAnnotation: false
ignoreAnnotated:
- 'Preview'
- 'PreviewLightDark'
- 'PreviewLightDarkLandscape'
ignoreNamedArgument: true
ignoreEnums: false
ignoreRanges: false
ignoreExtensionFunctions: true
MandatoryBracesLoops:
active: false
MaxChainedCallsOnSameLine:
active: false
maxChainedCalls: 5
MaxLineLength:
active: true
maxLineLength: 120
excludePackageStatements: true
excludeImportStatements: true
excludeCommentStatements: false
excludeRawStrings: true
MayBeConst:
active: true
ModifierOrder:
active: true
MultilineLambdaItParameter:
active: false
MultilineRawStringIndentation:
active: false
indentSize: 4
trimmingMethods:
- 'trimIndent'
- 'trimMargin'
NestedClassesVisibility:
active: true
NewLineAtEndOfFile:
active: true
NoTabs:
active: false
NullableBooleanCheck:
active: false
ObjectLiteralToLambda:
active: true
OptionalAbstractKeyword:
active: true
OptionalUnit:
active: true
PreferToOverPairSyntax:
active: true
ProtectedMemberInFinalClass:
active: true
RedundantExplicitType:
active: true
RedundantHigherOrderMapUsage:
active: true
RedundantVisibilityModifierRule:
active: false
ReturnCount:
active: true
max: 2
excludedFunctions:
- 'equals'
excludeLabeled: false
excludeReturnFromLambda: true
excludeGuardClauses: false
SafeCast:
active: true
SerialVersionUIDInSerializableClass:
active: true
SpacingBetweenPackageAndImports:
active: false
StringShouldBeRawString:
active: false
maxEscapedCharacterCount: 2
ignoredCharacters: []
ThrowsCount:
active: true
max: 2
excludeGuardClauses: false
TrailingWhitespace:
active: false
TrimMultilineRawString:
active: false
trimmingMethods:
- 'trimIndent'
- 'trimMargin'
UnderscoresInNumericLiterals:
active: false
acceptableLength: 4
allowNonStandardGrouping: false
UnnecessaryAbstractClass:
active: true
UnnecessaryAnnotationUseSiteTarget:
active: true
UnnecessaryApply:
active: true
UnnecessaryBackticks:
active: true
UnnecessaryBracesAroundTrailingLambda:
active: true
UnnecessaryFilter:
active: true
UnnecessaryInheritance:
active: true
UnnecessaryInnerClass:
active: true
UnnecessaryLet:
active: true
UnnecessaryParentheses:
active: false
allowForUnclearPrecedence: false
UntilInsteadOfRangeTo:
active: true
UnusedImports:
active: false
UnusedParameter:
active: true
allowedNames: 'ignored|expected'
UnusedPrivateClass:
active: true
UnusedPrivateMember:
active: true
allowedNames: ''
ignoreAnnotated:
- 'Preview'
- 'PreviewLightDark'
- 'PreviewLightDarkLandscape'
UnusedPrivateProperty:
active: true
allowedNames: '_|ignored|expected|serialVersionUID'
ignoreAnnotated:
- 'Preview'
- 'PreviewLightDark'
- 'PreviewLightDarkLandscape'
UseAnyOrNoneInsteadOfFind:
active: true
UseArrayLiteralsInAnnotations:
active: true
UseCheckNotNull:
active: true
UseCheckOrError:
active: true
UseDataClass:
active: false
allowVars: false
UseEmptyCounterpart:
active: true
UseIfEmptyOrIfBlank:
active: true
UseIfInsteadOfWhen:
active: false
ignoreWhenContainingVariableDeclaration: false
UseIsNullOrEmpty:
active: true
UseLet:
active: true
UseOrEmpty:
active: true
UseRequire:
active: true
UseRequireNotNull:
active: true
UseSumOfInsteadOfFlatMapSize:
active: true
UselessCallOnNotNull:
active: true
UtilityClassWithPublicConstructor:
active: true
VarCouldBeVal:
active: true
ignoreLateinitVar: false
WildcardImport:
active: true
excludeImports:
- 'java.util.*'
Compose:
CompositionLocalAllowlist:
active: true
allowedCompositionLocals: [
LocalColors,
LocalElevations,
LocalImages,
LocalShapes,
LocalSizes,
LocalSpacings,
LocalThemeColorScheme,
LocalThemeElevations,
LocalThemeImages,
LocalThemeShapes,
LocalThemeSizes,
LocalThemeSpacings,
LocalThemeTypography,
LocalDateTimeConfiguration
]
ContentEmitterReturningValues:
active: true
ModifierComposable:
active: true
ModifierMissing:
active: true
ModifierReused:
active: true
ModifierWithoutDefault:
active: true
MultipleEmitters:
active: true
MutableParams:
active: true
ComposableNaming:
active: true
ComposableParamOrder:
active: true
PreviewAnnotationNaming:
active: true
PreviewPublic:
active: true
RememberMissing:
active: true
UnstableCollections:
active: true
ViewModelForwarding:
active: true
ViewModelInjection:
active: true

View file

@ -0,0 +1,28 @@
# Taken from: https://appdefensealliance.dev/casa/tier-2/ast-guide/static-scan
# as that is out of date, updated to the latest version of the scanner, see below
# https://help.fluidattacks.com/portal/en/kb/articles/validate-casa-tier-2-requirements
namespace: thunderbird-android
working_dir: /repo
language: EN
output:
file_path: /repo/fluidscan-results.sarif
format: SARIF
#apk:
# include:
# - ./app-k9mail/build/outputs/apk/foss/release/app-k9mail-foss-release.apk
# - ./app-k9mail/build/outputs/apk/full/release/app-k9mail-full-release.apk
# - ./app-thunderbird/build/outputs/apk/foss/release/app-thunderbird-full-release.apk
# - ./app-thunderbird/build/outputs/apk/foss/release/app-thunderbird-full-release.apk
sast:
include:
- .
exclude:
- glob(**/build/**)
- glob(**/test/**)
sca:
include:
- .
exclude:
- glob(**/test/**)
file_size_limit: false
tracing_opt_out: true

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.11.1" type="baseline" client="gradle" dependencies="true" name="AGP (8.11.1)" variant="all" version="8.11.1">
<issue
id="MissingQuantity"
message="For locale &quot;iw&quot; (Hebrew) the following quantity should also be defined: `many` (e.g. &quot;20 שנה&quot;)"
errorLine1=" &lt;plurals name=&quot;account_setup_options_email_display_count_messages&quot;>"
errorLine2=" ^">
<location
file="src/main/res/values-iw/strings.xml"
line="46"
column="5"/>
</issue>
<issue
id="MissingQuantity"
message="For locale &quot;iw&quot; (Hebrew) the following quantity should also be defined: `many` (e.g. &quot;20 שנה&quot;)"
errorLine1=" &lt;plurals name=&quot;settings_import_password_prompt&quot;>"
errorLine2=" ^">
<location
file="src/main/res/values-iw/strings.xml"
line="35"
column="5"/>
</issue>
</issues>

26
config/lint/lint.xml Normal file
View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Validate translations - start -->
<issue id="MissingTranslation" severity="warning" />
<issue id="MissingQuantity" severity="error" />
<issue id="ExtraTranslation" severity="error" />
<issue id="ImpliedQuantity" severity="warning" />
<issue id="HardcodedText" severity="error" />
<issue id="IncompleteTranslation" severity="error" />
<issue id="StringFormatInvalid" severity="error" />
<issue id="StringEscaping" severity="error" />
<issue id="Untranslatable" severity="error" />
<issue id="LocaleFolder" severity="error" />
<!-- Validate translations - end -->
<issue id="UnusedResources" severity="warning" />
<issue id="ViewModelConstructorInComposable">
<ignore path="**/debug/**" />
</issue>
<issue id="all">
<ignore path="**/ui-utils/ItemTouchHelper/**"/>
<ignore path="**/ui-utils/LinearLayoutManager/**"/>
</issue>
</lint>