EU;A?1D8TI!W(Zt&zzh)ujV&
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
BlVJb=
literal 0
HcmV?d00001
diff --git a/ComposeCalendar/build.gradle.kts b/ComposeCalendar/build.gradle.kts
new file mode 100644
index 000000000..057fb2192
--- /dev/null
+++ b/ComposeCalendar/build.gradle.kts
@@ -0,0 +1,115 @@
+import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask
+import io.gitlab.arturbosch.detekt.Detekt
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ id(DetektLib.PluginId) version DetektLib.Version
+ id(GradleVersions.PluginId) version GradleVersions.Version
+ id(GrGit.PluginId) version GrGit.Version
+ id(Shipkit.AutoVersion.PluginId) version Shipkit.AutoVersion.Version
+ id(Shipkit.Changelog.PluginId) version Shipkit.Changelog.Version
+ id(Shipkit.GithubRelease.PluginId) version Shipkit.GithubRelease.Version
+ id(Kotlin.CompatibilityPlugin) version Kotlin.CompatibilityPluginVersion
+}
+
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+ dependencies {
+ classpath(Android.GradlePlugin)
+ classpath(Kotlin.GradlePlugin)
+ classpath(Kotlin.DokkaGradlePlugin)
+ classpath(DetektLib.Plugin)
+ classpath(GradleVersions.Plugin)
+ classpath(MavenPublish.GradlePlugin)
+ classpath(Firebase.GoogleServicesPlugin)
+ }
+}
+
+allprojects {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ google()
+ mavenLocal()
+ }
+
+ tasks.withType {
+ kotlinOptions {
+ jvmTarget = "17"
+ freeCompilerArgs = freeCompilerArgs + listOf(
+ "-progressive",
+ "-Xopt-in=kotlin.RequiresOptIn",
+ "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
+ "-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
+ )
+ }
+ }
+
+ tasks.withType {
+ useJUnitPlatform()
+ testLogging {
+ events("passed", "skipped", "failed")
+ }
+ }
+}
+
+dependencies {
+ detekt(DetektLib.Formatting)
+ detekt(DetektLib.Cli)
+}
+
+apiValidation {
+ ignoredProjects.add("sample")
+}
+
+tasks {
+ withType {
+ parallel = true
+ config.setFrom(rootProject.file("detekt-config.yml"))
+ setSource(files(projectDir))
+ exclude(subprojects.map { "${it.buildDir.relativeTo(rootDir).path}/" })
+ exclude("**/.gradle/**")
+ reports {
+ xml {
+ required.set(true)
+ outputLocation.set(file("build/reports/detekt/detekt-results.xml"))
+ }
+ html.required.set(false)
+ txt.required.set(false)
+ }
+ }
+
+ register("check") {
+ group = "Verification"
+ description = "Allows to attach Detekt to the root project."
+ }
+
+ withType {
+ rejectVersionIf {
+ isNonStable(candidate.version) && !isNonStable(currentVersion)
+ }
+ }
+
+ withType(org.shipkit.changelog.GenerateChangelogTask::class) {
+ previousRevision = project.ext["shipkit-auto-version.previous-tag"] as String?
+ githubToken = System.getenv("GITHUB_TOKEN")
+ repository = "boguszpawlowski/composecalendar"
+ }
+
+ withType(org.shipkit.github.release.GithubReleaseTask::class) {
+ dependsOn(named("generateChangelog"))
+ repository = "boguszpawlowski/composecalendar"
+ changelog = named("generateChangelog").get().outputs.files.singleFile
+ githubToken = System.getenv("GITHUB_TOKEN")
+ newTagRevision = System.getenv("GITHUB_SHA")
+ }
+}
+
+fun isNonStable(version: String): Boolean {
+ val regex = "^[0-9,.v-]+(-r)?$".toRegex()
+ return !regex.matches(version)
+}
diff --git a/ComposeCalendar/buildSrc/build.gradle.kts b/ComposeCalendar/buildSrc/build.gradle.kts
new file mode 100644
index 000000000..d8ab500d1
--- /dev/null
+++ b/ComposeCalendar/buildSrc/build.gradle.kts
@@ -0,0 +1,22 @@
+plugins {
+ `kotlin-dsl`
+}
+
+repositories {
+ mavenCentral()
+ google()
+}
+
+gradlePlugin {
+ plugins {
+ register("common-android-plugin") {
+ id = "common-android-plugin"
+ implementationClass = "CommonAndroidPlugin"
+ }
+ }
+}
+
+dependencies {
+ implementation("com.android.tools.build:gradle:8.2.0")
+ implementation(kotlin("gradle-plugin", "1.9.20"))
+}
diff --git a/ComposeCalendar/buildSrc/src/main/kotlin/CommonAndroidPlugin.kt b/ComposeCalendar/buildSrc/src/main/kotlin/CommonAndroidPlugin.kt
new file mode 100644
index 000000000..a4c3e2d1d
--- /dev/null
+++ b/ComposeCalendar/buildSrc/src/main/kotlin/CommonAndroidPlugin.kt
@@ -0,0 +1,32 @@
+import com.android.build.gradle.BaseExtension
+import org.gradle.api.JavaVersion.VERSION_17
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+class CommonAndroidPlugin : Plugin {
+
+ @Suppress("LongMethod")
+ override fun apply(target: Project) {
+ val androidExtension = target.extensions.getByName("android")
+
+ (androidExtension as? BaseExtension)?.apply {
+ compileSdkVersion(AndroidSdk.Compile)
+ defaultConfig {
+ minSdk = AndroidSdk.Min
+ targetSdk = AndroidSdk.Target
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ compileOptions {
+ sourceCompatibility = VERSION_17
+ targetCompatibility = VERSION_17
+ }
+
+ buildFeatures.compose = true
+
+ composeOptions {
+ kotlinCompilerExtensionVersion = Compose.CompilerVersion
+ }
+ }
+ }
+}
diff --git a/ComposeCalendar/buildSrc/src/main/kotlin/Dependencies.kt b/ComposeCalendar/buildSrc/src/main/kotlin/Dependencies.kt
new file mode 100644
index 000000000..16c4ae3cf
--- /dev/null
+++ b/ComposeCalendar/buildSrc/src/main/kotlin/Dependencies.kt
@@ -0,0 +1,141 @@
+@file:Suppress("ObjectPropertyNaming", "ClassNaming", "UnderscoresInNumericLiterals")
+object MavenPublish {
+ const val PluginId = "com.vanniktech.maven.publish"
+ const val GradlePlugin = "com.vanniktech:gradle-maven-publish-plugin:0.27.0"
+}
+
+object AndroidSdk {
+ const val Min = 21
+ const val Compile = 33
+ const val Target = Compile
+}
+
+object Kotlin {
+ const val Version = "1.9.21"
+ const val CompatibilityPluginVersion = "0.13.2"
+
+ const val GradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$Version"
+ const val DokkaGradlePlugin = "org.jetbrains.dokka:dokka-gradle-plugin:1.9.10"
+
+ const val AndroidPluginId = "android"
+ const val JvmPluginId = "jvm"
+
+ const val CompatibilityPlugin = "org.jetbrains.kotlinx.binary-compatibility-validator"
+ const val CompatibilityPluginId = "binary-compatibility-validator"
+
+ const val DesugarJdkLibs = "com.android.tools:desugar_jdk_libs:2.0.4"
+ const val DateTime = "org.jetbrains.kotlinx:kotlinx-datetime:0.5.0"
+}
+
+object Android {
+ const val GradlePlugin = "com.android.tools.build:gradle:8.2.0"
+
+ const val ApplicationPluginId = "com.android.application"
+ const val LibraryPluginId = "com.android.library"
+}
+
+object GradleVersions {
+ const val Version = "0.42.0"
+
+ const val PluginId = "com.github.ben-manes.versions"
+ const val Plugin = "com.github.ben-manes:gradle-versions-plugin:$Version"
+}
+
+object GrGit {
+ const val Version = "5.0.0"
+
+ const val PluginId = "org.ajoberstar.grgit"
+}
+
+object Shipkit {
+ object AutoVersion {
+ const val Version = "1.1.19"
+
+ const val PluginId = "org.shipkit.shipkit-auto-version"
+ }
+
+ object Changelog {
+ const val Version = "1.1.15"
+
+ const val PluginId = "org.shipkit.shipkit-changelog"
+ }
+
+ object GithubRelease {
+ const val Version = "1.1.15"
+
+ const val PluginId = "org.shipkit.shipkit-github-release"
+ }
+}
+
+object AndroidX {
+ const val Version = "1.0.0"
+ const val LifecycleVersion = "2.2.0"
+
+ const val AppCompat = "androidx.appcompat:appcompat:1.6.1"
+ const val ComposeActivity = "androidx.activity:activity-compose:1.6.1"
+}
+
+object Material {
+ const val Core = "com.google.android.material:material:1.5.0"
+}
+
+object DetektLib {
+ const val Version = "1.23.4"
+
+ const val PluginId = "io.gitlab.arturbosch.detekt"
+ const val Plugin = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$Version"
+
+ const val Formatting = "io.gitlab.arturbosch.detekt:detekt-formatting:$Version"
+ const val Cli = "io.gitlab.arturbosch.detekt:detekt-cli:$Version"
+}
+
+object Timber {
+ const val Version = "5.0.1"
+ const val Core = "com.jakewharton.timber:timber:$Version"
+}
+
+object Compose {
+ const val Version = "1.3.1"
+ const val CompilerVersion = "1.5.5"
+ const val AccompanistVersion = "0.25.1"
+
+ const val Runtime = "androidx.compose.runtime:runtime:$Version"
+ const val Compiler = "androidx.compose.compiler:compiler:$CompilerVersion"
+ const val Foundation = "androidx.compose.foundation:foundation:$Version"
+ const val FoundationLayout = "androidx.compose.foundation:foundation-layout:$Version"
+ const val Material = "androidx.compose.material:material:$Version"
+ const val Ui = "androidx.compose.ui:ui:$Version"
+ const val UiTooling = "androidx.compose.ui:ui-tooling:$Version"
+ const val AccompanistPager = "com.google.accompanist:accompanist-pager:$AccompanistVersion"
+ const val Navigation = "androidx.navigation:navigation-compose:2.5.0-alpha03"
+}
+
+object Debug {
+ const val LeakCanary = "com.squareup.leakcanary:leakcanary-android:2.7"
+}
+
+object Hyperion {
+ private const val Version = "0.9.34"
+ const val Core = "com.willowtreeapps.hyperion:hyperion-core:$Version"
+ const val Crash = "com.willowtreeapps.hyperion:hyperion-crash:$Version"
+ const val GeigerCounter = "com.willowtreeapps.hyperion:hyperion-geiger-counter:$Version"
+ const val Measurement = "com.willowtreeapps.hyperion:hyperion-measurement:$Version"
+}
+
+object Kotest {
+ const val Version = "5.4.2"
+
+ const val RunnerJunit5 = "io.kotest:kotest-runner-junit5-jvm:$Version"
+
+ const val Assertions = "io.kotest:kotest-assertions-core-jvm:$Version"
+}
+
+object ComposeTest {
+ const val Core = "androidx.compose.ui:ui-test-junit4:${Compose.Version}"
+ const val Manifest = "androidx.compose.ui:ui-test-manifest:${Compose.Version}"
+}
+
+object Firebase {
+ const val Bom = "com.google.firebase:firebase-bom:30.0.0"
+ const val GoogleServicesPlugin = "com.google.gms:google-services:4.3.10"
+}
diff --git a/ComposeCalendar/detekt-config.yml b/ComposeCalendar/detekt-config.yml
new file mode 100644
index 000000000..92c2fccc9
--- /dev/null
+++ b/ComposeCalendar/detekt-config.yml
@@ -0,0 +1,294 @@
+build:
+ maxIssues: 0
+ weights:
+
+complexity:
+ active: true
+ ComplexCondition:
+ active: true
+ threshold: 3
+ ComplexInterface:
+ active: true
+ ComplexMethod:
+ active: true
+ threshold: 10
+ ignoreSingleWhenExpression: true
+ LargeClass:
+ active: true
+ threshold: 400
+ LongMethod:
+ active: true
+ threshold: 40
+ LongParameterList:
+ active: true
+ functionThreshold: 10
+ constructorThreshold: 5
+ ignoreAnnotated: [ 'Composable' ]
+ NestedBlockDepth:
+ active: true
+ StringLiteralDuplication:
+ active: false
+
+empty-blocks:
+ active: true
+ EmptyCatchBlock:
+ active: true
+ EmptyClassBlock:
+ active: true
+ EmptyDefaultConstructor:
+ active: true
+ EmptyDoWhileBlock:
+ active: true
+ EmptyElseBlock:
+ active: true
+ EmptyFinallyBlock:
+ active: true
+ EmptyForBlock:
+ active: true
+ EmptyFunctionBlock:
+ active: true
+ EmptyIfBlock:
+ active: true
+ EmptyInitBlock:
+ active: true
+ EmptyKtFile:
+ active: true
+ EmptySecondaryConstructor:
+ active: true
+ EmptyWhenBlock:
+ active: true
+ EmptyWhileBlock:
+ active: true
+
+exceptions:
+ active: true
+ ExceptionRaisedInUnexpectedLocation:
+ active: true
+ methodNames: 'toString,hashCode,equals,finalize'
+ InstanceOfCheckForException:
+ active: true
+ NotImplementedDeclaration:
+ active: true
+ PrintStackTrace:
+ active: true
+ RethrowCaughtException:
+ active: true
+ ReturnFromFinally:
+ active: true
+ SwallowedException:
+ active: true
+ ThrowingExceptionFromFinally:
+ active: true
+ ThrowingExceptionsWithoutMessageOrCause:
+ active: true
+ ThrowingNewInstanceOfSameException:
+ active: true
+
+formatting:
+ active: true
+ ChainWrapping:
+ active: true
+ CommentSpacing:
+ active: true
+ ImportOrdering:
+ active: true
+ Indentation:
+ active: true
+ indentSize: 2
+ continuationIndentSize: 4
+ NoBlankLineBeforeRbrace:
+ active: true
+ NoConsecutiveBlankLines:
+ active: true
+ NoLineBreakBeforeAssignment:
+ active: true
+ NoMultipleSpaces:
+ active: true
+ NoSemicolons:
+ active: true
+ NoTrailingSpaces:
+ active: true
+ ParameterListWrapping:
+ active: true
+ indentSize: 2
+ SpacingAroundColon:
+ active: true
+ SpacingAroundComma:
+ active: true
+ SpacingAroundCurly:
+ active: true
+ SpacingAroundKeyword:
+ active: true
+ SpacingAroundOperators:
+ active: true
+ SpacingAroundRangeOperator:
+ active: true
+ StringTemplate:
+ active: true
+
+naming:
+ active: true
+ ClassNaming:
+ active: true
+ classPattern: '^[A-Z][a-z]+(?:[A-Z][a-z]+)*$'
+ ConstructorParameterNaming:
+ active: true
+ parameterPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ privateParameterPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ EnumNaming:
+ active: true
+ enumEntryPattern: '^[A-Z][a-z]+(?:[A-Z][a-z]+)*$'
+ FunctionNaming:
+ active: false
+ functionPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ ignoreAnnotated: [ 'Composable' ]
+ FunctionParameterNaming:
+ active: true
+ parameterPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ MatchingDeclarationName:
+ active: true
+ MemberNameEqualsClassName:
+ active: true
+ ObjectPropertyNaming:
+ active: false
+ constantPattern: '^[A-Z][a-z]+(?:[A-Z][a-z]+)*$'
+ propertyPattern: '^[A-Z][a-z]+(?:[A-Z][a-z]+)*$'
+ privatePropertyPattern: '^[A-Z][a-z]+(?:[A-Z][a-z]+)*$'
+ PackageNaming:
+ active: true
+ packagePattern: '^[a-z]+(\.[a-z][a-zA-Z]*)*$'
+ TopLevelPropertyNaming:
+ active: false
+ constantPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ propertyPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ privatePropertyPattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ VariableNaming:
+ active: true
+ variablePattern: '^[a-z]+(?:[A-Z][a-z]+)*$'
+ privateVariablePattern: '^[_a-z]+(?:[A-Z][a-z]+)*$'
+
+performance:
+ active: true
+ ForEachOnRange:
+ active: true
+ UnnecessaryTemporaryInstantiation:
+ active: true
+
+potential-bugs:
+ active: true
+ DuplicateCaseInWhenExpression:
+ active: true
+ EqualsAlwaysReturnsTrueOrFalse:
+ active: false
+ EqualsWithHashCodeExist:
+ active: true
+ ExplicitGarbageCollectionCall:
+ active: true
+ InvalidRange:
+ active: true
+ IteratorHasNextCallsNextMethod:
+ active: true
+ IteratorNotThrowingNoSuchElementException:
+ active: true
+ MissingWhenCase:
+ active: true
+ RedundantElseInWhen:
+ active: true
+ UnconditionalJumpStatementInLoop:
+ active: true
+ UnreachableCode:
+ active: true
+ UselessPostfixExpression:
+ active: true
+ WrongEqualsTypeParameter:
+ active: true
+
+style:
+ active: true
+ CollapsibleIfStatements:
+ active: true
+ DataClassShouldBeImmutable:
+ active: true
+ EqualsNullCall:
+ active: true
+ EqualsOnSignatureLine:
+ active: true
+ ExplicitItLambdaParameter:
+ active: true
+ ForbiddenVoid:
+ active: true
+ LibraryCodeMustSpecifyReturnType:
+ active: true
+ LoopWithTooManyJumpStatements:
+ active: false
+ maxJumpCount: 1
+ MaxLineLength:
+ active: true
+ maxLineLength: 120
+ excludePackageStatements: true
+ excludeImportStatements: true
+ excludeCommentStatements: true
+ MayBeConst:
+ active: true
+ ModifierOrder:
+ active: true
+ NewLineAtEndOfFile:
+ active: true
+ NoTabs:
+ active: true
+ OptionalAbstractKeyword:
+ active: true
+ OptionalWhenBraces:
+ active: true
+ PreferToOverPairSyntax:
+ active: true
+ ProtectedMemberInFinalClass:
+ active: true
+ RedundantVisibilityModifierRule:
+ active: true
+ excludes: ['**/library/**', '**/kotlinx-datetime/**']
+ SafeCast:
+ active: true
+ SerialVersionUIDInSerializableClass:
+ active: true
+ SpacingBetweenPackageAndImports:
+ active: true
+ TrailingWhitespace:
+ active: true
+ UnderscoresInNumericLiterals:
+ active: false
+ acceptableDecimalLength: 3
+ UnnecessaryAbstractClass:
+ active: true
+ UnnecessaryApply:
+ active: true
+ UnnecessaryInheritance:
+ active: true
+ UnnecessaryLet:
+ active: true
+ UnnecessaryParentheses:
+ active: true
+ UntilInsteadOfRangeTo:
+ active: true
+ UnusedImports:
+ active: true
+ UnusedPrivateClass:
+ active: true
+ UnusedPrivateMember:
+ active: false # Due to compose preview
+ UseArrayLiteralsInAnnotations:
+ active: true
+ UseCheckOrError:
+ active: true
+ UseIfInsteadOfWhen:
+ active: false
+ UseRequire:
+ active: true
+ UselessCallOnNotNull:
+ active: true
+ UtilityClassWithPublicConstructor:
+ active: true
+ VarCouldBeVal:
+ active: true
+ WildcardImport:
+ active: true
diff --git a/ComposeCalendar/gradle.properties b/ComposeCalendar/gradle.properties
new file mode 100644
index 000000000..269fd8b11
--- /dev/null
+++ b/ComposeCalendar/gradle.properties
@@ -0,0 +1,27 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+android.useAndroidX=true
+android.enableJetifier=true
+kotlin.code.style=official
+
+POM_NAME=Compose Calendar
+GROUP=io.github.boguszpawlowski.composecalendar
+POM_URL=https://github.com/boguszpawlowski/ComposeCalendar
+POM_SCM_URL=https://github.com/boguszpawlowski/ComposeCalendar
+POM_SCM_CONNECTION=git@github.com:boguszpawlowski/ComposeCalendar.git
+POM_SCM_DEV_CONNECTION=git@github.com:boguszpawlowski/ComposeCalendar.git
+POM_LICENCE_NAME=The Apache Software License, Version 2.0
+POM_LICENCE_URL=https://www.apache.org/licenses/LICENSE-2.0.txt
+POM_LICENCE_DIST=repo
+POM_DEVELOPER_ID=boguszp
+POM_DEVELOPER_NAME=Bogusz Pawlowski
+android.defaults.buildfeatures.buildconfig=true
+android.nonTransitiveRClass=false
+android.nonFinalResIds=false
diff --git a/ComposeCalendar/gradle/dependencies.gradle b/ComposeCalendar/gradle/dependencies.gradle
new file mode 100644
index 000000000..e69de29bb
diff --git a/ComposeCalendar/gradle/wrapper/gradle-wrapper.jar b/ComposeCalendar/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d64cd4917707c1f8861d8cb53dd15194d4248596
GIT binary patch
literal 43462
zcma&NWl&^owk(X(xVyW%ySuwf;qI=D6|RlDJ2cR^yEKh!