From 495f6f365125f996b33219e9f7849056d4c191ad Mon Sep 17 00:00:00 2001 From: Oleksandr Balan Date: Sun, 21 Aug 2022 09:45:13 +0200 Subject: [PATCH] Update versions, add detekt and spotless --- build.gradle | 25 +- config/detekt/detekt.yml | 684 ++++++++++++++++++ demo/build.gradle | 2 +- .../kotlin/eu/wewox/pagecurl/HowToPageData.kt | 9 + .../eu/wewox/pagecurl/components/HowToPage.kt | 7 + .../pagecurl/components/ZoomOutLayout.kt | 14 +- .../screens/BackPagePageCurlScreen.kt | 7 +- .../screens/InteractionConfigInPageCurl.kt | 77 +- .../screens/SettingsPageCurlScreen.kt | 4 + .../screens/ShadowInPageCurlScreen.kt | 5 + .../pagecurl/screens/SimplePageCurlScreen.kt | 4 + .../pagecurl/screens/StateInPageCurlScreen.kt | 4 + .../eu/wewox/pagecurl/ui/theme/Color.kt | 4 +- .../eu/wewox/pagecurl/ui/theme/Shape.kt | 5 +- .../eu/wewox/pagecurl/ui/theme/Theme.kt | 21 +- .../kotlin/eu/wewox/pagecurl/ui/theme/Type.kt | 28 - gradle/wrapper/gradle-wrapper.properties | 4 +- pagecurl/build.gradle | 2 +- .../wewox/pagecurl/config/PageCurlConfig.kt | 2 + .../eu/wewox/pagecurl/page/PageCurlState.kt | 1 + .../eu/wewox/pagecurl/page/TapGesture.kt | 6 +- .../eu/wewox/pagecurl/utils/MathUtils.kt | 11 +- 22 files changed, 832 insertions(+), 94 deletions(-) create mode 100644 config/detekt/detekt.yml delete mode 100644 demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Type.kt diff --git a/build.gradle b/build.gradle index b026de1..4648d95 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,26 @@ buildscript { ext { - compose_version = "1.2.0-beta01" - activity = "1.4.0" + compose_version = "1.2.1" + compose_compiler_version = "1.3.0" + activity = "1.5.1" } } plugins { - id "com.android.application" version "7.1.1" apply false - id "com.android.library" version "7.1.1" apply false - id "org.jetbrains.kotlin.android" version "1.6.21" apply false + id "com.android.application" version "7.2.0" apply false + id "com.android.library" version "7.2.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false + id "io.gitlab.arturbosch.detekt" version "1.21.0" + id "com.diffplug.spotless" version "6.5.1" } -task clean(type: Delete) { - delete rootProject.buildDir +configure(subprojects) { + apply plugin: "io.gitlab.arturbosch.detekt" + apply plugin: "com.diffplug.spotless" + + spotless { + kotlin { + target("**/*.kt") + ktlint("0.43.2") + } + } } diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml new file mode 100644 index 0000000..4dbb501 --- /dev/null +++ b/config/detekt/detekt.yml @@ -0,0 +1,684 @@ +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' + +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<])|([.?!:]$)' + OutdatedDocumentation: + active: false + matchTypeParameters: true + matchDeclarationsOrder: true + allowParamOnConstructorProperties: false + UndocumentedPublicClass: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true + UndocumentedPublicFunction: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + UndocumentedPublicProperty: + active: true + 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: 60 + LongParameterList: + active: true + functionThreshold: 10 + constructorThreshold: 7 + ignoreDefaultParameters: false + ignoreDataClasses: true + ignoreAnnotated: [ 'Composable' ] + ignoreAnnotatedParameter: [] + MethodOverloading: + active: false + threshold: 6 + NamedArguments: + active: false + threshold: 3 + ignoreArgumentsMatchingNames: false + NestedBlockDepth: + active: true + threshold: 4 + 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: false + dispatcherNames: + - 'IO' + - 'Default' + - 'Unconfined' + RedundantSuspendModifier: + active: false + SleepInsteadOfDelay: + active: false + SuspendFunWithCoroutineScopeReceiver: + active: false + SuspendFunWithFlowReturnType: + active: false + +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: false + 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: true + 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: false + 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: false + 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 + ForEachOnRange: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + SpreadOperator: + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + UnnecessaryTemporaryInstantiation: + active: true + +potential-bugs: + active: true + AvoidReferentialEquality: + active: false + forbiddenTypePatterns: + - 'kotlin.String' + CastToNullableType: + active: false + Deprecation: + active: false + DontDowncastCollectionTypes: + active: false + DoubleMutabilityForCollection: + active: false + 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: false + IgnoredReturnValue: + active: false + 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: false + 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: false + UnreachableCode: + active: true + UnsafeCallOnNullableType: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + UnsafeCast: + active: true + UnusedUnaryOperator: + active: false + UselessPostfixExpression: + active: false + WrongEqualsTypeParameter: + active: true + +style: + active: true + CanBeNonNullable: + active: false + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false + conversionFunctionPrefix: 'to' + DataClassShouldBeImmutable: + active: false + DestructuringDeclarationWithTooManyEntries: + active: false + maxDestructuringEntries: 3 + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: false + 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.*' + ForbiddenVoid: + active: false + 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: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + 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 + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: false + MayBeConst: + active: true + ModifierOrder: + active: true + MultilineLambdaItParameter: + active: false + NestedClassesVisibility: + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false + ObjectLiteralToLambda: + active: false + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + OptionalWhenBraces: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true + RedundantExplicitType: + active: false + RedundantHigherOrderMapUsage: + active: false + 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 + UnnecessaryFilter: + active: false + 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)' + UseAnyOrNoneInsteadOfFind: + active: false + UseArrayLiteralsInAnnotations: + active: false + UseCheckNotNull: + active: false + UseCheckOrError: + active: false + UseDataClass: + active: false + allowVars: false + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: false + UseIfInsteadOfWhen: + active: false + UseIsNullOrEmpty: + active: false + UseOrEmpty: + active: false + UseRequire: + active: false + UseRequireNotNull: + active: false + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true + WildcardImport: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludeImports: + - 'java.util.*' diff --git a/demo/build.gradle b/demo/build.gradle index f3b0ffb..f5f54f1 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -38,7 +38,7 @@ android { compose true } composeOptions { - kotlinCompilerExtensionVersion compose_version + kotlinCompilerExtensionVersion compose_compiler_version } packagingOptions { resources { diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/HowToPageData.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/HowToPageData.kt index 5260ca4..df8107a 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/HowToPageData.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/HowToPageData.kt @@ -1,9 +1,18 @@ +@file:Suppress("MaxLineLength", "UndocumentedPublicProperty") + package eu.wewox.pagecurl +/** + * The model for data for the page. + * + * @property title The title to show on the page. + * @property message The message to show on the page. + */ data class HowToPageData( val title: String, val message: String, ) { + companion object { val simpleHowToPages = listOf( HowToPageData( diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/components/HowToPage.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/components/HowToPage.kt index 9e00a9a..bc45de3 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/components/HowToPage.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/components/HowToPage.kt @@ -18,6 +18,13 @@ import eu.wewox.pagecurl.HowToPageData import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingMedium +/** + * The simple page to use for demo purposes. + * + * @param index The index of the page to show a page number in the bottom. + * @param page The page data to show. + * @param modifier The modifier for this composable. + */ @Composable fun HowToPage( index: Int, diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/components/ZoomOutLayout.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/components/ZoomOutLayout.kt index 1044f49..c2c53c7 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/components/ZoomOutLayout.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/components/ZoomOutLayout.kt @@ -20,6 +20,15 @@ import androidx.compose.ui.unit.dp import eu.wewox.pagecurl.ExperimentalPageCurlApi import eu.wewox.pagecurl.config.PageCurlConfig +/** + * Layout which could be zoomed out and zoomed in to show / hide the [bottom] bar. + * + * @param zoomOut True when layout is zoomed out. + * @param config The [PageCurlConfig] to turn off interactions in the page curl. + * @param bottom The content of the bottom bar. + * @param modifier The modifier for this composable. + * @param pageCurl The content where PageCurl should be placed. + */ @Composable fun ZoomOutLayout( zoomOut: Boolean, @@ -29,7 +38,7 @@ fun ZoomOutLayout( pageCurl: @Composable () -> Unit, ) { // Disable all state interactions when PageCurl is zoomed out - LaunchedEffect(zoomOut) { + LaunchedEffect(zoomOut, config) { with(config) { dragForwardEnabled = !zoomOut dragBackwardEnabled = !zoomOut @@ -54,9 +63,8 @@ fun ZoomOutLayout( } } - @Composable -fun ZoomOutLayout( +private fun ZoomOutLayout( zoomOut: Boolean, bottom: @Composable () -> Unit, modifier: Modifier = Modifier, diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/BackPagePageCurlScreen.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/BackPagePageCurlScreen.kt index ff75ad8..b3aa6a6 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/BackPagePageCurlScreen.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/BackPagePageCurlScreen.kt @@ -1,4 +1,5 @@ @file:OptIn(ExperimentalPageCurlApi::class) +@file:Suppress("MagicNumber") package eu.wewox.pagecurl.screens @@ -42,6 +43,10 @@ import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingMedium import eu.wewox.pagecurl.ui.SpacingSmall +/** + * Back-Page Configuration in Page Curl. + * Example how to customize the back-page (the back of the page user see during the drag or animation). + */ @Composable fun BackPagePageCurlScreen() { Box(Modifier.fillMaxSize()) { @@ -86,7 +91,7 @@ private fun SettingsRow( Column( modifier = modifier .fillMaxWidth() - .padding(vertical = SpacingMedium) + .padding(vertical = SpacingLarge) ) { Text( text = "Alpha", diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/InteractionConfigInPageCurl.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/InteractionConfigInPageCurl.kt index d4576dc..f763d6a 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/InteractionConfigInPageCurl.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/InteractionConfigInPageCurl.kt @@ -38,6 +38,10 @@ import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingMedium import eu.wewox.pagecurl.ui.SpacingSmall +/** + * Interactions Configurations In Page Curl. + * Example interactions (drag / tap) can be customized. + */ @Composable fun InteractionConfigInPageCurlScreen() { Box(Modifier.fillMaxSize()) { @@ -114,37 +118,48 @@ private fun SettingsRow( } } - when (selectedOption) { - InteractionOption.Drag -> { - Slider( - value = config.dragForwardInteraction.start.left, - onValueChange = { - config.dragForwardInteraction = PageCurlConfig.DragInteraction( - Rect(it, 0.0f, 1.0f, 1.0f), - Rect(0.0f, 0.0f, it, 1.0f) - ) - config.dragBackwardInteraction = PageCurlConfig.DragInteraction( - Rect(0.0f, 0.0f, it, 1.0f), - Rect(it, 0.0f, 1.0f, 1.0f), - ) - }, - modifier = Modifier.fillMaxWidth() - ) - } - InteractionOption.Tap -> { - Slider( - value = config.tapForwardInteraction.target.left, - onValueChange = { - config.tapForwardInteraction = PageCurlConfig.TapInteraction( - Rect(it, 0.0f, 1.0f, 1.0f), - ) - config.tapBackwardInteraction = PageCurlConfig.TapInteraction( - Rect(0.0f, 0.0f, it, 1.0f), - ) - }, - modifier = Modifier.fillMaxWidth() - ) - } + SettingsRowSlider( + selectedOption = selectedOption, + config = config, + ) + } +} + +@Composable +private fun SettingsRowSlider( + selectedOption: InteractionOption, + config: PageCurlConfig, +) { + when (selectedOption) { + InteractionOption.Drag -> { + Slider( + value = config.dragForwardInteraction.start.left, + onValueChange = { + config.dragForwardInteraction = PageCurlConfig.DragInteraction( + Rect(it, 0.0f, 1.0f, 1.0f), + Rect(0.0f, 0.0f, it, 1.0f) + ) + config.dragBackwardInteraction = PageCurlConfig.DragInteraction( + Rect(0.0f, 0.0f, it, 1.0f), + Rect(it, 0.0f, 1.0f, 1.0f), + ) + }, + modifier = Modifier.fillMaxWidth() + ) + } + InteractionOption.Tap -> { + Slider( + value = config.tapForwardInteraction.target.left, + onValueChange = { + config.tapForwardInteraction = PageCurlConfig.TapInteraction( + Rect(it, 0.0f, 1.0f, 1.0f), + ) + config.tapBackwardInteraction = PageCurlConfig.TapInteraction( + Rect(0.0f, 0.0f, it, 1.0f), + ) + }, + modifier = Modifier.fillMaxWidth() + ) } } } diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SettingsPageCurlScreen.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SettingsPageCurlScreen.kt index f063f1f..7dd24a6 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SettingsPageCurlScreen.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SettingsPageCurlScreen.kt @@ -22,6 +22,10 @@ import eu.wewox.pagecurl.config.rememberPageCurlConfig import eu.wewox.pagecurl.page.PageCurl import eu.wewox.pagecurl.page.rememberPageCurlState +/** + * Page Curl With Settings. + * Showcases how individual interactions can be toggled on / off. + */ @Composable fun SettingsPageCurlScreen() { Box(Modifier.fillMaxSize()) { diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/ShadowInPageCurlScreen.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/ShadowInPageCurlScreen.kt index 6266d3f..9419b9e 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/ShadowInPageCurlScreen.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/ShadowInPageCurlScreen.kt @@ -1,4 +1,5 @@ @file:OptIn(ExperimentalPageCurlApi::class) +@file:Suppress("MagicNumber") package eu.wewox.pagecurl.screens @@ -29,6 +30,10 @@ import eu.wewox.pagecurl.page.PageCurl import eu.wewox.pagecurl.page.rememberPageCurlState import eu.wewox.pagecurl.ui.SpacingLarge +/** + * Shadow Configuration in Page Curl. + * Example how to customize shadow of the page. + */ @Composable fun ShadowInPageCurlScreen() { Box(Modifier.fillMaxSize()) { diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SimplePageCurlScreen.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SimplePageCurlScreen.kt index 13f9842..ce9807e 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SimplePageCurlScreen.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/SimplePageCurlScreen.kt @@ -13,6 +13,10 @@ import eu.wewox.pagecurl.components.HowToPage import eu.wewox.pagecurl.page.PageCurl import eu.wewox.pagecurl.page.rememberPageCurlState +/** + * Page Curl With Settings. + * Showcases how individual interactions can be toggled on / off. + */ @Composable fun SimplePageCurlScreen() { Box(Modifier.fillMaxSize()) { diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/StateInPageCurlScreen.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/StateInPageCurlScreen.kt index 113e598..bf3a74d 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/screens/StateInPageCurlScreen.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/screens/StateInPageCurlScreen.kt @@ -35,6 +35,10 @@ import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingMedium import kotlinx.coroutines.launch +/** + * Page Curl With State Management. + * Example how state can be used to change current page (snap / animate). + */ @Composable fun StateInPageCurlScreen() { Box(Modifier.fillMaxSize()) { diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Color.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Color.kt index b3daf39..e34a75f 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Color.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Color.kt @@ -1,3 +1,5 @@ +@file:Suppress("UndocumentedPublicProperty") + package eu.wewox.pagecurl.ui.theme import androidx.compose.ui.graphics.Color @@ -5,4 +7,4 @@ import androidx.compose.ui.graphics.Color val Purple200 = Color(0xFFBB86FC) val Purple500 = Color(0xFF6200EE) val Purple700 = Color(0xFF3700B3) -val Teal200 = Color(0xFF03DAC5) \ No newline at end of file +val Teal200 = Color(0xFF03DAC5) diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Shape.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Shape.kt index 4a470a7..2287108 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Shape.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Shape.kt @@ -4,8 +4,11 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Shapes import androidx.compose.ui.unit.dp +/** + * The application shapes. + */ val Shapes = Shapes( small = RoundedCornerShape(4.dp), medium = RoundedCornerShape(4.dp), large = RoundedCornerShape(0.dp) -) \ No newline at end of file +) diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Theme.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Theme.kt index fc6bbb6..b20c257 100644 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Theme.kt +++ b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Theme.kt @@ -2,6 +2,7 @@ package eu.wewox.pagecurl.ui.theme import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.MaterialTheme +import androidx.compose.material.Typography import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable @@ -9,24 +10,18 @@ import androidx.compose.runtime.Composable private val DarkColorPalette = darkColors( primary = Purple200, primaryVariant = Purple700, - secondary = Teal200 + secondary = Teal200, ) private val LightColorPalette = lightColors( primary = Purple500, primaryVariant = Purple700, - secondary = Teal200 - - /* Other default colors to override - background = Color.White, - surface = Color.White, - onPrimary = Color.White, - onSecondary = Color.Black, - onBackground = Color.Black, - onSurface = Color.Black, - */ + secondary = Teal200, ) +/** + * The theme to use for demo application. + */ @Composable fun PageCurlTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) { val colors = if (darkTheme) { @@ -37,8 +32,8 @@ fun PageCurlTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composab MaterialTheme( colors = colors, - typography = Typography, + typography = Typography(), shapes = Shapes, content = content ) -} \ No newline at end of file +} diff --git a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Type.kt b/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Type.kt deleted file mode 100644 index 6e627f8..0000000 --- a/demo/src/main/kotlin/eu/wewox/pagecurl/ui/theme/Type.kt +++ /dev/null @@ -1,28 +0,0 @@ -package eu.wewox.pagecurl.ui.theme - -import androidx.compose.material.Typography -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp - -// Set of Material typography styles to start with -val Typography = Typography( - body1 = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp - ) - /* Other default text styles to override - button = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.W500, - fontSize = 14.sp - ), - caption = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 12.sp - ) - */ -) \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0bf388e..ba8ce81 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Mar 22 09:36:17 CET 2022 +#Thu Aug 18 14:58:20 CEST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/pagecurl/build.gradle b/pagecurl/build.gradle index 4705f4b..5773c2d 100644 --- a/pagecurl/build.gradle +++ b/pagecurl/build.gradle @@ -27,7 +27,7 @@ android { compose true } composeOptions { - kotlinCompilerExtensionVersion compose_version + kotlinCompilerExtensionVersion compose_compiler_version } kotlinOptions { jvmTarget = "1.8" diff --git a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/config/PageCurlConfig.kt b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/config/PageCurlConfig.kt index fcd9571..b4c0d69 100644 --- a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/config/PageCurlConfig.kt +++ b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/config/PageCurlConfig.kt @@ -1,3 +1,5 @@ +@file:Suppress("LongParameterList", "LongMethod") + package eu.wewox.pagecurl.config import androidx.compose.runtime.Composable diff --git a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/PageCurlState.kt b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/PageCurlState.kt index 5c35f9f..4a9037f 100644 --- a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/PageCurlState.kt +++ b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/PageCurlState.kt @@ -63,6 +63,7 @@ public fun rememberPageCurlState( * The state of the PageCurl. * * @property max The max number of pages. + * @property config The configuration for PageCurl. * @param initialCurrent The initial current page. */ @ExperimentalPageCurlApi diff --git a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/TapGesture.kt b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/TapGesture.kt index 1776b1e..20dd2ef 100644 --- a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/TapGesture.kt +++ b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/page/TapGesture.kt @@ -38,7 +38,11 @@ internal fun Modifier.tapGesture( return@awaitPointerEventScope } - if (config.tapBackwardEnabled && config.tapBackwardInteraction.target.multiply(size).contains(up.position)) { + if (config.tapBackwardEnabled && + config.tapBackwardInteraction.target + .multiply(size) + .contains(up.position) + ) { scope.launch { onTapBackward() } diff --git a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/utils/MathUtils.kt b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/utils/MathUtils.kt index e2bf793..be26a51 100644 --- a/pagecurl/src/main/kotlin/eu/wewox/pagecurl/utils/MathUtils.kt +++ b/pagecurl/src/main/kotlin/eu/wewox/pagecurl/utils/MathUtils.kt @@ -19,9 +19,12 @@ internal fun lineLineIntersection( val denominator = (line1a.x - line1b.x) * (line2a.y - line2b.y) - (line1a.y - line1b.y) * (line2a.x - line2b.x) if (denominator == 0f) return null - val x = ((line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.x - line2b.x) - - (line1a.x - line1b.x) * (line2a.x * line2b.y - line2a.y * line2b.x)) / denominator - val y = ((line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.y - line2b.y) - - (line1a.y - line1b.y) * (line2a.x * line2b.y - line2a.y * line2b.x)) / denominator + val x1 = (line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.x - line2b.x) + val x2 = (line1a.x - line1b.x) * (line2a.x * line2b.y - line2a.y * line2b.x) + val x = (x1 - x2) / denominator + + val y1 = (line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.y - line2b.y) + val y2 = (line1a.y - line1b.y) * (line2a.x * line2b.y - line2a.y * line2b.x) + val y = (y1 - y2) / denominator return Offset(x, y) }