From bc6d2ed90eaf089eb89cdeb3ce4fdd2e5a18c40f Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 15:56:41 -0400 Subject: [PATCH 01/14] chore: update error codes --- .../libs/ioncameralib/model/IONCAMRError.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/io/ionic/libs/ioncameralib/model/IONCAMRError.kt b/src/main/kotlin/io/ionic/libs/ioncameralib/model/IONCAMRError.kt index c861097..9928996 100644 --- a/src/main/kotlin/io/ionic/libs/ioncameralib/model/IONCAMRError.kt +++ b/src/main/kotlin/io/ionic/libs/ioncameralib/model/IONCAMRError.kt @@ -11,15 +11,15 @@ enum class IONCAMRError(val code: Int, val description: String) { EDIT_CANCELLED_ERROR(13, "Couldn't edit photo because the process was canceled."), CAPTURE_VIDEO_ERROR(16, "Couldn't record video."), CAPTURE_VIDEO_CANCELLED_ERROR(17, "Couldn't record video because the process was canceled."), - GENERIC_CHOOSE_MULTIMEDIA_ERROR(19, "Couldn't choose media from the gallery."), - CHOOSE_MULTIMEDIA_CANCELLED_ERROR(21, "Couldn't choose media from the gallery because the process was canceled."), - MEDIA_PATH_ERROR(22, "Couldn't get media file path."), - PLAY_VIDEO_GENERAL_ERROR(24, "Couldn't play video."), - EDIT_PICTURE_EMPTY_URI_ERROR(25, "URI parameter cannot be empty."), - FILE_DOES_NOT_EXIST_ERROR(28, "The selected file doesn't exist."), - FETCH_IMAGE_FROM_URI_ERROR(29, "Couldn't retrieve image from the URI."), - INVALID_ARGUMENT_ERROR(32, "Invalid argument provided to plugin method."), + GENERIC_CHOOSE_MULTIMEDIA_ERROR(18, "Couldn't choose media from the gallery."), + CHOOSE_MULTIMEDIA_CANCELLED_ERROR(20, "Couldn't choose media from the gallery because the process was canceled."), + MEDIA_PATH_ERROR(21, "Couldn't get media file path."), + PLAY_VIDEO_GENERAL_ERROR(23, "Couldn't play video."), + EDIT_PICTURE_EMPTY_URI_ERROR(24, "URI parameter cannot be empty."), + FILE_DOES_NOT_EXIST_ERROR(27, "The selected file doesn't exist."), + FETCH_IMAGE_FROM_URI_ERROR(28, "Couldn't retrieve image from the URI."), + INVALID_ARGUMENT_ERROR(31, "Invalid argument provided to plugin method."), // Overall Android specific - CONTEXT_ERROR(34, "Unable to get the context.") + CONTEXT_ERROR(33, "Unable to get the context.") } \ No newline at end of file From 7baea3a2285a83a2e656f30ca8d9e42d8cb2ce0b Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 16:45:07 -0400 Subject: [PATCH 02/14] chore: update unit tests pipeline file name --- .github/workflows/{github_actions.yml => unit_tests.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{github_actions.yml => unit_tests.yml} (100%) diff --git a/.github/workflows/github_actions.yml b/.github/workflows/unit_tests.yml similarity index 100% rename from .github/workflows/github_actions.yml rename to .github/workflows/unit_tests.yml From 18720e21ee5ff34d17ead8cdbfa71d30f1665b9b Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 16:46:25 -0400 Subject: [PATCH 03/14] feat: add workflow to publish library in Maven repository --- .github/workflows/publish-android.yml | 35 +++++++++++++ pom.xml | 10 ++++ scripts/publish-android.sh | 38 ++++++++++++++ scripts/publish-module.gradle | 74 +++++++++++++++++++++++++++ scripts/publish-root.gradle | 37 ++++++++++++++ 5 files changed, 194 insertions(+) create mode 100644 .github/workflows/publish-android.yml create mode 100644 pom.xml create mode 100755 scripts/publish-android.sh create mode 100644 scripts/publish-module.gradle create mode 100644 scripts/publish-root.gradle diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml new file mode 100644 index 0000000..708fa17 --- /dev/null +++ b/.github/workflows/publish-android.yml @@ -0,0 +1,35 @@ +name: Publish Native Android Library + +on: workflow_dispatch + +jobs: + publish-android: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'adopt' + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + - name: Grant execute permission for publishing script + run: chmod +x ./scripts/publish-android.sh + - name: Make local props + run: | + cat << EOF > "local.properties" + centralTokenUsername=${{ secrets.ANDROID_CENTRAL_USERNAME }} + centralTokenPassword=${{ secrets.ANDROID_CENTRAL_PASSWORD }} + sonatypeStagingProfileId=${{ secrets.ANDROID_SONATYPE_STAGING_PROFILE_ID }} + signing.keyId=${{ secrets.ANDROID_SIGNING_KEY_ID }} + signing.password=${{ secrets.ANDROID_SIGNING_PASSWORD }} + signing.key=${{ secrets.ANDROID_SIGNING_KEY }} + EOF + echo "local.properties file has been created successfully." + - name: Run publish script + working-directory: ./scripts + run: ./publish-android.sh \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a86319f --- /dev/null +++ b/pom.xml @@ -0,0 +1,10 @@ + + + + 4.0.0 + io.ionic.libs + ioncamera-android + 0.1.0 + \ No newline at end of file diff --git a/scripts/publish-android.sh b/scripts/publish-android.sh new file mode 100755 index 0000000..1e815f0 --- /dev/null +++ b/scripts/publish-android.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +ANDROID_PATH=../ +LOG_OUTPUT=./tmp/publish-android.txt +THE_VERSION=`sed -n 's/.*\(.*\)<\/version>.*/\1/p' ../pom.xml` + +# Get latest io.ionic:portals XML version info +PUBLISHED_URL="https://repo1.maven.org/maven2/io/ionic/libs/ioncamera-android/maven-metadata.xml" +PUBLISHED_DATA=$(curl -s $PUBLISHED_URL) +PUBLISHED_VERSION="$(perl -ne 'print and last if s/.*(.*)<\/latest>.*/\1/;' <<< $PUBLISHED_DATA)" + +if [[ "$THE_VERSION" == "$PUBLISHED_VERSION" ]]; then + printf %"s\n\n" "Duplicate: a published version exists for $THE_VERSION, skipping..." +else + # Make log dir if doesnt exist + mkdir -p ./tmp + + # Export ENV variable used by Gradle for Versioning + export THE_VERSION + export SHOULD_PUBLISH=true + + printf %"s\n" "Attempting to build and publish version $THE_VERSION" + # Publish a release to the Maven repo + # "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 + # Stage a version + "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 + + echo $RESULT + + if grep --quiet "BUILD SUCCESSFUL" $LOG_OUTPUT; then + printf %"s\n" "Success: Published to MavenCentral." + else + printf %"s\n" "Error publishing, check $LOG_OUTPUT for more info! Manually review and release from the Central Portal may be necessary https://central.sonatype.com/publishing/deployments/" + cat $LOG_OUTPUT + exit 1 + fi + +fi \ No newline at end of file diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle new file mode 100644 index 0000000..dec2036 --- /dev/null +++ b/scripts/publish-module.gradle @@ -0,0 +1,74 @@ +apply plugin: 'maven-publish' +apply plugin: 'signing' + +def LIB_VERSION = System.getenv('THE_VERSION') + +task androidSourcesJar(type: Jar) { + archiveClassifier.set('sources') + from android.sourceSets.main.java.srcDirs + from android.sourceSets.main.kotlin.srcDirs +} + +artifacts { + archives androidSourcesJar +} + +group = 'io.ionic.libs' +version = LIB_VERSION + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + // Coordinates + groupId 'io.ionic.libs' + artifactId 'ioncamera-android' + version LIB_VERSION + + // Two artifacts, the `aar` (or `jar`) and the sources + if (project.plugins.findPlugin("com.android.library")) { + from components.release + } else { + artifact("$buildDir/libs/${project.getName()}-${version}.jar") + } + + artifact androidSourcesJar + + // POM Data + pom { + name = 'ioncamera-android' + description = 'Camera Android Lib' + url = 'https://github.com/ionic-team/ion-android-camera' + licenses { + license { + name = 'License' + url = 'https://github.com/ionic-team/ion-android-camera/blob/main/docs/LICENSE' + } + } + developers { + developer { + name = 'Ionic' + email = 'hi@ionic.io' + } + } + + // Version Control Info + scm { + connection = 'scm:git:github.com:ionic-team/ion-android-camera.git' + developerConnection = 'scm:git:ssh://github.com:ionic-team/ion-android-camera.git' + url = 'https://github.com/ionic-team/ion-android-camera/tree/main' + } + } + } + } + } +} + +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..1270cd3 --- /dev/null +++ b/scripts/publish-root.gradle @@ -0,0 +1,37 @@ +// Create variables with empty default values +ext["signing.keyId"] = '' +ext["signing.key"] = '' +ext["signing.password"] = '' +ext["centralTokenUsername"] = '' +ext["centralTokenPassword"] = '' +ext["sonatypeStagingProfileId"] = '' + +File secretPropsFile = 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["centralTokenUsername"] = System.getenv('ANDROID_CENTRAL_USERNAME') + ext["centralTokenPassword"] = System.getenv('ANDROID_CENTRAL_PASSWORD') + ext["sonatypeStagingProfileId"] = System.getenv('ANDROID_SONATYPE_STAGING_PROFILE_ID') + ext["signing.keyId"] = System.getenv('ANDROID_SIGNING_KEY_ID') + ext["signing.key"] = System.getenv('ANDROID_SIGNING_KEY') + ext["signing.password"] = System.getenv('ANDROID_SIGNING_PASSWORD') +} + +// Set up Sonatype repository +nexusPublishing { + repositories { + sonatype { + stagingProfileId = sonatypeStagingProfileId + username = centralTokenUsername + password = centralTokenPassword + nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) + snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) + } + } + repositoryDescription = 'IONCamera Android Lib v' + System.getenv('THE_VERSION') +} \ No newline at end of file From d760c503875c61ec1f099a38898d9fb6c07a7bba Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 16:47:20 -0400 Subject: [PATCH 04/14] chore: update LICENSE --- docs/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/LICENSE b/docs/LICENSE index c2979b0..774efa0 100644 --- a/docs/LICENSE +++ b/docs/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 OutSystems +Copyright (c) 2025 Ionic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From dbb60d048df04ce6f8a436fba894d984f92e1386 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 16:52:58 -0400 Subject: [PATCH 05/14] chore: add condition to run workflow on push to current branch to test --- .github/workflows/publish-android.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml index 708fa17..7937c80 100644 --- a/.github/workflows/publish-android.yml +++ b/.github/workflows/publish-android.yml @@ -1,6 +1,10 @@ name: Publish Native Android Library -on: workflow_dispatch +#on: workflow_dispatch +on: + push: + branches: + - feat/RMET-5076/update-errors jobs: publish-android: From 30927be6672a2b6f2650f3c763048344a437b422 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:24:52 -0400 Subject: [PATCH 06/14] fix: fix branch name in pipeline condition --- .github/workflows/publish-android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml index 7937c80..da3a9d3 100644 --- a/.github/workflows/publish-android.yml +++ b/.github/workflows/publish-android.yml @@ -4,7 +4,7 @@ name: Publish Native Android Library on: push: branches: - - feat/RMET-5076/update-errors + - ci/add-release-pipeline jobs: publish-android: From 649028043266be1df62038700c11b79f8be78abc Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:25:47 -0400 Subject: [PATCH 07/14] chore: correct workflow name --- .github/workflows/unit_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index b445f27..dc5b779 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -1,4 +1,4 @@ -name: GitHub Actions +name: Run Unit Tests on: workflow_dispatch: From a752e2871b4ba4a2fdc7ca71e7c9e330dc1b7ff2 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:30:07 -0400 Subject: [PATCH 08/14] fix: add publish script to Gradle --- build.gradle | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/build.gradle b/build.gradle index 9eeb234..7d0fba4 100644 --- a/build.gradle +++ b/build.gradle @@ -6,12 +6,20 @@ buildscript { mavenCentral() } dependencies { + if (System.getenv("SHOULD_PUBLISH") == "true") { + classpath("io.github.gradle-nexus:publish-plugin:1.1.0") + } classpath 'com.android.tools.build:gradle:8.7.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jacoco:org.jacoco.core:$jacocoVersion" } } +if (System.getenv("SHOULD_PUBLISH") == "true") { + apply plugin: "io.github.gradle-nexus.publish-plugin" + apply from: file("./scripts/publish-root.gradle") +} + apply plugin: "com.android.library" apply plugin: "kotlin-android" apply plugin: "jacoco" @@ -96,3 +104,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3" } + +if (System.getenv("SHOULD_PUBLISH") == "true") { + apply from: file("./scripts/publish-module.gradle") +} From 5281a9aafb5cc8da86318cf8c01d383c0b1056cb Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:32:56 -0400 Subject: [PATCH 09/14] fix: add missing Gradle repo --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 7d0fba4..cd44c1f 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,9 @@ buildscript { repositories { google() mavenCentral() + maven { + url = uri("https://plugins.gradle.org/m2/") + } } dependencies { if (System.getenv("SHOULD_PUBLISH") == "true") { From 99d0c69612d64306e6845d78f5db4de705d922c8 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:39:40 -0400 Subject: [PATCH 10/14] fix: add explicit dependsOn for dependency Context: This adds an explicit dependsOn on androidSourcesJar from generateMetadataFileForReleasePublication, which tells Gradle to always run androidSourcesJar first. It's placed inside afterEvaluate so the task is guaranteed to exist when the dependency is declared. --- scripts/publish-module.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle index dec2036..ef07b44 100644 --- a/scripts/publish-module.gradle +++ b/scripts/publish-module.gradle @@ -62,6 +62,10 @@ afterEvaluate { } } } + + tasks.named("generateMetadataFileForReleasePublication") { + dependsOn androidSourcesJar + } } signing { From a71955c8c31c2ba52c2d6b90606fda34bcb7020b Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:46:13 -0400 Subject: [PATCH 11/14] fix: remove duplication in publish-module.gradle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context: Removed the artifacts { archives androidSourcesJar } block. The sources jar is still explicitly included in the publication via artifact androidSourcesJar, so nothing is lost — it just won't be registered twice, which was causing the duplicate artifact conflict during signing. --- scripts/publish-module.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle index ef07b44..33f0dd4 100644 --- a/scripts/publish-module.gradle +++ b/scripts/publish-module.gradle @@ -9,9 +9,6 @@ task androidSourcesJar(type: Jar) { from android.sourceSets.main.kotlin.srcDirs } -artifacts { - archives androidSourcesJar -} group = 'io.ionic.libs' version = LIB_VERSION From 64f09ed8fce1ded6675387267e540220f230fff4 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 17:51:20 -0400 Subject: [PATCH 12/14] fix: properly configure signing --- scripts/publish-module.gradle | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle index 33f0dd4..b440f94 100644 --- a/scripts/publish-module.gradle +++ b/scripts/publish-module.gradle @@ -63,13 +63,13 @@ afterEvaluate { tasks.named("generateMetadataFileForReleasePublication") { dependsOn androidSourcesJar } -} -signing { - useInMemoryPgpKeys( - rootProject.ext["signing.keyId"], - rootProject.ext["signing.key"], - rootProject.ext["signing.password"], - ) - sign publishing.publications + signing { + useInMemoryPgpKeys( + rootProject.ext["signing.keyId"], + rootProject.ext["signing.key"], + rootProject.ext["signing.password"], + ) + sign publishing.publications + } } \ No newline at end of file From 1ed9eafcff312da85197229dfdd5a2f57ecef47d Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 18:17:22 -0400 Subject: [PATCH 13/14] fix: fixing release workflow --- build.gradle | 6 ++++++ scripts/publish-module.gradle | 13 ------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index cd44c1f..4b75f43 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,12 @@ android { testOptions { unitTests.returnDefaultValues = true } + + publishing { + singleVariant("release") { + withSourcesJar() + } + } } repositories { diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle index b440f94..2c08b84 100644 --- a/scripts/publish-module.gradle +++ b/scripts/publish-module.gradle @@ -3,13 +3,6 @@ apply plugin: 'signing' def LIB_VERSION = System.getenv('THE_VERSION') -task androidSourcesJar(type: Jar) { - archiveClassifier.set('sources') - from android.sourceSets.main.java.srcDirs - from android.sourceSets.main.kotlin.srcDirs -} - - group = 'io.ionic.libs' version = LIB_VERSION @@ -29,8 +22,6 @@ afterEvaluate { artifact("$buildDir/libs/${project.getName()}-${version}.jar") } - artifact androidSourcesJar - // POM Data pom { name = 'ioncamera-android' @@ -60,10 +51,6 @@ afterEvaluate { } } - tasks.named("generateMetadataFileForReleasePublication") { - dependsOn androidSourcesJar - } - signing { useInMemoryPgpKeys( rootProject.ext["signing.keyId"], From 3c1386ec10a1bb79349b959f2b2bcdbf65fe4bb0 Mon Sep 17 00:00:00 2001 From: Alexandre Jacinto Date: Fri, 27 Mar 2026 18:26:41 -0400 Subject: [PATCH 14/14] chore: configure workflow to run on manual trigger --- .github/workflows/publish-android.yml | 6 +----- scripts/publish-android.sh | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml index da3a9d3..708fa17 100644 --- a/.github/workflows/publish-android.yml +++ b/.github/workflows/publish-android.yml @@ -1,10 +1,6 @@ name: Publish Native Android Library -#on: workflow_dispatch -on: - push: - branches: - - ci/add-release-pipeline +on: workflow_dispatch jobs: publish-android: diff --git a/scripts/publish-android.sh b/scripts/publish-android.sh index 1e815f0..38b01a7 100755 --- a/scripts/publish-android.sh +++ b/scripts/publish-android.sh @@ -21,9 +21,9 @@ else printf %"s\n" "Attempting to build and publish version $THE_VERSION" # Publish a release to the Maven repo - # "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 + "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 # Stage a version - "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 + # "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1 echo $RESULT