From 7e03f1f8077d31bc3ecac1326425eca4a2cb4540 Mon Sep 17 00:00:00 2001 From: Jakub Syty Date: Tue, 14 Feb 2023 12:10:09 +0100 Subject: [PATCH] Gradle adjustements (#60) * Many gradle adjustements based on dependency-analysis plugin * Gradle api/impl cleanup * Setup linter with serif report * Fix lint errors --- .github/workflows/android.yaml | 9 +- app/build.gradle | 8 +- build-logic/build.gradle | 5 - .../project.android-base-conventions.gradle | 6 +- ...project.android-compose-conventions.gradle | 16 +- ...ect.android-feature-api-conventions.gradle | 2 +- .../project.android-mapper-conventions.gradle | 2 +- ...ject.android-networking-conventions.gradle | 4 +- build.gradle | 1 + config/detekt/detekt.yml | 1447 ++++++++--------- .../plugins/detekt-rules-compose-1.2.2.jar | Bin 59196 -> 0 bytes core/infrastructure/build.gradle | 2 +- core/navigation/impl/build.gradle | 2 +- core/networking/build.gradle | 3 +- .../ui/BaseComposeSetup.kt | 3 + .../longaction/impl/LongActionFragment.kt | 3 +- gradle.properties | 26 +- gradle/libs.versions.toml | 7 +- 18 files changed, 773 insertions(+), 773 deletions(-) delete mode 100644 config/detekt/plugins/detekt-rules-compose-1.2.2.jar diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index dd0b3b2..c977052 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -60,9 +60,15 @@ jobs: uses: gradle/gradle-build-action@v2 id: gradle with: - arguments: lintKotlin :app:assembleDebug :app:lintDebug --stacktrace # run tests here + arguments: lintKotlin lintDebug :app:assembleDebug --stacktrace # run tests here if: steps.commit_formatted_code.outputs.pushed == 'false' + - uses: github/codeql-action/upload-sarif@v2 + if: steps.commit_formatted_code.outputs.pushed == 'false' && success() || failure() + with: + sarif_file: app/build/reports/lint-results-debug.sarif + category: lint + actionlint: runs-on: ubuntu-latest steps: @@ -78,7 +84,6 @@ jobs: with: github_token: ${{ secrets.github_token }} detekt_config: ./config/detekt/detekt.yml - detekt_plugins: ./config/detekt/plugins/detekt-rules-compose-1.2.2.jar reviewdog_filter: file # always analyse whole file that was added/modified modulecheck: diff --git a/app/build.gradle b/app/build.gradle index 86d3f23..0e862e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,6 +37,11 @@ android { buildFeatures { buildConfig = true } + + lint { + checkDependencies true + sarifReport true + } } kapt { @@ -59,7 +64,8 @@ dependencies { implementation libs.androidx.coordinatorlayour implementation libs.fragNav - implementation libs.bundles.networking + implementation libs.orbitmvi.viewmodel + implementation libs.material internalImplementation libs.bundles.pluto } diff --git a/build-logic/build.gradle b/build-logic/build.gradle index 7baac15..d7e931e 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -10,10 +10,5 @@ plugins { } dependencies { - implementation libs.kotlin.android.plugin - implementation libs.android.plugin - implementation libs.whetstone.plugin implementation libs.androidCacheFix - implementation libs.kotlinx.serialization.plugin - implementation libs.detekt.plugin } diff --git a/build-logic/src/main/groovy/project.android-base-conventions.gradle b/build-logic/src/main/groovy/project.android-base-conventions.gradle index beec036..bbea960 100644 --- a/build-logic/src/main/groovy/project.android-base-conventions.gradle +++ b/build-logic/src/main/groovy/project.android-base-conventions.gradle @@ -48,6 +48,10 @@ android { } } +kotlin { + jvmToolchain(11) +} + anvil { generateDaggerFactories = true } @@ -67,7 +71,7 @@ dependencies { implementation libs.coroutines.lib - implementation libs.dagger.core + api libs.dagger.core implementation libs.bundles.androidx.core implementation libs.timber diff --git a/build-logic/src/main/groovy/project.android-compose-conventions.gradle b/build-logic/src/main/groovy/project.android-compose-conventions.gradle index b59097f..d7448cc 100644 --- a/build-logic/src/main/groovy/project.android-compose-conventions.gradle +++ b/build-logic/src/main/groovy/project.android-compose-conventions.gradle @@ -11,12 +11,12 @@ android { if (findProperty("enableComposeCompilerReports") == "true") { kotlinOptions { freeCompilerArgs += [ - "-P", - "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + - buildDir.absolutePath + "/compose_metrics", - "-P", - "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + - buildDir.absolutePath + "/compose_metrics" + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + + buildDir.absolutePath + "/compose_metrics", + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + + buildDir.absolutePath + "/compose_metrics" ] } } @@ -32,7 +32,9 @@ dependencies { implementation libs.androidx.activity.compose - implementation libs.bundles.compose.ui.core + api libs.bundles.compose.ui.core + + lintChecks libs.compose.linter androidTestImplementation composeBom androidTestImplementation libs.bundles.androidx.test diff --git a/build-logic/src/main/groovy/project.android-feature-api-conventions.gradle b/build-logic/src/main/groovy/project.android-feature-api-conventions.gradle index 3476ad5..95e67f0 100644 --- a/build-logic/src/main/groovy/project.android-feature-api-conventions.gradle +++ b/build-logic/src/main/groovy/project.android-feature-api-conventions.gradle @@ -9,6 +9,6 @@ android { } dependencies { - api projects.core.infrastructure + implementation projects.core.infrastructure api projects.core.navigation } diff --git a/build-logic/src/main/groovy/project.android-mapper-conventions.gradle b/build-logic/src/main/groovy/project.android-mapper-conventions.gradle index f1bdb4e..15986e3 100644 --- a/build-logic/src/main/groovy/project.android-mapper-conventions.gradle +++ b/build-logic/src/main/groovy/project.android-mapper-conventions.gradle @@ -3,6 +3,6 @@ plugins { } dependencies { - implementation libs.kmapper.library + compileOnly libs.kmapper.library ksp libs.kmapper.compiler } diff --git a/build-logic/src/main/groovy/project.android-networking-conventions.gradle b/build-logic/src/main/groovy/project.android-networking-conventions.gradle index 86a1b88..c1966e3 100644 --- a/build-logic/src/main/groovy/project.android-networking-conventions.gradle +++ b/build-logic/src/main/groovy/project.android-networking-conventions.gradle @@ -5,6 +5,6 @@ plugins { dependencies { api projects.core.networking - implementation libs.retrofit.core - implementation libs.kotlinx.serialization.json + api libs.retrofit.core + api libs.kotlinx.serialization.json } diff --git a/build.gradle b/build.gradle index 7c95883..e1fda47 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ plugins { alias libs.plugins.benManesVersions alias libs.plugins.gradleDoctor alias libs.plugins.moduleCheck + alias libs.plugins.dependencyAnalysis } moduleCheck { diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 4b90d7f..278e722 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -1,734 +1,713 @@ -build: - maxIssues: 0 - excludeCorrectable: false - weights: - # complexity: 2 - # LongParameterList: 1 - # style: 1 - # comments: 1 - -config: - validation: true - warningsAsErrors: 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' - -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/**', '**/jsTest/**', '**/iosTest/**'] - OutdatedDocumentation: - active: false - matchTypeParameters: true - matchDeclarationsOrder: true - allowParamOnConstructorProperties: false - UndocumentedPublicClass: - active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - searchInNestedClass: true - searchInInnerClass: true - searchInInnerObject: true - searchInInnerInterface: true - UndocumentedPublicFunction: - active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - UndocumentedPublicProperty: - active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - -complexity: - active: true - ComplexCondition: - active: true - threshold: 4 - ComplexInterface: - active: false - threshold: 10 - includeStaticDeclarations: false - includePrivateDeclarations: false - ComplexMethod: - 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: 800 - ignoreAnnotated: ['Composable'] - LongParameterList: - active: true - functionThreshold: 6 - constructorThreshold: 7 - ignoreDefaultParameters: true - ignoreDataClasses: true - ignoreAnnotatedParameter: [] - ignoreAnnotated: ['Composable'] - MethodOverloading: - active: false - threshold: 6 - NamedArguments: - active: false - threshold: 3 - ignoreArgumentsMatchingNames: false - 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/**', '**/jsTest/**', '**/iosTest/**'] - threshold: 3 - ignoreAnnotation: true - excludeStringsWithLessThan5Characters: true - ignoreStringsRegex: '$^' - TooManyFunctions: - active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/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 - SuspendFunWithCoroutineScopeReceiver: - active: false - 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/**', '**/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/**', '**/jsTest/**', '**/iosTest/**'] - exceptions: - - 'ArrayIndexOutOfBoundsException' - - 'Exception' - - 'IllegalArgumentException' - - 'IllegalMonitorStateException' - - 'IllegalStateException' - - 'IndexOutOfBoundsException' - - 'NullPointerException' - - 'RuntimeException' - - 'Throwable' - ThrowingNewInstanceOfSameException: - active: true - TooGenericExceptionCaught: - active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/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)' - ignoreOverridden: true - 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: '$^' - ignoreOverridden: true - 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/**', '**/jsTest/**', '**/iosTest/**'] - functionPattern: '[a-z][a-zA-Z0-9]*' - excludeClassPattern: '$^' - ignoreOverridden: true - ignoreAnnotated: ['Composable'] - FunctionParameterNaming: - active: true - parameterPattern: '[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' - ignoreOverridden: true - 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-Za-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: '$^' - ignoreOverridden: true - -performance: - active: true - ArrayPrimitive: - active: true - CouldBeSequence: - active: false - threshold: 3 - ForEachOnRange: - active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - SpreadOperator: - active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - UnnecessaryTemporaryInstantiation: - active: true - -potential-bugs: - active: true - AvoidReferentialEquality: - active: true - forbiddenTypePatterns: - - 'kotlin.String' - CastToNullableType: - active: false - Deprecation: - active: false - DontDowncastCollectionTypes: - active: false - 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' - DuplicateCaseInWhenExpression: - active: true - ElseCaseInsteadOfExhaustiveWhen: - active: false - EqualsAlwaysReturnsTrueOrFalse: - active: true - EqualsWithHashCodeExist: - active: true - ExitOutsideMain: - active: false - ExplicitGarbageCollectionCall: - active: true - HasPlatformType: - active: true - IgnoredReturnValue: - active: true - restrictToAnnotatedMethods: true - returnValueAnnotations: - - '*.CheckResult' - - '*.CheckReturnValue' - ignoreReturnValueAnnotations: - - '*.CanIgnoreReturnValue' - 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/**', '**/jsTest/**', '**/iosTest/**'] - ignoreOnClassesPattern: '' - MapGetWithNotNullAssertionOperator: - active: true - MissingPackageDeclaration: - active: false - excludes: ['**/*.kts'] - MissingWhenCase: - active: true - allowElseExpression: true - NullCheckOnMutableProperty: - active: false - NullableToStringCall: - active: false - RedundantElseInWhen: - active: true - UnconditionalJumpStatementInLoop: - active: false - UnnecessaryNotNullOperator: - active: true - UnnecessarySafeCall: - active: true - UnreachableCatchBlock: - active: true - UnreachableCode: - active: true - UnsafeCallOnNullableType: - active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - UnsafeCast: - active: true - UnusedUnaryOperator: - active: true - UselessPostfixExpression: - active: true - WrongEqualsTypeParameter: - active: true - -style: - active: true - CanBeNonNullable: - active: false - CascadingCallWrapping: - active: false - includeElvis: true - ClassOrdering: - active: false - CollapsibleIfStatements: - active: false - DataClassContainsFunctions: - active: false - conversionFunctionPrefix: 'to' - DataClassShouldBeImmutable: - active: false - DestructuringDeclarationWithTooManyEntries: - active: true - maxDestructuringEntries: 3 - EqualsNullCall: - active: true - EqualsOnSignatureLine: - active: false - ExplicitCollectionElementAccessMethod: - active: false - ExplicitItLambdaParameter: - active: true - ExpressionBodySyntax: - active: false - includeLineWrapping: false - ForbiddenComment: - active: true - values: - - 'FIXME:' - - 'STOPSHIP:' - - 'TODO:' - allowedPatterns: '' - customMessage: '' - ForbiddenImport: - active: false - imports: [] - forbiddenPatterns: '' - ForbiddenMethodCall: - active: false - methods: - - 'kotlin.io.print' - - 'kotlin.io.println' - ForbiddenPublicDataClass: - active: true - excludes: ['**'] - ignorePackages: - - '*.internal' - - '*.internal.*' - ForbiddenSuppress: - active: false - rules: [] - ForbiddenVoid: - active: true - ignoreOverridden: false - ignoreUsageInGenerics: false - FunctionOnlyReturningConstant: - active: true - ignoreOverridableFunction: true - ignoreActualFunction: true - excludedFunctions: '' - LibraryCodeMustSpecifyReturnType: - active: true - excludes: ['**'] - LibraryEntitiesShouldNotBePublic: - active: true - excludes: ['**'] - LoopWithTooManyJumpStatements: - active: true - maxJumpCount: 1 - MagicNumber: - active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts'] - ignoreNumbers: - - '-1' - - '0' - - '1' - - '2' - ignoreHashCodeFunction: true - ignorePropertyDeclaration: false - ignoreLocalVariableDeclaration: false - ignoreConstantDeclaration: true - ignoreCompanionObjectPropertyDeclaration: true - ignoreAnnotation: false - ignoreNamedArgument: true - ignoreEnums: false - ignoreRanges: false - ignoreExtensionFunctions: true - MandatoryBracesIfStatements: - active: false - MandatoryBracesLoops: - active: false - MaxChainedCallsOnSameLine: - active: false - maxChainedCalls: 5 - MaxLineLength: - active: true - maxLineLength: 200 - excludePackageStatements: true - excludeImportStatements: true - excludeCommentStatements: true - MayBeConst: - active: true - ModifierOrder: - active: true - MultilineLambdaItParameter: - active: false - NestedClassesVisibility: - active: true - NewLineAtEndOfFile: - active: true - NoTabs: - active: false - NullableBooleanCheck: - active: false - ObjectLiteralToLambda: - active: true - OptionalAbstractKeyword: - active: true - OptionalUnit: - active: false - OptionalWhenBraces: - active: false - PreferToOverPairSyntax: - active: false - ProtectedMemberInFinalClass: - active: true - RedundantExplicitType: - active: false - 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 - ThrowsCount: - active: true - max: 2 - excludeGuardClauses: false - TrailingWhitespace: - active: false - UnderscoresInNumericLiterals: - active: false - acceptableLength: 4 - allowNonStandardGrouping: false - UnnecessaryAbstractClass: - active: true - UnnecessaryAnnotationUseSiteTarget: - active: false - UnnecessaryApply: - active: true - UnnecessaryBackticks: - active: false - UnnecessaryFilter: - active: true - UnnecessaryInheritance: - active: true - UnnecessaryInnerClass: - active: false - UnnecessaryLet: - active: false - UnnecessaryParentheses: - active: false - UntilInsteadOfRangeTo: - active: false - UnusedImports: - active: false - UnusedPrivateClass: - active: true - UnusedPrivateMember: - active: true - allowedNames: '(_|ignored|expected|serialVersionUID)' - ignoreAnnotated: ['Preview'] - UseAnyOrNoneInsteadOfFind: - active: true - UseArrayLiteralsInAnnotations: - active: true - UseCheckNotNull: - active: true - UseCheckOrError: - active: true - UseDataClass: - active: false - allowVars: false - UseEmptyCounterpart: - active: false - UseIfEmptyOrIfBlank: - active: false - UseIfInsteadOfWhen: - active: false - UseIsNullOrEmpty: - active: true - UseOrEmpty: - active: true - UseRequire: - active: true - UseRequireNotNull: - active: true - UselessCallOnNotNull: - active: true - UtilityClassWithPublicConstructor: - active: true - VarCouldBeVal: - active: true - ignoreLateinitVar: false - WildcardImport: - active: false -compose: - ReusedModifierInstance: - active: true - UnnecessaryEventHandlerParameter: - active: true - ComposableEventParameterNaming: - active: true - ComposableParametersOrdering: - active: true - ModifierHeightWithText: - active: true - ModifierParameterPosition: - active: true - ModifierDefaultValue: - active: true - MissingModifierDefaultValue: - active: true - PublicComposablePreview: - active: true - TopLevelComposableFunctions: - active: false +build: + maxIssues: 0 + excludeCorrectable: false + weights: + # complexity: 2 + # LongParameterList: 1 + # style: 1 + # comments: 1 + +config: + validation: true + warningsAsErrors: 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' + +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/**', '**/jsTest/**', '**/iosTest/**' ] + OutdatedDocumentation: + active: false + matchTypeParameters: true + matchDeclarationsOrder: true + allowParamOnConstructorProperties: false + UndocumentedPublicClass: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true + UndocumentedPublicFunction: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + UndocumentedPublicProperty: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + +complexity: + active: true + ComplexCondition: + active: true + threshold: 4 + ComplexInterface: + active: false + threshold: 10 + includeStaticDeclarations: false + includePrivateDeclarations: false + ComplexMethod: + 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: 800 + ignoreAnnotated: [ 'Composable' ] + LongParameterList: + active: true + functionThreshold: 6 + constructorThreshold: 7 + ignoreDefaultParameters: true + ignoreDataClasses: true + ignoreAnnotatedParameter: [ ] + ignoreAnnotated: [ 'Composable' ] + MethodOverloading: + active: false + threshold: 6 + NamedArguments: + active: false + threshold: 3 + ignoreArgumentsMatchingNames: false + 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/**', '**/jsTest/**', '**/iosTest/**' ] + threshold: 3 + ignoreAnnotation: true + excludeStringsWithLessThan5Characters: true + ignoreStringsRegex: '$^' + TooManyFunctions: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/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 + SuspendFunWithCoroutineScopeReceiver: + active: false + 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/**', '**/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/**', '**/jsTest/**', '**/iosTest/**' ] + exceptions: + - 'ArrayIndexOutOfBoundsException' + - 'Exception' + - 'IllegalArgumentException' + - 'IllegalMonitorStateException' + - 'IllegalStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + ThrowingNewInstanceOfSameException: + active: true + TooGenericExceptionCaught: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/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)' + ignoreOverridden: true + 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: '$^' + ignoreOverridden: true + 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/**', '**/jsTest/**', '**/iosTest/**' ] + functionPattern: '[a-z][a-zA-Z0-9]*' + excludeClassPattern: '$^' + ignoreOverridden: true + ignoreAnnotated: [ 'Composable' ] + FunctionParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + ignoreOverridden: true + 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-Za-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: '$^' + ignoreOverridden: true + +performance: + active: true + ArrayPrimitive: + active: true + CouldBeSequence: + active: false + threshold: 3 + ForEachOnRange: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + SpreadOperator: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + UnnecessaryTemporaryInstantiation: + active: true + +potential-bugs: + active: true + AvoidReferentialEquality: + active: true + forbiddenTypePatterns: + - 'kotlin.String' + CastToNullableType: + active: false + Deprecation: + active: false + DontDowncastCollectionTypes: + active: false + 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' + DuplicateCaseInWhenExpression: + active: true + ElseCaseInsteadOfExhaustiveWhen: + active: false + EqualsAlwaysReturnsTrueOrFalse: + active: true + EqualsWithHashCodeExist: + active: true + ExitOutsideMain: + active: false + ExplicitGarbageCollectionCall: + active: true + HasPlatformType: + active: true + IgnoredReturnValue: + active: true + restrictToAnnotatedMethods: true + returnValueAnnotations: + - '*.CheckResult' + - '*.CheckReturnValue' + ignoreReturnValueAnnotations: + - '*.CanIgnoreReturnValue' + 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/**', '**/jsTest/**', '**/iosTest/**' ] + ignoreOnClassesPattern: '' + MapGetWithNotNullAssertionOperator: + active: true + MissingPackageDeclaration: + active: false + excludes: [ '**/*.kts' ] + MissingWhenCase: + active: true + allowElseExpression: true + NullCheckOnMutableProperty: + active: false + NullableToStringCall: + active: false + RedundantElseInWhen: + active: true + UnconditionalJumpStatementInLoop: + active: false + UnnecessaryNotNullOperator: + active: true + UnnecessarySafeCall: + active: true + UnreachableCatchBlock: + active: true + UnreachableCode: + active: true + UnsafeCallOnNullableType: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + UnsafeCast: + active: true + UnusedUnaryOperator: + active: true + UselessPostfixExpression: + active: true + WrongEqualsTypeParameter: + active: true + +style: + active: true + CanBeNonNullable: + active: false + CascadingCallWrapping: + active: false + includeElvis: true + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false + conversionFunctionPrefix: 'to' + DataClassShouldBeImmutable: + active: false + DestructuringDeclarationWithTooManyEntries: + active: true + maxDestructuringEntries: 3 + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: true + ExpressionBodySyntax: + active: false + includeLineWrapping: false + ForbiddenComment: + active: true + values: + - 'FIXME:' + - 'STOPSHIP:' + - 'TODO:' + allowedPatterns: '' + customMessage: '' + ForbiddenImport: + active: false + imports: [ ] + forbiddenPatterns: '' + ForbiddenMethodCall: + active: false + methods: + - 'kotlin.io.print' + - 'kotlin.io.println' + ForbiddenPublicDataClass: + active: true + excludes: [ '**' ] + ignorePackages: + - '*.internal' + - '*.internal.*' + ForbiddenSuppress: + active: false + rules: [ ] + ForbiddenVoid: + active: true + ignoreOverridden: false + ignoreUsageInGenerics: false + FunctionOnlyReturningConstant: + active: true + ignoreOverridableFunction: true + ignoreActualFunction: true + excludedFunctions: '' + LibraryCodeMustSpecifyReturnType: + active: true + excludes: [ '**' ] + LibraryEntitiesShouldNotBePublic: + active: true + excludes: [ '**' ] + LoopWithTooManyJumpStatements: + active: true + maxJumpCount: 1 + MagicNumber: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts' ] + ignoreNumbers: + - '-1' + - '0' + - '1' + - '2' + ignoreHashCodeFunction: true + ignorePropertyDeclaration: false + ignoreLocalVariableDeclaration: false + ignoreConstantDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + ignoreAnnotation: false + ignoreNamedArgument: true + ignoreEnums: false + ignoreRanges: false + ignoreExtensionFunctions: true + MandatoryBracesIfStatements: + active: false + MandatoryBracesLoops: + active: false + MaxChainedCallsOnSameLine: + active: false + maxChainedCalls: 5 + MaxLineLength: + active: true + maxLineLength: 200 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: true + MayBeConst: + active: true + ModifierOrder: + active: true + MultilineLambdaItParameter: + active: false + NestedClassesVisibility: + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false + NullableBooleanCheck: + active: false + ObjectLiteralToLambda: + active: true + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + OptionalWhenBraces: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true + RedundantExplicitType: + active: false + 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 + ThrowsCount: + active: true + max: 2 + excludeGuardClauses: false + TrailingWhitespace: + active: false + UnderscoresInNumericLiterals: + active: false + acceptableLength: 4 + allowNonStandardGrouping: false + UnnecessaryAbstractClass: + active: true + UnnecessaryAnnotationUseSiteTarget: + active: false + UnnecessaryApply: + active: true + UnnecessaryBackticks: + active: false + UnnecessaryFilter: + active: true + UnnecessaryInheritance: + active: true + UnnecessaryInnerClass: + active: false + UnnecessaryLet: + active: false + UnnecessaryParentheses: + active: false + UntilInsteadOfRangeTo: + active: false + UnusedImports: + active: false + UnusedPrivateClass: + active: true + UnusedPrivateMember: + active: true + allowedNames: '(_|ignored|expected|serialVersionUID)' + ignoreAnnotated: [ 'Preview' ] + UseAnyOrNoneInsteadOfFind: + active: true + UseArrayLiteralsInAnnotations: + active: true + UseCheckNotNull: + active: true + UseCheckOrError: + active: true + UseDataClass: + active: false + allowVars: false + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: false + UseIfInsteadOfWhen: + active: false + UseIsNullOrEmpty: + active: true + UseOrEmpty: + active: true + UseRequire: + active: true + UseRequireNotNull: + active: true + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true + ignoreLateinitVar: false + WildcardImport: + active: false diff --git a/config/detekt/plugins/detekt-rules-compose-1.2.2.jar b/config/detekt/plugins/detekt-rules-compose-1.2.2.jar deleted file mode 100644 index 2866cb79298fcc3c03eebf5bdf20f40223d2deb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59196 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 B4^RLA diff --git a/core/infrastructure/build.gradle b/core/infrastructure/build.gradle index 4626943..9650827 100644 --- a/core/infrastructure/build.gradle +++ b/core/infrastructure/build.gradle @@ -12,7 +12,7 @@ android { dependencies { implementation libs.androidx.fragment - api libs.orbitmvi.viewmodel + implementation libs.orbitmvi.viewmodel // needed to mark certain classes as @Stable or @Immutable var composeBom = platform(libs.compose.bom) diff --git a/core/navigation/impl/build.gradle b/core/navigation/impl/build.gradle index 1dfc32e..2b902a9 100644 --- a/core/navigation/impl/build.gradle +++ b/core/navigation/impl/build.gradle @@ -7,7 +7,7 @@ android { } dependencies { - api projects.core.infrastructure + implementation projects.core.infrastructure api projects.core.navigation implementation libs.androidx.fragment } diff --git a/core/networking/build.gradle b/core/networking/build.gradle index d16a417..657b536 100644 --- a/core/networking/build.gradle +++ b/core/networking/build.gradle @@ -10,7 +10,8 @@ android { dependencies { api projects.core.infrastructure - implementation libs.bundles.networking + api libs.okhttp.core + implementation libs.kotlinx.serialization.json implementation libs.retrofit.core implementation libs.retrofit.kotlinSerializationConverter implementation libs.resilience4j.kotlin diff --git a/core/ui/src/main/java/pl/jsyty/architecturetemplate/ui/BaseComposeSetup.kt b/core/ui/src/main/java/pl/jsyty/architecturetemplate/ui/BaseComposeSetup.kt index db2ed1f..d3443f0 100644 --- a/core/ui/src/main/java/pl/jsyty/architecturetemplate/ui/BaseComposeSetup.kt +++ b/core/ui/src/main/java/pl/jsyty/architecturetemplate/ui/BaseComposeSetup.kt @@ -1,5 +1,8 @@ +@file:SuppressLint("ComposeCompositionLocalUsage") + package pl.jsyty.architecturetemplate.ui +import android.annotation.SuppressLint import androidx.compose.runtime.* import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy diff --git a/features/longaction/impl/src/main/java/pl/jsyty/architecturetemplate/feature/longaction/impl/LongActionFragment.kt b/features/longaction/impl/src/main/java/pl/jsyty/architecturetemplate/feature/longaction/impl/LongActionFragment.kt index 4ae8baf..53520d7 100644 --- a/features/longaction/impl/src/main/java/pl/jsyty/architecturetemplate/feature/longaction/impl/LongActionFragment.kt +++ b/features/longaction/impl/src/main/java/pl/jsyty/architecturetemplate/feature/longaction/impl/LongActionFragment.kt @@ -2,8 +2,7 @@ package pl.jsyty.architecturetemplate.feature.longaction.impl import androidx.compose.foundation.layout.* import androidx.compose.material.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.deliveryhero.whetstone.fragment.ContributesFragment diff --git a/gradle.properties b/gradle.properties index e630430..c263732 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,15 @@ -org.gradle.jvmargs=-Xmx16g -Xms4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -org.gradle.parallel=true -android.useAndroidX=true -android.enableJetifier=false -kotlin.code.style=official -systemProp.file.encoding=utf-8 -org.gradle.vfs.watch=true -org.gradle.caching=true -kapt.include.compile.classpath=false -android.nonTransitiveRClass=true -kotlin.incremental.useClasspathSnapshot=true +org.gradle.jvmargs=-Xmx16g -Xms4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC +org.gradle.parallel=true +android.useAndroidX=true +android.enableJetifier=false +kotlin.code.style=official +systemProp.file.encoding=utf-8 +org.gradle.vfs.watch=true +org.gradle.caching=true +kapt.include.compile.classpath=false +android.nonTransitiveRClass=true +kotlin.incremental.useClasspathSnapshot=true +# Experimental +org.gradle.unsafe.configuration-cache=true +# Use this flag carefully, in case some of the plugins are not fully compatible. +org.gradle.unsafe.configuration-cache-problems=warn diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 918d0f7..6b79919 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,7 +45,7 @@ dagger-core = { module = "com.google.dagger:dagger", version.ref = "dagger" } dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" } compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } -compose-runtime = { module = "androidx.compose.runtime:runtime"} +compose-runtime = { module = "androidx.compose.runtime:runtime" } compose-ui = { module = "androidx.compose.ui:ui" } compose-uitooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } compose-uitooling-core = { module = "androidx.compose.ui:ui-tooling" } @@ -56,6 +56,8 @@ compose-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } # We are not using this anywhere, but it's required so the renovate bot can properly spot new compiler releases compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose-compiler" } +compose-linter = { module = "com.slack.lint.compose:compose-lint-checks", version = "1.0.0" } + junit4 = { module = "junit:junit", version = "4.13.2" } fragNav = { module = "com.github.ncapdevi:FragNav", version = "3.3.0" } @@ -136,6 +138,7 @@ kotlinter = { id = "org.jmailen.kotlinter", version.ref = "kotlinter" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } moduleCheck = { id = "com.rickbusarow.module-check", version = "0.12.5" } +dependencyAnalysis = { id = "com.autonomousapps.dependency-analysis", version = "1.19.0" } [bundles] compose-ui-core = ["compose-ui", "compose-uitooling-preview", "compose-material"] @@ -152,8 +155,6 @@ test-kotlinCompile = ["test-kotlinCompile-base", "test-kotlinCompile-ksp"] anvil-compiler = ["anvil-compiler-api", "anvil-compiler-utils"] -networking = ["okhttp-core", "kotlinx-serialization-json"] - pluto = [ "pluto-core", "pluto-logger",