diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2d75d8a34..6a1f85b9c 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -133,6 +133,9 @@ android {
detekt {
baseline = file("detekt-baseline.xml")
+ config.setFrom("$rootDir/detekt.yml")
+ buildUponDefaultConfig = true
+ allRules = false
}
dependencies {
@@ -143,4 +146,5 @@ dependencies {
implementation(libs.androidx.print)
implementation(libs.bundles.room)
ksp(libs.androidx.room.compiler)
+ detektPlugins(libs.compose.detekt)
}
diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml
index 8ca9e6bf6..cbd30a898 100644
--- a/app/detekt-baseline.xml
+++ b/app/detekt-baseline.xml
@@ -75,50 +75,23 @@
LargeClass:TaskActivity.kt$TaskActivity : SimpleActivity
LargeClass:WeekFragment.kt$WeekFragment : FragmentWeeklyCalendar
LongMethod:CalDAVHelper.kt$CalDAVHelper$@SuppressLint("MissingPermission") private fun fetchCalDAVCalendarEvents( calendar: CalDAVCalendar, eventTypeId: Long, showToasts: Boolean, )
- LongMethod:Context.kt$@SuppressLint("NewApi") fun Context.getNotification(pendingIntent: PendingIntent, event: Event, content: String, publicVersion: Boolean = false): Notification?
- LongMethod:Context.kt$fun Context.backupEventsAndTasks()
- LongMethod:EventActivity.kt$EventActivity$private fun addSelectedAttendee( attendee: Attendee, autoCompleteView: MyAutoCompleteTextView, attendeeHolder: ItemAttendeeBinding, )
LongMethod:EventActivity.kt$EventActivity$private fun gotEvent( savedInstanceState: Bundle?, localEventType: EventType?, event: Event?, )
LongMethod:EventActivity.kt$EventActivity$private fun saveEvent()
- LongMethod:EventActivity.kt$EventActivity$private fun updateCurrentCalendarInfo(currentCalendar: CalDAVCalendar?)
- LongMethod:EventListWidgetAdapter.kt$EventListWidgetAdapter$override fun onDataSetChanged()
- LongMethod:EventsHelper.kt$EventsHelper$fun getEventsSync( fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean, searchQuery: String = "", callback: (events: ArrayList<Event>) -> Unit )
LongMethod:IcsImporter.kt$IcsImporter$fun importEvents( path: String, defaultEventTypeId: Long, calDAVCalendarId: Int, overrideFileEventTypes: Boolean, eventReminders: ArrayList<Int>? = null, loadFromAssets: Boolean = false, ): ImportResult
- LongMethod:MainActivity.kt$MainActivity$private fun addContactEvents(birthdays: Boolean, reminders: ArrayList<Int>, initEventsFound: Int, initEventsAdded: Int, callback: (Int) -> Unit)
- LongMethod:MainActivity.kt$MainActivity$private fun addPrivateEvents( birthdays: Boolean, contacts: ArrayList<SimpleContact>, reminders: ArrayList<Int>, callback: (eventsFound: Int, eventsAdded: Int) -> Unit )
- LongMethod:MonthView.kt$MonthView$override fun onDraw(canvas: Canvas)
LongMethod:MyTimeZones.kt$fun getAllTimeZones()
- LongMethod:MyWidgetMonthlyProvider.kt$MyWidgetMonthlyProvider$private fun updateDays(context: Context, views: RemoteViews, days: List<DayMonthly>)
- LongMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)
- LongMethod:SettingsActivity.kt$SettingsActivity$private fun setupSettingItems()
- LongMethod:TaskActivity.kt$TaskActivity$private fun gotTask(savedInstanceState: Bundle?, localEventType: EventType?, task: Event?)
- LongMethod:TaskActivity.kt$TaskActivity$private fun saveTask()
- LongMethod:WeekFragment.kt$WeekFragment$@SuppressLint("NewApi") private fun addAllDayEvent(event: Event)
LongMethod:WeekFragment.kt$WeekFragment$private fun addEvents(events: ArrayList<Event>)
- LongMethod:WeekFragment.kt$WeekFragment$private fun initGrid()
- LongMethod:WidgetListConfigureActivity.kt$WidgetListConfigureActivity$private fun getListItems(): ArrayList<ListItem>
- LongParameterList:Context.kt$( uri: Uri, projection: Array<String>, selection: String? = null, selectionArgs: Array<String>? = null, sortOrder: String? = null, showErrors: Boolean = false, callback: (cursor: Cursor) -> Unit )
- LongParameterList:CssColors.kt$CssColors$( a1: Int, r1: Int, g1: Int, b1: Int, a2: Int, r2: Int, g2: Int, b2: Int, )
- LongParameterList:EventsHelper.kt$EventsHelper$( fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = true, searchQuery: String = "", callback: (events: ArrayList<Event>) -> Unit )
- LongParameterList:EventsHelper.kt$EventsHelper$( fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean, searchQuery: String = "", callback: (events: ArrayList<Event>) -> Unit )
- LongParameterList:IcsImporter.kt$IcsImporter$( path: String, defaultEventTypeId: Long, calDAVCalendarId: Int, overrideFileEventTypes: Boolean, eventReminders: ArrayList<Int>? = null, loadFromAssets: Boolean = false, )
- LongParameterList:MonthView.kt$MonthView$(event: MonthViewEvent, canvas: Canvas, x: Float, y: Float, availableWidth: Float, paint: Paint)
LongParameterList:SelectEventTypeDialog.kt$SelectEventTypeDialog$( val activity: Activity, val currEventType: Long, val showCalDAVCalendars: Boolean, val showNewEventTypeOption: Boolean, val addLastUsedOneAsFirstOption: Boolean, val showOnlyWritable: Boolean, var showManageEventTypes: Boolean, val callback: (eventType: EventType) -> Unit )
LoopWithTooManyJumpStatements:IcsImporter.kt$IcsImporter$while
LoopWithTooManyJumpStatements:ManageEventTypesAdapter.kt$ManageEventTypesAdapter$for
LoopWithTooManyJumpStatements:WeekFragment.kt$WeekFragment$do
MagicNumber:AutomaticBackupReceiver.kt$AutomaticBackupReceiver$3000
MagicNumber:CalDAVCalendar.kt$CalDAVCalendar$500
- MagicNumber:CalDAVHelper.kt$CalDAVHelper$1000L
MagicNumber:CalDAVHelper.kt$CalDAVHelper$60L
MagicNumber:CalDAVHelper.kt$CalDAVHelper$8
MagicNumber:Config.kt$Config$10
MagicNumber:Config.kt$Config$7
- MagicNumber:Constants.kt$1000L
MagicNumber:Constants.kt$6
MagicNumber:Context.kt$0.25f
- MagicNumber:Context.kt$1000
- MagicNumber:Context.kt$1000L
MagicNumber:Context.kt$2.5f
MagicNumber:Context.kt$3f
MagicNumber:Context.kt$500
@@ -131,15 +104,12 @@
MagicNumber:CssColors.kt$CssColors$16
MagicNumber:CssColors.kt$CssColors$24
MagicNumber:CssColors.kt$CssColors$8
- MagicNumber:DateTime.kt$1000L
- MagicNumber:DayFragment.kt$DayFragment$1000
MagicNumber:DayFragmentsHolder.kt$DayFragmentsHolder$100000
MagicNumber:DayFragmentsHolder.kt$DayFragmentsHolder$251
MagicNumber:Event.kt$Event$3
MagicNumber:Event.kt$Event$4
MagicNumber:Event.kt$Event$7
MagicNumber:EventActivity.kt$EventActivity$0.4f
- MagicNumber:EventActivity.kt$EventActivity$1000L
MagicNumber:EventActivity.kt$EventActivity$12
MagicNumber:EventActivity.kt$EventActivity$23
MagicNumber:EventActivity.kt$EventActivity$3
@@ -149,7 +119,6 @@
MagicNumber:EventActivity.kt$EventActivity$6
MagicNumber:EventActivity.kt$EventActivity$60
MagicNumber:EventActivity.kt$EventActivity$7
- MagicNumber:EventListFragment.kt$EventListFragment$1000
MagicNumber:EventListFragment.kt$EventListFragment$100000
MagicNumber:EventListFragment.kt$EventListFragment$6
MagicNumber:EventListWidgetAdapter.kt$EventListWidgetAdapter$23
@@ -168,20 +137,15 @@
MagicNumber:EventsDatabase.kt$EventsDatabase.Companion.<no name provided>$9
MagicNumber:EventsHelper.kt$EventsHelper$23
MagicNumber:EventsHelper.kt$EventsHelper$59
- MagicNumber:Formatter.kt$Formatter$1000L
MagicNumber:Formatter.kt$Formatter$3
MagicNumber:Formatter.kt$Formatter$4
MagicNumber:Formatter.kt$Formatter$6
MagicNumber:HsvColorComparator.kt$HsvColorComparator$3
- MagicNumber:IcsExporter.kt$IcsExporter$1000L
MagicNumber:IcsExporter.kt$IcsExporter$75
- MagicNumber:IcsImporter.kt$IcsImporter$1000L
MagicNumber:IcsImporter.kt$IcsImporter$180
MagicNumber:IcsImporter.kt$IcsImporter$2
MagicNumber:IcsImporter.kt$IcsImporter$60
- MagicNumber:IcsImporter.kt$IcsImporter.ImportResult.IMPORT_FAIL$3
MagicNumber:MainActivity.kt$MainActivity$0.8f
- MagicNumber:MainActivity.kt$MainActivity$1000L
MagicNumber:MainActivity.kt$MainActivity$300
MagicNumber:MonthDayFragment.kt$MonthDayFragment$7
MagicNumber:MonthDayFragmentsHolder.kt$MonthDayFragmentsHolder$100000
@@ -199,10 +163,8 @@
MagicNumber:MonthView.kt$MonthView$2.5f
MagicNumber:MonthView.kt$MonthView$3
MagicNumber:MonthView.kt$MonthView$41
- MagicNumber:MonthView.kt$MonthView$42
MagicNumber:MonthView.kt$MonthView$7
MagicNumber:MonthView.kt$MonthView$7f
- MagicNumber:MonthlyCalendarImpl.kt$MonthlyCalendarImpl$42
MagicNumber:MonthlyCalendarImpl.kt$MonthlyCalendarImpl$43
MagicNumber:MonthlyCalendarImpl.kt$MonthlyCalendarImpl$7
MagicNumber:MyWidgetMonthlyProvider.kt$MyWidgetMonthlyProvider$3
@@ -260,7 +222,6 @@
MagicNumber:WeekFragment.kt$WeekFragment$60
MagicNumber:WeekFragment.kt$WeekFragment.<no name provided>$24
MagicNumber:WeekFragment.kt$WeekFragment.<no name provided>$24f
- MagicNumber:WeekFragmentsHolder.kt$WeekFragmentsHolder$1000
MagicNumber:WeekFragmentsHolder.kt$WeekFragmentsHolder$100000
MagicNumber:WeekFragmentsHolder.kt$WeekFragmentsHolder$14
MagicNumber:WeekFragmentsHolder.kt$WeekFragmentsHolder$151
diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml
index 14cb8340a..4a4c7ff77 100644
--- a/app/lint-baseline.xml
+++ b/app/lint-baseline.xml
@@ -73,8 +73,8 @@
errorLine1="app-build-targetSDK = "34""
errorLine2=" ~~~~">
@@ -216,7 +216,7 @@
errorLine1="distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -227,8 +227,8 @@
errorLine1="gradlePlugins-agp = "8.10.1""
errorLine2=" ~~~~~~~~">
@@ -238,8 +238,8 @@
errorLine1="app-build-compileSDKVersion = "34""
errorLine2=" ~~~~">
diff --git a/detekt.yml b/detekt.yml
new file mode 100644
index 000000000..6472c5a35
--- /dev/null
+++ b/detekt.yml
@@ -0,0 +1,58 @@
+build:
+ maxIssues: 0
+ weights:
+ complexity: 2
+ LongParameterList: 2
+ style: 1
+
+processors:
+ active: true
+ exclude:
+ - "FunctionCountProcessor"
+ - "PropertyCountProcessor"
+
+config:
+ validation: true
+
+complexity:
+ LongParameterList:
+ active: true
+ functionThreshold: 10
+ constructorThreshold: 8
+ ignoreDefaultParameters: true
+ ignoreAnnotated:
+ - "Composable"
+ LongMethod:
+ active: true
+ threshold: 120
+ ignoreAnnotated:
+ - "Composable"
+ - "Preview"
+
+style:
+ MagicNumber:
+ active: true
+ ignoreAnnotated: ["Composable"]
+ ignoreEnums: true
+ ignoreNumbers: ["-1", "0", "1", "2", "42", "1000"]
+ MaxLineLength:
+ active: true
+ maxLineLength: 120
+ excludePackageStatements: true
+ excludeImportStatements: true
+
+naming:
+ FunctionNaming:
+ active: true
+ ignoreAnnotated: ["Composable", "Preview"]
+ functionPattern: "[a-z][A-Za-z0-9]*"
+
+Compose: # io.nlopez.compose.rules
+ ComposableParametersOrdering:
+ active: true
+ ModifierDefaultValue:
+ active: true
+ MissingModifierDefaultValue:
+ active: true
+ PublicComposablePreview:
+ active: true
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 21a8b10e9..e4c50c49a 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -5,6 +5,7 @@ kotlin = "2.2.0"
ksp = "2.1.21-2.0.2"
#Detekt
detekt = "1.23.8"
+detektCompose = "0.4.22"
#Androidx
multidex = "2.0.1"
print = "1.1.0"
@@ -32,6 +33,8 @@ androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefre
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
+#Compose
+compose-detekt = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" }
#Fossify
fossify-commons = { module = "org.fossify:commons", version.ref = "commons" }
[bundles]
diff --git a/lint.xml b/lint.xml
index 05685cd8e..4b4a78251 100644
--- a/lint.xml
+++ b/lint.xml
@@ -31,4 +31,5 @@
+