diff --git a/.github/workflows/generate-tag.yml b/.github/workflows/generate-tag.yml index 403da64e..14951ba3 100644 --- a/.github/workflows/generate-tag.yml +++ b/.github/workflows/generate-tag.yml @@ -69,4 +69,4 @@ jobs: run: ./gradlew :${{ matrix.module }}:assembleRelease - name: Publish ${{ matrix.module }} - run: ./gradlew :${{ matrix.module }}:publishToolkitPublicationToSonatypeRepository + run: ./gradlew :${{ matrix.module }}:publishAllPublicationsToSonatypeRepository diff --git a/.gitignore b/.gitignore index c4dab34c..69f7ef55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,11 @@ +**/build +**/.kotlin/ +**/.gradle/ +**/.idea/ +**/.git/ *.log *.iml -.gradle /local.properties -/.idea .DS_Store -/build -**/build -*/build /captures .externalNativeBuild -toolkit/build/ diff --git a/build.gradle.kts b/build.gradle.kts index 3e04c554..19c13b03 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,14 +1,7 @@ plugins { id("jacoco") - alias(pluginLibraries.plugins.android.application) apply false - alias(pluginLibraries.plugins.android.library) apply false - alias(pluginLibraries.plugins.google.ksp) apply false - alias(pluginLibraries.plugins.jetbrains.kotlin) apply false - alias(pluginLibraries.plugins.jetbrains.multiplatform) apply false - alias(pluginLibraries.plugins.jetbrains.serialization) apply false - alias(pluginLibraries.plugins.dexcount) apply false - alias(pluginLibraries.plugins.detekt) apply false - // TODO Pedrinho, help me -// alias(pluginLibraries.plugins.pedrinho_publish) apply false + alias(libs.plugins.google.ksp) apply false + alias(libs.plugins.jetbrains.serialization) apply false + alias(libs.plugins.dexcount) apply false } diff --git a/plugin/build.gradle.kts b/buildSrc/build.gradle.kts similarity index 82% rename from plugin/build.gradle.kts rename to buildSrc/build.gradle.kts index 7d01a517..141d4e73 100644 --- a/plugin/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java-gradle-plugin") - alias(pluginLibraries.plugins.jvm) + alias(libs.plugins.jvm) } kotlin { jvmToolchain(17) } @@ -11,12 +11,13 @@ version = "1.0.0" dependencies { compileOnly(gradleApi()) - implementation(pluginLibraries.androidx.plugin) - implementation(pluginLibraries.detekt) - implementation(pluginLibraries.ktlint) - implementation(pluginLibraries.jetbrains.plugin) - implementation(pluginLibraries.jetbrains.extensions) - implementation(pluginLibraries.jetbrains.kover) + implementation(libs.androidx.plugin) + implementation(libs.detekt) + implementation(libs.ktlint) + implementation(libs.jetbrains.plugin) + implementation(libs.jetbrains.extensions) + implementation(libs.jetbrains.kover) + implementation(libs.jetbrains.dokka) } sourceSets { @@ -50,6 +51,12 @@ gradlePlugin { description = "All default config" implementationClass = "com.toolkit.plugin.android.ToolkitBasePlugin" } + create("toolkit-android-publish") { + id = "toolkit-android-publish" + displayName = "Toolkit Publish Plugin" + description = "Enables and configure publish for module" + implementationClass = "com.toolkit.plugin.android.ToolkitPublishPlugin" + } //endregion //region Multiplatform @@ -61,19 +68,19 @@ gradlePlugin { implementationClass = "com.toolkit.plugin.multiplatform.ToolkitLibraryPlugin" } - create("toolkit-multiplatform-sample") { - id = "toolkit-multiplatform-sample" - displayName = "Toolkit Sample Plugin" - description = "Plug and play for modules to show the world the wonders of tomorrow!" - implementationClass = "com.toolkit.plugin.multiplatform.ToolkitSamplePlugin" - } - create("toolkit-multiplatform-base") { id = "toolkit-multiplatform-base" displayName = "Toolkit Base Plugin" description = "All default config" implementationClass = "com.toolkit.plugin.multiplatform.ToolkitBasePlugin" } + + create("toolkit-multiplatform-publish") { + id = "toolkit-multiplatform-publish" + displayName = "Toolkit Publish Plugin" + description = "Enables and configure publish for module" + implementationClass = "com.toolkit.plugin.multiplatform.ToolkitPublishPlugin" + } //endregion //region Generic @@ -112,13 +119,6 @@ gradlePlugin { description = "Enables and configure group for module" implementationClass = "com.toolkit.plugin.ToolkitGroupPlugin" } - - create("toolkit-publish") { - id = "toolkit-publish" - displayName = "Toolkit Publish Plugin" - description = "Enables and configure publish for module" - implementationClass = "com.toolkit.plugin.ToolkitPublishPlugin" - } //endregion } } diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties new file mode 100644 index 00000000..4b141e4c --- /dev/null +++ b/buildSrc/gradle.properties @@ -0,0 +1,14 @@ +# +# +# +# +# +# ----------- PROJECT CONFIG -------------- +# Gradle +org.gradle.jvmargs=-Xmx8192m -XX:+UseParallelGC -Dkotlin.daemon.jvm.options\="-Xmx8192m" +org.gradle.parallel=true +org.gradle.warning.mode=none +org.gradle.configuration-cache=true +# Kotlin +kotlin.mpp.androidGradlePluginCompatibility.nowarn=trueorg.gradle.parallel=true +# \ No newline at end of file diff --git a/plugin/repositories.gradle.kts b/buildSrc/repositories.gradle.kts similarity index 100% rename from plugin/repositories.gradle.kts rename to buildSrc/repositories.gradle.kts diff --git a/plugin/settings.gradle.kts b/buildSrc/settings.gradle.kts similarity index 63% rename from plugin/settings.gradle.kts rename to buildSrc/settings.gradle.kts index 28759751..6e7308cd 100644 --- a/plugin/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -11,13 +11,5 @@ dependencyResolutionManagement { apply(from = "$rootDir/repositories.gradle.kts") val repositoryList: RepositoryHandler.() -> Unit by extra repositories(repositoryList) - - versionCatalogs { - register("libraries") { - from(files("$rootDir/../tools/libs.versions.toml")) - } - register("pluginLibraries") { - from(files("$rootDir/../tools/plugin.versions.toml")) - } - } + versionCatalogs { register("libs") { from(files("$rootDir/../gradle/libs.versions.toml")) } } } diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt similarity index 67% rename from plugin/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt index c241a255..56202845 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitComposePlugin.kt @@ -1,7 +1,7 @@ package com.toolkit.plugin import com.toolkit.plugin.util.androidApplication -import com.toolkit.plugin.util.libraries +import com.toolkit.plugin.util.libs import com.toolkit.plugin.util.requireAll import com.toolkit.plugin.util.version import org.gradle.api.Plugin @@ -18,12 +18,12 @@ internal class ToolkitComposePlugin : Plugin { } composeOptions { kotlinCompilerExtensionVersion = - target.libraries.version("androidx-compose-compiler") + target.libs.version("androidx-compose-compiler") } } with(target.dependencies) { - add("implementation", target.libraries.findBundle("androidx-compose-release").get()) - add("debugImplementation", target.libraries.findBundle("androidx-compose-debug").get()) + add("implementation", target.libs.findBundle("androidx-compose-release").get()) + add("debugImplementation", target.libs.findBundle("androidx-compose-debug").get()) } } } diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt new file mode 100644 index 00000000..1dc04fe9 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt @@ -0,0 +1,49 @@ +package com.toolkit.plugin + +import com.toolkit.plugin.util.applyPlugins +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.com.google.gson.JsonArray +import java.nio.file.Files + +internal class ToolkitGroupPlugin : Plugin { + + override fun apply(target: Project) { + target.evaluationDependsOnChildren() + target.applyPlugins("jetbrains-kover") + + // Try to unify coverage reports + target.subprojects.onEach { target.dependencies.add("kover", it) } + + // Generate file containing all modules with publish plugin attached + target.tasks.register("publishModules") { task -> + task.group = "groupTask" + // Store target directory into a variable to avoid project reference in the configuration cache + val directory = task.project.layout.buildDirectory.get() + val file = directory.file("modules.txt").asFile + val publishAndroidLibraries = task.project.allAndroid() + val publishMultiplatformLibraries = task.project.allMultiplatform() + task.doLast { _ -> + Files.createDirectories(directory.asFile.toPath()) + val json = JsonArray() + publishAndroidLibraries.onEach(json::add) + publishMultiplatformLibraries.onEach(json::add) + + if (file.exists().not()) file.createNewFile() + file.writeText(json.toString()) + println("Publish module list generated at: $file") + println(json.toString()) + } + } + } + + private fun Project.allAndroid(prefix: String = "toolkit"): List = + if (plugins.hasPlugin("toolkit-android-publish")) listOf("$prefix:$name") + else subprojects.filter { it.subprojects.isEmpty() } + .flatMap { it.allAndroid("$prefix:android") } + + private fun Project.allMultiplatform(prefix: String = "toolkit"): List = + if (plugins.hasPlugin("toolkit-multiplatform-publish")) listOf("$prefix:$name") + else subprojects.filter { it.subprojects.isEmpty() } + .flatMap { it.allMultiplatform("$prefix:multi") } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt similarity index 96% rename from plugin/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt index 176c3d9b..40806d5a 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitLintPlugin.kt @@ -8,7 +8,7 @@ import com.toolkit.plugin.util.androidLibrary import com.toolkit.plugin.util.applyPlugins import com.toolkit.plugin.util.detekt import com.toolkit.plugin.util.ktLint -import com.toolkit.plugin.util.libraries +import com.toolkit.plugin.util.libs import io.gitlab.arturbosch.detekt.Detekt import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask import io.gitlab.arturbosch.detekt.extensions.DetektReport @@ -24,7 +24,7 @@ internal class ToolkitLintPlugin : Plugin { // Detekt configuration target.dependencies.add( "detektPlugins", - target.libraries.findLibrary("detekt-formatting").get() + target.libs.findLibrary("detekt-formatting").get() ) with(target.detekt) { parallel = true diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt similarity index 94% rename from plugin/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt index c0ec68d0..15a44666 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitOptimizeDependenciesAndFilterTasksPlugin.kt @@ -4,15 +4,15 @@ package com.toolkit.plugin import com.toolkit.plugin.util.allDefinedDependencies import com.toolkit.plugin.util.applicationComponent -import com.toolkit.plugin.util.libraries import com.toolkit.plugin.util.libraryComponent +import com.toolkit.plugin.util.libs import org.gradle.api.Plugin import org.gradle.api.Project internal class ToolkitOptimizeDependenciesAndFilterTasksPlugin : Plugin { override fun apply(target: Project) { - val libraries = target.libraries + val libraries = target.libs val allDefinedLibraries = libraries.allDefinedDependencies target.configurations.configureEach { config -> config.resolutionStrategy { strategy -> diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt similarity index 89% rename from plugin/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt index 19d067a6..4a7b63bb 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/ToolkitTestPlugin.kt @@ -9,8 +9,7 @@ import com.toolkit.plugin.util.androidLibrary import com.toolkit.plugin.util.applyPlugins import com.toolkit.plugin.util.jacoco import com.toolkit.plugin.util.kover -import com.toolkit.plugin.util.koverReport -import com.toolkit.plugin.util.libraries +import com.toolkit.plugin.util.libs import com.toolkit.plugin.util.version import org.gradle.api.Plugin import org.gradle.api.Project @@ -27,14 +26,9 @@ internal class ToolkitTestPlugin : Plugin { disable() } } - with(target.koverReport) { - defaults { reports -> - reports.mergeWith("debug") - } - } // Kover configuration - with(target.jacoco) { toolVersion = target.libraries.version("jacoco") } + with(target.jacoco) { toolVersion = target.libs.version("jacoco") } // Regular Test configuration kotlin.runCatching { setForApplication(target.androidApplication) } diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/_application.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/_application.kt similarity index 85% rename from plugin/src/main/kotlin/com/toolkit/plugin/_application.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/_application.kt index ebd8ebb9..cd6489d9 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/_application.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/_application.kt @@ -2,7 +2,7 @@ package com.toolkit.plugin import com.android.build.api.dsl.ApplicationExtension import com.toolkit.plugin.util.androidApplication -import com.toolkit.plugin.util.libraries +import com.toolkit.plugin.util.libs import com.toolkit.plugin.util.version import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog @@ -13,8 +13,8 @@ internal fun Project.setupAndroidApplicationModule() = with(androidApplication) proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - versionCode = libraries.version("build-version-code").toInt() - versionName = libraries.version("build-version-name") + versionCode = libs.version("build-version-code").toInt() + versionName = libs.version("build-version-name") resourceConfigurations.add("en") } @@ -22,7 +22,7 @@ internal fun Project.setupAndroidApplicationModule() = with(androidApplication) buildFeatures.buildConfig = true // Setup Android Version support - setupVersion(libraries) + setupVersion(libs) // Common Setup commonSetup() diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/_common.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/_common.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/_common.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/_common.kt diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/_library.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/_library.kt similarity index 92% rename from plugin/src/main/kotlin/com/toolkit/plugin/_library.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/_library.kt index f90ecd0c..2c537570 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/_library.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/_library.kt @@ -2,7 +2,7 @@ package com.toolkit.plugin import com.android.build.api.dsl.LibraryExtension import com.toolkit.plugin.util.androidLibrary -import com.toolkit.plugin.util.libraries +import com.toolkit.plugin.util.libs import com.toolkit.plugin.util.version import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog @@ -12,7 +12,7 @@ internal fun Project.setupAndroidLibraryModule() = with(androidLibrary) { commonSetup() // Setup Android Version support - setupVersion(libraries) + setupVersion(libs) // Exclusive Library Configurations defaultConfig { diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitBasePlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitBasePlugin.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitBasePlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitBasePlugin.kt diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitLibraryPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitLibraryPlugin.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitLibraryPlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitLibraryPlugin.kt diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitPublishPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitPublishPlugin.kt new file mode 100644 index 00000000..30b221ed --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitPublishPlugin.kt @@ -0,0 +1,89 @@ +package com.toolkit.plugin.android + +import com.toolkit.plugin.util.attachAllTasksIntoAssembleRelease +import com.toolkit.plugin.util.configurePom +import com.toolkit.plugin.util.createLocalPathRepository +import com.toolkit.plugin.util.createSonatypeRepository +import com.toolkit.plugin.util.missing +import com.toolkit.plugin.util.publishing +import com.toolkit.plugin.util.requireAny +import com.toolkit.plugin.util.setupJavadocAndSources +import com.toolkit.plugin.util.sign +import com.toolkit.plugin.util.versionName +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven +import org.gradle.api.publish.maven.tasks.PublishToMavenRepository +import org.gradle.plugins.signing.Sign +import org.jetbrains.kotlin.konan.file.File + +internal class ToolkitPublishPlugin : Plugin { + + private val Project.aar: String? + get() = "$projectDir/build/outputs/aar/$name-release.aar".takeIf { File(it).exists } + private val Project.javadoc: String? + get() = "$projectDir/build/libs/$name-release-javadoc.jar".takeIf { File(it).exists } + private val Project.sources: String? + get() = "$projectDir/build/libs/$name-release-sources.jar".takeIf { File(it).exists } + + override fun apply(target: Project) { + target.requireAny( + "toolkit-android-publish", + "toolkit-android-library", + "toolkit-multiplatform-library" + ) + target.plugins.apply("maven-publish") + + // Setup Javadoc and sources artifacts + target.setupJavadocAndSources() + + // Setup Publishing + with(target.publishing) { + repositories { repo -> + repo.createLocalPathRepository(target) + repo.createSonatypeRepository(target) + } + + publications { container -> + container.register("Toolkit", MavenPublication::class.java) { pub -> + pub.groupId = target.properties["GROUP"] as String + pub.artifactId = target.name + pub.version = target.versionName + + target.aar?.let(pub::artifact) + target.javadoc?.let { file -> + pub.artifact(file) { artifact -> + artifact.classifier = "javadoc" + artifact.extension = "jar" + } + } + target.sources?.let { file -> + pub.artifact(file) { artifact -> + artifact.classifier = "sources" + artifact.extension = "jar" + } + } + pub.pom { target.configurePom(it) } + } + } + } + + // Attach all needed tasks into assembleRelease task + target.attachAllTasksIntoAssembleRelease() + + // Setup Signing + if (target.missing("signing.keyId", "signing.password", "signing.secretKeyRingFile")) { + println("Missing env variables") + return + } + target.plugins.apply("signing") + target.tasks.withType(AbstractPublishToMaven::class.java).configureEach { + it.dependsOn(it.project.tasks.withType(Sign::class.java)) + } + with(target.sign) { + sign(target.publishing.publications) + setRequired { target.gradle.taskGraph.allTasks.any { (it is PublishToMavenRepository) } } + } + } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitSamplePlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitSamplePlugin.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/android/ToolkitSamplePlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/android/ToolkitSamplePlugin.kt diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt new file mode 100644 index 00000000..d12619a4 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt @@ -0,0 +1,25 @@ +@file:Suppress("UnstableApiUsage") + +package com.toolkit.plugin.multiplatform + +import com.toolkit.plugin.util.applyPlugins +import com.toolkit.plugin.util.multiplatform +import com.toolkit.plugin.util.projectJavaVersionCode +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension + +internal class ToolkitBasePlugin : Plugin { + + override fun apply(target: Project) { + target.applyPlugins("jetbrains-multiplatform") + target.kotlinExtension.jvmToolchain(projectJavaVersionCode) + + with(target.multiplatform) { + androidTarget() + jvm {} + } + + target.plugins.apply("toolkit-optimize") + } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitLibraryPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitLibraryPlugin.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitLibraryPlugin.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitLibraryPlugin.kt diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitPublishPlugin.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitPublishPlugin.kt new file mode 100644 index 00000000..3a76a9af --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitPublishPlugin.kt @@ -0,0 +1,76 @@ +package com.toolkit.plugin.multiplatform + +import com.toolkit.plugin.util.attachAllTasksIntoAssembleRelease +import com.toolkit.plugin.util.createLocalPathRepository +import com.toolkit.plugin.util.createSonatypeRepository +import com.toolkit.plugin.util.missing +import com.toolkit.plugin.util.multiplatform +import com.toolkit.plugin.util.publishing +import com.toolkit.plugin.util.requireAny +import com.toolkit.plugin.util.setupJavadocAndSources +import com.toolkit.plugin.util.sign +import com.toolkit.plugin.util.versionName +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven +import org.gradle.api.publish.maven.tasks.PublishToMavenRepository +import org.gradle.plugins.signing.Sign + +internal class ToolkitPublishPlugin : Plugin { + + override fun apply(target: Project) { + target.requireAny( + "toolkit-android-library", + "toolkit-multiplatform-library", + "toolkit-multiplatform-publish" + ) + target.plugins.apply("maven-publish") + + with(target.multiplatform){ + withSourcesJar(true) + androidTarget().publishLibraryVariants("release") + } + + // Setup Javadoc and sources artifacts + target.setupJavadocAndSources() + + // Setup Publishing + with(target.publishing) { + repositories { repo -> + repo.createLocalPathRepository(target) + repo.createSonatypeRepository(target) + } + + publications { container -> + container.withType(MavenPublication::class.java) { pub -> + val suffix = when { + pub.name.contains("android") -> "-android" + pub.name.contains("jvm") -> "-jvm" + else -> "" + } + pub.groupId = target.properties["GROUP"] as String + pub.artifactId = "${target.name}$suffix" + pub.version = target.versionName + } + } + } + + // Attach all needed tasks into assembleRelease task + target.attachAllTasksIntoAssembleRelease() + + // Setup Signing + if (target.missing("signing.keyId", "signing.password", "signing.secretKeyRingFile")) { + println("Missing env variables") + return + } + target.plugins.apply("signing") + target.tasks.withType(AbstractPublishToMaven::class.java).configureEach { + it.dependsOn(it.project.tasks.withType(Sign::class.java)) + } + with(target.sign) { + sign(target.publishing.publications) + setRequired { target.gradle.taskGraph.allTasks.any { (it is PublishToMavenRepository) } } + } + } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_java.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_java.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/util/_java.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/util/_java.kt diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt new file mode 100644 index 00000000..7465d0d0 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt @@ -0,0 +1,32 @@ +package com.toolkit.plugin.util + +import org.gradle.api.Project +import org.gradle.jvm.tasks.Jar +import org.jetbrains.dokka.gradle.DokkaTask + +internal fun Project.setupJavadocAndSources() { + setupSources() + setupJavadoc() +} + +private fun Project.setupJavadoc() { + applyPlugins("jetbrains-dokka") + tasks.register("javadocJar", Jar::class.java) { task -> + task.group = "documentation" + val dokka = task.project.tasks.named("dokkaHtml", DokkaTask::class.java) + task.dependsOn(dokka) + task.from(dokka.flatMap(DokkaTask::outputDirectory)) + task.archiveClassifier.set("javadoc") + task.archiveFileName.set("${task.project.name}-release-javadoc.jar") + } +} + +private fun Project.setupSources() { + tasks.whenTaskAdded { task -> + if (task !is Jar) return@whenTaskAdded + when (task.name) { + "releaseSourcesJar" -> task.archiveFileName.set("${task.project.name}-release-sources.jar") + "debugSourcesJar" -> task.archiveFileName.set("${task.project.name}-debug-sources.jar") + } + } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt similarity index 77% rename from plugin/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt index efa2ccc2..c1f0da65 100644 --- a/plugin/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_projectExtensions.kt @@ -7,27 +7,21 @@ import com.android.build.api.variant.LibraryAndroidComponentsExtension import com.android.build.gradle.BaseExtension import io.gitlab.arturbosch.detekt.extensions.DetektExtension import kotlinx.kover.gradle.plugin.dsl.KoverProjectExtension -import kotlinx.kover.gradle.plugin.dsl.KoverReportExtension import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.publish.PublishingExtension +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.jvm.tasks.Jar import org.gradle.plugins.signing.SigningExtension import org.gradle.testing.jacoco.plugins.JacocoPluginExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jlleitschuh.gradle.ktlint.KtlintExtension -import com.android.build.gradle.LibraryExtension as LibraryExtension2 -internal val Project.libraries: VersionCatalog +internal val Project.libs: VersionCatalog @Throws(IllegalStateException::class) get() { - return extensions.findByType(VersionCatalogsExtension::class.java)?.named("libraries") - ?: error("Cannot find libraries in version catalog!") - } -internal val Project.pluginLibraries: VersionCatalog - @Throws(IllegalStateException::class) - get() { - return extensions.findByType(VersionCatalogsExtension::class.java)?.named("pluginLibraries") + return extensions.findByType(VersionCatalogsExtension::class.java)?.named("libs") ?: error("Cannot find libraries in version catalog!") } @@ -56,21 +50,11 @@ internal val Project.kover: KoverProjectExtension get() = extensions.findByType(KoverProjectExtension::class.java) ?: error("Project do not implement kover plugin!") -internal val Project.koverReport: KoverReportExtension - @Throws(IllegalStateException::class) - get() = extensions.findByType(KoverReportExtension::class.java) - ?: error("Project do not implement kover plugin!") - internal val Project.androidLibrary: LibraryExtension @Throws(IllegalStateException::class) get() = extensions.findByType(LibraryExtension::class.java) ?: error("Project do not implement android-library plugin!") -internal val Project.androidLibrary2: LibraryExtension2 - @Throws(IllegalStateException::class) - get() = extensions.findByType(LibraryExtension2::class.java) - ?: error("Project do not implement android-library plugin!") - internal val Project.androidApplication: ApplicationExtension @Throws(IllegalStateException::class) get() = extensions.findByType(ApplicationExtension::class.java) @@ -101,8 +85,22 @@ internal val Project.sign: SigningExtension get() = extensions.findByType(SigningExtension::class.java) ?: error("Project do not implement signing plugin!") -internal fun Project.applyPlugins(vararg id: String) { - id.forEach { - plugins.apply(pluginLibraries.findPlugin(it).get().get().pluginId) - } +internal fun Project.applyPlugins(vararg id: String) = + id.forEach { plugins.apply(libs.findPlugin(it).get().get().pluginId) } + +internal fun Project.hasPlugins(vararg id: String) = + id.all { plugins.hasPlugin(libs.findPlugin(it).get().get().pluginId) } + +internal fun Project.attachAllTasksIntoAssembleRelease() = afterEvaluate { project -> + val all = project.tasks.filter { task -> + when (task) { + is Jar, is Javadoc -> when { + task.name.contains("debug", true) -> false + else -> true + } + + else -> false + } + }.map { project.tasks.named(it.name) } + project.tasks.findByName("assembleRelease")?.dependsOn(all) } diff --git a/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_publish.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_publish.kt new file mode 100644 index 00000000..5f7672d8 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_publish.kt @@ -0,0 +1,115 @@ +package com.toolkit.plugin.util + +import groovy.util.Node +import org.codehaus.groovy.runtime.DefaultGroovyMethods +import org.gradle.api.Project +import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.dsl.RepositoryHandler +import org.gradle.api.publish.maven.MavenPom +import org.gradle.api.publish.maven.MavenPublication + +internal fun RepositoryHandler.createLocalPathRepository(project: Project) = maven { maven -> + maven.name = "LocalPath" + maven.url = project.uri(project.rootProject.layout.buildDirectory.asFile.get().absolutePath) +} + +internal fun RepositoryHandler.createSonatypeRepository(project: Project) { + if (project.missing("OSSRH_USERNAME", "OSSRH_PASSWORD")) return + maven { maven -> + maven.name = "Sonatype" + maven.url = project.uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") + maven.credentials { cred -> + cred.username = + System.getenv("OSSRH_USERNAME") ?: (project.properties["OSSRH_USERNAME"] as String) + cred.password = + System.getenv("OSSRH_PASSWORD") ?: (project.properties["OSSRH_PASSWORD"] as String) + } + } +} + +internal fun Project.configurePom(pom: MavenPom) { + // Main Configuration + if (pom.name.orNull.isNullOrBlank() && hasProperty("NAME")) { + pom.name.set(properties["NAME"] as String) + } + if (pom.description.orNull.isNullOrBlank() && hasProperty("DESCRIPTION")) { + pom.description.set(properties["DESCRIPTION"] as String) + } + if (pom.url.orNull.isNullOrBlank() && hasProperty("REPO_URL")) { + pom.url.set(properties["REPO_URL"] as String) + } + + // SCM + pom.scm { + it.url.set(properties["REPO_GIT_URL"] as String) + } + + // Developer Configuration + pom.developers { developers -> + developers.developer { dev -> + dev.id.set("melete") + dev.name.set("Melete") + dev.email.set("melete@notValidEmail.com") + dev.organization.set("Wonderland") + dev.url.set(properties["DEV_URL"] as String) + } + } + + // License Configuration + pom.licenses { licenses -> + licenses.license { license -> + license.name.set(properties["LICENCE_NAME"] as String) + license.url.set(properties["LICENCE_URL"] as String) + license.distribution.set(properties["LICENCE_DIST"] as String) + } + } + + pom.ciManagement { ci -> + ci.system.set("GitHub Actions") + ci.url.set("${pom.url.orNull}/actions") + } + + val mapOfConfigurations = mapOf( + "runtime" to "implementation", + "compile" to "api", + "provided" to "compileOnly" + ).mapNotNull { (scope, configuration) -> + configurations.findByName(configuration)?.let { scope to it } + }.toMap() + if (mapOfConfigurations.isNotEmpty()) { + pom.withXml { xml -> + val dependencyNode: Node = xml.asNode().appendNode("dependencies") + mapOfConfigurations.forEach { (scope, configuration) -> + configuration.dependencies.forEach { dependencyNode.addDependency(it, scope) } + } + } + } +} + +private fun Node.addDependency(dependency: Dependency, scope: String) { + val projectDependency = + DefaultGroovyMethods.getProperties(dependency)["dependencyProject"] as? Project + + if (projectDependency != null) { + val publishExtension = projectDependency.publishing + publishExtension.publications.filterIsInstance().onEach { pub -> + val node = appendNode("dependency") + node.appendNode("groupId", pub.groupId) + node.appendNode("artifactId", pub.artifactId) + node.appendNode("version", pub.version) + node.appendNode("scope", scope) + } + } else { + val group = dependency.group.takeIf { it.isNullOrBlank().not() } + val name = dependency.name.takeIf { it.isNullOrBlank().not() } + val version = dependency.version.takeIf { it.isNullOrBlank().not() } + + if (group == null || name == null || version == null) return + + val node = appendNode("dependency") + node.appendNode("groupId", group) + node.appendNode("artifactId", name) + node.appendNode("version", version) + node.appendNode("scope", scope) + } +} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_require.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_require.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/util/_require.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/util/_require.kt diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_versionCatalogExtensions.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_versionCatalogExtensions.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/util/_versionCatalogExtensions.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/util/_versionCatalogExtensions.kt diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_versionName.kt b/buildSrc/src/main/kotlin/com/toolkit/plugin/util/_versionName.kt similarity index 100% rename from plugin/src/main/kotlin/com/toolkit/plugin/util/_versionName.kt rename to buildSrc/src/main/kotlin/com/toolkit/plugin/util/_versionName.kt diff --git a/gradle.properties b/gradle.properties index 7c178da4..42a0df56 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,8 @@ org.gradle.jvmargs=-Xmx8192m -XX:+UseParallelGC -Dkotlin.daemon.jvm.options\="-X org.gradle.parallel=true org.gradle.warning.mode=none org.gradle.configuration-cache=false +# Kotlin +kotlin.mpp.androidGradlePluginCompatibility.nowarn=trueorg.gradle.parallel=true # # # diff --git a/tools/libs.versions.toml b/gradle/libs.versions.toml similarity index 63% rename from tools/libs.versions.toml rename to gradle/libs.versions.toml index 42ad0daa..09d27fa8 100644 --- a/tools/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ [versions] ## --- Plugins and more general stuff --- ## jacoco = "0.8.9" -detekt = "1.23.3" +detekt = "1.23.7" ## --- Build Config and SDK --- ## build-version-name = "1.0.0" @@ -14,16 +14,18 @@ build-sdk-target = "35" build-tools = "35.0.0" ## JetBrains -jetbrains-kotlin = "2.0.20" +jetbrains-kotlin = "2.0.21" jetbrains-coroutines = "1.8.1" jetbrains-serialization = "1.6.3" -jetbrains-kover = "0.7.4" +jetbrains-kover = "0.8.3" +jetbrains-dokka = "2.0.0" ## AndroidX +androidx-plugin = "8.7.3" androidx-appcompat = "1.7.0" androidx-annotation = "1.9.1" androidx-constraint = "2.2.0" -androidx-recyclerview = "1.3.2" +androidx-recyclerview = "1.4.0" androidx-lifecycle = "2.8.7" androidx-window = "1.3.0" androidx-splash = "1.0.1" @@ -35,29 +37,32 @@ androidx-test-espresso = "3.6.1" ## AndroidX Compose androidx-compose-compiler = "1.4.3" -androidx-compose-material = "1.7.5" +androidx-compose-material = "1.7.6" androidx-compose-material3 = "1.3.1" androidx-compose-constraint = "1.1.0" -androidx-compose-core = "1.7.5" +androidx-compose-core = "1.7.6" androidx-compose-lifecycle = "2.8.7" -androidx-compose-activity = "1.9.3" +androidx-compose-activity = "1.10.0" ## SquareUp -square-retrofit = "2.9.0" +square-retrofit = "2.11.0" square-okhttp = "4.12.0" -square-moshi = "1.14.0" +square-moshi = "1.15.1" square-timber = "5.0.1" ## Google google-material = "1.12.0" google-gson = "2.11.0" +google-ksp = "2.0.21-1.0.28" ## Tools -mockito = "5.6.0" +mockito = "5.7.0" mockk = "1.13.12" mockito-kotlin = "5.1.0" junit = "4.13.2" -robolectric = "4.9" +robolectric = "4.10.3" +ktlint = "11.6.1" +dexcount = "4.0.0" # ------------------------------------------------------------------------------------------------ # [libraries] @@ -67,15 +72,20 @@ jetbrains-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", v jetbrains-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "jetbrains-serialization" } jetbrains-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "jetbrains-coroutines" } jetbrains-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "jetbrains-coroutines" } +jetbrains-kover = { group = "org.jetbrains.kotlinx", name = "kover-gradle-plugin", version.ref = "jetbrains-kover" } +jetbrains-dokka = { group = "org.jetbrains.dokka", name = "dokka-gradle-plugin", version.ref = "jetbrains-dokka" } +jetbrains-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "jetbrains-kotlin" } +jetbrains-extensions = { group = "org.jetbrains.kotlin", name = "kotlin-android-extensions", version.ref = "jetbrains-kotlin" } jetbrains-test-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "jetbrains-coroutines" } ## Androidx +androidx-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidx-plugin" } androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "androidx-annotation" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" } androidx-constraint = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "androidx-constraint" } androidx-recycler = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "androidx-recyclerview" } -androidx-lifecycle-livedata = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-livedata = { group = "androidx.lifecycle", name = "lifecycle-livedata", version.ref = "androidx-lifecycle" } +androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime", version.ref = "androidx-lifecycle" } androidx-window = { group = "androidx.window", name = "window", version.ref = "androidx-window" } androidx-splash = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidx-splash" } androidx-security = { group = "androidx.security", name = "security-crypto", version.ref = "androidx-security" } @@ -119,32 +129,54 @@ mockito-test-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", v junit-test = { group = "junit", name = "junit", version.ref = "junit" } robolectric-test = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } detekt-formatting = { group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version.ref = "detekt" } +detekt = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" } +ktlint = { group = "org.jlleitschuh.gradle.ktlint-idea", name = "org.jlleitschuh.gradle.ktlint-idea.gradle.plugin", version.ref = "ktlint" } # ------------------------------------------------------------------------------------------------ # ## Comment this when you start to update some libraries -x-normalize-001 = { group = "androidx.activity", name = "activity", version.ref = "androidx-compose-activity" } -x-normalize-002 = { group = "androidx.annotation", name = "annotation-experimental", version = "1.4.1" } -x-normalize-003 = { group = "androidx.arch.core", name = "core-common", version = "2.2.0" } -x-normalize-004 = { group = "androidx.arch.core", name = "core-runtime", version = "2.2.0" } -x-normalize-005 = { group = "androidx.collection", name = "collection", version = "1.4.4" } -x-normalize-006 = { group = "androidx.core", name = "core", version = "1.13.1" } -x-normalize-007 = { group = "androidx.core", name = "core-ktx", version = "1.13.1" } -x-normalize-008 = { group = "androidx.customview", name = "customview", version = "1.1.0" } -x-normalize-009 = { group = "androidx.drawerlayout", name = "drawerlayout", version = "1.2.0" } -x-normalize-010 = { group = "androidx.lifecycle", name = "lifecycle-common", version.ref = "androidx-lifecycle" } -x-normalize-011 = { group = "androidx.viewpager2", name = "viewpager2", version = "1.1.0" } -x-normalize-012 = { group = "androidx.test", name = "monitor", version = "1.7.2" } -x-normalize-013 = { group = "androidx.test", name = "runner", version = "1.6.2" } -x-normalize-014 = { group = "com.google.auto.value", name = "auto-value-annotations", version = "1.9" } -x-normalize-015 = { group = "com.google.code.findbugs", name = "jsr305", version = "3.0.2" } -x-normalize-016 = { group = "com.squareup", name = "javawritter", version = "2.5.0" } -x-normalize-017 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "jetbrains-kotlin" } -x-normalize-018 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-common", version.ref = "jetbrains-kotlin" } -x-normalize-019 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-jvm", version.ref = "jetbrains-coroutines" } -x-normalize-020 = { group = "org.jetbrains", name = "annotations", version = "23.0.0" } +x-normalize-x001 = { group = "androidx.activity", name = "activity", version.ref = "androidx-compose-activity" } +x-normalize-x002 = { group = "androidx.annotation", name = "annotation-experimental", version = "1.4.1" } +x-normalize-x003 = { group = "androidx.arch.core", name = "core-common", version = "2.2.0" } +x-normalize-x004 = { group = "androidx.arch.core", name = "core-runtime", version = "2.2.0" } +x-normalize-x005 = { group = "androidx.collection", name = "collection", version = "1.4.5" } +x-normalize-x006 = { group = "androidx.core", name = "core", version = "1.15.0" } +x-normalize-x007 = { group = "androidx.core", name = "core-ktx", version = "1.15.0" } +x-normalize-x008 = { group = "androidx.customview", name = "customview", version = "1.1.0" } +x-normalize-x009 = { group = "androidx.drawerlayout", name = "drawerlayout", version = "1.2.0" } +x-normalize-x010 = { group = "androidx.lifecycle", name = "lifecycle-common", version.ref = "androidx-lifecycle" } +x-normalize-x011 = { group = "androidx.viewpager2", name = "viewpager2", version = "1.1.0" } +x-normalize-x012 = { group = "androidx.test", name = "monitor", version = "1.7.2" } +x-normalize-x013 = { group = "androidx.test", name = "runner", version = "1.6.2" } +x-normalize-x014 = { group = "com.google.auto.value", name = "auto-value-annotations", version = "1.11.0" } +x-normalize-x015 = { group = "com.google.code.findbugs", name = "jsr305", version = "3.0.2" } +x-normalize-x016 = { group = "com.squareup", name = "javawritter", version = "2.5.0" } +x-normalize-x017 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "jetbrains-kotlin" } +x-normalize-x018 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-common", version.ref = "jetbrains-kotlin" } +x-normalize-x019 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-jvm", version.ref = "jetbrains-coroutines" } +x-normalize-x020 = { group = "org.jetbrains", name = "annotations", version = "24.1.0" } # ------------------------------------------------------------------------------------------------ # [plugins] +jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "jetbrains-kotlin" } + +## Android +android-application = { id = "com.android.application", version.ref = "androidx-plugin" } +android-library = { id = "com.android.library", version.ref = "androidx-plugin" } + +## Android +google-ksp = { id = "com.google.devtools.ksp", version.ref = "google-ksp" } + +## JetBrains +jetbrains-kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "jetbrains-kotlin" } +jetbrains-kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "jetbrains-kover" } +jetbrains-dokka = { id = "org.jetbrains.dokka", version.ref = "jetbrains-dokka" } +jetbrains-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "jetbrains-kotlin" } +jetbrains-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "jetbrains-kotlin" } + +## Tools to make my life easier +dexcount = { id = "com.getkeepsafe.dexcount", version.ref = "dexcount" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint-idea", version.ref = "ktlint" } # ------------------------------------------------------------------------------------------------ # [bundles] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e49806f3..30426504 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt b/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt deleted file mode 100644 index b58c0a15..00000000 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitGroupPlugin.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.toolkit.plugin - -import com.toolkit.plugin.util.applyPlugins -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.jetbrains.kotlin.com.google.gson.JsonArray -import java.nio.file.Files - -internal class ToolkitGroupPlugin : Plugin { - - override fun apply(target: Project) { - target.evaluationDependsOnChildren() - target.applyPlugins("jetbrains-kover") - - // Try to unify coverage reports - target.subprojects.onEach { - target.dependencies.add("kover", it) - } - - // Generate file containing all modules with publish plugin attached - target.tasks.register("publishModules") { - it.group = "groupTask" - // Store target directory into a variable to avoid project reference in the configuration cache - val directory = target.layout.buildDirectory.get() - val file = directory.file("modules.txt").asFile - val publishLibraries = target.subprojects - .filter { it.plugins.hasPlugin("toolkit-publish") } - .map { "toolkit:${it.name}" } - it.doLast { _ -> - Files.createDirectories(directory.asFile.toPath()) - val json = JsonArray() - publishLibraries.onEach(json::add) - - if (file.exists().not()) { - file.createNewFile() - } - file.writeText(json.toString()) - println("Publish module list generated at: $file") - println(json.toString()) - } - } - } -} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitPublishPlugin.kt b/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitPublishPlugin.kt deleted file mode 100644 index 9c93591b..00000000 --- a/plugin/src/main/kotlin/com/toolkit/plugin/ToolkitPublishPlugin.kt +++ /dev/null @@ -1,214 +0,0 @@ -package com.toolkit.plugin - -import com.toolkit.plugin.util.missing -import com.toolkit.plugin.util.publishing -import com.toolkit.plugin.util.requireAny -import com.toolkit.plugin.util.setupJavadocAndSources -import com.toolkit.plugin.util.sign -import com.toolkit.plugin.util.versionName -import groovy.util.Node -import org.codehaus.groovy.runtime.DefaultGroovyMethods -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.artifacts.Dependency -import org.gradle.api.artifacts.dsl.RepositoryHandler -import org.gradle.api.publish.maven.MavenPom -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.publish.maven.tasks.PublishToMavenRepository -import org.jetbrains.kotlin.konan.file.File - -internal class ToolkitPublishPlugin : Plugin { - - private val Project.aar: String? - get() { - val aarPath = "$projectDir/build/outputs/aar/$name-release.aar" - return when { - File(aarPath).exists -> aarPath - else -> null - } - } - private val Project.javadoc: String? - get() { - val aarPath = "$projectDir/build/libs/$name-javadoc.jar" - return when { - File(aarPath).exists -> aarPath - else -> null - } - } - private val Project.sources: String? - get() { - val sourcesPath = "$projectDir/build/libs/$name-sources.jar" - val sourcesMultiPlatformPath = "$projectDir/build/libs/$name-kotlin-sources.jar" - return when { - File(sourcesPath).exists -> sourcesPath - File(sourcesMultiPlatformPath).exists -> sourcesMultiPlatformPath - else -> null - } - } - - override fun apply(target: Project) { - target.requireAny( - "toolkit-publish", - "toolkit-android-library", - "toolkit-multiplatform-library" - ) - - if (target.missing( - "OSSRH_USERNAME", - "OSSRH_PASSWORD", - "signing.keyId", - "signing.password", - "signing.secretKeyRingFile", - ) - ) { - println("Missing env variables") - return - } - - target.plugins.apply("maven-publish") - target.plugins.apply("signing") - - // Setup Javadoc and sources artifacts - target.setupJavadocAndSources() - - // Setup Publishing - with(target.publishing) { - repositories { repo -> - repo.createLocalPathRepository(target) - repo.createSonatypeRepository(target) - } - - publications { - it.register("Toolkit", MavenPublication::class.java) { pub -> - pub.groupId = target.properties["GROUP"] as String - pub.artifactId = target.name - pub.version = target.versionName - - if (target.aar != null) { - pub.artifact(target.aar) - } - if (target.javadoc != null) { - pub.artifact(target.javadoc) { artifact -> - artifact.classifier = "javadoc" - artifact.extension = "jar" - } - } - if (target.sources != null) { - pub.artifact(target.sources) { artifact -> - artifact.classifier = "sources" - artifact.extension = "jar" - } - } - pub.pom { target.configurePom(it) } - } - } - } - - // Setup Signing - with(target.sign) { - sign(target.publishing.publications) - setRequired { - // signing is only required if the artifacts are to be published - target.gradle.taskGraph.allTasks.any { (it is PublishToMavenRepository) } - } - } - } - - private fun RepositoryHandler.createLocalPathRepository(project: Project) = maven { maven -> - maven.name = "LocalPath" - maven.url = project.uri(project.rootProject.layout.buildDirectory.asFile.get().absolutePath) - } - - private fun RepositoryHandler.createSonatypeRepository(project: Project) = maven { maven -> - maven.name = "Sonatype" - maven.url = project.uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") - maven.credentials { cred -> - cred.username = - System.getenv("OSSRH_USERNAME") ?: (project.properties["OSSRH_USERNAME"] as String) - cred.password = - System.getenv("OSSRH_PASSWORD") ?: (project.properties["OSSRH_PASSWORD"] as String) - } - } - - private fun Project.configurePom(pom: MavenPom) { - // Main Configuration - if (pom.name.orNull.isNullOrBlank() && hasProperty("NAME")) { - pom.name.set(properties["NAME"] as String) - } - if (pom.description.orNull.isNullOrBlank() && hasProperty("DESCRIPTION")) { - pom.description.set(properties["DESCRIPTION"] as String) - } - if (pom.url.orNull.isNullOrBlank() && hasProperty("REPO_URL")) { - pom.url.set(properties["REPO_URL"] as String) - } - - // SCM - pom.scm { - it.url.set(properties["REPO_GIT_URL"] as String) - } - - // Developer Configuration - pom.developers { developers -> - developers.developer { dev -> - dev.id.set("melete") - dev.name.set("Melete") - dev.email.set("melete@notValidEmail.com") - dev.organization.set("Wonderland") - dev.url.set(properties["DEV_URL"] as String) - } - } - - // License Configuration - pom.licenses { licenses -> - licenses.license { license -> - license.name.set(properties["LICENCE_NAME"] as String) - license.url.set(properties["LICENCE_URL"] as String) - license.distribution.set(properties["LICENCE_DIST"] as String) - } - } - - val mapOfConfigurations = mapOf( - "runtime" to "implementation", - "compile" to "api", - "provided" to "compileOnly" - ).mapNotNull { (scope, configuration) -> - configurations.findByName(configuration)?.let { scope to it } - }.toMap() - if (mapOfConfigurations.isNotEmpty()) { - pom.withXml { xml -> - val dependencyNode: Node = xml.asNode().appendNode("dependencies") - mapOfConfigurations.forEach { (scope, configuration) -> - configuration.dependencies.forEach { dependencyNode.addDependency(it, scope) } - } - } - } - } - - private fun Node.addDependency(dependency: Dependency, scope: String) { - val projectDependency = - DefaultGroovyMethods.getProperties(dependency)["dependencyProject"] as? Project - - if (projectDependency != null) { - val publishExtension = projectDependency.publishing - publishExtension.publications.filterIsInstance().onEach { pub -> - val node = appendNode("dependency") - node.appendNode("groupId", pub.groupId) - node.appendNode("artifactId", pub.artifactId) - node.appendNode("version", pub.version) - node.appendNode("scope", scope) - } - } else { - val group = dependency.group.takeIf { it.isNullOrBlank().not() } - val name = dependency.name.takeIf { it.isNullOrBlank().not() } - val version = dependency.version.takeIf { it.isNullOrBlank().not() } - - if (group == null || name == null || version == null) return - - val node = appendNode("dependency") - node.appendNode("groupId", group) - node.appendNode("artifactId", name) - node.appendNode("version", version) - node.appendNode("scope", scope) - } - } -} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt b/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt deleted file mode 100644 index be3047c9..00000000 --- a/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitBasePlugin.kt +++ /dev/null @@ -1,38 +0,0 @@ -@file:Suppress("UnstableApiUsage") - -package com.toolkit.plugin.multiplatform - -import com.toolkit.plugin.util.applyPlugins -import com.toolkit.plugin.util.multiplatform -import com.toolkit.plugin.util.projectJavaVersionCode -import org.gradle.api.NamedDomainObjectContainer -import org.gradle.api.NamedDomainObjectProvider -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet - -internal class ToolkitBasePlugin : Plugin { - - override fun apply(target: Project) { - target.applyPlugins("jetbrains-multiplatform") - with(target.kotlinExtension) { - jvmToolchain(projectJavaVersionCode) - } - - with(target.multiplatform) { - androidTarget {} - } - - target.plugins.apply("toolkit-optimize") - } -} - -val NamedDomainObjectContainer.androidMain: NamedDomainObjectProvider - get() = named("androidMain") - -val NamedDomainObjectContainer.androidUnitTest: NamedDomainObjectProvider - get() = named("androidUnitTest") - -val NamedDomainObjectContainer.androidInstrumentedTest: NamedDomainObjectProvider - get() = named("androidInstrumentedTest") diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitSamplePlugin.kt b/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitSamplePlugin.kt deleted file mode 100644 index c7a1d062..00000000 --- a/plugin/src/main/kotlin/com/toolkit/plugin/multiplatform/ToolkitSamplePlugin.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.toolkit.plugin.multiplatform - -import com.toolkit.plugin.setupAndroidApplicationModule -import com.toolkit.plugin.util.applyPlugins -import org.gradle.api.Plugin -import org.gradle.api.Project - -internal class ToolkitSamplePlugin : Plugin { - - override fun apply(target: Project) { - target.applyPlugins("android-application") - target.plugins.apply("toolkit-multiplatform-base") - - target.setupAndroidApplicationModule() - - target.plugins.apply("toolkit-lint") - target.plugins.apply("toolkit-test") - target.plugins.apply("toolkit-optimize") - } -} diff --git a/plugin/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt b/plugin/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt deleted file mode 100644 index 795dad17..00000000 --- a/plugin/src/main/kotlin/com/toolkit/plugin/util/_javadocAndSources.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.toolkit.plugin.util - -import org.gradle.api.Project -import org.gradle.api.tasks.javadoc.Javadoc -import org.gradle.jvm.tasks.Jar -import org.jetbrains.kotlin.konan.file.File - -internal fun Project.setupJavadocAndSources() { - val sourcesJar = setupSources() - val javadocJar = setupJavadoc() - setupArtifacts(javadocJar, sourcesJar) - - tasks.whenTaskAdded { - when (it.name) { - "assembleRelease" -> { - it.finalizedBy(sourcesJar, javadocJar) - } - - "signToolkitPublication" -> { - it.dependsOn(sourcesJar, javadocJar) - } - - "signKotlinMultiplatformPublication" -> { - it.dependsOn(sourcesJar, javadocJar) - } - } - } -} - -private fun Project.setupJavadoc(): Jar { - configurations.maybeCreate("jacocoDeps") - - val javadoc = tasks.register("javadoc", Javadoc::class.java) { - val list = ArrayList() - androidLibrary2.sourceSets.forEach { set -> list.addAll(set.java.srcDirs) } - - it.isFailOnError = false - it.setExcludes(listOf("**/*.kt", "**/*.java")) - it.source(list) - it.classpath += files(androidLibrary2.bootClasspath.joinToString(separator = File.separator)) - it.classpath += configurations.named("jacocoDeps").get() - }.get() - - return tasks.register("javadocJar", Jar::class.java) { - it.dependsOn(javadoc) - it.archiveClassifier.set("javadoc") - it.from(javadoc.destinationDir) - }.get() -} - -private fun Project.setupSources() = if (tasks.findByName("sourcesJar") == null) { - tasks.register("sourcesJar", Jar::class.java) { - val mainSource = androidLibrary2.sourceSets.named("main").get().java.srcDirs - it.from(mainSource) - it.archiveClassifier.set("sources") - }.get() -} else { - tasks.named("sourcesJar", Jar::class.java).get() -} - -private fun Project.setupArtifacts(javadoc: Jar, sources: Jar) { - artifacts { - it.add("archives", javadoc) - it.add("archives", sources) - } -} diff --git a/samples/github-list-project/build.gradle.kts b/samples/github-list-project/build.gradle.kts index 75721e9f..d0df1420 100644 --- a/samples/github-list-project/build.gradle.kts +++ b/samples/github-list-project/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("toolkit-android-sample") // id("toolkit-compose") --> Commented until Compose finally work on API 34 -.-" - alias(pluginLibraries.plugins.google.ksp) + alias(libs.plugins.google.ksp) } android.namespace = "br.com.arch.toolkit.sample.github" @@ -19,26 +19,26 @@ androidComponents.beforeVariants { dependencies { // Other Modules - implementation(project(":toolkit:delegate")) - implementation(project(":toolkit:event-observer")) - implementation(project(":toolkit:recycler-adapter")) - implementation(project(":toolkit:statemachine")) - implementation(project(":toolkit:splinter")) + implementation(project(":toolkit:multi:event-observer")) + implementation(project(":toolkit:multi:splinter")) + implementation(project(":toolkit:android:delegate")) + implementation(project(":toolkit:android:recycler-adapter")) + implementation(project(":toolkit:android:statemachine")) // Libraries - implementation(libraries.jetbrains.stdlib.jdk8) - implementation(libraries.androidx.annotation) - implementation(libraries.androidx.appcompat) - implementation(libraries.androidx.recycler) - implementation(libraries.androidx.splash) - implementation(libraries.square.retrofit.main) - implementation(libraries.square.retrofit.moshi) - implementation(libraries.square.okhttp.core) - implementation(libraries.square.moshi.kotlin) - implementation(libraries.square.timber) - implementation(libraries.square.okhttp.logging) + implementation(libs.jetbrains.stdlib.jdk8) + implementation(libs.androidx.annotation) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.recycler) + implementation(libs.androidx.splash) + implementation(libs.square.retrofit.main) + implementation(libs.square.retrofit.moshi) + implementation(libs.square.okhttp.core) + implementation(libs.square.moshi.kotlin) + implementation(libs.square.timber) + implementation(libs.square.okhttp.logging) // Doing evil things generating code! - ksp(libraries.square.moshi.codegen) + ksp(libs.square.moshi.codegen) } diff --git a/samples/playground-android/.gitignore b/samples/playground-android/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/samples/playground-android/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/samples/playground-android/build.gradle.kts b/samples/playground-android/build.gradle.kts deleted file mode 100644 index 4c51ceec..00000000 --- a/samples/playground-android/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -plugins { id("toolkit-android-sample") } - -android.namespace = "br.com.arch.toolkit.sample.playground" -android.defaultConfig.applicationId("br.com.arch.toolkit.sample.playground") - -androidComponents.beforeVariants { - it.enable = it.name == "debug" -} - -dependencies { - // Other Modules - implementation(project(":toolkit:event-observer")) - implementation(project(":toolkit:util")) - implementation(project(":toolkit:storage")) - implementation(project(":toolkit:splinter")) - implementation(project(":toolkit:recycler-adapter")) - implementation(project(":toolkit:statemachine")) - implementation(project(":toolkit:delegate")) - - // Libraries - implementation(libraries.jetbrains.stdlib.jdk8) - implementation(libraries.androidx.annotation) - implementation(libraries.androidx.appcompat) - implementation(libraries.androidx.recycler) - implementation(libraries.androidx.constraint) - implementation(libraries.square.timber) - implementation(libraries.google.gson) -} diff --git a/samples/playground-android/proguard-rules.pro b/samples/playground-android/proguard-rules.pro deleted file mode 100644 index ff59496d..00000000 --- a/samples/playground-android/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle.kts. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/playground-android/src/main/AndroidManifest.xml b/samples/playground-android/src/main/AndroidManifest.xml deleted file mode 100644 index 225a35bb..00000000 --- a/samples/playground-android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/MainActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/MainActivity.kt deleted file mode 100644 index cbd16a84..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/MainActivity.kt +++ /dev/null @@ -1,80 +0,0 @@ -package br.com.arch.toolkit.sample.playground - -import android.content.Intent -import android.os.Bundle -import android.widget.Button -import androidx.appcompat.app.AppCompatActivity -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.recyclerAdapter.ChangingListActivity -import br.com.arch.toolkit.sample.playground.recyclerAdapter.MultipleViewTypesActivity -import br.com.arch.toolkit.sample.playground.recyclerAdapter.SimpleListActivity -import br.com.arch.toolkit.sample.playground.recyclerAdapter.StickyHeadersActivity -import br.com.arch.toolkit.sample.playground.statemachine.SceneStateMachineExampleActivity -import br.com.arch.toolkit.sample.playground.statemachine.ViewStateMachineExampleActivity -import br.com.arch.toolkit.sample.playground.storage.StorageSampleActivity -import timber.log.Timber - -class MainActivity : AppCompatActivity(R.layout.activity_main) { - - // Recycler Adapter - private val simpleListButton: Button by viewProvider(R.id.bt_simple_list_example) - private val multipleViewButton: Button by viewProvider(R.id.bt_multiple_view_types_example) - private val stickyHeadersButton: Button by viewProvider(R.id.bt_sticky_headers_example) - private val changingListButton: Button by viewProvider(R.id.bt_changing_list_example) - - // State Machine - private val viewStateMachineExampleButton: Button by viewProvider(R.id.bt_view_state_machine_example) - private val sceneStateMachineExampleButton: Button by viewProvider(R.id.bt_scene_state_machine_example) - - // State Machine - private val viewStorageExampleButton: Button by viewProvider(R.id.bt_view_storage_example) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - Timber.plant(Timber.DebugTree()) - - // Recycler Adapter - setupRecyclerAdapterSamples() - - // State Machine - setupStateMachineSamples() - - // Storage - setupStorageSamples() - } - - private fun setupRecyclerAdapterSamples() { - simpleListButton.setOnClickListener { - startActivity(Intent(this, SimpleListActivity::class.java)) - } - - multipleViewButton.setOnClickListener { - startActivity(Intent(this, MultipleViewTypesActivity::class.java)) - } - - stickyHeadersButton.setOnClickListener { - startActivity(Intent(this, StickyHeadersActivity::class.java)) - } - - changingListButton.setOnClickListener { - startActivity(Intent(this, ChangingListActivity::class.java)) - } - } - - private fun setupStateMachineSamples() { - viewStateMachineExampleButton.setOnClickListener { - startActivity(Intent(this, ViewStateMachineExampleActivity::class.java)) - } - - sceneStateMachineExampleButton.setOnClickListener { - startActivity(Intent(this, SceneStateMachineExampleActivity::class.java)) - } - } - - private fun setupStorageSamples() { - viewStorageExampleButton.setOnClickListener { - startActivity(Intent(this, StorageSampleActivity::class.java)) - } - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/BaseActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/BaseActivity.kt deleted file mode 100644 index 750f52c5..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/BaseActivity.kt +++ /dev/null @@ -1,24 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter - -import android.os.Bundle -import android.view.MenuItem -import androidx.appcompat.app.AppCompatActivity - -abstract class BaseActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - supportActionBar?.let { - it.setDisplayHomeAsUpEnabled(true) - it.setDisplayShowHomeEnabled(true) - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - finish() - return true - } - return super.onOptionsItemSelected(item) - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/ChangingListActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/ChangingListActivity.kt deleted file mode 100644 index 055b09eb..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/ChangingListActivity.kt +++ /dev/null @@ -1,52 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter - -import android.os.Bundle -import android.view.View -import android.widget.LinearLayout.VERTICAL -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.recyclerAdapter.adapter.MultipleViewTypesAdapter - -class ChangingListActivity : BaseActivity() { - - private val recycler: RecyclerView by viewProvider(R.id.recycler_view) - private val restore: View by viewProvider(R.id.restore) - private val sortDescending: View by viewProvider(R.id.sort_descending) - - private val adapter = MultipleViewTypesAdapter() - .withListener(::onItemClick) - .withListener(MultipleViewTypesAdapter.TYPE_TWO, ::onTypeTwoClick) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_sorting_list) - - recycler.layoutManager = LinearLayoutManager(this) - recycler.addItemDecoration(DividerItemDecoration(this, VERTICAL)) - recycler.adapter = adapter - - adapter.setList(generateStringList()) - - restore.setOnClickListener { - adapter.setList(generateStringList()) - } - - sortDescending.setOnClickListener { - adapter.setList(generateSortedStringList()) - } - } - - private fun onItemClick(item: String) { - adapter.addItem(item + System.currentTimeMillis()) - } - - private fun onTypeTwoClick(item: String) { - adapter.removeItem(item) - } - - private fun generateStringList() = (1 until 20).map { "Item $it" } - private fun generateSortedStringList() = generateStringList().minus("Item 2").sortedDescending() -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/MultipleViewTypesActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/MultipleViewTypesActivity.kt deleted file mode 100644 index 8904c1aa..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/MultipleViewTypesActivity.kt +++ /dev/null @@ -1,39 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter - -import android.os.Bundle -import android.widget.LinearLayout.VERTICAL -import android.widget.Toast -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.recyclerAdapter.adapter.MultipleViewTypesAdapter - -class MultipleViewTypesActivity : BaseActivity() { - - private val recycler by viewProvider(R.id.recycler_view) - private val adapter = MultipleViewTypesAdapter() - .withListener(::onItemClick) - .withListener(MultipleViewTypesAdapter.TYPE_TWO, ::onTypeTwoClick) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - recycler.layoutManager = LinearLayoutManager(this) - recycler.addItemDecoration(DividerItemDecoration(this, VERTICAL)) - recycler.adapter = adapter - - adapter.setList(generateStringList()) - } - - private fun onItemClick(item: String) { - Toast.makeText(this, "Default Listener: $item", Toast.LENGTH_SHORT).show() - } - - private fun onTypeTwoClick(item: String) { - Toast.makeText(this, "Type Two: $item", Toast.LENGTH_SHORT).show() - } - - private fun generateStringList() = (1 until 20).map { "Item $it" } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/SimpleListActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/SimpleListActivity.kt deleted file mode 100644 index 4c9a4566..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/SimpleListActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter - -import android.os.Bundle -import android.widget.LinearLayout.VERTICAL -import android.widget.Toast -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.recyclerAdapter.SimpleAdapter -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView.SimpleItemView - -class SimpleListActivity : BaseActivity() { - - private val recycler: RecyclerView by viewProvider(R.id.recycler_view) - private val adapter = SimpleAdapter(::SimpleItemView).withListener(::onItemClick) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - recycler.layoutManager = LinearLayoutManager(this) - recycler.addItemDecoration(DividerItemDecoration(this, VERTICAL)) - recycler.adapter = adapter - - adapter.setList(generateStringList()) - } - - private fun onItemClick(item: String) { - Toast.makeText(this, item, Toast.LENGTH_SHORT).show() - } - - private fun generateStringList() = (1 until 20).map { "Item $it" } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/StickyHeadersActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/StickyHeadersActivity.kt deleted file mode 100644 index 8b8af0d4..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/StickyHeadersActivity.kt +++ /dev/null @@ -1,48 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter - -import android.os.Bundle -import android.widget.LinearLayout -import android.widget.Toast -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.RecyclerView -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.recyclerAdapter.SimpleStickyAdapter -import br.com.arch.toolkit.recyclerAdapter.stickyheader.StickyHeaderModel -import br.com.arch.toolkit.recyclerAdapter.stickyheader.StickyHeadersLinearLayoutManager -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView.StickyItemView - -class StickyHeadersActivity : BaseActivity() { - - private val recycler by viewProvider(R.id.recycler_view) - private val adapter = SimpleStickyAdapter(StickyItemView::Item, StickyItemView::Header).withListener(::onItemClick) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - recycler.layoutManager = - StickyHeadersLinearLayoutManager< - SimpleStickyAdapter - >(this) - recycler.addItemDecoration(DividerItemDecoration(this, LinearLayout.VERTICAL)) - recycler.adapter = adapter - - adapter.setList(generateList()) - } - - private fun onItemClick(item: StickyHeaderModelExample) { - Toast.makeText(this, "Default Listener: ${item.title}", Toast.LENGTH_SHORT).show() - } - - private fun generateList() = (1 until 19).map { - if (it == 1 || it % 4 == 0) { - StickyHeaderModelExample("Header $it").apply { isSticky = true } - } else { - StickyHeaderModelExample("Item $it") - } - } - - class StickyHeaderModelExample(val title: String) : StickyHeaderModel { - override var isSticky = false - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/adapter/MultipleViewTypesAdapter.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/adapter/MultipleViewTypesAdapter.kt deleted file mode 100644 index f1e1546e..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/adapter/MultipleViewTypesAdapter.kt +++ /dev/null @@ -1,26 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter.adapter - -import android.content.Context -import br.com.arch.toolkit.recyclerAdapter.BaseRecyclerAdapter -import br.com.arch.toolkit.recyclerAdapter.ViewBinder -import br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView.AnotherSimpleItemView -import br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView.SimpleItemView - -class MultipleViewTypesAdapter : BaseRecyclerAdapter() { - - override fun viewCreator(context: Context, viewType: Int): ViewBinder<*> { - return when (viewType) { - TYPE_ONE -> SimpleItemView(context) - else -> AnotherSimpleItemView(context) - } - } - - override fun getItemViewType(position: Int): Int { - return if (position % 2 == 0) TYPE_ONE else TYPE_TWO - } - - companion object { - const val TYPE_ONE = 0 - const val TYPE_TWO = 1 - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/AnotherSimpleItemView.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/AnotherSimpleItemView.kt deleted file mode 100644 index f5d109ee..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/AnotherSimpleItemView.kt +++ /dev/null @@ -1,34 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView - -import android.content.Context -import android.util.AttributeSet -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import androidx.appcompat.widget.AppCompatTextView -import br.com.arch.toolkit.recyclerAdapter.ViewBinder -import br.com.arch.toolkit.sample.playground.R - -class AnotherSimpleItemView : AppCompatTextView, ViewBinder { - - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this( - context, - attrs, - R.attr.anotherSimpleItemStyle - ) - - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - - init { - layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT) - } - - override fun bind(model: String) { - text = model - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/SimpleItemView.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/SimpleItemView.kt deleted file mode 100644 index eaaad7be..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/SimpleItemView.kt +++ /dev/null @@ -1,34 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView - -import android.content.Context -import android.util.AttributeSet -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import androidx.appcompat.widget.AppCompatTextView -import br.com.arch.toolkit.recyclerAdapter.ViewBinder -import br.com.arch.toolkit.sample.playground.R - -class SimpleItemView : AppCompatTextView, ViewBinder { - - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this( - context, - attrs, - R.attr.simpleItemStyle - ) - - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - - init { - layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT) - } - - override fun bind(model: String) { - text = model - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/StickyItemView.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/StickyItemView.kt deleted file mode 100644 index 975d74e4..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/recyclerAdapter/itemView/StickyItemView.kt +++ /dev/null @@ -1,64 +0,0 @@ -package br.com.arch.toolkit.sample.playground.recyclerAdapter.itemView - -import android.content.Context -import android.util.AttributeSet -import android.view.ViewGroup -import androidx.appcompat.widget.AppCompatTextView -import br.com.arch.toolkit.recyclerAdapter.ViewBinder -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.recyclerAdapter.StickyHeadersActivity - -sealed class StickyItemView { - abstract class View( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int - ) : AppCompatTextView( - context, - attrs, - defStyleAttr - ), - ViewBinder { - - init { - layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - } - - override fun bind(model: StickyHeadersActivity.StickyHeaderModelExample) { - text = model.title - } - } - - class Header : View { - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this( - context, - attrs, - R.attr.stickyItemStyle - ) - - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - } - - class Item : View { - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this( - context, - attrs, - R.attr.simpleItemStyle - ) - - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/BaseActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/BaseActivity.kt deleted file mode 100644 index b9c19507..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/BaseActivity.kt +++ /dev/null @@ -1,37 +0,0 @@ -package br.com.arch.toolkit.sample.playground.statemachine - -import android.os.Bundle -import android.view.MenuItem -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity - -abstract class BaseActivity(layoutRes: Int) : AppCompatActivity(layoutRes) { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - supportActionBar?.let { - it.setDisplayHomeAsUpEnabled(true) - it.setDisplayShowHomeEnabled(true) - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - finish() - return true - } - return super.onOptionsItemSelected(item) - } - - protected fun displayToast(message: String) { - Toast.makeText(this, message, Toast.LENGTH_SHORT).show() - } - - companion object { - const val STATE_ONE = 0 - const val STATE_TWO = 1 - const val STATE_THREE = 2 - - const val STATE_MACHINE_RESTORE_KEY = "STATE_MACHINE_RESTORE_KEY" - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/SceneStateMachineExampleActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/SceneStateMachineExampleActivity.kt deleted file mode 100644 index bcfcac0e..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/SceneStateMachineExampleActivity.kt +++ /dev/null @@ -1,83 +0,0 @@ -package br.com.arch.toolkit.sample.playground.statemachine - -import android.os.Bundle -import android.transition.Fade -import android.transition.Slide -import android.view.Gravity -import android.widget.Button -import android.widget.FrameLayout -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.statemachine.SceneStateMachine -import br.com.arch.toolkit.statemachine.config -import br.com.arch.toolkit.statemachine.scene -import br.com.arch.toolkit.statemachine.state - -class SceneStateMachineExampleActivity : BaseActivity(R.layout.activity_scene_state_machine) { - - private val stateContainer: FrameLayout by viewProvider(R.id.state_container) - - private val btStateOne: Button by viewProvider(R.id.bt_state_one) - private val btStateTwo: Button by viewProvider(R.id.bt_state_two) - private val btStateThree: Button by viewProvider(R.id.bt_state_three) - - private val stateMachine = SceneStateMachine() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupStateMachine(savedInstanceState?.getBundle(STATE_MACHINE_RESTORE_KEY)) - setupClickListeners() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putBundle(STATE_MACHINE_RESTORE_KEY, stateMachine.saveInstanceState()) - } - - private fun setupClickListeners() { - btStateOne.setOnClickListener { stateMachine.changeState(STATE_ONE, true) } - - btStateTwo.setOnClickListener { - stateMachine.changeState(STATE_TWO) { newActiveStateKey -> - displayToast("Custom Listener: $newActiveStateKey") - } - } - - btStateThree.setOnClickListener { stateMachine.changeState(STATE_THREE) } - } - - private fun setupStateMachine(savedInstanceState: Bundle?) = with(stateMachine) { - restoreInstanceState(savedInstanceState) - - config { - initialState = STATE_ONE - setOnChangeState { newActiveStateKey -> - displayToast("Default Listener: $newActiveStateKey") - } - } - - state(STATE_ONE) { - scene(R.layout.scene_one to stateContainer) - - onEnter { - displayToast("State One Is Active") - } - } - - state(STATE_TWO) { - scene(R.layout.scene_two to stateContainer) - transition(Fade()) - - onExit { - displayToast("State Two Is Hidden") - } - } - - state(STATE_THREE) { - scene(R.layout.scene_three to stateContainer) - transition(Slide(Gravity.START)) - } - - start() - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/ViewStateMachineExampleActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/ViewStateMachineExampleActivity.kt deleted file mode 100644 index ca5cf545..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/statemachine/ViewStateMachineExampleActivity.kt +++ /dev/null @@ -1,82 +0,0 @@ -package br.com.arch.toolkit.sample.playground.statemachine - -import android.os.Bundle -import android.widget.Button -import android.widget.TextView -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.statemachine.ViewStateMachine -import br.com.arch.toolkit.statemachine.config -import br.com.arch.toolkit.statemachine.setup -import br.com.arch.toolkit.statemachine.state - -class ViewStateMachineExampleActivity : BaseActivity(R.layout.activity_view_state_machine) { - - private val stateOne: TextView by viewProvider(R.id.state_one) - private val stateTwo: TextView by viewProvider(R.id.state_two) - private val stateThree: TextView by viewProvider(R.id.state_three) - - private val btStateOne: Button by viewProvider(R.id.bt_state_one) - private val btStateTwo: Button by viewProvider(R.id.bt_state_one) - private val btStateThree: Button by viewProvider(R.id.bt_state_one) - - private val stateMachine = ViewStateMachine() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupStateMachine(savedInstanceState?.getBundle(STATE_MACHINE_RESTORE_KEY)) - setupClickListeners() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putBundle(STATE_MACHINE_RESTORE_KEY, stateMachine.saveInstanceState()) - } - - private fun setupClickListeners() { - btStateOne.setOnClickListener { stateMachine.changeState(STATE_ONE, true) } - - btStateTwo.setOnClickListener { - stateMachine.changeState(STATE_TWO) { newActiveStateKey -> - displayToast("Custom Listener: $newActiveStateKey") - } - } - - btStateThree.setOnClickListener { stateMachine.changeState(STATE_THREE) } - } - - private fun setupStateMachine(savedInstanceState: Bundle?) = stateMachine.setup { - config { - initialState = STATE_ONE - setOnChangeState { newActiveStateKey -> - displayToast("Default Listener: $newActiveStateKey") - } - } - - state(STATE_ONE) { - visibles(stateOne) - invisibles(stateTwo) - gones(stateThree) - - onEnter { - displayToast("State One Is Active") - } - } - - state(STATE_TWO) { - visibles(stateTwo) - invisibles(stateOne, stateThree) - - onExit { - displayToast("State Two Is Hidden") - } - } - - state(STATE_THREE) { - visibles(stateThree) - gones(stateOne, stateTwo) - } - - restoreInstanceState(savedInstanceState) - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/SampleData.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/SampleData.kt deleted file mode 100644 index 560bb955..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/SampleData.kt +++ /dev/null @@ -1,80 +0,0 @@ -package br.com.arch.toolkit.sample.playground.storage - -import br.com.arch.toolkit.storage.Storage -import br.com.arch.toolkit.storage.delegate.keyValueStorage -import kotlin.reflect.KClass - -class SampleData(private val name: String, default: T, kClass: KClass) { - - private var nullableValue: T? by keyValueStorage(kClass, "nullable-$name") - private var value: T by keyValueStorage(kClass, name).required(default) - - private var nullableListOfValue: List? by keyValueStorage("nullable-list-$name") - private var listOfValue: List by keyValueStorage>("list-$name") - .required(listOf(default)) - - private var nullableMapOfValue: Map? by keyValueStorage("nullable-map-$name") - private var mapOfValue: Map by keyValueStorage>("map-$name") - .required(emptyMap()) - - fun asNewData() = NewData( - nullableValue, - value, - nullableListOfValue, - listOfValue, - nullableMapOfValue, - mapOfValue - ) - - fun applyNewData(new: NewData) { - nullableValue = new.nullableValue - value = new.value - nullableListOfValue = new.nullableListOfValue - listOfValue = new.listOfValue - nullableMapOfValue = new.nullableMapOfValue - mapOfValue = new.mapOfValue - } - - fun delete() { - nullableValue = null - nullableListOfValue = null - nullableMapOfValue = null - - Storage.Settings.keyValue.apply { - remove(this@SampleData.name) - remove("list-${this@SampleData.name}") - remove("map-${this@SampleData.name}") - } - } - - override fun toString() = """ - |Actual Value: - | - |Nullable = $nullableValue - |Value = $value - |Null List = $nullableListOfValue - |List = $listOfValue - |Null Map = $nullableMapOfValue - |Map = $mapOfValue - """.trimMargin() - - class NewData( - var nullableValue: T?, - var value: T, - var nullableListOfValue: List?, - var listOfValue: List, - var nullableMapOfValue: Map?, - var mapOfValue: Map, - ) { - override fun toString() = """ - |Next Value: - | - |Nullable = $nullableValue - |Value = $value - |Null List = $nullableListOfValue - |List = $listOfValue - |Null Map = $nullableMapOfValue - |Map = $mapOfValue - """.trimMargin() - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageSampleActivity.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageSampleActivity.kt deleted file mode 100644 index dc6dc957..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageSampleActivity.kt +++ /dev/null @@ -1,135 +0,0 @@ -@file:Suppress("MagicNumber") - -package br.com.arch.toolkit.sample.playground.storage - -import android.os.Bundle -import androidx.lifecycle.lifecycleScope -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R -import br.com.arch.toolkit.sample.playground.statemachine.BaseActivity -import br.com.arch.toolkit.storage.ComplexDataParser -import br.com.arch.toolkit.storage.Storage -import com.google.gson.Gson -import kotlinx.coroutines.launch -import java.util.UUID -import kotlin.random.Random -import kotlin.reflect.KClass -import kotlin.time.Duration.Companion.minutes - -class StorageSampleActivity : BaseActivity(R.layout.activity_storage_sample) { - - // Primitive - private val intData = SampleData("int", 0, Int::class) - private val longData = SampleData("long", 0L, Long::class) - private val doubleData = SampleData("double", 0.0, Double::class) - private val floatData = SampleData("float", 0.0f, Float::class) - private val stringData = SampleData("string", "string", String::class) - private val booleanData = SampleData("boolean", false, Boolean::class) - - // Complex - private val enumData = SampleData("TestEnum", TestEnum.ONE, TestEnum::class) - private val classData = SampleData("TestClass", TestClass("test"), TestClass::class) - - //region Views - private val intDataView: StorageValidationView by viewProvider(R.id.int_data) - private val longDataView: StorageValidationView by viewProvider(R.id.long_data) - private val doubleDataView: StorageValidationView by viewProvider(R.id.double_data) - private val floatDataView: StorageValidationView by viewProvider(R.id.float_data) - private val stringDataView: StorageValidationView by viewProvider(R.id.string_data) - private val booleanDataView: StorageValidationView by viewProvider(R.id.boolean_data) - private val enumDataView: StorageValidationView by viewProvider(R.id.enum_data) - private val classDataView: StorageValidationView by viewProvider(R.id.class_data) - //endregion - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - Storage.Settings.setDefaultStorage(Storage.KeyValue.encrypted) - Storage.Settings.setDefaultThreshold(2.minutes) - Storage.Settings.setComplexDataParser(object : ComplexDataParser { - val gson = Gson() - - override fun fromJson(json: String, classToParse: KClass) = - gson.fromJson(json, classToParse.java) - - override fun toJson(data: T): String = gson.toJson(data) - }) - - lifecycleScope.launch { - // Primitive - intDataView.setData(intData, ::generateInt) - longDataView.setData(longData, ::generateLong) - doubleDataView.setData(doubleData, ::generateDouble) - floatDataView.setData(floatData, ::generateFloat) - stringDataView.setData(stringData, ::generateString) - booleanDataView.setData(booleanData, ::generateBoolean) - - // Complex - enumDataView.setData(enumData, ::generateEnum) - classDataView.setData(classData, ::generateClass) - } - } - - private fun generateInt(): SampleData.NewData { - fun randomData() = Random.nextInt(5000) - return generate(::randomData) - } - - private fun generateLong(): SampleData.NewData { - fun randomData() = Random.nextLong(5000) - return generate(::randomData) - } - - private fun generateDouble(): SampleData.NewData { - fun randomData() = Random.nextDouble(5000.0) - return generate(::randomData) - } - - private fun generateFloat(): SampleData.NewData { - fun randomData() = Random.nextFloat() - return generate(::randomData) - } - - private fun generateString(): SampleData.NewData { - fun randomData() = UUID.randomUUID().toString().slice(0..3) - return generate(::randomData) - } - - private fun generateBoolean(): SampleData.NewData { - fun randomData() = Random.nextBoolean() - return generate(::randomData) - } - - private fun generateEnum(): SampleData.NewData { - fun randomData() = TestEnum.entries.random() - return generate(::randomData) - } - - private fun generateClass(): SampleData.NewData { - fun randomData() = TestClass(generateString().value) - return generate(::randomData) - } - - private fun generate( - randomData: () -> T - ): SampleData.NewData { - fun randomList() = (0..1).map { randomData() } - return SampleData.NewData( - nullableValue = Random.nextBoolean().ifTrue { randomData() }, - value = randomData(), - nullableListOfValue = Random.nextBoolean().ifTrue { randomList() }, - listOfValue = randomList(), - nullableMapOfValue = Random.nextBoolean().ifTrue { mapOf("key" to randomData()) }, - mapOfValue = mapOf("key" to randomData()), - ) - } - - enum class TestEnum { ONE } - data class TestClass(val value: String) - - private fun Boolean.ifTrue(block: () -> T) = if (this) { - block() - } else { - null - } -} diff --git a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageValidationView.kt b/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageValidationView.kt deleted file mode 100644 index dcd5d9a1..00000000 --- a/samples/playground-android/src/main/kotlin/br/com/arch/toolkit/sample/playground/storage/StorageValidationView.kt +++ /dev/null @@ -1,58 +0,0 @@ -@file:Suppress("UNCHECKED_CAST") - -package br.com.arch.toolkit.sample.playground.storage - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import androidx.appcompat.widget.AppCompatTextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.withStyledAttributes -import br.com.arch.toolkit.delegate.viewProvider -import br.com.arch.toolkit.sample.playground.R - -class StorageValidationView : ConstraintLayout { - - //region Views - private val title: AppCompatTextView by viewProvider(R.id.title) - private val nextValue: AppCompatTextView by viewProvider(R.id.next_value) - private val currentValue: AppCompatTextView by viewProvider(R.id.current_value) - private val generateNextData: View by viewProvider(R.id.generate_next_data) - private val applyNextDataIntoStorage: View by viewProvider(R.id.apply_next_data_into_storage) - private val getFromStorage: View by viewProvider(R.id.get_from_storage) - private val clearStorage: View by viewProvider(R.id.clear_storage) - //endregion - - private var nextValueData: SampleData.NewData<*>? = null - - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : - super(context, attrs, defStyleAttr) { - inflate(context, R.layout.view_storage_validation, this) - context.withStyledAttributes(attrs, R.styleable.StorageValidationView, defStyleAttr, 0) { - title.text = getString(R.styleable.StorageValidationView_android_text) - } - } - - fun setData(data: SampleData, listener: () -> SampleData.NewData) { - if (nextValueData == null) { - nextValueData = data.asNewData() - } - nextValue.text = nextValueData.toString() - currentValue.text = data.toString() - getFromStorage.setOnClickListener { currentValue.text = data.toString() } - applyNextDataIntoStorage.setOnClickListener { - nextValueData?.let { data.applyNewData(it as SampleData.NewData) } - setData(data, listener) - } - generateNextData.setOnClickListener { - nextValueData = listener() - nextValue.text = nextValueData.toString() - } - clearStorage.setOnClickListener { - data.delete() - currentValue.text = data.toString() - } - } -} diff --git a/samples/playground-android/src/main/res/drawable/divider.xml b/samples/playground-android/src/main/res/drawable/divider.xml deleted file mode 100644 index 253d5feb..00000000 --- a/samples/playground-android/src/main/res/drawable/divider.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - diff --git a/samples/playground-android/src/main/res/drawable/ic_launcher_background.xml b/samples/playground-android/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc53..00000000 --- a/samples/playground-android/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/playground-android/src/main/res/drawable/ic_launcher_foreground.xml b/samples/playground-android/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21db..00000000 --- a/samples/playground-android/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/samples/playground-android/src/main/res/layout/activity_list.xml b/samples/playground-android/src/main/res/layout/activity_list.xml deleted file mode 100644 index 25675144..00000000 --- a/samples/playground-android/src/main/res/layout/activity_list.xml +++ /dev/null @@ -1,7 +0,0 @@ - - \ No newline at end of file diff --git a/samples/playground-android/src/main/res/layout/activity_main.xml b/samples/playground-android/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4455b66d..00000000 --- a/samples/playground-android/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -