Update versions, add detekt and spotless

This commit is contained in:
Oleksandr Balan
2022-08-21 09:45:13 +02:00
parent c7ba0f606d
commit 495f6f3651
22 changed files with 832 additions and 94 deletions

View File

@@ -1,15 +1,26 @@
buildscript { buildscript {
ext { ext {
compose_version = "1.2.0-beta01" compose_version = "1.2.1"
activity = "1.4.0" compose_compiler_version = "1.3.0"
activity = "1.5.1"
} }
} }
plugins { plugins {
id "com.android.application" version "7.1.1" apply false id "com.android.application" version "7.2.0" apply false
id "com.android.library" version "7.1.1" apply false id "com.android.library" version "7.2.0" apply false
id "org.jetbrains.kotlin.android" version "1.6.21" 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) { configure(subprojects) {
delete rootProject.buildDir apply plugin: "io.gitlab.arturbosch.detekt"
apply plugin: "com.diffplug.spotless"
spotless {
kotlin {
target("**/*.kt")
ktlint("0.43.2")
}
}
} }

684
config/detekt/detekt.yml Normal file
View File

@@ -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.*'

View File

@@ -38,7 +38,7 @@ android {
compose true compose true
} }
composeOptions { composeOptions {
kotlinCompilerExtensionVersion compose_version kotlinCompilerExtensionVersion compose_compiler_version
} }
packagingOptions { packagingOptions {
resources { resources {

View File

@@ -1,9 +1,18 @@
@file:Suppress("MaxLineLength", "UndocumentedPublicProperty")
package eu.wewox.pagecurl 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( data class HowToPageData(
val title: String, val title: String,
val message: String, val message: String,
) { ) {
companion object { companion object {
val simpleHowToPages = listOf( val simpleHowToPages = listOf(
HowToPageData( HowToPageData(

View File

@@ -18,6 +18,13 @@ import eu.wewox.pagecurl.HowToPageData
import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingLarge
import eu.wewox.pagecurl.ui.SpacingMedium 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 @Composable
fun HowToPage( fun HowToPage(
index: Int, index: Int,

View File

@@ -20,6 +20,15 @@ import androidx.compose.ui.unit.dp
import eu.wewox.pagecurl.ExperimentalPageCurlApi import eu.wewox.pagecurl.ExperimentalPageCurlApi
import eu.wewox.pagecurl.config.PageCurlConfig 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 @Composable
fun ZoomOutLayout( fun ZoomOutLayout(
zoomOut: Boolean, zoomOut: Boolean,
@@ -29,7 +38,7 @@ fun ZoomOutLayout(
pageCurl: @Composable () -> Unit, pageCurl: @Composable () -> Unit,
) { ) {
// Disable all state interactions when PageCurl is zoomed out // Disable all state interactions when PageCurl is zoomed out
LaunchedEffect(zoomOut) { LaunchedEffect(zoomOut, config) {
with(config) { with(config) {
dragForwardEnabled = !zoomOut dragForwardEnabled = !zoomOut
dragBackwardEnabled = !zoomOut dragBackwardEnabled = !zoomOut
@@ -54,9 +63,8 @@ fun ZoomOutLayout(
} }
} }
@Composable @Composable
fun ZoomOutLayout( private fun ZoomOutLayout(
zoomOut: Boolean, zoomOut: Boolean,
bottom: @Composable () -> Unit, bottom: @Composable () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,

View File

@@ -1,4 +1,5 @@
@file:OptIn(ExperimentalPageCurlApi::class) @file:OptIn(ExperimentalPageCurlApi::class)
@file:Suppress("MagicNumber")
package eu.wewox.pagecurl.screens 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.SpacingMedium
import eu.wewox.pagecurl.ui.SpacingSmall 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 @Composable
fun BackPagePageCurlScreen() { fun BackPagePageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {
@@ -86,7 +91,7 @@ private fun SettingsRow(
Column( Column(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = SpacingMedium) .padding(vertical = SpacingLarge)
) { ) {
Text( Text(
text = "Alpha", text = "Alpha",

View File

@@ -38,6 +38,10 @@ import eu.wewox.pagecurl.ui.SpacingLarge
import eu.wewox.pagecurl.ui.SpacingMedium import eu.wewox.pagecurl.ui.SpacingMedium
import eu.wewox.pagecurl.ui.SpacingSmall import eu.wewox.pagecurl.ui.SpacingSmall
/**
* Interactions Configurations In Page Curl.
* Example interactions (drag / tap) can be customized.
*/
@Composable @Composable
fun InteractionConfigInPageCurlScreen() { fun InteractionConfigInPageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {
@@ -114,37 +118,48 @@ private fun SettingsRow(
} }
} }
when (selectedOption) { SettingsRowSlider(
InteractionOption.Drag -> { selectedOption = selectedOption,
Slider( config = config,
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) @Composable
) private fun SettingsRowSlider(
config.dragBackwardInteraction = PageCurlConfig.DragInteraction( selectedOption: InteractionOption,
Rect(0.0f, 0.0f, it, 1.0f), config: PageCurlConfig,
Rect(it, 0.0f, 1.0f, 1.0f), ) {
) when (selectedOption) {
}, InteractionOption.Drag -> {
modifier = Modifier.fillMaxWidth() Slider(
) value = config.dragForwardInteraction.start.left,
} onValueChange = {
InteractionOption.Tap -> { config.dragForwardInteraction = PageCurlConfig.DragInteraction(
Slider( Rect(it, 0.0f, 1.0f, 1.0f),
value = config.tapForwardInteraction.target.left, Rect(0.0f, 0.0f, it, 1.0f)
onValueChange = { )
config.tapForwardInteraction = PageCurlConfig.TapInteraction( config.dragBackwardInteraction = PageCurlConfig.DragInteraction(
Rect(it, 0.0f, 1.0f, 1.0f), Rect(0.0f, 0.0f, it, 1.0f),
) Rect(it, 0.0f, 1.0f, 1.0f),
config.tapBackwardInteraction = PageCurlConfig.TapInteraction( )
Rect(0.0f, 0.0f, it, 1.0f), },
) modifier = Modifier.fillMaxWidth()
}, )
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()
)
} }
} }
} }

View File

@@ -22,6 +22,10 @@ import eu.wewox.pagecurl.config.rememberPageCurlConfig
import eu.wewox.pagecurl.page.PageCurl import eu.wewox.pagecurl.page.PageCurl
import eu.wewox.pagecurl.page.rememberPageCurlState import eu.wewox.pagecurl.page.rememberPageCurlState
/**
* Page Curl With Settings.
* Showcases how individual interactions can be toggled on / off.
*/
@Composable @Composable
fun SettingsPageCurlScreen() { fun SettingsPageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {

View File

@@ -1,4 +1,5 @@
@file:OptIn(ExperimentalPageCurlApi::class) @file:OptIn(ExperimentalPageCurlApi::class)
@file:Suppress("MagicNumber")
package eu.wewox.pagecurl.screens 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.page.rememberPageCurlState
import eu.wewox.pagecurl.ui.SpacingLarge import eu.wewox.pagecurl.ui.SpacingLarge
/**
* Shadow Configuration in Page Curl.
* Example how to customize shadow of the page.
*/
@Composable @Composable
fun ShadowInPageCurlScreen() { fun ShadowInPageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {

View File

@@ -13,6 +13,10 @@ import eu.wewox.pagecurl.components.HowToPage
import eu.wewox.pagecurl.page.PageCurl import eu.wewox.pagecurl.page.PageCurl
import eu.wewox.pagecurl.page.rememberPageCurlState import eu.wewox.pagecurl.page.rememberPageCurlState
/**
* Page Curl With Settings.
* Showcases how individual interactions can be toggled on / off.
*/
@Composable @Composable
fun SimplePageCurlScreen() { fun SimplePageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {

View File

@@ -35,6 +35,10 @@ import eu.wewox.pagecurl.ui.SpacingLarge
import eu.wewox.pagecurl.ui.SpacingMedium import eu.wewox.pagecurl.ui.SpacingMedium
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/**
* Page Curl With State Management.
* Example how state can be used to change current page (snap / animate).
*/
@Composable @Composable
fun StateInPageCurlScreen() { fun StateInPageCurlScreen() {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {

View File

@@ -1,3 +1,5 @@
@file:Suppress("UndocumentedPublicProperty")
package eu.wewox.pagecurl.ui.theme package eu.wewox.pagecurl.ui.theme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@@ -5,4 +7,4 @@ import androidx.compose.ui.graphics.Color
val Purple200 = Color(0xFFBB86FC) val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE) val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3) val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5) val Teal200 = Color(0xFF03DAC5)

View File

@@ -4,8 +4,11 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Shapes import androidx.compose.material.Shapes
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
/**
* The application shapes.
*/
val Shapes = Shapes( val Shapes = Shapes(
small = RoundedCornerShape(4.dp), small = RoundedCornerShape(4.dp),
medium = RoundedCornerShape(4.dp), medium = RoundedCornerShape(4.dp),
large = RoundedCornerShape(0.dp) large = RoundedCornerShape(0.dp)
) )

View File

@@ -2,6 +2,7 @@ package eu.wewox.pagecurl.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Typography
import androidx.compose.material.darkColors import androidx.compose.material.darkColors
import androidx.compose.material.lightColors import androidx.compose.material.lightColors
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -9,24 +10,18 @@ import androidx.compose.runtime.Composable
private val DarkColorPalette = darkColors( private val DarkColorPalette = darkColors(
primary = Purple200, primary = Purple200,
primaryVariant = Purple700, primaryVariant = Purple700,
secondary = Teal200 secondary = Teal200,
) )
private val LightColorPalette = lightColors( private val LightColorPalette = lightColors(
primary = Purple500, primary = Purple500,
primaryVariant = Purple700, primaryVariant = Purple700,
secondary = Teal200 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,
*/
) )
/**
* The theme to use for demo application.
*/
@Composable @Composable
fun PageCurlTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) { fun PageCurlTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
val colors = if (darkTheme) { val colors = if (darkTheme) {
@@ -37,8 +32,8 @@ fun PageCurlTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composab
MaterialTheme( MaterialTheme(
colors = colors, colors = colors,
typography = Typography, typography = Typography(),
shapes = Shapes, shapes = Shapes,
content = content content = content
) )
} }

View File

@@ -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
)
*/
)

View File

@@ -1,6 +1,6 @@
#Tue Mar 22 09:36:17 CET 2022 #Thu Aug 18 14:58:20 CEST 2022
distributionBase=GRADLE_USER_HOME 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 distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

View File

@@ -27,7 +27,7 @@ android {
compose true compose true
} }
composeOptions { composeOptions {
kotlinCompilerExtensionVersion compose_version kotlinCompilerExtensionVersion compose_compiler_version
} }
kotlinOptions { kotlinOptions {
jvmTarget = "1.8" jvmTarget = "1.8"

View File

@@ -1,3 +1,5 @@
@file:Suppress("LongParameterList", "LongMethod")
package eu.wewox.pagecurl.config package eu.wewox.pagecurl.config
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable

View File

@@ -63,6 +63,7 @@ public fun rememberPageCurlState(
* The state of the PageCurl. * The state of the PageCurl.
* *
* @property max The max number of pages. * @property max The max number of pages.
* @property config The configuration for PageCurl.
* @param initialCurrent The initial current page. * @param initialCurrent The initial current page.
*/ */
@ExperimentalPageCurlApi @ExperimentalPageCurlApi

View File

@@ -38,7 +38,11 @@ internal fun Modifier.tapGesture(
return@awaitPointerEventScope 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 { scope.launch {
onTapBackward() onTapBackward()
} }

View File

@@ -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) val denominator = (line1a.x - line1b.x) * (line2a.y - line2b.y) - (line1a.y - line1b.y) * (line2a.x - line2b.x)
if (denominator == 0f) return null if (denominator == 0f) return null
val x = ((line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.x - line2b.x) - val x1 = (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 x2 = (line1a.x - line1b.x) * (line2a.x * line2b.y - line2a.y * line2b.x)
val y = ((line1a.x * line1b.y - line1a.y * line1b.x) * (line2a.y - line2b.y) - val x = (x1 - x2) / denominator
(line1a.y - line1b.y) * (line2a.x * line2b.y - line2a.y * line2b.x)) / 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) return Offset(x, y)
} }