From 38ee848a0731e21464f8b02f83f2f8b5595ab8bb Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sun, 26 Oct 2025 17:49:23 +0100 Subject: [PATCH 1/8] CI and java 17 Prepare screenshot diff Remove screenshot Espresso tests preparation --- .github/release.yml | 12 +++ .github/workflows/Android-CI-release.yml | 45 ---------- .github/workflows/Android-CI.yml | 87 ++++++++++++------- .../workflows/gradle-wrapper-validation.yml | 16 ---- .github/workflows/release.yml | 54 ++++++++++++ .gitmodules | 3 + app/build.gradle | 9 +- buildSrc | 1 + jitpack.yml | 2 +- mjpeg-view/build.gradle | 7 ++ 10 files changed, 143 insertions(+), 93 deletions(-) delete mode 100644 .github/workflows/Android-CI-release.yml delete mode 100644 .github/workflows/gradle-wrapper-validation.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitmodules create mode 160000 buildSrc diff --git a/.github/release.yml b/.github/release.yml index d62e3abf..4eefc596 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -11,6 +11,18 @@ changelog: - title: Exciting New Features 🎉 labels: - enhancement + - title: Espresso test + labels: + - Espresso + - title: Bug fix + labels: + - bugfix + - title: Pipeline + labels: + - pipeline + - title: Dependencies + labels: + - dependencies - title: Other Changes labels: - "*" \ No newline at end of file diff --git a/.github/workflows/Android-CI-release.yml b/.github/workflows/Android-CI-release.yml deleted file mode 100644 index 0e0dcf82..00000000 --- a/.github/workflows/Android-CI-release.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Release - -on: - push: - tags: - - '*' - -jobs: - build: - name: Release - runs-on: macOS-latest - strategy: - matrix: - java_version: [ 11 ] - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Find Tag - id: tagger - uses: jimschubert/query-tag-action@v2 - with: - skip-unshallow: 'true' - abbrev: false - commit-ish: HEAD - - name: Install JDK ${{ matrix.java_version }} - uses: actions/setup-java@v4 - with: - distribution: 'adopt' - java-version: ${{ matrix.java_version }} - - name: Install Android SDK - uses: malinskiy/action-android/install-sdk@release/0.1.4 - - name: Build project - run: ./gradlew assembleRelease - - - name: Create Release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{steps.tagger.outputs.tag}} - name: ${{steps.tagger.outputs.tag}} - generate_release_notes: true - files: ./mjpeg-view/build/outputs/aar/mjpeg-view-release.aar - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/Android-CI.yml b/.github/workflows/Android-CI.yml index 7141063d..073d4158 100644 --- a/.github/workflows/Android-CI.yml +++ b/.github/workflows/Android-CI.yml @@ -1,59 +1,88 @@ -name: PullRequest +name: Pull request on: push: branches: - master pull_request: - branches: - - master +env: + resourceRunID: ${{ github.run_id }}-${{ github.run_number }} jobs: - buildTest: - name: Build & Test JDK ${{ matrix.java_version }} - runs-on: macOS-latest + Build: + name: Test + runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: - java_version: [ 11.0.3 ] + os: [ ubuntu-24.04 ] + api: [ 34 ] + abi: [ x86_64 ] + emulatorApi: [ 14 ] + tag: [ 'google_apis' ] steps: - - name: Checkout - uses: actions/checkout@v4 + - name: kvm support + run: | + egrep -c '(vmx|svm)' /proc/cpuinfo + id + sudo adduser $USER kvm + sudo chown -R $USER /dev/kvm + id + - uses: actions/checkout@v5 with: - fetch-depth: 0 - - name: Install JDK ${{ matrix.java_version }} - uses: actions/setup-java@v4 + submodules: true + - name: set up JDK + uses: actions/setup-java@v5 with: distribution: 'adopt' - java-version: ${{ matrix.java_version }} + java-version: 17 + - uses: gradle/actions/wrapper-validation@v5 - name: Install Android SDK - uses: malinskiy/action-android/install-sdk@release/0.1.1 - - name: Build project - run: ./gradlew build - - name: Run tests - run: ./gradlew test + uses: hannesa2/action-android/install-sdk@0.1.16.7 + - name: Android Emulator test + uses: hannesa2/action-android/emulator-run-cmd@0.1.16.7 + with: + cmd: ./gradlew cAT --continue + api: ${{ matrix.api }} + tag: ${{ matrix.tag }} + abi: ${{ matrix.abi }} + cmdOptions: -noaudio -no-boot-anim -no-window -metrics-collection + disableAnimations: true + bootTimeout: 720 + - uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: ipcam-Espresso-${{ matrix.api }}-${{ matrix.abi }}-report-${{ matrix.emulatorApi }} + path: | + ./**/build/reports/androidTests/connected + ./**/build/outputs/androidTest-results/connected Check: name: Check - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: - java_version: [ 11.0.3 ] + os: [ ubuntu-22.04 ] steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: - fetch-depth: 0 - - name: Install JDK ${{ matrix.java_version }} - uses: actions/setup-java@v4 + submodules: true + - name: set up JDK + uses: actions/setup-java@v5 with: distribution: 'adopt' - java-version: ${{ matrix.java_version }} + java-version: 17 - name: Install Android SDK - uses: malinskiy/action-android/install-sdk@release/0.1.1 + uses: hannesa2/action-android/install-sdk@0.1.16.7 + - name: Run tests + run: ./gradlew test - name: Code checks run: ./gradlew check - name: Archive Lint report uses: actions/upload-artifact@v4 if: ${{ always() }} with: - name: IP-Cam-Lint-report - path: app/build/reports/lint-results.html + name: IPView-Lint-report + path: | + ./**/build/reports/lint-results*.html + ./**/build/reports/ktlint/ktlintMainSourceSetCheck/ktlintMainSourceSetCheck.txt diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml deleted file mode 100644 index d346cb55..00000000 --- a/.github/workflows/gradle-wrapper-validation.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: "Validate Gradle Wrapper" -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - validation: - name: "Validation" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: gradle/wrapper-validation-action@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..9c01be56 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,54 @@ +name: Release + +on: + push: + tags: + - '*' + +jobs: + build: + name: Publish release + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v5 + with: + submodules: true + - name: Find Tag + id: tagger + uses: jimschubert/query-tag-action@v2 + with: + skip-unshallow: 'true' + commit-ish: HEAD + - name: Check pre-release + run: | + echo "tag=${{steps.tagger.outputs.tag}}" + if [[ ${{ steps.tagger.outputs.tag }} == *alpha* || ${{ steps.tagger.outputs.tag }} == *beta* ]] + then + prerelease=true + else + prerelease=false + fi + echo "PRE_RELEASE=$prerelease" >> $GITHUB_ENV + echo "prerelease=$prerelease" + - name: Install JDK + uses: actions/setup-java@v5 + with: + distribution: 'adopt' + java-version: 17 + - name: Install Android SDK + uses: hannesa2/action-android/install-sdk@0.1.16.7 + - name: Build project + run: ./gradlew assembleRelease + env: + VERSION: ${{steps.tagger.outputs.tag}} + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{steps.tagger.outputs.tag}} + generate_release_notes: true + prerelease: ${{ env.PRE_RELEASE }} + name: ${{steps.tagger.outputs.tag}} + files: | + ./mjpeg-view/build/outputs/aar/mjpeg-view-release.aar + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..4328b650 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "buildSrc"] + path = buildSrc + url = git@github.com:hannesa2/KotlinBuildSource.git diff --git a/app/build.gradle b/app/build.gradle index 4155b482..b14529fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,8 +28,13 @@ android { abortOnError false disable 'InvalidPackage' } - namespace 'com.github.niqdev.ipcam' - + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } } dependencies { diff --git a/buildSrc b/buildSrc new file mode 160000 index 00000000..abb98b14 --- /dev/null +++ b/buildSrc @@ -0,0 +1 @@ +Subproject commit abb98b1449cfa86f169cc6d6eb2f4ed9769545df diff --git a/jitpack.yml b/jitpack.yml index f2cee2a1..8e050741 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,4 +1,4 @@ jdk: - - openjdk11 + - openjdk17 install: - ./gradlew :mjpeg-view:build :mjpeg-view:publishToMavenLocal -x :mjpeg-view:test diff --git a/mjpeg-view/build.gradle b/mjpeg-view/build.gradle index bd9051bd..e8a7e76e 100644 --- a/mjpeg-view/build.gradle +++ b/mjpeg-view/build.gradle @@ -27,6 +27,13 @@ android { useLibrary 'org.apache.http.legacy' + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' From cceb4b364927684a948cb10c49e70fbc19c8d109 Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sun, 26 Oct 2025 17:51:41 +0100 Subject: [PATCH 2/8] Prepare kts build --- app/build.gradle | 21 ++++++++-------- build.gradle | 10 ++++---- mjpeg-view/build.gradle | 56 ++++++++++++++++++++--------------------- settings.gradle | 3 ++- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b14529fb..8e44d363 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,9 +1,10 @@ plugins { - id 'com.android.application' - id 'kotlin-android' + id "com.android.application" + id "kotlin-android" } android { + namespace "com.github.niqdev.ipcam" compileSdkVersion 33 defaultConfig { @@ -21,12 +22,12 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } lint { abortOnError false - disable 'InvalidPackage' + disable "InvalidPackage" } compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -38,12 +39,10 @@ android { } dependencies { - implementation project(':mjpeg-view') - - implementation 'androidx.appcompat:appcompat:1.6.1' - - implementation 'com.jakewharton:butterknife:10.2.3' - annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' + implementation project(":mjpeg-view") + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "com.jakewharton:butterknife:10.2.3" + annotationProcessor "com.jakewharton:butterknife-compiler:10.2.3" implementation "androidx.core:core-ktx:1.10.1" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.22" } diff --git a/build.gradle b/build.gradle index f8e94d95..9327dbdd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,18 @@ buildscript { - ext.kotlin_version = '1.9.22' + ext.kotlin_version = "1.9.22" repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath "com.android.tools.build:gradle:7.4.2" + classpath "com.github.dcendents:android-maven-gradle-plugin:2.1" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { - group = 'com.github.niqdev' + group = "com.github.niqdev" version = getTag() repositories { @@ -21,7 +21,7 @@ allprojects { } } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/mjpeg-view/build.gradle b/mjpeg-view/build.gradle index e8a7e76e..175b8c44 100644 --- a/mjpeg-view/build.gradle +++ b/mjpeg-view/build.gradle @@ -1,10 +1,11 @@ plugins { - id 'com.android.library' - id 'maven-publish' - id 'kotlin-android' + id "com.android.library" + id "maven-publish" + id "kotlin-android" } android { + namespace "com.github.niqdev.mjpeg" compileSdkVersion 33 defaultConfig { @@ -15,17 +16,16 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } packagingOptions { resources { - excludes += ['META-INF/services/javax.annotation.processing.Processor'] + excludes += ["META-INF/services/javax.annotation.processing.Processor"] } } - - useLibrary 'org.apache.http.legacy' + useLibrary "org.apache.http.legacy" compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -36,36 +36,36 @@ android { } externalNativeBuild { ndkBuild { - path 'src/main/jni/Android.mk' + path "src/main/jni/Android.mk" } } - namespace 'com.github.niqdev.mjpeg' } dependencies { - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation "androidx.appcompat:appcompat:1.6.1" - api 'io.reactivex:rxjava:1.3.8' // it's obsolete - api 'io.reactivex:rxandroid:1.2.1' + api "io.reactivex:rxjava:1.3.8" // it"s obsolete + api "io.reactivex:rxandroid:1.2.1" implementation "androidx.core:core-ktx:1.10.1" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.22" } -task hello(dependsOn: build) { - println '' - println ' _ _ _ _ _ _ _ ' - println ' /\\ \\ _ /\\ \\ /\\ \\ /\\ \\ /\\ \\ /\\ \\ _ / /\\' - println ' / \\ \\ /\\_\\ \\ \\ \\ / \\ \\ / \\ \\____ / \\ \\ \\ \\ \\ /_/ / /' - println ' / /\\ \\ \\_/ / / /\\ \\_\\ / /\\ \\ \\ / /\\ \\_____\\ / /\\ \\ \\ \\ \\ \\ \\___\\/ ' - println ' / / /\\ \\___/ / / /\\/_/ / / /\\ \\ \\ / / /\\/___ // / /\\ \\_\\/ / / \\ \\ \\ ' - println ' / / / \\/____/ / / / / / / \\ \\_\\ / / / / / // /_/_ \\/_/\\ \\ \\ \\_\\ \\' - println ' / / / / / / / / / / / / _ / / // / / / / // /____/\\ \\ \\ \\ / / /' - println ' / / / / / / / / / / / / /\\ \\/ // / / / / // /\\____\\/ \\ \\ \\/ / / ' - println ' / / / / / /___/ / /__ / / /__\\ \\ \\/ \\ \\ \\__/ / // / /______ \\ \\ \\/ / ' - println '/ / / / / //\\__\\/_/___\\/ / /____\\ \\ \\ \\ \\___\\/ // / /_______\\ \\ \\ / ' - println '\\/_/ \\/_/ \\/_________/\\/________\\_\\/ \\/_____/ \\/__________/ \\_\\/ ' - println ':see https://github.com/niqdev/ipcam-view\n' - println '*--~> [' + project.group + ':' + rootProject.name + ':' + project.version + '] <~--*\n' +tasks.register('hello') { + dependsOn build + println "" + println " _ _ _ _ _ _ _ " + println " /\\ \\ _ /\\ \\ /\\ \\ /\\ \\ /\\ \\ /\\ \\ _ / /\\" + println " / \\ \\ /\\_\\ \\ \\ \\ / \\ \\ / \\ \\____ / \\ \\ \\ \\ \\ /_/ / /" + println " / /\\ \\ \\_/ / / /\\ \\_\\ / /\\ \\ \\ / /\\ \\_____\\ / /\\ \\ \\ \\ \\ \\ \\___\\/ " + println " / / /\\ \\___/ / / /\\/_/ / / /\\ \\ \\ / / /\\/___ // / /\\ \\_\\/ / / \\ \\ \\ " + println " / / / \\/____/ / / / / / / \\ \\_\\ / / / / / // /_/_ \\/_/\\ \\ \\ \\_\\ \\" + println " / / / / / / / / / / / / _ / / // / / / / // /____/\\ \\ \\ \\ / / /" + println " / / / / / / / / / / / / /\\ \\/ // / / / / // /\\____\\/ \\ \\ \\/ / / " + println " / / / / / /___/ / /__ / / /__\\ \\ \\/ \\ \\ \\__/ / // / /______ \\ \\ \\/ / " + println "/ / / / / //\\__\\/_/___\\/ / /____\\ \\ \\ \\ \\___\\/ // / /_______\\ \\ \\ / " + println "\\/_/ \\/_/ \\/_________/\\/________\\_\\/ \\/_____/ \\/__________/ \\_\\/ " + println ":see https://github.com/niqdev/ipcam-view\n" + println "*--~> [" + project.group + ":" + rootProject.name + ":" + project.version + "] <~--*\n" } project.afterEvaluate { diff --git a/settings.gradle b/settings.gradle index 641fe92e..0846686c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ -include ':app', ':mjpeg-view' +include ":app" +include ":mjpeg-view" From 13f15266750612538848713b81c41e08db9ae6e2 Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sun, 26 Oct 2025 17:56:42 +0100 Subject: [PATCH 3/8] Android Studio Narwhal settings --- .idea/codeStyles/Project.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 4dbbc6ae..5fc8cd6f 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -31,6 +31,7 @@