From 0c5f41c8c7a665b5b6aec6dba2c7dd8843f6d5d6 Mon Sep 17 00:00:00 2001 From: Adrian Kuta Date: Fri, 3 Sep 2021 20:46:26 +0200 Subject: [PATCH] feat: Upgrade to build gradle 7.0.2 --- .github/workflows/build.yml | 24 ++++ .github/workflows/publish.yml | 38 ++++++ .github/workflows/test.yml | 23 ++++ .idea/codeStyles/Project.xml | 3 - .idea/compiler.xml | 6 + .idea/gradle.xml | 4 +- .idea/jarRepositories.xml | 30 +++++ .idea/misc.xml | 12 +- .idea/runConfigurations.xml | 12 -- app/build.gradle | 22 ++-- app/src/main/AndroidManifest.xml | 3 +- .../com/github/adriankuta/MainActivity.kt | 16 ++- app/src/main/res/layout/item_level_1.xml | 3 +- app/src/main/res/layout/item_level_2.xml | 4 +- app/src/main/res/layout/item_level_3.xml | 6 +- build.gradle | 17 ++- expandable-recyclerview/build.gradle | 26 ++-- .../src/main/res/values/strings.xml | 3 - gradle/wrapper/gradle-wrapper.properties | 2 +- scripts/publish-mavencentral.gradle | 122 ------------------ scripts/publish-module.gradle | 86 ++++++++++++ scripts/publish-root.gradle | 43 ++++++ 22 files changed, 320 insertions(+), 185 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/test.yml create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 expandable-recyclerview/src/main/res/values/strings.xml delete mode 100644 scripts/publish-mavencentral.gradle create mode 100644 scripts/publish-module.gradle create mode 100644 scripts/publish-root.gradle diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..660df3d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,24 @@ +name: Build + +on: pull_request + +jobs: + build: + name: Check project build + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + distribution: adopt + java-version: 11 + + # Builds the release artifacts of the library + - name: Build + run: ./gradlew assemble + + # Generates other artifacts (javadocJar is optional) + - name: Source jar and dokka + run: ./gradlew androidSourcesJar javadocJar diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..c8dcad0 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,38 @@ +name: Publish + +on: + release: + # We'll run this workflow when a new GitHub release is created + types: [released] + +jobs: + publish: + name: Release build and publish + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + distribution: adopt + java-version: 11 + + # Builds the release artifacts of the library + - name: Release build + run: ./gradlew :expandable-recyclerview:assembleRelease + + # Generates other artifacts (javadocJar is optional) + - name: Source jar and dokka + run: ./gradlew androidSourcesJar javadocJar + + # Runs upload, and then closes & releases the repository + - name: Publish to MavenCentral + run: ./gradlew publishReleasePublicationToSonatypeRepository --max-workers 1 closeAndReleaseSonatypeStagingRepository + env: + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..48d4f91 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Test + +on: + pull_request: + branches: + - master + +jobs: + build: + name: Run unit tests + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + distribution: adopt + java-version: 11 + + # Builds the release artifacts of the library + - name: Test + run: ./gradlew test diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 5c82789..43fd926 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,8 +1,5 @@ - - diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 11a9487..c443b1e 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,10 +1,13 @@ + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..e34606c --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a7509..5f0cf35 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,16 @@ - + + + + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 438b50c..e6b5927 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 31 + buildToolsVersion "31.0.0" defaultConfig { applicationId "com.github.adriankuta" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -20,6 +19,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + buildFeatures { + viewBinding true + } dataBinding { enabled = true } @@ -28,11 +30,11 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'com.github.adriankuta:expandable-recyclerView:1.0.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b21bfe..332a9ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/github/adriankuta/MainActivity.kt b/app/src/main/java/com/github/adriankuta/MainActivity.kt index da606f4..824f7f8 100644 --- a/app/src/main/java/com/github/adriankuta/MainActivity.kt +++ b/app/src/main/java/com/github/adriankuta/MainActivity.kt @@ -4,15 +4,17 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.github.adriankuta.databinding.ActivityMainBinding import com.github.adriankuta.expandable_recyclerview.expandableTree -import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - + binding = ActivityMainBinding.inflate(layoutInflater) val tree = expandableTree("World") { child("North America") { @@ -29,10 +31,12 @@ class MainActivity : AppCompatActivity() { } } - val adapter = ExpandableAdapter() - recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) - recyclerView.adapter = adapter + with(binding) { + val adapter = ExpandableAdapter() + recyclerView.layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false) + recyclerView.adapter = adapter - adapter.setTree(tree) + adapter.setTree(tree) + } } } diff --git a/app/src/main/res/layout/item_level_1.xml b/app/src/main/res/layout/item_level_1.xml index 0941bfa..d87431d 100644 --- a/app/src/main/res/layout/item_level_1.xml +++ b/app/src/main/res/layout/item_level_1.xml @@ -14,7 +14,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + tools:viewBindingIgnore="true"> + @@ -13,7 +14,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + tools:viewBindingIgnore="true"> + @@ -13,7 +14,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + tools:viewBindingIgnore="true"> \ No newline at end of file diff --git a/build.gradle b/build.gradle index a04b145..7f01fbf 100644 --- a/build.gradle +++ b/build.gradle @@ -1,26 +1,29 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.5.30' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:7.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } +plugins { + id("io.github.gradle-nexus.publish-plugin") version "1.1.0" + id("org.jetbrains.dokka") version "1.5.0" +} + allprojects { repositories { google() - jcenter() - + mavenCentral() } } @@ -28,4 +31,4 @@ task clean(type: Delete) { delete rootProject.buildDir } -apply plugin: 'io.codearte.nexus-staging' +apply from: "${rootDir}/scripts/publish-root.gradle" diff --git a/expandable-recyclerview/build.gradle b/expandable-recyclerview/build.gradle index 5cb348b..5baf3f2 100644 --- a/expandable-recyclerview/build.gradle +++ b/expandable-recyclerview/build.gradle @@ -1,21 +1,19 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' afterEvaluate { generateReleaseBuildConfig.enabled = false } android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 31 + buildToolsVersion "31.0.0" defaultConfig { minSdkVersion 23 - targetSdkVersion 29 - versionCode 1 - versionName "1.0.0" + targetSdkVersion 31 + versionName "2.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -32,14 +30,14 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.1.0' - implementation "androidx.recyclerview:recyclerview:1.1.0" - implementation "com.github.adriankuta:tree-structure:1.2.3" + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.core:core-ktx:1.6.0' + implementation "androidx.recyclerview:recyclerview:1.2.1" + implementation "com.github.adriankuta:tree-structure:2.0.3" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' } ext { @@ -48,4 +46,4 @@ ext { PUBLISH_VERSION = android.defaultConfig.versionName } -apply from: "${rootProject.projectDir}/scripts/publish-mavencentral.gradle" +apply from: "${rootProject.projectDir}/scripts/publish-module.gradle" diff --git a/expandable-recyclerview/src/main/res/values/strings.xml b/expandable-recyclerview/src/main/res/values/strings.xml deleted file mode 100644 index ab1f7fe..0000000 --- a/expandable-recyclerview/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Expandable RecyclerView - diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9347ece..3f5d1b2 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-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/scripts/publish-mavencentral.gradle b/scripts/publish-mavencentral.gradle deleted file mode 100644 index 2bcb75a..0000000 --- a/scripts/publish-mavencentral.gradle +++ /dev/null @@ -1,122 +0,0 @@ -task androidSourcesJar(type: Jar) { - archiveClassifier.set("sources") - from android.sourceSets.main.java.source -} - -artifacts { - archives androidSourcesJar -} - -apply plugin: 'maven-publish' -apply plugin: 'signing' - -group = PUBLISH_GROUP_ID -version = PUBLISH_VERSION - -ext["signing.keyId"] = '' -ext["signing.password"] = '' -ext["signing.secretKeyRingFile"] = '' -ext["ossrhUsername"] = '' -ext["ossrhPassword"] = '' - -File secretPropsFile = project.rootProject.file('local.properties') -if (secretPropsFile.exists()) { - println "Found secret props file, loading props" - Properties p = new Properties() - p.load(new FileInputStream(secretPropsFile)) - p.each { name, value -> - ext[name] = value - } -} else { - println "No props file, loading env vars" - ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID') - ext["signing.password"] = System.getenv('SIGNING_PASSWORD') - ext["signing.secretKeyRingFile"] = System.getenv('SIGNING_SECRET_KEY_RING_FILE') - ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME') - ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD') -} - -nexusStaging { - packageGroup = PUBLISH_GROUP_ID - stagingProfileId = '2097bad464f778' - username = ossrhUsername - password = ossrhPassword -} - -publishing { - publications { - release(MavenPublication) { - // The coordinates of the library, being set from variables that - // we'll set up in a moment - groupId PUBLISH_GROUP_ID - artifactId PUBLISH_ARTIFACT_ID - version PUBLISH_VERSION - - // Two artifacts, the `aar` and the sources - artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") - artifact androidSourcesJar - - // Self-explanatory metadata for the most part - pom { - name = PUBLISH_ARTIFACT_ID - description = 'Multilevel expandable recyclerView.' - // If your project has a dedicated site, use its URL here - url = 'https://github.com/AdrianKuta/Expandable-RecyclerView' - licenses { - license { - name = 'Apache License 2.0' - url = 'https://github.com/AdrianKuta/Expandable-RecyclerView/blob/master/LICENSE' - } - } - developers { - developer { - name = 'Adrian Kuta' - email = 'adrian.kuta93@gmail.com' - } - } - // Version control info, if you're using GitHub, follow the format as seen here - scm { - connection = 'scm:git:github.com/AdrianKuta/Expandable-RecyclerView.git' - developerConnection = 'scm:git:ssh://github.com/AdrianKuta/Expandable-RecyclerView.git' - url = 'https://github.com/AdrianKuta/Expandable-RecyclerView/tree/master' - } - // A slightly hacky fix so that your POM will include any transitive dependencies - // that your library builds upon - withXml { - def dependenciesNode = asNode().appendNode('dependencies') - - project.configurations.implementation.allDependencies.each { - def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.group) - dependencyNode.appendNode('artifactId', it.name) - dependencyNode.appendNode('version', it.version) - } - } - } - } - } - repositories { - // The repository to publish to, Sonatype/MavenCentral - maven { - // This is an arbitrary name, you may also use "mavencentral" or - // any other name that's descriptive for you - name = "sonatype" - - def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" - // You only need this if you want to publish snapshots, otherwise just set the URL - // to the release repo directly - url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl - - // The username and password we've fetched earlier - credentials { - username ossrhUsername - password ossrhPassword - } - } - } -} - -signing { - sign publishing.publications -} \ No newline at end of file diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle new file mode 100644 index 0000000..4428f78 --- /dev/null +++ b/scripts/publish-module.gradle @@ -0,0 +1,86 @@ +apply plugin: 'maven-publish' +apply plugin: 'signing' +apply plugin: 'org.jetbrains.dokka' + +task androidSourcesJar(type: Jar) { + archiveClassifier.set('sources') + if (project.plugins.findPlugin("com.android.library")) { + from android.sourceSets.main.java.srcDirs + from android.sourceSets.main.kotlin.srcDirs + } else { + from sourceSets.main.java.srcDirs + from sourceSets.main.kotlin.srcDirs + } +} + +tasks.withType(dokkaHtmlPartial.getClass()).configureEach { + pluginsMapConfiguration.set( + ["org.jetbrains.dokka.base.DokkaBase": """{ "separateInheritedMembers": true}"""] + ) +} + +task javadocJar(type: Jar, dependsOn: dokkaJavadoc) { + archiveClassifier.set('javadoc') + from dokkaJavadoc.outputDirectory +} + +artifacts { + archives androidSourcesJar + archives javadocJar +} + +group = PUBLISH_GROUP_ID +version = PUBLISH_VERSION + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + groupId PUBLISH_GROUP_ID + artifactId PUBLISH_ARTIFACT_ID + version PUBLISH_VERSION + if (project.plugins.findPlugin("com.android.library")) { + from components.release + } else { + from components.java + } + + artifact androidSourcesJar + artifact javadocJar + + pom { + name = PUBLISH_ARTIFACT_ID + description = 'Simple implementation to store object in tree structure.' + url = 'https://github.com/AdrianKuta/Tree-Data-Structure' + licenses { + license { + name = 'MIT License' + url = 'https://www.mit.edu/~amini/LICENSE.md' + } + } + developers { + developer { + name = 'Adrian Kuta' + email = 'adrian.kuta93@gmail.com' + } + } + // Version control info, if you're using GitHub, follow the format as seen here + scm { + connection = 'scm:git:github.com/AdrianKuta/Tree-Data-Structure.git' + developerConnection = 'scm:git:ssh://github.com/AdrianKuta/Tree-Data-Structure.git' + url = 'https://github.com/AdrianKuta/Tree-Data-Structure/tree/master' + } + } + } + } + } +} + +signing { + useInMemoryPgpKeys( + rootProject.ext["signing.keyId"], + rootProject.ext["signing.key"], + rootProject.ext["signing.password"], + ) + sign publishing.publications +} \ No newline at end of file diff --git a/scripts/publish-root.gradle b/scripts/publish-root.gradle new file mode 100644 index 0000000..4695fee --- /dev/null +++ b/scripts/publish-root.gradle @@ -0,0 +1,43 @@ +// Create variables with empty default values +ext["ossrhUsername"] = '' +ext["ossrhPassword"] = '' +ext["sonatypeStagingProfileId"] = '' +ext["signing.keyId"] = '' +ext["signing.password"] = '' +ext["signing.key"] = '' +ext["snapshot"] = '' + +File secretPropsFile = project.rootProject.file('local.properties') +if (secretPropsFile.exists()) { + // Read local.properties file first if it exists + Properties p = new Properties() + new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) } + p.each { name, value -> ext[name] = value } +} else { + // Use system environment variables + ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME') + ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD') + ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID') + ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID') + ext["signing.password"] = System.getenv('SIGNING_PASSWORD') + ext["signing.key"] = System.getenv('SIGNING_KEY') + ext["snapshot"] = System.getenv('SNAPSHOT') +} + +//if (snapshot) { +// ext["rootVersionName"] = Configuration.snapshotVersionName +//} else { +// ext["rootVersionName"] = Configuration.versionName +//} + +// Set up Sonatype repository +nexusPublishing { + repositories { + sonatype { + stagingProfileId = sonatypeStagingProfileId + username = ossrhUsername + password = ossrhPassword + //version = rootVersionName + } + } +} \ No newline at end of file