diff --git a/.github/workflows/compilation-check.yml b/.github/workflows/compilation-check.yml index b067a6e..4e582b6 100644 --- a/.github/workflows/compilation-check.yml +++ b/.github/workflows/compilation-check.yml @@ -14,15 +14,15 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v1 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 11 - name: Check build run: ./gradlew build publishToMavenLocal - name: Install pods run: cd sample/ios-app && pod install if: matrix.os == 'macOS-latest' - name: Check iOS - run: cd sample/ios-app && xcodebuild -scheme TestProj -workspace TestProj.xcworkspace -configuration Debug build CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO + run: cd sample/ios-app && set -o pipefail && xcodebuild -scheme TestProj -workspace TestProj.xcworkspace -configuration Debug -sdk iphonesimulator -arch x86_64 build CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO | xcpretty if: matrix.os == 'macOS-latest' \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9ed0c10..37d1d14 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,10 +22,10 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v1 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 11 - name: Publish run: ./gradlew publish -DIS_MAIN_HOST=${{ matrix.os == 'ubuntu-latest' }} release: @@ -41,6 +41,6 @@ jobs: with: commitish: ${{ github.ref }} tag_name: release/${{ github.event.inputs.version }} - release_name: Release ${{ github.event.inputs.version }} + release_name: ${{ github.event.inputs.version }} body: "Will be filled later" draft: true \ No newline at end of file diff --git a/README.md b/README.md index 72af13d..9cfb1ef 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ![moko-graphics](img/logo.png) -[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/graphics) ](https://repo1.maven.org/maven2/dev/icerock/moko/graphics/) ![kotlin-version](https://img.shields.io/badge/kotlin-1.5.10-orange) +[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/graphics) ](https://repo1.maven.org/maven2/dev/icerock/moko/graphics) ![kotlin-version](https://kotlin-version.aws.icerock.dev/kotlin-version?group=dev.icerock.moko&name=graphics) # Mobile Kotlin graphics This is a Kotlin Multiplatform library that provides graphics primitives to common code. @@ -7,7 +7,6 @@ This is a Kotlin Multiplatform library that provides graphics primitives to comm ## Table of Contents - [Features](#features) - [Requirements](#requirements) -- [Versions](#versions) - [Installation](#installation) - [Usage](#usage) - [Samples](#samples) @@ -20,9 +19,9 @@ This is a Kotlin Multiplatform library that provides graphics primitives to comm - All Kotlin Multiplatform targets support. ## Requirements -- Gradle version 6.0+ +- Gradle version 6.8+ - Android API 16+ -- iOS version 9.0+ +- iOS version 11.0+ ## Installation root build.gradle @@ -37,7 +36,7 @@ allprojects { project build.gradle ```groovy dependencies { - commonMainApi("dev.icerock.moko:graphics:0.7.0") + commonMainApi("dev.icerock.moko:graphics:0.8.0") } ``` diff --git a/build.gradle.kts b/build.gradle.kts index f48b054..d16dfa9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,28 +5,16 @@ buildscript { repositories { mavenCentral() google() + gradlePluginPortal() } dependencies { - classpath("dev.icerock:mobile-multiplatform:0.9.2") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10") - classpath("com.android.tools.build:gradle:4.2.1") + classpath(":graphics-build-logic") } } allprojects { - repositories { - mavenCentral() - google() - } - - plugins.withId("com.android.library") { - configure { - compileSdkVersion(libs.versions.compileSdk.get().toInt()) - - defaultConfig { - minSdkVersion(libs.versions.minSdk.get().toInt()) - targetSdkVersion(libs.versions.targetSdk.get().toInt()) - } - } + plugins.withId("org.gradle.maven-publish") { + group = "dev.icerock.moko" + version = libs.versions.mokoGraphicsVersion.get() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1e5f38a..4290d93 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,7 @@ [versions] androidAppCompatVersion = "1.2.0" androidAnnotationVersion = "1.1.0" -mokoGraphicsVersion = "0.7.0" -compileSdk = "28" -targetSdk = "28" -minSdk = "16" +mokoGraphicsVersion = "0.8.0" [libraries] appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } diff --git a/graphics-build-logic/build.gradle.kts b/graphics-build-logic/build.gradle.kts new file mode 100644 index 0000000..84cbae3 --- /dev/null +++ b/graphics-build-logic/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + google() + + gradlePluginPortal() +} + +dependencies { + api("dev.icerock:mobile-multiplatform:0.12.0") + api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20") + api("com.android.tools.build:gradle:4.2.1") + api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0") +} diff --git a/graphics-build-logic/src/main/kotlin/android-app-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/android-app-convention.gradle.kts new file mode 100644 index 0000000..2859874 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/android-app-convention.gradle.kts @@ -0,0 +1,32 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.application") + id("android-base-convention") + id("kotlin-android") +} + +android { + dexOptions { + javaMaxHeapSize = "2g" + } + + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + getByName("debug") { + isDebuggable = true + applicationIdSuffix = ".debug" + } + } + + packagingOptions { + exclude("META-INF/*.kotlin_module") + exclude("META-INF/AL2.0") + exclude("META-INF/LGPL2.1") + } +} diff --git a/graphics-build-logic/src/main/kotlin/android-base-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/android-base-convention.gradle.kts new file mode 100644 index 0000000..7f67285 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/android-base-convention.gradle.kts @@ -0,0 +1,14 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import com.android.build.gradle.BaseExtension + +configure { + compileSdkVersion(30) + + defaultConfig { + minSdkVersion(16) + targetSdkVersion(30) + } +} diff --git a/graphics-build-logic/src/main/kotlin/android-library-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/android-library-convention.gradle.kts new file mode 100644 index 0000000..c435401 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/android-library-convention.gradle.kts @@ -0,0 +1,13 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("kotlin-android") + id("android-base-convention") +} + +android { + sourceSets.all { java.srcDir("src/$name/kotlin") } +} diff --git a/graphics-build-logic/src/main/kotlin/android-publication-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/android-publication-convention.gradle.kts new file mode 100644 index 0000000..b4dae9e --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/android-publication-convention.gradle.kts @@ -0,0 +1,15 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("publication-convention") +} + +afterEvaluate { + publishing.publications { + create("release", MavenPublication::class.java) { + from(components.getByName("release")) + } + } +} diff --git a/graphics-build-logic/src/main/kotlin/detekt-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/detekt-convention.gradle.kts new file mode 100644 index 0000000..68343a8 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/detekt-convention.gradle.kts @@ -0,0 +1,15 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +detekt { + input.setFrom("src/commonMain/kotlin", "src/androidMain/kotlin", "src/iosMain/kotlin", "src/main/kotlin") +} + +dependencies { + "detektPlugins"("io.gitlab.arturbosch.detekt:detekt-formatting:1.15.0") +} diff --git a/graphics-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts new file mode 100644 index 0000000..a1a2691 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts @@ -0,0 +1,16 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("org.gradle.maven-publish") +} + +val javadocJar by tasks.registering(Jar::class) { + archiveClassifier.set("javadoc") +} + +publishing.publications.withType { + // Stub javadoc.jar artifact + artifact(javadocJar.get()) +} diff --git a/graphics-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts new file mode 100644 index 0000000..161a7e7 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts @@ -0,0 +1,41 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.multiplatform") + id("android-base-convention") + id("dev.icerock.mobile.multiplatform.android-manifest") +} + +kotlin { + ios() + android { + publishLibraryVariants("release", "debug") + } + macosX64() + tvos() + watchos() + jvm() + js(BOTH) { + nodejs() + browser() + } + linux() + windows() + wasm32() +} + +fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.linux() { + linuxArm64() + linuxArm32Hfp() + linuxMips32() + linuxMipsel32() + linuxX64() +} + +fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.windows() { + mingwX64() + mingwX86() +} diff --git a/graphics-build-logic/src/main/kotlin/publication-convention.gradle.kts b/graphics-build-logic/src/main/kotlin/publication-convention.gradle.kts new file mode 100644 index 0000000..57d7525 --- /dev/null +++ b/graphics-build-logic/src/main/kotlin/publication-convention.gradle.kts @@ -0,0 +1,70 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import java.util.Base64 + +plugins { + id("javadoc-stub-convention") + id("org.gradle.maven-publish") + id("signing") +} + +publishing { + repositories.maven("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") { + name = "OSSRH" + + credentials { + username = System.getenv("OSSRH_USER") + password = System.getenv("OSSRH_KEY") + } + } + + publications.withType { + // Provide artifacts information requited by Maven Central + pom { + name.set("MOKO graphics") + description.set("Graphics primitives for mobile (android & ios) Kotlin Multiplatform development") + url.set("https://github.com/icerockdev/moko-graphics") + licenses { + license { + name.set("Apache-2.0") + distribution.set("repo") + url.set("https://github.com/icerockdev/moko-graphics/blob/master/LICENSE.md") + } + } + + developers { + developer { + id.set("Alex009") + name.set("Aleksey Mikhailov") + email.set("aleksey.mikhailov@icerockdev.com") + } + developer { + id.set("nrobi144") + name.set("Nagy Robert") + email.set("nagyrobi144@gmail.com") + } + } + + scm { + connection.set("scm:git:ssh://github.com/icerockdev/moko-graphics.git") + developerConnection.set("scm:git:ssh://github.com/icerockdev/moko-graphics.git") + url.set("https://github.com/icerockdev/moko-graphics") + } + } + } +} + + +signing { + val signingKeyId: String? = System.getenv("SIGNING_KEY_ID") + val signingPassword: String? = System.getenv("SIGNING_PASSWORD") + val signingKey: String? = System.getenv("SIGNING_KEY")?.let { base64Key -> + String(Base64.getDecoder().decode(base64Key)) + } + if (signingKeyId != null) { + useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) + sign(publishing.publications) + } +} diff --git a/graphics/build.gradle.kts b/graphics/build.gradle.kts index 547588f..71b0c12 100644 --- a/graphics/build.gradle.kts +++ b/graphics/build.gradle.kts @@ -6,11 +6,9 @@ import java.util.Base64 import kotlin.text.String plugins { - id("com.android.library") - id("org.jetbrains.kotlin.multiplatform") - id("dev.icerock.mobile.multiplatform") - id("maven-publish") - id("signing") + id("multiplatform-library-convention") + id("dev.icerock.mobile.multiplatform.android-manifest") + id("publication-convention") } group = "dev.icerock.moko" @@ -19,115 +17,3 @@ version = libs.versions.mokoGraphicsVersion.get() dependencies { "androidMainImplementation"(libs.annotation) } - -kotlin { - macosX64() - tvos() - watchos() - jvm() - js(BOTH) { - nodejs() - browser() - } - linux() - windows() - wasm32() -} - -fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.linux() { - linuxArm64() - linuxArm32Hfp() - linuxMips32() - linuxMipsel32() - linuxX64() -} - -fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.windows() { - mingwX64() - mingwX86() -} - -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") -} - -publishing { - repositories.maven("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") { - name = "OSSRH" - - credentials { - username = System.getenv("OSSRH_USER") - password = System.getenv("OSSRH_KEY") - } - } - - // Make sure to avoid duplicate publications - val publicationsFromMainHost = listOf( - "wasm32", - "jvm", - "js", - "kotlinMultiplatform", - "androidRelease", - "androidDebug", - "linuxArm64", - "linuxArm32Hfp", - "linuxX64" - ) - - publications - .matching { it.name in publicationsFromMainHost } - .all { - val targetPublication = this@all - tasks.withType() - .matching { it.publication == targetPublication } - .all { onlyIf { System.getProperty("IS_MAIN_HOST") == "true" } } - } - - publications.withType { - // Stub javadoc.jar artifact - artifact(javadocJar.get()) - - // Provide artifacts information requited by Maven Central - pom { - name.set("MOKO graphics") - description.set("Graphics primitives for mobile (android & ios) Kotlin Multiplatform development") - url.set("https://github.com/icerockdev/moko-graphics") - licenses { - license { - url.set("https://github.com/icerockdev/moko-graphics/blob/master/LICENSE.md") - } - } - - developers { - developer { - id.set("Alex009") - name.set("Aleksey Mikhailov") - email.set("aleksey.mikhailov@icerockdev.com") - } - developer { - id.set("nrobi144") - name.set("Nagy Robert") - email.set("nagyrobi144@gmail.com") - } - } - - scm { - connection.set("scm:git:ssh://github.com/icerockdev/moko-graphics.git") - developerConnection.set("scm:git:ssh://github.com/icerockdev/moko-graphics.git") - url.set("https://github.com/icerockdev/moko-graphics") - } - } - } - - signing { - val signingKeyId: String? = System.getenv("SIGNING_KEY_ID") - val signingPassword: String? = System.getenv("SIGNING_PASSWORD") - val signingKey: String? = System.getenv("SIGNING_KEY")?.let { base64Key -> - String(Base64.getDecoder().decode(base64Key)) - } - if (signingKeyId != null) { - useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) - sign(publishing.publications) - } - } -} diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index bfbc268..5e4be9a 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -3,42 +3,16 @@ */ plugins { - id("com.android.application") + id("android-app-convention") id("kotlin-android") } android { - compileSdkVersion(libs.versions.compileSdk.get().toInt()) - - dexOptions { - javaMaxHeapSize = "2g" - } - defaultConfig { - minSdkVersion(libs.versions.minSdk.get().toInt()) - targetSdkVersion(libs.versions.targetSdk.get().toInt()) - applicationId = "dev.icerock.moko.samples.graphics" versionCode = 1 versionName = "0.1.0" - - vectorDrawables.useSupportLibrary = true - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } - getByName("debug") { - isDebuggable = true - applicationIdSuffix = ".debug" - } - } - - packagingOptions { - exclude("META-INF/*.kotlin_module") } } diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 744ad8b..a82de92 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -4,12 +4,16 @@ plugins { id("com.android.library") + id("android-base-convention") + id("detekt-convention") id("org.jetbrains.kotlin.multiplatform") - id("dev.icerock.mobile.multiplatform") - id("dev.icerock.mobile.multiplatform.apple-framework") + id("dev.icerock.mobile.multiplatform.android-manifest") + id("dev.icerock.mobile.multiplatform.ios-framework") } kotlin { + android() + ios() macosX64() targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java).all { binaries.withType(org.jetbrains.kotlin.gradle.plugin.mpp.Framework::class.java).all { diff --git a/settings.gradle.kts b/settings.gradle.kts index aa356e1..6b64ae4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,6 +5,21 @@ enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +dependencyResolutionManagement { + repositories { + mavenCentral() + google() + + jcenter { + content { + includeGroup("org.jetbrains.kotlinx") + } + } + } +} + +includeBuild("graphics-build-logic") + include(":graphics") include(":sample:android-app") include(":sample:mpp-library")