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 @@ +