diff --git a/.github/workflows/android-test.yml b/.github/workflows/android-test.yml
new file mode 100644
index 0000000..e499e2f
--- /dev/null
+++ b/.github/workflows/android-test.yml
@@ -0,0 +1,99 @@
+name: Android Emulator Tests
+on: [ push, pull_request ]
+
+jobs:
+ check-if-tests-exist:
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check-androidTest.outputs.NOT_EMPTY }}
+ min-sdk-version: ${{ steps.get-sdk-version.outputs.MIN_SDK_VERSION }}
+ target-sdk-version: ${{ steps.get-sdk-version.outputs.TARGET_SDK_VERSION }}
+ app-id: ${{ steps.get-app-id.outputs.APP_ID }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: "recursive"
+ - name: Check if androidTest folder is not empty
+ run: |
+ echo "NOT_EMPTY=$([ "$(ls -A app/src/androidTest)" ] && echo 'true' || echo 'false')"
+ echo "NOT_EMPTY=$([ "$(ls -A app/src/androidTest)" ] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
+ id: check-androidTest
+ - name: Get min and target sdk
+ if: steps.check-androidTest.outputs.NOT_EMPTY == 'true'
+ id: get-sdk-version
+ run: |
+ echo "MIN_SDK_VERSION=$(cat app/build.gradle | grep minSdkVersion | rev | cut -d' ' -f 1 | rev)" >> $GITHUB_OUTPUT
+ echo "TARGET_SDK_VERSION=$(cat app/build.gradle | grep targetSdkVersion | rev | cut -d' ' -f 1 | rev)" >> $GITHUB_OUTPUT
+ - name: Get app ID
+ id: get-app-id
+ run: |
+ echo "APP_ID=$(cat app/build.gradle | grep applicationId | rev | cut -d' ' -f 1 | rev | tr -d '"')" >> $GITHUB_OUTPUT
+
+ test:
+ needs: check-if-tests-exist
+ if: needs.check-if-tests-exist.outputs.status == 'true'
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ api-level: [34, "${{ needs.check-if-tests-exist.outputs.min-sdk-version }}", "${{ needs.check-if-tests-exist.outputs.target-sdk-version }}"]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: 'recursive'
+
+ - name: Enable KVM group perms
+ 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
+ sudo udevadm trigger --name-match=kvm
+
+ - name: Gradle cache
+ uses: gradle/gradle-build-action@v3
+
+ - name: AVD cache
+ uses: actions/cache@v4
+ id: avd-cache
+ with:
+ path: |
+ ~/.android/avd/*
+ ~/.android/adb*
+ key: avd-${{ matrix.api-level }}
+
+ - name: Set up JDK environment
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: 17
+
+ - name: create AVD and generate snapshot for caching
+ if: steps.avd-cache.outputs.cache-hit != 'true'
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ api-level: ${{ matrix.api-level }}
+ target: ${{ matrix.api-level >= 30 && 'google_apis' || 'default' }}
+ arch: ${{ matrix.api-level < 21 && 'x86' || 'x86_64' }}
+ force-avd-creation: false
+ emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
+ disable-animations: false
+ script: echo "Generated AVD snapshot for caching."
+
+ - name: Run connected tests
+ uses: ReactiveCircus/android-emulator-runner@v2
+ with:
+ api-level: ${{ matrix.api-level }}
+ target: ${{ matrix.api-level >= 30 && 'google_apis' || 'default' }}
+ arch: ${{ matrix.api-level < 21 && 'x86' || 'x86_64' }}
+ force-avd-creation: false
+ emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
+ disable-animations: true
+ script: |
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}} || true
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}}.test || true
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}}.androidTest || true
+ chmod +x gradlew
+ ./gradlew :app:connectedCheck --stacktrace
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}} || true
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}}.test || true
+ adb uninstall ${{needs.check-if-tests-exist.outputs.app-id}}.androidTest || true
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
index ad4099a..6e50db1 100644
--- a/.github/workflows/changelog.yml
+++ b/.github/workflows/changelog.yml
@@ -2,7 +2,7 @@ name: Changelog Generation
on:
release:
- types: [published, released]
+ types: [published]
workflow_dispatch:
jobs:
@@ -16,6 +16,7 @@ jobs:
- uses: rhysd/changelog-from-release/action@v3
with:
file: CHANGELOG.md
+ pull_request: true
github_token: ${{ secrets.GITHUB_TOKEN }}
commit_summary_template: 'update changelog for %s changes'
args: -l 2
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..fe5b0a9
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,67 @@
+name: Continuous Integration
+on: [push, pull_request]
+
+jobs:
+ test:
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: "recursive"
+
+ - name: Set up JDK environment
+ uses: actions/setup-java@v3
+ with:
+ distribution: "zulu"
+ java-version: 17
+
+ - name: Make gradlew executable
+ run: chmod +x ./gradlew
+
+ - name: Setup Gradle
+ uses: gradle/gradle-build-action@v2
+
+ - name: Run local unit tests
+ run: bash ./gradlew test --stacktrace
+
+ build:
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: "recursive"
+
+ - name: Set up JDK environment
+ uses: actions/setup-java@v3
+ with:
+ distribution: "zulu"
+ java-version: 17
+
+ - name: Make gradlew executable
+ run: chmod +x ./gradlew
+
+ - name: Setup Gradle
+ uses: gradle/gradle-build-action@v2
+
+ - name: Run lint check
+ run: bash ./gradlew lint
+
+ - name: Upload lint result
+ uses: actions/upload-artifact@v4
+ with:
+ name: lint-results-debug
+ path: app/build/reports/lint-results-debug.html
+
+ - name: Build the app
+ run: bash ./gradlew build --stacktrace
+
+ - name: Build debug apk
+ run: bash ./gradlew assembleDebug
+
+ - name: Upload debug apk
+ uses: actions/upload-artifact@v4
+ with:
+ name: debug-apk
+ path: app/build/outputs/apk/debug/*.apk
\ No newline at end of file
diff --git a/app/src/androidTest/java/org/secuso/privacyfriendlycameraruler/ApplicationTest.java b/app/src/androidTest/java/org/secuso/privacyfriendlycameraruler/ApplicationTest.java
deleted file mode 100644
index d705ae3..0000000
--- a/app/src/androidTest/java/org/secuso/privacyfriendlycameraruler/ApplicationTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.secuso.privacyfriendlycameraruler;
-
-import android.app.Application;
-import android.test.ApplicationTestCase;
-
-/**
- * Testing Fundamentals
- */
-public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
-}
\ No newline at end of file