diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..36adc78e --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,9 @@ +name: PR + +on: + pull_request: + branches: [ master ] + +jobs: + call-pr-workflow: + uses: FossifyOrg/.github/.github/workflows/pr.yml@main diff --git a/.github/workflows/testing-build.yml b/.github/workflows/testing-build.yml new file mode 100644 index 00000000..33379f92 --- /dev/null +++ b/.github/workflows/testing-build.yml @@ -0,0 +1,10 @@ +name: Testing build (on PR) + +on: + pull_request: + branches: [ master ] + types: [ labeled, opened, synchronize, reopened ] + +jobs: + call-testing-build-workflow: + uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c6946d39..37c793df 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlinAndroid) alias(libs.plugins.ksp) alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.detekt) } val keystorePropertiesFile: File = rootProject.file("keystore.properties") @@ -91,10 +92,16 @@ android { lint { checkReleaseBuilds = false - abortOnError = false + abortOnError = true + warningsAsErrors = true + baseline = file("lint-baseline.xml") } } +detekt { + baseline = file("detekt-baseline.xml") +} + dependencies { implementation(libs.fossify.commons) implementation(libs.androidx.constraintlayout) diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml new file mode 100644 index 00000000..e16cb805 --- /dev/null +++ b/app/detekt-baseline.xml @@ -0,0 +1,178 @@ + + + + + ComplexCondition:MainActivity.kt$MainActivity$config.showNotePicker && savedInstanceState == null && hasNoIntent && !mIsPasswordProtectionPending + ComplexCondition:MainActivity.kt$MainActivity$requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null && mNotes.isNotEmpty() + ComplexCondition:MainActivity.kt$MainActivity$requestCode == PICK_OPEN_FILE_INTENT && resultCode == RESULT_OK && resultData != null && resultData.data != null + ComplexCondition:TextFragment.kt$TextFragment$config.showKeyboard && isMenuVisible && (!note!!.isLocked() || shouldShowLockedContent) + CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun refreshMenuItems() + CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun setupOptionsMenu() + CyclomaticComplexMethod:TextFragment.kt$TextFragment$@SuppressLint("ClickableViewAccessibility") private fun setupFragment() + EmptyCatchBlock:String.kt${ } + EmptyFunctionBlock:OpenNoteAdapter.kt$OpenNoteAdapter${} + EmptyFunctionBlock:TasksAdapter.kt$TasksAdapter${} + EmptyFunctionBlock:WidgetAdapter.kt$WidgetAdapter${} + LargeClass:MainActivity.kt$MainActivity : SimpleActivity + LongMethod:Context.kt$fun Context.backupNotes() + MagicNumber:AutomaticBackupReceiver.kt$AutomaticBackupReceiver$3000 + MagicNumber:Config.kt$Config$100 + MagicNumber:Constants.kt$6 + MagicNumber:Context.kt$100f + MagicNumber:ImportFolderDialog.kt$ImportFolderDialog$1000 + MagicNumber:MainActivity.kt$MainActivity$0.4f + MagicNumber:MainActivity.kt$MainActivity$1000 + MagicNumber:MainActivity.kt$MainActivity$127 + MagicNumber:MainActivity.kt$MainActivity$250 + MagicNumber:MainActivity.kt$MainActivity$255 + MagicNumber:MainActivity.kt$MainActivity$50 + MagicNumber:NotesDatabase.kt$NotesDatabase.Companion.<no name provided>$3 + MagicNumber:NotesDatabase.kt$NotesDatabase.Companion.<no name provided>$4 + MagicNumber:NotesHelper.kt$NotesHelper$200 + MagicNumber:Task.kt$CompletedTasks$42 + MagicNumber:TextFragment.kt$TextFragment$.4f + MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100 + MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100f + MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$3 + MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$4 + MaxLineLength:Config.kt$Config$set(addNewCheckListItemsTop) = prefs.edit().putBoolean(ADD_NEW_CHECKLIST_ITEMS_TOP, addNewCheckListItemsTop).apply() + MaxLineLength:Constants.kt$const val MOVE_DONE_CHECKLIST_ITEMS = "move_undone_checklist_items" // it has been replaced from moving undone items at the top to moving done to bottom + MaxLineLength:Context.kt$AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, backupAtMillis, pendingIntent) + MaxLineLength:Context.kt$applicationContext.contentResolver.openOutputStream(exportFileUri, "wt") ?: FileOutputStream(exportFile) + MaxLineLength:Context.kt$fun Context.getPercentageFontSize() + MaxLineLength:Context.kt$return PendingIntent.getBroadcast(this, AUTOMATIC_BACKUP_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + MaxLineLength:Context.kt$val widgetIDs = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java)) ?: return + MaxLineLength:DeleteNoteDialog.kt$DeleteNoteDialog$. + MaxLineLength:ExportFilesDialog.kt$ExportFilesDialog$class + MaxLineLength:ExportNotesDialog.kt$ExportNotesDialog$activity.getAlertDialogBuilder().setPositiveButton(org.fossify.commons.R.string.ok, null).setNegativeButton(org.fossify.commons.R.string.cancel, null) + MaxLineLength:ImportFolderDialog.kt$ImportFolderDialog$class + MaxLineLength:MainActivity.kt$MainActivity$!config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) + MaxLineLength:MainActivity.kt$MainActivity$(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_plus_background).applyColorFilter(appIconColor) + MaxLineLength:MainActivity.kt$MainActivity$// if we got here by some other app invoking the file open intent, we have no permission for updating the original file itself + MaxLineLength:MainActivity.kt$MainActivity$ConfirmationDialog + MaxLineLength:MainActivity.kt$MainActivity$Note(null, title.substringBeforeLast('.'), fileText, NoteType.TYPE_CHECKLIST, "", PROTECTION_NONE, "") + MaxLineLength:MainActivity.kt$MainActivity$displayNewNoteDialog(note.value, title = it.title, it.path, setChecklistAsDefault = true) + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_10_title_commons, org.fossify.commons.R.string.faq_10_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, org.fossify.commons.R.string.faq_2_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, org.fossify.commons.R.string.faq_6_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_7_title_commons, org.fossify.commons.R.string.faq_7_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.lock_note).isVisible = mNotes.isNotEmpty() && (::mCurrentNote.isInitialized && !mCurrentNote.isLocked()) + MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations) + MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.unlock_note).isVisible = mNotes.isNotEmpty() && (::mCurrentNote.isInitialized && mCurrentNote.isLocked()) + MaxLineLength:MainActivity.kt$MainActivity$fun + MaxLineLength:MainActivity.kt$MainActivity$getPagerAdapter().updateCurrentNoteData(binding.viewPager.currentItem, mCurrentNote.path, mCurrentNote.value) + MaxLineLength:MainActivity.kt$MainActivity$if + MaxLineLength:MainActivity.kt$MainActivity$intent.flags = intent.flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY + MaxLineLength:MainActivity.kt$MainActivity$private + MaxLineLength:MainActivity.kt$MainActivity$private fun isCurrentItemChecklist() + MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(binding.mainCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = false) + MaxLineLength:MainActivity.kt$MainActivity$val newChecklist = Note(null, getCurrentFormattedDateTime(), "", NoteType.TYPE_CHECKLIST, "", PROTECTION_NONE, "") + MaxLineLength:MainActivity.kt$MainActivity$val newTextNote = Note(null, getCurrentFormattedDateTime(), "", NoteType.TYPE_TEXT, "", PROTECTION_NONE, "") + MaxLineLength:MainActivity.kt$MainActivity$} + MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$PendingIntent.getActivity(context, widgetId, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + MaxLineLength:NewChecklistItemDialog.kt$NewChecklistItemDialog$if + MaxLineLength:NewChecklistItemDialog.kt$NewChecklistItemDialog$titles.all { it.text!!.isEmpty() } -> activity.toast(org.fossify.commons.R.string.empty_name) + MaxLineLength:NewChecklistItemDialog.kt$NewChecklistItemDialog$val titles = titles.map { it.text.toString() }.filter { it.isNotEmpty() }.toMutableList() as ArrayList<String> + MaxLineLength:NewNoteDialog.kt$NewNoteDialog$activity.notesDB.getNoteIdWithTitle(newTitle) != null -> activity.toast(R.string.title_taken) + MaxLineLength:NewNoteDialog.kt$NewNoteDialog$class + MaxLineLength:NewNoteDialog.kt$NewNoteDialog$val + MaxLineLength:NotesDatabase.kt$NotesDatabase.Companion.<no name provided>$execSQL("ALTER TABLE widgets ADD COLUMN widget_bg_color INTEGER NOT NULL DEFAULT $defaultWidgetBgColor") + MaxLineLength:NotesDatabase.kt$NotesDatabase.Companion.<no name provided>$execSQL("ALTER TABLE widgets ADD COLUMN widget_text_color INTEGER NOT NULL DEFAULT $DEFAULT_WIDGET_TEXT_COLOR") + MaxLineLength:NotesPagerAdapter.kt$NotesPagerAdapter$class + MaxLineLength:OpenFileDialog.kt$OpenFileDialog$class + MaxLineLength:OpenFileDialog.kt$OpenFileDialog$val updateFileOnEdit = binding.openFileType.checkedRadioButtonId == binding.openFileUpdateFile.id + MaxLineLength:OpenNoteAdapter.kt$OpenNoteAdapter$iconLock.setImageDrawable(activity.resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_lock_vector, properPrimaryColor)) + MaxLineLength:OpenNoteDialog.kt$OpenNoteDialog$binding.dialogOpenNoteList.layoutManager = AutoStaggeredGridLayoutManager(noteItemWidth, StaggeredGridLayoutManager.VERTICAL) + MaxLineLength:RenameNoteDialog.kt$RenameNoteDialog$class + MaxLineLength:SettingsActivity.kt$SettingsActivity$NotesHelper.ImportResult.IMPORT_PARTIAL -> toast(org.fossify.commons.R.string.importing_some_entries_failed) + MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) + MaxLineLength:SettingsActivity.kt$SettingsActivity$org.fossify.commons.R.string.fingerprint_setup_successfully + MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false) + MaxLineLength:SettingsActivity.kt$SettingsActivity$val items = listOf(GRAVITY_START, GRAVITY_CENTER, GRAVITY_END).map { RadioItem(it, getGravityOptionLabel(it)) } + MaxLineLength:SettingsActivity.kt$SettingsActivity$val leftToRightDirection = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_LTR + MaxLineLength:TasksAdapter.kt$TasksAdapter$menu.findItem(R.id.cab_move_to_bottom).isVisible = selectedItems.none { it.isDone } || !activity.config.moveDoneChecklistItems + MaxLineLength:TasksAdapter.kt$TasksAdapter$menu.findItem(R.id.cab_move_to_top).isVisible = selectedItems.none { it.isDone } || !activity.config.moveDoneChecklistItems + MaxLineLength:TasksAdapter.kt$TasksAdapter$private fun getSelectedItems() + MaxLineLength:TasksAdapter.kt$TasksAdapter$text = resources.getQuantityString(R.plurals.num_checked_items, completedTasks.tasks.size, completedTasks.tasks.size) + MaxLineLength:TasksFragment.kt$TasksFragment$note.getNoteStoredValue(requireActivity())?.split("\n")?.map { it.trim() }?.filter { it.isNotBlank() } + MaxLineLength:TasksFragment.kt$TasksFragment$tasks = Gson().fromJson<ArrayList<Task>>(storedNote.getNoteStoredValue(requireActivity()), taskType) ?: ArrayList(1) + MaxLineLength:TextFragment.kt$TextFragment$val inputManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + MaxLineLength:UnlockNotesDialog.kt$UnlockNotesDialog$activity + MaxLineLength:UnlockNotesDialog.kt$UnlockNotesDialog$class + MaxLineLength:WidgetAdapter.kt$WidgetAdapter$// checklist title can be null only because of the glitch in upgrade to 6.6.0, remove this check in the future + MaxLineLength:WidgetAdapter.kt$WidgetAdapter$tasks = note!!.getNoteStoredValue(context)?.ifEmpty { "[]" }?.let { Json.decodeFromString(it) } ?: mutableListOf() + MaxLineLength:WidgetAdapter.kt$WidgetAdapter$val paintFlags = if (checklistItem.isDone) Paint.STRIKE_THRU_TEXT_FLAG or Paint.ANTI_ALIAS_FLAG else Paint.ANTI_ALIAS_FLAG + MaxLineLength:WidgetAdapter.kt$WidgetAdapter$val widgetNewTextColor = if (checklistItem.isDone) widgetTextColor.adjustAlpha(DONE_CHECKLIST_ITEM_ALPHA) else widgetTextColor + MaxLineLength:WidgetConfigureActivity.kt$WidgetConfigureActivity$if + MaxLineLength:WidgetConfigureActivity.kt$WidgetConfigureActivity$val id = if (extras?.containsKey(CUSTOMIZED_WIDGET_KEY_ID) == true) extras.getLong(CUSTOMIZED_WIDGET_KEY_ID) else null + MaxLineLength:WidgetConfigureActivity.kt$WidgetConfigureActivity$val sampleValue = if (note.value.isEmpty() || mIsCustomizingColors) getString(R.string.widget_config) else note.value + NestedBlockDepth:MainActivity.kt$MainActivity$private fun checkIntents(intent: Intent) + NestedBlockDepth:Note.kt$Note$fun getNoteStoredValue(context: Context): String? + NestedBlockDepth:OpenNoteAdapter.kt$OpenNoteAdapter$private fun Note.getFormattedValue(context: Context): CharSequence? + NestedBlockDepth:TasksFragment.kt$TasksFragment$private fun prepareTaskItems(): List<NoteItem> + ReturnCount:TasksFragment.kt$TasksFragment$private fun saveNote(callback: () -> Unit = {}) + ReturnCount:TextFragment.kt$TextFragment$fun saveText(force: Boolean, callback: ((note: Note) -> Unit)? = null) + SwallowedException:MainActivity.kt$MainActivity$e: ActivityNotFoundException + SwallowedException:MainActivity.kt$MainActivity$e: Exception + SwallowedException:MainActivity.kt$MainActivity$e: NetworkErrorException + SwallowedException:Note.kt$Note$e: Exception + SwallowedException:String.kt$e: Exception + SwallowedException:TasksFragment.kt$TasksFragment$e: Exception + TooGenericExceptionCaught:Context.kt$e: Exception + TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception + TooGenericExceptionCaught:Note.kt$Note$e: Exception + TooGenericExceptionCaught:NotesPagerAdapter.kt$NotesPagerAdapter$e: Exception + TooGenericExceptionCaught:SettingsActivity.kt$SettingsActivity$e: Exception + TooGenericExceptionCaught:String.kt$e: Exception + TooGenericExceptionCaught:TasksFragment.kt$TasksFragment$e: Exception + TooGenericExceptionCaught:TextFragment.kt$TextFragment$e: Exception + TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivity + TooManyFunctions:NotesPagerAdapter.kt$NotesPagerAdapter : FragmentStatePagerAdapter + TooManyFunctions:OpenNoteAdapter.kt$OpenNoteAdapter : MyRecyclerViewAdapter + TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity + TooManyFunctions:TasksAdapter.kt$TasksAdapter : MyRecyclerViewListAdapterItemTouchHelperContract + TooManyFunctions:TasksFragment.kt$TasksFragment : NoteFragmentTasksActionListener + TooManyFunctions:TextFragment.kt$TextFragment : NoteFragment + TooManyFunctions:WidgetAdapter.kt$WidgetAdapter : RemoteViewsFactory + TooManyFunctions:WidgetConfigureActivity.kt$WidgetConfigureActivity : SimpleActivity + VariableNaming:MainActivity.kt$MainActivity$private val EXPORT_FILE_NO_SYNC = 2 + VariableNaming:MainActivity.kt$MainActivity$private val EXPORT_FILE_SYNC = 1 + VariableNaming:MainActivity.kt$MainActivity$private val IMPORT_FILE_NO_SYNC = 2 + VariableNaming:MainActivity.kt$MainActivity$private val IMPORT_FILE_SYNC = 1 + VariableNaming:MainActivity.kt$MainActivity$private val PICK_EXPORT_FILE_INTENT = 2 + VariableNaming:MainActivity.kt$MainActivity$private val PICK_OPEN_FILE_INTENT = 1 + VariableNaming:TextFragment.kt$TextFragment$private val TEXT = "text" + WildcardImport:Context.kt$import org.fossify.commons.extensions.* + WildcardImport:Context.kt$import org.fossify.notes.helpers.* + WildcardImport:EditTaskDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:ExportFileDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:ExportFilesDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:ExportNotesDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:ImportFolderDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:MainActivity.kt$import org.fossify.commons.dialogs.* + WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:MainActivity.kt$import org.fossify.notes.dialogs.* + WildcardImport:MainActivity.kt$import org.fossify.notes.extensions.* + WildcardImport:MainActivity.kt$import org.fossify.notes.helpers.* + WildcardImport:ManageAutoBackupsDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:NewChecklistItemDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:NewNoteDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:Note.kt$import androidx.room.* + WildcardImport:NoteFragment.kt$import org.fossify.commons.extensions.* + WildcardImport:NotesDao.kt$import androidx.room.* + WildcardImport:OpenNoteAdapter.kt$import org.fossify.commons.extensions.* + WildcardImport:RenameNoteDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:SettingsActivity.kt$import org.fossify.notes.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.notes.helpers.* + WildcardImport:TasksFragment.kt$import org.fossify.commons.extensions.* + WildcardImport:TextFragment.kt$import org.fossify.commons.extensions.* + WildcardImport:UnlockNotesDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:WidgetAdapter.kt$import org.fossify.notes.helpers.* + WildcardImport:WidgetConfigureActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:WidgetConfigureActivity.kt$import org.fossify.notes.helpers.* + + diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml new file mode 100644 index 00000000..dea0335a --- /dev/null +++ b/app/lint-baseline.xml @@ -0,0 +1,1529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.gradle.kts b/build.gradle.kts index faadecc8..9d428d5c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,4 +3,5 @@ plugins { alias(libs.plugins.kotlinAndroid).apply(false) alias(libs.plugins.ksp).apply(false) alias(libs.plugins.kotlinSerialization).apply(false) + alias(libs.plugins.detekt).apply(false) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 438edb14..1c1f162e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,6 +4,8 @@ kotlin = "1.9.24" #KSP kotlinxSerializationJson = "1.6.3" ksp = "1.9.24-1.0.20" +#Detekt +detekt = "1.23.3" #AndroidX androidx-constraintlayout = "2.1.4" androidx-documentfile = "1.0.1" @@ -45,3 +47,4 @@ android = { id = "com.android.application", version.ref = "gradlePlugins-agp" } kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }