From e42a5a3ee623bac3bb5f08ff0cda6acc23484772 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 13:43:53 +0300 Subject: [PATCH 01/14] Bump Java SDK version --- core/src/main/java/com/cloudinary/android/ApiStrategy.java | 6 ++---- .../main/java/com/cloudinary/android/UploaderStrategy.java | 2 +- gradle.properties | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/cloudinary/android/ApiStrategy.java b/core/src/main/java/com/cloudinary/android/ApiStrategy.java index 76c53cad..6ff221a9 100644 --- a/core/src/main/java/com/cloudinary/android/ApiStrategy.java +++ b/core/src/main/java/com/cloudinary/android/ApiStrategy.java @@ -7,15 +7,13 @@ import com.cloudinary.strategies.AbstractApiStrategy; public class ApiStrategy extends AbstractApiStrategy { - @Override - public ApiResponse callApi(HttpMethod method, Iterable uri, Map params, Map options) throws Exception { + public ApiResponse callApi(HttpMethod method, String apiUrl, Map params, Map options, String authorizationHeader) throws Exception { throw new Exception("Administration API is not supported for mobile applications."); } @Override - public ApiResponse callAccountApi(HttpMethod method, Iterable uri, Map params, Map options) throws Exception { + public ApiResponse callAccountApi(HttpMethod method, String apiUrl, Map params, Map options, String authorizationHeader) throws Exception { throw new Exception("Account API is not supported for mobile applications."); } - } diff --git a/core/src/main/java/com/cloudinary/android/UploaderStrategy.java b/core/src/main/java/com/cloudinary/android/UploaderStrategy.java index cb595c80..3d48c145 100644 --- a/core/src/main/java/com/cloudinary/android/UploaderStrategy.java +++ b/core/src/main/java/com/cloudinary/android/UploaderStrategy.java @@ -54,7 +54,7 @@ public Map callApi(String action, Map params, Map options, Objec if (apiSecret == null) throw new IllegalArgumentException("Must supply api_secret"); params.put("timestamp", Long.valueOf(System.currentTimeMillis() / 1000L).toString()); - params.put("signature", this.cloudinary().apiSignRequest(params, apiSecret)); + params.put("signature", this.cloudinary().apiSignRequest(params, apiSecret, this.cloudinary().config.signatureVersion)); params.put("api_key", apiKey); } } diff --git a/gradle.properties b/gradle.properties index 299aef11..e7b0b564 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ developerEmail=info@cloudinary.com # These two properties must use these exact names to be compatible with 'gradle install' plugin. group=com.cloudinary version=3.0.2 -cloudinaryLibsVersion=1.38.0 +cloudinaryLibsVersion=2.3.0 org.gradle.jvmargs=-Xmx1024m gnsp.disableApplyOnlyOnRootProjectEnforcement=true From 02cfa3421016787d11f9bb184129d1e1e633a351 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 13:49:35 +0300 Subject: [PATCH 02/14] Fix github action --- .github/workflows/android-build.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index cfce357b..60a1c022 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -1,4 +1,4 @@ -name: Test +name: Android Workflow on: [push, pull_request] @@ -16,11 +16,11 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - distribution: 'adopt' - java-version: '11' + distribution: 'temurin' + java-version: '17' - name: Setup Android SDK uses: android-actions/setup-android@v2 @@ -30,7 +30,6 @@ jobs: cd $ANDROID_HOME/cmdline-tools/latest/bin ./sdkmanager "platform-tools" ./sdkmanager "emulator" - ./sdkmanager "tools" ./sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" ./sdkmanager "platforms;android-${TARGET_VERSION}" ./sdkmanager "system-images;android-30;google_apis;x86" @@ -54,7 +53,7 @@ jobs: echo "Starting emulator..." export PATH=$PATH:$ANDROID_HOME/emulator emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics & - # Wait for the emulator to start up + # Wait for emulator to fully boot sleep 120 - name: Export CLOUDINARY_URL From 421a825cea0290c52e4c3e2bd8a8eafe66e2609e Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:09:06 +0300 Subject: [PATCH 03/14] Fix tests --- .../java/com/cloudinary/android/UploaderTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java index 6c9b5469..3466b179 100644 --- a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java +++ b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java @@ -88,7 +88,7 @@ public void testUpload() throws Exception { Map to_sign = new HashMap(); to_sign.put("public_id", result.getString("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); - String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } @@ -119,7 +119,7 @@ public void onProgress(long bytesUploaded, long totalBytes) { Map to_sign = new HashMap(); to_sign.put("public_id", result.getString("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); - String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } @@ -135,7 +135,7 @@ public void testUnsignedUpload() throws Exception { to_sign.put("public_id", result.getString("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); Log.d("TestRunner", cloudinary.config.apiSecret); - String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } @@ -149,7 +149,7 @@ public void testUploadUrl() throws Exception { Map to_sign = new HashMap(); to_sign.put("public_id", (String) result.get("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); - String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } @@ -167,7 +167,7 @@ public void testUploadDataUri() throws Exception { Map to_sign = new HashMap(); to_sign.put("public_id", (String) result.get("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); - String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, cloudinary.config.apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } @@ -182,7 +182,7 @@ public void testUploadExternalSignature() throws Exception { Map params = new HashMap(); params.put("timestamp", Long.valueOf(System.currentTimeMillis() / 1000L).toString()); - params.put("signature", this.cloudinary.apiSignRequest(params, apiSecret)); + params.put("signature", this.cloudinary.apiSignRequest(params, apiSecret, cloudinary.config.signatureVersion)); Cloudinary emptyCloudinary = new Cloudinary(config); JSONObject result = new JSONObject(emptyCloudinary.uploader().upload(getAssetStream(TEST_IMAGE), params)); Assert.assertEquals(result.getLong("width"), 241L); @@ -190,7 +190,7 @@ public void testUploadExternalSignature() throws Exception { Map to_sign = new HashMap(); to_sign.put("public_id", result.getString("public_id")); to_sign.put("version", ObjectUtils.asString(result.get("version"))); - String expected_signature = cloudinary.apiSignRequest(to_sign, apiSecret); + String expected_signature = cloudinary.apiSignRequest(to_sign, apiSecret, cloudinary.config.signatureVersion); Assert.assertEquals(result.get("signature"), expected_signature); } From 2a6f827dd247766abb69264f78dc0c85624a31e5 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:19:20 +0300 Subject: [PATCH 04/14] Fix github action --- .github/workflows/android-build.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index 60a1c022..33d77cd2 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -52,9 +52,27 @@ jobs: run: | echo "Starting emulator..." export PATH=$PATH:$ANDROID_HOME/emulator - emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics & - # Wait for emulator to fully boot - sleep 120 + nohup emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics > /dev/null 2>&1 & + + # Wait for ADB to detect the device + echo "Waiting for emulator device..." + adb wait-for-device + + # Poll for full boot + boot_completed="" + echo "Waiting for emulator to boot..." + until [[ "$boot_completed" == "1" ]]; do + sleep 5 + boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') + done + + # Optional: unlock the screen (some test frameworks expect an unlocked device) + adb shell input keyevent 82 + + echo "Emulator is fully booted." + + - name: Verify emulator is running + run: adb devices - name: Export CLOUDINARY_URL run: | From c7e14c66f9142e16a6336b60db49de34232a0953 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:30:42 +0300 Subject: [PATCH 05/14] Fix github action --- .github/workflows/android-build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index 33d77cd2..dbc1f042 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -32,9 +32,9 @@ jobs: ./sdkmanager "emulator" ./sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" ./sdkmanager "platforms;android-${TARGET_VERSION}" - ./sdkmanager "system-images;android-30;google_apis;x86" + ./sdkmanager "system-images;android-30;google_apis;x86_64" - - name: Enable KVM + - name: Enable KVM (safe for CI even if no hardware accel) run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules @@ -43,7 +43,7 @@ jobs: - name: Create AVD run: | cd $ANDROID_HOME/cmdline-tools/latest/bin - echo no | ./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86" --force + echo no | ./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86_64" --force - name: Start ADB Server run: adb start-server @@ -52,23 +52,19 @@ jobs: run: | echo "Starting emulator..." export PATH=$PATH:$ANDROID_HOME/emulator - nohup emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics > /dev/null 2>&1 & - - # Wait for ADB to detect the device + nohup emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics -accel off > /tmp/emulator.log 2>&1 & + echo "Waiting for emulator device..." adb wait-for-device - # Poll for full boot - boot_completed="" echo "Waiting for emulator to boot..." + boot_completed="" until [[ "$boot_completed" == "1" ]]; do sleep 5 boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') done - # Optional: unlock the screen (some test frameworks expect an unlocked device) adb shell input keyevent 82 - echo "Emulator is fully booted." - name: Verify emulator is running @@ -81,3 +77,7 @@ jobs: - name: Run tests run: ./gradlew clean connectedCheck --stacktrace + + - name: Dump emulator log on failure + if: failure() + run: cat /tmp/emulator.log From d1149a325a8fe9dbb9b5c97392f34dedff3258da Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:38:05 +0300 Subject: [PATCH 06/14] Fix github action --- .github/workflows/android-build.yml | 39 ++++++++--------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index dbc1f042..cfce357b 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -1,4 +1,4 @@ -name: Android Workflow +name: Test on: [push, pull_request] @@ -16,11 +16,11 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' - java-version: '17' + distribution: 'adopt' + java-version: '11' - name: Setup Android SDK uses: android-actions/setup-android@v2 @@ -30,11 +30,12 @@ jobs: cd $ANDROID_HOME/cmdline-tools/latest/bin ./sdkmanager "platform-tools" ./sdkmanager "emulator" + ./sdkmanager "tools" ./sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" ./sdkmanager "platforms;android-${TARGET_VERSION}" - ./sdkmanager "system-images;android-30;google_apis;x86_64" + ./sdkmanager "system-images;android-30;google_apis;x86" - - name: Enable KVM (safe for CI even if no hardware accel) + - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules @@ -43,7 +44,7 @@ jobs: - name: Create AVD run: | cd $ANDROID_HOME/cmdline-tools/latest/bin - echo no | ./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86_64" --force + echo no | ./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86" --force - name: Start ADB Server run: adb start-server @@ -52,23 +53,9 @@ jobs: run: | echo "Starting emulator..." export PATH=$PATH:$ANDROID_HOME/emulator - nohup emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics -accel off > /tmp/emulator.log 2>&1 & - - echo "Waiting for emulator device..." - adb wait-for-device - - echo "Waiting for emulator to boot..." - boot_completed="" - until [[ "$boot_completed" == "1" ]]; do - sleep 5 - boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') - done - - adb shell input keyevent 82 - echo "Emulator is fully booted." - - - name: Verify emulator is running - run: adb devices + emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics & + # Wait for the emulator to start up + sleep 120 - name: Export CLOUDINARY_URL run: | @@ -77,7 +64,3 @@ jobs: - name: Run tests run: ./gradlew clean connectedCheck --stacktrace - - - name: Dump emulator log on failure - if: failure() - run: cat /tmp/emulator.log From f5e74ffa439890aa56062da933e1f75c16f0eb1c Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:42:14 +0300 Subject: [PATCH 07/14] Fix github action --- .github/workflows/android-build.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index cfce357b..5693a16d 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -16,11 +16,11 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - distribution: 'adopt' - java-version: '11' + distribution: 'temurin' + java-version: '17' - name: Setup Android SDK uses: android-actions/setup-android@v2 @@ -30,10 +30,9 @@ jobs: cd $ANDROID_HOME/cmdline-tools/latest/bin ./sdkmanager "platform-tools" ./sdkmanager "emulator" - ./sdkmanager "tools" ./sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" ./sdkmanager "platforms;android-${TARGET_VERSION}" - ./sdkmanager "system-images;android-30;google_apis;x86" + ./sdkmanager "system-images;android-30;google_apis;x86_64" - name: Enable KVM run: | From 5e764263e5b05ce5792fd0fe2da9308d6d0f9951 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:46:23 +0300 Subject: [PATCH 08/14] Fix github action --- tools/get_test_cloud.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/get_test_cloud.sh b/tools/get_test_cloud.sh index f666772d..f067a948 100755 --- a/tools/get_test_cloud.sh +++ b/tools/get_test_cloud.sh @@ -4,10 +4,10 @@ function test_cloud { CLOUD_DETAILS=$(curl -X POST \-H 'Content-type:application/json' \https://sub-account-testing.cloudinary.com/create_sub_account \--data '{"prefix" : "android-test-cloud"}') - APIKEY=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiKey"]))') - APISECRET=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiSecret"]))') - CLOUD_NAME=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudName"]))') - CLOUDINARY_URL=$(echo ${CLOUD_DETAILS} | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("cloudinary://%s:%s@%s" % (c["cloudApiKey"], c["cloudApiSecret"], c["cloudName"]))') + APIKEY=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiKey"]))') + APISECRET=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiSecret"]))') + CLOUD_NAME=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudName"]))') + CLOUDINARY_URL=$(echo ${CLOUD_DETAILS} | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("cloudinary://%s:%s@%s" % (c["cloudApiKey"], c["cloudApiSecret"], c["cloudName"]))') curl \ -d "name=cloudinary_java_test&unsigned=true" \ -X POST \ From 0f2c1c0ddffc661fa1195c91016f2fb9abe616a7 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:49:05 +0300 Subject: [PATCH 09/14] Fix github action --- .github/workflows/android-build.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index 5693a16d..cfce357b 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -16,11 +16,11 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' - java-version: '17' + distribution: 'adopt' + java-version: '11' - name: Setup Android SDK uses: android-actions/setup-android@v2 @@ -30,9 +30,10 @@ jobs: cd $ANDROID_HOME/cmdline-tools/latest/bin ./sdkmanager "platform-tools" ./sdkmanager "emulator" + ./sdkmanager "tools" ./sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" ./sdkmanager "platforms;android-${TARGET_VERSION}" - ./sdkmanager "system-images;android-30;google_apis;x86_64" + ./sdkmanager "system-images;android-30;google_apis;x86" - name: Enable KVM run: | From ce21f45d3392d822afc93d5d284fc399214191b3 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:50:29 +0300 Subject: [PATCH 10/14] Fix github action --- .github/workflows/android-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index cfce357b..d042c209 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -16,11 +16,11 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'adopt' - java-version: '11' + java-version: '17' - name: Setup Android SDK uses: android-actions/setup-android@v2 @@ -63,4 +63,4 @@ jobs: echo "CLOUDINARY_URL=$CLOUDINARY_URL" >> $GITHUB_ENV - name: Run tests - run: ./gradlew clean connectedCheck --stacktrace + run: ./gradlew clean connectedCheck --stacktrace \ No newline at end of file From 4e9b226013c05aad2d203f0a4eabdab331768df4 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 14:53:58 +0300 Subject: [PATCH 11/14] Fix github action --- .github/workflows/android-build.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index d042c209..bef84224 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -43,8 +43,13 @@ jobs: - name: Create AVD run: | - cd $ANDROID_HOME/cmdline-tools/latest/bin - echo no | ./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86" --force + export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin + echo "no" | avdmanager create avd -n test -k "system-images;android-30;google_apis;x86" --force + + - name: List AVDs (debug) + run: | + export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin + avdmanager list avd - name: Start ADB Server run: adb start-server @@ -52,10 +57,18 @@ jobs: - name: Start Emulator run: | echo "Starting emulator..." - export PATH=$PATH:$ANDROID_HOME/emulator - emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics & + export PATH=$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin + # Verify AVD exists before starting + avdmanager list avd + emulator -avd test -no-audio -no-window -no-boot-anim -no-metrics -verbose & + + - name: Wait for emulator + run: | # Wait for the emulator to start up - sleep 120 + echo "Waiting for emulator to boot..." + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + adb devices + echo "Emulator is ready" - name: Export CLOUDINARY_URL run: | From fc65a88b2c4326e879e60e7b76b5c9883c8b72c3 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Wed, 18 Jun 2025 17:21:38 +0300 Subject: [PATCH 12/14] Fix github action --- .../androidTest/java/com/cloudinary/android/ResponsiveTest.java | 1 + .../androidTest/java/com/cloudinary/android/UploaderTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/core/src/androidTest/java/com/cloudinary/android/ResponsiveTest.java b/core/src/androidTest/java/com/cloudinary/android/ResponsiveTest.java index 4e523614..337c04b8 100644 --- a/core/src/androidTest/java/com/cloudinary/android/ResponsiveTest.java +++ b/core/src/androidTest/java/com/cloudinary/android/ResponsiveTest.java @@ -22,6 +22,7 @@ public class ResponsiveTest extends AbstractTest { public static void setUp() throws Exception { String url = Utils.cloudinaryUrlFromContext(InstrumentationRegistry.getInstrumentation().getContext()); cloudinary = new Cloudinary(url); + cloudinary.config.analytics = false; } /** diff --git a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java index 3466b179..44f7bbba 100644 --- a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java +++ b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java @@ -50,6 +50,7 @@ public class UploaderTest extends AbstractTest { public static void setUp() throws Exception { String url = Utils.cloudinaryUrlFromContext(InstrumentationRegistry.getInstrumentation().getContext()); cloudinary = new Cloudinary(url); + cloudinary.config.analytics = false; if (StringUtils.isBlank(url)) { throw new IllegalArgumentException("UploaderTest - No cloudinary url configured"); } From d18b1cd10c38d9ad10b5839563d03cb854722f1c Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Thu, 19 Jun 2025 09:55:13 +0300 Subject: [PATCH 13/14] Bump gradle version --- all/build.gradle | 1 + all/src/main/AndroidManifest.xml | 5 +++- build.gradle | 2 +- core/build.gradle | 2 ++ core/src/androidTest/AndroidManifest.xml | 1 - .../com/cloudinary/android/PayloadTest.java | 24 ++++++++++++++++--- .../com/cloudinary/android/UploaderTest.java | 1 + core/src/main/AndroidManifest.xml | 2 +- download/build.gradle | 4 +++- download/src/androidTest/AndroidManifest.xml | 1 - download/src/main/AndroidManifest.xml | 5 +++- glide-integration/build.gradle | 3 ++- .../src/main/AndroidManifest.xml | 5 +++- gradle/wrapper/gradle-wrapper.properties | 6 ++--- preprocess/build.gradle | 2 ++ .../src/androidTest/AndroidManifest.xml | 1 - preprocess/src/main/AndroidManifest.xml | 2 +- sample/build.gradle | 1 + sample/src/main/AndroidManifest.xml | 1 - ui/build.gradle | 1 + ui/src/main/AndroidManifest.xml | 2 +- 21 files changed, 53 insertions(+), 19 deletions(-) diff --git a/all/build.gradle b/all/build.gradle index a708cfea..e7df8763 100644 --- a/all/build.gradle +++ b/all/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.all' compileSdk 34 diff --git a/all/src/main/AndroidManifest.xml b/all/src/main/AndroidManifest.xml index 6964e524..9cf0d350 100644 --- a/all/src/main/AndroidManifest.xml +++ b/all/src/main/AndroidManifest.xml @@ -1 +1,4 @@ - + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index ab0787ce..c08e45e8 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ allprojects { } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:8.3.0' classpath "de.marcphilipp.gradle:nexus-publish-plugin:0.4.0" classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.1" classpath 'digital.wup:android-maven-publish:3.6.2' diff --git a/core/build.gradle b/core/build.gradle index db79fb32..c4b38191 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.core' + testNamespace 'com.cloudinary.android.test' compileSdk 34 diff --git a/core/src/androidTest/AndroidManifest.xml b/core/src/androidTest/AndroidManifest.xml index f3795b60..4e1054b4 100644 --- a/core/src/androidTest/AndroidManifest.xml +++ b/core/src/androidTest/AndroidManifest.xml @@ -1,7 +1,6 @@ diff --git a/core/src/androidTest/java/com/cloudinary/android/PayloadTest.java b/core/src/androidTest/java/com/cloudinary/android/PayloadTest.java index 74da423b..0231060a 100644 --- a/core/src/androidTest/java/com/cloudinary/android/PayloadTest.java +++ b/core/src/androidTest/java/com/cloudinary/android/PayloadTest.java @@ -11,7 +11,6 @@ import com.cloudinary.android.payload.Payload; import com.cloudinary.android.payload.PayloadFactory; import com.cloudinary.android.payload.PayloadNotFoundException; -import com.cloudinary.android.payload.ResourcePayload; import org.junit.BeforeClass; import org.junit.Test; @@ -19,7 +18,10 @@ import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import static junit.framework.Assert.assertEquals; @@ -64,11 +66,27 @@ public void testBytesPayload() throws PayloadNotFoundException, IOException { } @Test - public void testResourcePayload() throws PayloadNotFoundException { - ResourcePayload payload = new ResourcePayload(com.cloudinary.android.core.test.R.raw.old_logo); + public void testResourcePayload() throws PayloadNotFoundException, IOException { + InputStream is = InstrumentationRegistry.getInstrumentation() + .getContext() + .getAssets() + .open("images/old_logo.png"); + + File tempFile = File.createTempFile("old_logo", ".png"); + + try (OutputStream os = new FileOutputStream(tempFile)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); // ✅ the actual fix + } + } + + Payload payload = new FilePayload(tempFile.getAbsolutePath()); verifyLengthAndRecreation(payload, 3381); } + private void verifyLengthAndRecreation(Payload payload, long expectedLength) throws PayloadNotFoundException { assertEquals(expectedLength, payload.getLength(InstrumentationRegistry.getInstrumentation().getContext())); diff --git a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java index 44f7bbba..5b112b85 100644 --- a/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java +++ b/core/src/androidTest/java/com/cloudinary/android/UploaderTest.java @@ -51,6 +51,7 @@ public static void setUp() throws Exception { String url = Utils.cloudinaryUrlFromContext(InstrumentationRegistry.getInstrumentation().getContext()); cloudinary = new Cloudinary(url); cloudinary.config.analytics = false; + cloudinary.config.secure = false; if (StringUtils.isBlank(url)) { throw new IllegalArgumentException("UploaderTest - No cloudinary url configured"); } diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index d169784f..325a8330 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + > diff --git a/download/build.gradle b/download/build.gradle index 60835ed2..c4ff8a4d 100644 --- a/download/build.gradle +++ b/download/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.download' + testNamespace 'com.cloudinary.android.download.test' compileSdk 34 defaultConfig { @@ -37,7 +39,7 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'org.mockito:mockito-android:4.2.0' + androidTestImplementation 'org.mockito:mockito-android:5.11.0' } ext { diff --git a/download/src/androidTest/AndroidManifest.xml b/download/src/androidTest/AndroidManifest.xml index ccc8fb81..a6bf0b75 100644 --- a/download/src/androidTest/AndroidManifest.xml +++ b/download/src/androidTest/AndroidManifest.xml @@ -1,6 +1,5 @@ diff --git a/download/src/main/AndroidManifest.xml b/download/src/main/AndroidManifest.xml index ed91a3e1..a09f0fdb 100644 --- a/download/src/main/AndroidManifest.xml +++ b/download/src/main/AndroidManifest.xml @@ -1 +1,4 @@ - + + + + diff --git a/glide-integration/build.gradle b/glide-integration/build.gradle index 0a2646be..e980b5fa 100644 --- a/glide-integration/build.gradle +++ b/glide-integration/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.glide_integration' compileSdk 34 defaultConfig { @@ -32,7 +33,7 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'org.mockito:mockito-android:4.2.0' + androidTestImplementation 'org.mockito:mockito-android:5.11.0' } ext { diff --git a/glide-integration/src/main/AndroidManifest.xml b/glide-integration/src/main/AndroidManifest.xml index 4f049cd4..9cf0d350 100644 --- a/glide-integration/src/main/AndroidManifest.xml +++ b/glide-integration/src/main/AndroidManifest.xml @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4ff50e52..91e4910b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jan 19 11:45:39 IST 2022 +#Thu Jun 19 08:08:34 IDT 2025 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/preprocess/build.gradle b/preprocess/build.gradle index 618c4cbd..2ea909c4 100644 --- a/preprocess/build.gradle +++ b/preprocess/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.preprocess' + testNamespace 'com.cloudinary.android.test' compileSdk 34 defaultConfig { diff --git a/preprocess/src/androidTest/AndroidManifest.xml b/preprocess/src/androidTest/AndroidManifest.xml index 45a2d542..f4ee81c8 100644 --- a/preprocess/src/androidTest/AndroidManifest.xml +++ b/preprocess/src/androidTest/AndroidManifest.xml @@ -1,6 +1,5 @@ diff --git a/preprocess/src/main/AndroidManifest.xml b/preprocess/src/main/AndroidManifest.xml index 9cb4f93e..c6119fc1 100644 --- a/preprocess/src/main/AndroidManifest.xml +++ b/preprocess/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + > diff --git a/sample/build.gradle b/sample/build.gradle index c9d223cd..1bef893b 100755 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -7,6 +7,7 @@ android { } defaultConfig { + namespace 'com.cloudinary.sample' compileSdk 34 applicationId "com.cloudinary.sample" minSdkVersion 21 diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index e3e76576..6defcfa7 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ diff --git a/ui/build.gradle b/ui/build.gradle index 9a1fce65..a9d77024 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' android { + namespace 'com.cloudinary.android.ui' compileSdk 34 diff --git a/ui/src/main/AndroidManifest.xml b/ui/src/main/AndroidManifest.xml index bfcbda68..864def03 100644 --- a/ui/src/main/AndroidManifest.xml +++ b/ui/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + > From b48bc19dc6e11c398155de34ca52ec1b882cd9f9 Mon Sep 17 00:00:00 2001 From: adimiz1 Date: Thu, 19 Jun 2025 09:56:18 +0300 Subject: [PATCH 14/14] Fix get test cloud --- tools/get_test_cloud.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/get_test_cloud.sh b/tools/get_test_cloud.sh index f067a948..f666772d 100755 --- a/tools/get_test_cloud.sh +++ b/tools/get_test_cloud.sh @@ -4,10 +4,10 @@ function test_cloud { CLOUD_DETAILS=$(curl -X POST \-H 'Content-type:application/json' \https://sub-account-testing.cloudinary.com/create_sub_account \--data '{"prefix" : "android-test-cloud"}') - APIKEY=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiKey"]))') - APISECRET=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiSecret"]))') - CLOUD_NAME=$(echo "${CLOUD_DETAILS}" | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudName"]))') - CLOUDINARY_URL=$(echo ${CLOUD_DETAILS} | python3 -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("cloudinary://%s:%s@%s" % (c["cloudApiKey"], c["cloudApiSecret"], c["cloudName"]))') + APIKEY=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiKey"]))') + APISECRET=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudApiSecret"]))') + CLOUD_NAME=$(echo "${CLOUD_DETAILS}" | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("%s" % (c["cloudName"]))') + CLOUDINARY_URL=$(echo ${CLOUD_DETAILS} | python -c 'import json,sys;c=json.load(sys.stdin)["payload"];print("cloudinary://%s:%s@%s" % (c["cloudApiKey"], c["cloudApiSecret"], c["cloudName"]))') curl \ -d "name=cloudinary_java_test&unsigned=true" \ -X POST \