From 9d4a9506aee64318cb46096bfddbaf087b4eb418 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 11 May 2026 19:28:08 +0200 Subject: [PATCH 1/4] Fix ImageThumbnailCreatorTest to use Paths.get() instead of Path.of() for better compatibility --- .../notesr/core/util/thumbnail/ImageThumbnailCreatorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/androidTest/java/app/notesr/core/util/thumbnail/ImageThumbnailCreatorTest.java b/core/src/androidTest/java/app/notesr/core/util/thumbnail/ImageThumbnailCreatorTest.java index b14a80b6..fd685357 100644 --- a/core/src/androidTest/java/app/notesr/core/util/thumbnail/ImageThumbnailCreatorTest.java +++ b/core/src/androidTest/java/app/notesr/core/util/thumbnail/ImageThumbnailCreatorTest.java @@ -22,7 +22,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collection; import app.notesr.core.util.FilesUtils; @@ -64,7 +64,7 @@ public void testGetThumbnail() throws IOException { byte[] thumbnailBytes = thumbnailCreator.getThumbnail(Uri.fromFile(imageFile)); - Files.write(Path.of(thumbnailFile.getAbsolutePath()), thumbnailBytes); + Files.write(Paths.get(thumbnailFile.getAbsolutePath()), thumbnailBytes); Size imageSize = getImageSize(imageFile); Size thumbnailSize = getImageSize(thumbnailFile); From 61c50c9e7d9d81a3a98777d7638cd5e1f1f6550f Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 11 May 2026 19:29:03 +0200 Subject: [PATCH 2/4] Fix VideoThumbnailCreatorTest to use Paths.get() instead of Path.of() for better compatibility --- .../notesr/core/util/thumbnail/VideoThumbnailCreatorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/androidTest/java/app/notesr/core/util/thumbnail/VideoThumbnailCreatorTest.java b/core/src/androidTest/java/app/notesr/core/util/thumbnail/VideoThumbnailCreatorTest.java index 8dd88e18..31396d9a 100644 --- a/core/src/androidTest/java/app/notesr/core/util/thumbnail/VideoThumbnailCreatorTest.java +++ b/core/src/androidTest/java/app/notesr/core/util/thumbnail/VideoThumbnailCreatorTest.java @@ -18,7 +18,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.Paths; public class VideoThumbnailCreatorTest extends ThumbnailCreatorTestBase { private static final int EXPECTED_WIDTH = 200; @@ -34,7 +34,7 @@ public void testGetThumbnail() throws IOException { byte[] thumbnailBytes = thumbnailCreator.getThumbnail(Uri.fromFile(videoFile)); assertNotNull("Thumbnail creator returned null", thumbnailBytes); - Files.write(Path.of(thumbnailFile.getAbsolutePath()), thumbnailBytes); + Files.write(Paths.get(thumbnailFile.getAbsolutePath()), thumbnailBytes); int actualWidth = getImageSize(thumbnailFile).getWidth(); From c83fa51a7a6c7e354f3c25c9512f3a6dd324d993 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 11 May 2026 19:30:53 +0200 Subject: [PATCH 3/4] Replace readAllBytes() with a custom readAllBytes() implementation in FileExifDataResolverTest for better compatibility --- .../core/util/FileExifDataResolverTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/androidTest/java/app/notesr/core/util/FileExifDataResolverTest.java b/core/src/androidTest/java/app/notesr/core/util/FileExifDataResolverTest.java index 25323bb4..01408b8c 100644 --- a/core/src/androidTest/java/app/notesr/core/util/FileExifDataResolverTest.java +++ b/core/src/androidTest/java/app/notesr/core/util/FileExifDataResolverTest.java @@ -19,6 +19,7 @@ import org.junit.BeforeClass; import org.junit.Test; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -44,7 +45,7 @@ public static void beforeAll() throws IOException { try (InputStream inputStream = assets.open("test_image.jpg")) { try (FileOutputStream outputStream = new FileOutputStream(testFile)) { - byte[] imageBytes = inputStream.readAllBytes(); + byte[] imageBytes = readAllBytes(inputStream); testFileSize = imageBytes.length; outputStream.write(imageBytes); @@ -90,4 +91,17 @@ public static Uri getImageContentUri(Context context, File imageFile, int size) return contentResolver.insert(imagesCollection, values); } + + private static byte[] readAllBytes(InputStream inputStream) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + + int bytesRead; + byte[] data = new byte[16384]; + + while ((bytesRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, bytesRead); + } + + return buffer.toByteArray(); + } } From 0b736dac9716a98c8288cd38d9fd351eb5e63b2d Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 11 May 2026 19:31:14 +0200 Subject: [PATCH 4/4] Add GitHub Actions workflow for running Android instrumented tests via emulator --- .../workflows/android-instrumented-tests.yml | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 .github/workflows/android-instrumented-tests.yml diff --git a/.github/workflows/android-instrumented-tests.yml b/.github/workflows/android-instrumented-tests.yml new file mode 100644 index 00000000..b6f09722 --- /dev/null +++ b/.github/workflows/android-instrumented-tests.yml @@ -0,0 +1,93 @@ +name: Android Instrumented Tests + +on: + push: + pull_request: + +jobs: + instrumented-tests: + runs-on: ubuntu-latest + timeout-minutes: 35 + + env: + GRADLE_OPTS: -Xmx4g + ADB_INSTALL_TIMEOUT: 15 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup JDK + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + + - name: Make gradlew executable + run: chmod +x gradlew + + - name: Show disk space + run: df -h + + - name: Create emulator wait script + run: | + cat > wait-for-android.sh <<'EOF' + #!/usr/bin/env bash + set -e + + adb wait-for-device + + echo "Waiting for boot completion..." + + until adb shell getprop sys.boot_completed | grep -m 1 '1'; do + sleep 5 + done + + echo "Boot completed" + + until adb shell getprop ro.build.version.sdk | grep -E '^[0-9]+$'; do + echo "Waiting for SDK..." + sleep 5 + done + + echo "SDK ready" + + until adb shell pm path android >/dev/null 2>&1; do + echo "Waiting for PackageManager..." + sleep 5 + done + + echo "PackageManager ready" + EOF + + chmod +x wait-for-android.sh + + - name: Run connected tests + uses: ReactiveCircus/android-emulator-runner@v2 + with: + api-level: 29 + arch: x86_64 + target: default + profile: pixel_4 + + emulator-boot-timeout: 900 + + disable-spellchecker: true + + emulator-options: >- + -no-window + -gpu swiftshader_indirect + -noaudio + -no-boot-anim + -camera-back none + -camera-front none + -no-snapshot + -memory 2048 + + script: | + ./wait-for-android.sh + adb shell getprop ro.build.version.sdk + ./gradlew connectedDebugAndroidTest --stacktrace --no-daemon \ No newline at end of file