diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7701762e..17af0eb7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -160,12 +160,363 @@ jobs:
name: build-files
path: ${{ env.GRADLE_DIR }}/app/.cxx/
- # Test_APK:
- # name: Test APK
- # runs-on: macos-latest
+ Test_APK:
+ name: Test APK
+ runs-on: macos-latest
+ env:
+ EMU_OPTS: -no-window -gpu swiftshader_indirect -no-boot-anim -verbose -camera-back virtualscene # -noaudio
+ EMU_PROFILE: pixel_2
+ EMU_AVD_NAME: Pixel_2
+ EMU_TARGET: playstore # google_apis
+ EMU_TIMEOUT: 1200
+
+ strategy:
+ matrix:
+ api-level: [30] # 29
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: 'true'
+
+ - name: Set Up JDK
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'oracle'
+ java-version: 17
+
+ # https://github.com/iterative/cml/issues/1377
+ - uses: actions/setup-node@v1
+ with:
+ node-version: '16'
+
+ # Only for Testing github-actions
+ - uses: actions-rs/toolchain@v1
+ if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ with:
+ profile: minimal
+ toolchain: stable
+ override: true
+ components: clippy
+ - uses: Swatinem/rust-cache@v2
+ if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ with:
+ cache-on-failure: true
+ workspaces: ${{env.GRADLE_DIR}}/ALVR/
+
+ - uses: gradle/gradle-build-action@v2
+ if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ with:
+ build-root-directory: ${{env.GRADLE_DIR}}
+ cache-read-only: ${{ false }}
+
+ # - name: AVD cache
+ # uses: actions/cache@v3
+ # id: avd-cache
+ # with:
+ # path: |
+ # ~/.android/avd/*
+ # ~/.android/adb*
+ # key: avd-${{ matrix.api-level }}
+
+ ## Create AVD with some redundancy - 3 Checks
+ - name: create AVD and generate snapshot for caching
+ if: steps.avd-cache.outputs.cache-hit != 'true'
+ uses: reactivecircus/android-emulator-runner@v2
+ id: avd_create_1
+ continue-on-error: true
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: false
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ emulator-boot-timeout: ${{ env.EMU_TIMEOUT }}
+ script: echo "Generated AVD snapshot for caching."
+
+ - name: create AVD and generate snapshot for caching try#2
+ if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_1.outcome == 'failure'
+ uses: reactivecircus/android-emulator-runner@v2
+ id: avd_create_2
+ continue-on-error: true
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: false
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ emulator-boot-timeout: ${{ env.EMU_TIMEOUT }}
+ script: echo "Generated AVD snapshot for caching."
+
+ - name: create AVD and generate snapshot for caching try#3
+ if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_2.outcome == 'failure'
+ uses: reactivecircus/android-emulator-runner@v2
+ id: avd_create_3
+ # continue-on-error: true # Fail, if failed in the 3rd try
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: false
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ emulator-boot-timeout: ${{ env.EMU_TIMEOUT }}
+ script: echo "Generated AVD snapshot for caching."
+ ## Redundancy End
+
+ - name: Prepare deps
+ shell: bash
+ run: |
+ ls -alh
+ cd code/mobile/android/PhoneVR
+ chmod +x prepare-alvr-deps.sh
+ bash prepare-alvr-deps.sh
+
+ - name: Change gradle wrapper permissions
+ run: |
+ echo "GLESDynamicVersion = on" >> ~/.android/advancedFeatures.ini # OpenGL3 Support on AVDs
+ cat ~/.android/advancedFeatures.ini
+
+ cd code/mobile/android/PhoneVR
+ chmod +x ./gradlew
+ ls -alh
+ ls -alh app
+
+ # Cache APK gradle tasks
+ - name: Build apk debug project (APK)
+ run: |
+ cd code/mobile/android/PhoneVR
+ ./gradlew :${{ env.MAIN_PROJECT_MODULE }}:assembleDebug --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+
+ - name: Start PVR ADB-Telnet Server
+ working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ run: |
+ brew install telnet
+
+ chmod +x pvr-adb-telnet.sh
+ bash pvr-adb-telnet.sh >> log.txt 2>&1 &
+
+ - name: Install recorder and record session
+ env:
+ SUFFIX: ${{ matrix.api-level }}
+ run: |
+ brew install glfw3
+ brew install glew
+ # brew install glxinfo
+
+ # glxinfo | grep -i opengl
+
+ brew install ffmpeg
+ ffmpeg -f avfoundation -i 0 -t 840 out_API$SUFFIX.mov &
+
+ ## Create AVD with some redundancy - 3 Checks
+ - name: Run tests
+ uses: reactivecircus/android-emulator-runner@v2
+ id: avd_run_1
+ continue-on-error: true
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: true
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ script: |
+ adb shell "logcat -b all -v color" &
+ ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb logcat -b all > logcat.log
+ jobs -p | xargs kill
+ # adb bugreport bugreport.zip # hangs indef here
+
+ - name: Run tests try#2
+ uses: reactivecircus/android-emulator-runner@v2
+ if: steps.avd_run_1.outcome == 'failure'
+ id: avd_run_2
+ continue-on-error: true
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: true
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ script: |
+ adb shell "logcat -b all -v color" &
+ ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb logcat -b all > logcat.log
+ jobs -p | xargs kill
+ # adb bugreport bugreport.zip # hangs indef here
+
+ - name: Run tests try#3
+ uses: reactivecircus/android-emulator-runner@v2
+ if: steps.avd_run_2.outcome == 'failure'
+ id: avd_run_3
+ # continue-on-error: true # Fail if even fail the 3rd try
+ with:
+ working-directory: ${{env.GRADLE_DIR}}
+ api-level: ${{ matrix.api-level }}
+ target: ${{ env.EMU_TARGET }}
+ force-avd-creation: false
+ emulator-options: ${{ env.EMU_OPTS }}
+ disable-animations: true
+ profile: ${{ env.EMU_PROFILE }}
+ avd-name: ${{ env.EMU_AVD_NAME }}
+ script: |
+ adb shell "logcat -b all -v color" &
+ ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb logcat -b all > logcat.log
+ jobs -p | xargs kill
+ # adb bugreport bugreport.zip # hangs indef here
+ ## Redundancy End
+
+ - name: Shutdown PVR ADB-Telnet Server and log
+ working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ if: always()
+ run: |
+ echo "shutdown meow !" >> pvr-adb-telnet.sd
+ cat log.txt
+
+ # build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/GPlay_Pixel_2_API_30(AVD) - 11/ALVRActivityTest_saveDeviceScreenBitmap.png
+ - uses: actions/upload-artifact@v3
+ if: always()
+ with:
+ name: Test results
+ path: |
+ **/app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*
+ **/app/build/reports
+ **/app/build/test-results
+ **/app/build/outputs/androidTest-results
+ ${{env.GRADLE_DIR}}/logcat.log
+ ./*.mov
+ ${{env.GRADLE_DIR}}/bugreport.zip
+
+ # app\build\outputs\androidTest-results\connected\TEST-GPlay_Pixel_2_API_30(AVD) - 11-_app-.xml
+ - name: Publish Test Results in Comment
+ uses: EnricoMi/publish-unit-test-result-action/composite@v2
+ # if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ if: always()
+ with:
+ report_individual_runs: true
+ report_suite_logs: 'any'
+ deduplicate_classes_by_file_name: true
+ comment_title: '🛠Test Results'
+ files: |
+ code/mobile/android/PhoneVR/app/build/outputs/androidTest-results/**/TEST-*.xml
+
+ - uses: iterative/setup-cml@v1
+ if: always()
+
+ - name: Publish Screenshots - Find Comment
+ if: always()
+ uses: peter-evans/find-comment@v2
+ id: fc
+ with:
+ issue-number: ${{ github.event.number }}
+ body-includes: '# 📷 Screenshots of tests:'
+ direction: last
+ comment-author: 'github-actions[bot]'
+
+ - name: Publish Screenshots - build comment
+ if: always()
+ env:
+ REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ EVENT: ${{ github.event_name }}
+ REF: ${{ github.ref }}
+ WK_DIR: ${{env.GRADLE_DIR}}
+ shell: bash
+ working-directory: ${{env.GRADLE_DIR}}
+ run: |
+ brew install gnu-sed # There are differences between default sed on MacOS and Linux (gnuSed)
+
+ echo "# 📷 Screenshots of tests:" >> comment.md
+ echo "" >> comment.md
+
+ # ls -alh
+ # ls -alh app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/
+ # stat 'app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2(AVD) - 11/InitActivityTest_saveDeviceScreenBitmap.png'
+
+ # for each AVD Image
+ for ss_test_avd in app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*; do
+
+ ls -alh "$ss_test_avd"
+ echo "$ss_test_avd"
+ ss_test_avd_desc=$(basename "$ss_test_avd")
+
+ echo "" >> comment.md
+ echo "### 📱 $ss_test_avd_desc" >> comment.md
+ echo "" >> comment.md
+
+ # for each .png in that AVD folder
+ for ss_test in "app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/$ss_test_avd_desc/"*.png; do
+
+ ss_test_desc=$(basename "$ss_test" .png)
+
+ echo "" >> comment.md
+ echo "#### 🔧 $ss_test_desc" >> comment.md
+ echo "" >> comment.md
+
+ echo "$WK_DIR + / + $ss_test"
+ echo '
' >> comment.md
+ cml-publish "$ss_test" | gsed -E 's/.+/
/' >> comment.md
+ echo '
' >> comment.md
+
+ done
+ done
+
+ if [ "$EVENT" == 'pull_request' ]
+ then
+ sha=${{ github.event.pull_request.head.sha}}
+ elif [ "$EVENT" == 'workflow_run' ]
+ then
+ sha=${{ github.event.workflow_run.head_sha}}
+ else
+ sha=$GITHUB_SHA
+ fi
+
+ echo "" >> comment.md
+ echo "###### For commit $sha" >> comment.md
+
+ - name: Publish Screehnshots - Update or Create Comment
+ if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ uses: peter-evans/create-or-update-comment@v3
+ with:
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ body-file: ${{env.GRADLE_DIR}}/comment.md
+ edit-mode: replace
+ issue-number: ${{ github.event.number }}
+
+ # - name: Save AVD Cache
+ # uses: actions/cache/save@v3
+ # if: always() && !steps.avd-cache.outputs.cache-hit
+ # with:
+ # path: |
+ # ~/.android/avd/*
+ # ~/.android/adb*
+ # key: avd-${{ matrix.api-level }}
+ # Test_APK_Linux:
+ # name: Test APK Linux
+ # runs-on: ubuntu-latest
+ # env:
+ # EMU_OPTS: -no-window -gpu swiftshader_indirect -no-boot-anim -verbose -camera-back virtualscene # -noaudio
+ # EMU_PROFILE: pixel_2
+ # EMU_AVD_NAME: Pixel_2
+ # EMU_TARGET: playstore # google_apis
+
# strategy:
# matrix:
- # api-level: [29]
+ # api-level: [30] # 29
# steps:
# - name: checkout
# uses: actions/checkout@v3
@@ -198,6 +549,65 @@ jobs:
# build-root-directory: ${{env.GRADLE_DIR}}
# cache-read-only: ${{ false }}
+ # # - name: AVD cache
+ # # uses: actions/cache@v3
+ # # id: avd-cache
+ # # with:
+ # # path: |
+ # # ~/.android/avd/*
+ # # ~/.android/adb*
+ # # key: avd-${{ matrix.api-level }}
+
+ # ## Create AVD with some redundancy - 3 Checks
+ # - name: create AVD and generate snapshot for caching
+ # if: steps.avd-cache.outputs.cache-hit != 'true'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_1
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+
+ # - name: create AVD and generate snapshot for caching try#2
+ # if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_1.outcome == 'failure'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_2
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+
+ # - name: create AVD and generate snapshot for caching try#3
+ # if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_2.outcome == 'failure'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_3
+ # # continue-on-error: true # Fail if even fail the 3rd try
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+ # ## Redundancy End
+
# - name: Prepare deps
# shell: bash
# run: |
@@ -208,46 +618,638 @@ jobs:
# - name: Change gradle wrapper permissions
# run: |
+ # echo "GLESDynamicVersion = on" >> ~/.android/advancedFeatures.ini # OpenGL3 Support on AVDs
+ # cat ~/.android/advancedFeatures.ini
+
# cd code/mobile/android/PhoneVR
# chmod +x ./gradlew
# ls -alh
# ls -alh app
-
- # - name: AVD cache
- # uses: actions/cache@v3
- # id: avd-cache
- # with:
- # path: |
- # ~/.android/avd/*
- # ~/.android/adb*
- # key: avd-${{ matrix.api-level }}
- # # Cache APK Debug
+ # # Cache APK gradle tasks
# - name: Build apk debug project (APK)
# run: |
# cd code/mobile/android/PhoneVR
# ./gradlew :${{ env.MAIN_PROJECT_MODULE }}:assembleDebug --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
- # - name: create AVD and generate snapshot for caching
- # if: steps.avd-cache.outputs.cache-hit != 'true'
- # uses: reactivecircus/android-emulator-runner@v2
+ # - name: Start PVR ADB-Telnet Server
+ # working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ # run: |
+ # brew install telnet
+
+ # chmod +x pvr-adb-telnet.sh
+ # bash pvr-adb-telnet.sh >> log.txt 2>&1 &
+
+ # - name: Install recorder and record session
+ # env:
+ # SUFFIX: ${{ matrix.api-level }}
+ # run: |
+ # brew install glfw3
+ # brew install glew
+ # # brew install glxinfo
+
+ # # glxinfo | grep -i opengl
+
+ # brew install ffmpeg
+ # ffmpeg -f avfoundation -i 0 -t 840 out_API$SUFFIX.mov &
+
+ # ## Create AVD with some redundancy - 3 Checks
+ # - name: Run tests
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_run_1
+ # continue-on-error: true
# with:
# working-directory: ${{env.GRADLE_DIR}}
# api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
# 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."
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: |
+ # adb shell "logcat -b all -v color" &
+ # ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb shell "logcat -b all" >> logcat.log
- # - name: Run tests
+ # # adb bugreport bugreport.zip # hangs indef here
+
+ # - name: Run tests try#2
# uses: reactivecircus/android-emulator-runner@v2
+ # if: steps.avd_run_1.outcome == 'failure'
+ # id: avd_run_2
+ # continue-on-error: true
# with:
# working-directory: ${{env.GRADLE_DIR}}
# api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
# force-avd-creation: false
- # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
+ # emulator-options: ${{ env.EMU_OPTS }}
# disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
# script: |
- # adb logcat -v color &
+ # adb shell "logcat -b all -v color" &
# ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
- # adb logcat > mobile/build/logcat.log
+ # adb shell "logcat -b all" >> logcat.log
+
+ # # adb bugreport bugreport.zip # hangs indef here
+
+ # - name: Run tests try#3
+ # uses: reactivecircus/android-emulator-runner@v2
+ # if: steps.avd_run_2.outcome == 'failure'
+ # id: avd_run_3
+ # # continue-on-error: true # Fail if even fail the 3rd try
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: |
+ # adb shell "logcat -b all -v color" &
+ # ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb shell "logcat -b all" >> logcat.log
+
+ # # adb bugreport bugreport.zip # hangs indef here
+ # ## Redundancy End
+
+ # - name: Shutdown PVR ADB-Telnet Server and log
+ # working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ # if: always()
+ # run: |
+ # echo "shutdown meow !" >> pvr-adb-telnet.sd
+ # cat log.txt
+
+ # # build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/GPlay_Pixel_2_API_30(AVD) - 11/ALVRActivityTest_saveDeviceScreenBitmap.png
+ # - uses: actions/upload-artifact@v3
+ # if: always()
+ # with:
+ # name: Test results
+ # path: |
+ # **/app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*
+ # **/app/build/reports
+ # **/app/build/test-results
+ # **/app/build/outputs/androidTest-results
+ # ${{env.GRADLE_DIR}}/logcat.log
+ # ./*.mov
+ # ${{env.GRADLE_DIR}}/bugreport.zip
+
+ # # app\build\outputs\androidTest-results\connected\TEST-GPlay_Pixel_2_API_30(AVD) - 11-_app-.xml
+ # - name: Publish Test Results in Comment
+ # uses: EnricoMi/publish-unit-test-result-action/composite@v2
+ # # if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ # if: always()
+ # with:
+ # report_individual_runs: true
+ # report_suite_logs: 'any'
+ # deduplicate_classes_by_file_name: true
+ # comment_title: '🛠Test Results'
+ # files: |
+ # code/mobile/android/PhoneVR/app/build/outputs/androidTest-results/**/TEST-*.xml
+
+ # # https://github.com/iterative/cml/issues/1377
+ # - uses: actions/setup-node@v1
+ # with:
+ # node-version: '16'
+
+ # - uses: iterative/setup-cml@v1
+ # if: always()
+
+ # - name: Publish Screenshots - Find Comment
+ # if: always()
+ # uses: peter-evans/find-comment@v2
+ # id: fc
+ # with:
+ # issue-number: ${{ github.event.number }}
+ # body-includes: '# 📷 Screenshots of tests:'
+ # direction: last
+ # comment-author: 'github-actions[bot]'
+
+ # - name: Publish Screenshots - build comment
+ # if: always()
+ # env:
+ # REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # EVENT: ${{ github.event_name }}
+ # REF: ${{ github.ref }}
+ # WK_DIR: ${{env.GRADLE_DIR}}
+ # shell: bash
+ # working-directory: ${{env.GRADLE_DIR}}
+ # run: |
+ # echo "# 📷 Screenshots of tests:" >> comment.md
+ # echo "" >> comment.md
+
+ # ls -alh
+ # ls -alh app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/
+ # stat 'app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2(AVD) - 11/InitActivityTest_saveDeviceScreenBitmap.png'
+
+ # # for each AVD Image
+ # for ss_test_avd in app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*; do
+
+ # ls -alh "$ss_test_avd"
+ # echo "$ss_test_avd"
+ # ss_test_avd_desc=$(basename "$ss_test_avd")
+
+ # echo "" >> comment.md
+ # echo "### 📱 $ss_test_avd_desc" >> comment.md
+ # echo "" >> comment.md
+
+ # # for each .png in that AVD folder
+ # for ss_test in "app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/$ss_test_avd_desc/"*.png; do
+
+ # ss_test_desc=$(basename "$ss_test" .png)
+
+ # echo "#### 🔧 $ss_test_desc" >> comment.md
+
+ # echo "$WK_DIR + / + $ss_test"
+ # echo '' >> comment.md
+ # cml-publish "$ss_test" | sed -E 's/.+/
/' >> comment.md
+ # echo '
' >> comment.md
+
+ # done
+ # done
+
+ # if [ "$EVENT" == 'pull_request' ]
+ # then
+ # sha=${{ github.event.pull_request.head.sha}}
+ # elif [ "$EVENT" == 'workflow_run' ]
+ # then
+ # sha=${{ github.event.workflow_run.head_sha}}
+ # else
+ # sha=$GITHUB_SHA
+ # fi
+
+ # echo "" >> comment.md
+ # echo "###### For commit $sha" >> comment.md
+
+ # - name: Publish Screehnshots - Update or Create Comment
+ # if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ # uses: peter-evans/create-or-update-comment@v3
+ # with:
+ # comment-id: ${{ steps.fc.outputs.comment-id }}
+ # body-file: comment.md
+ # edit-mode: replace
+ # issue-number: ${{ github.event.number }}
+
+ # # - name: Save AVD Cache
+ # # uses: actions/cache/save@v3
+ # # if: always() && !steps.avd-cache.outputs.cache-hit
+ # # with:
+ # # path: |
+ # # ~/.android/avd/*
+ # # ~/.android/adb*
+ # # key: avd-${{ matrix.api-level }}
+ # Test_APK_Win:
+ # runs-on: windows-latest
+ # steps:
+ # - name: Test HyperV
+ # shell: powershell
+ # run: |
+ # Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V
+ # get-service | findstr vmcompute
+
+ # - name: Test emu
+ # shell: bash
+ # run: |
+ # $ANDROID_HOME\\emulator\\emulator -accel-check
+
+ # Test_APK_Win:
+ # name: Test APK Win
+ # runs-on: windows-latest
+ # env:
+ # EMU_OPTS: -no-window -gpu swiftshader_indirect -no-boot-anim -verbose -camera-back virtualscene # -noaudio
+ # EMU_PROFILE: pixel_2
+ # EMU_AVD_NAME: Pixel_2
+ # EMU_TARGET: google_apis_playstore # google_apis
+ # MATRIX_E_SDK: 30
+ # MATRIX_AVD: test_win
+
+ # strategy:
+ # matrix:
+ # api-level: [30] # 29
+ # steps:
+ # - uses: FedericoCarboni/setup-ffmpeg@v2
+ # id: setup-ffmpeg
+ # - run: |
+ # ffmpeg -f gdigrab -framerate 30 -i desktop -t 120 out_API$SUFFIX.mov &
+ # npm install --global nircmd
+ # nircmd --help
+ # shell: bash
+
+ # - name: Create Android emulator
+ # shell: bash
+ # run: |
+ # # brew install intel-haxm
+ # # Install AVD files
+
+ # echo "y" | $ANDROID_HOME\\tools\\bin\\sdkmanager.bat --install 'system-images;android-'$MATRIX_E_SDK';google_apis_playstore;x86' > /dev/null
+ # echo "y" | $ANDROID_HOME\\tools\\bin\\sdkmanager.bat --licenses > /dev/null
+
+ # echo Creating emulator
+ # $ANDROID_HOME\\tools\\bin\\avdmanager.bat create avd -n $MATRIX_AVD -d pixel --package 'system-images;android-'$MATRIX_E_SDK';google_apis_playstore;x86'
+ # $ANDROID_HOME\\emulator\\emulator -list-avds
+ # if false; then
+ # emulator_config=~\\.android\\avd\\$MATRIX_AVD.avd\\config.ini
+ # # The following madness is to support empty OR populated config.ini files,
+ # # the state of which is dependant on the version of the emulator used (which we don't control),
+ # # so let's be defensive to be safe.
+ # # Replace existing config (NOTE we're on MacOS so sed works differently!)
+ # # sed -i .bak 's/hw.lcd.density=.*/hw.lcd.density=420/' "$emulator_config"
+ # # sed -i .bak 's/hw.lcd.height=.*/hw.lcd.height=1920/' "$emulator_config"
+ # # sed -i .bak 's/hw.lcd.width=.*/hw.lcd.width=1080/' "$emulator_config"
+ # # Or, add new config
+ # if ! grep -q "hw.lcd.density" "$emulator_config"; then
+ # echo "hw.lcd.density=420" >> "$emulator_config"
+ # fi
+ # if ! grep -q "hw.lcd.height" "$emulator_config"; then
+ # echo "hw.lcd.height=1920" >> "$emulator_config"
+ # fi
+ # if ! grep -q "hw.lcd.width" "$emulator_config"; then
+ # echo "hw.lcd.width=1080" >> "$emulator_config"
+ # fi
+ # echo "Emulator settings ($emulator_config)"
+ # cat "$emulator_config"
+ # fi
+
+ # - name: Start Android emulator
+ # timeout-minutes: 30 # ~4min normal - 3x DOSafety
+ # env:
+ # SUFFIX: ${{ matrix.android_avd }}-eAPI-${{ matrix.android_emu_version }}-${{ matrix.os }}
+ # shell: bash
+ # run: |
+ # echo "Starting emulator and waiting for boot to complete...."
+ # ls -la $ANDROID_HOME\\emulator
+ # nohup $ANDROID_HOME\\tools\\emulator -avd $MATRIX_AVD -gpu swiftshader_indirect -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 &
+ # $ANDROID_HOME\\platform-tools\\adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "wait..."; sleep 1; done; input keyevent 82'
+ # echo "Emulator has finished booting"
+ # $ANDROID_HOME\\platform-tools\\adb devices
+ # sleep 30
+
+ # nircmd savescreenshot screenshot$SUFFIX.jpg
+
+ # $ANDROID_HOME\\platform-tools\\adb exec-out screencap -p > emulator$SUFFIX.png
+
+ # ls -alh
+
+ # - name: checkout
+ # uses: actions/checkout@v3
+ # with:
+ # submodules: 'true'
+
+ # - name: Set Up JDK
+ # uses: actions/setup-java@v3
+ # with:
+ # distribution: 'oracle'
+ # java-version: 17
+
+ # # Only for Testing github-actions
+ # - uses: actions-rs/toolchain@v1
+ # if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ # with:
+ # profile: minimal
+ # toolchain: stable
+ # override: true
+ # components: clippy
+ # - uses: Swatinem/rust-cache@v2
+ # if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ # with:
+ # cache-on-failure: true
+ # workspaces: ${{env.GRADLE_DIR}}/ALVR/
+
+ # - uses: gradle/gradle-build-action@v2
+ # if: ${{ github.event.pull_request.head.repo.full_name != '${{ env.ORG_FULL }}' }} # Only run if not on master repo
+ # with:
+ # build-root-directory: ${{env.GRADLE_DIR}}
+ # cache-read-only: ${{ false }}
+
+ # # - name: AVD cache
+ # # uses: actions/cache@v3
+ # # id: avd-cache
+ # # with:
+ # # path: |
+ # # ~/.android/avd/*
+ # # ~/.android/adb*
+ # # key: avd-${{ matrix.api-level }}
+
+ # ## Create AVD with some redundancy - 3 Checks
+ # - name: create AVD and generate snapshot for caching
+ # if: steps.avd-cache.outputs.cache-hit != 'true'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_1
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+
+ # - name: create AVD and generate snapshot for caching try#2
+ # if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_1.outcome == 'failure'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_2
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+
+ # - name: create AVD and generate snapshot for caching try#3
+ # if: steps.avd-cache.outputs.cache-hit != 'true' && steps.avd_create_2.outcome == 'failure'
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_create_3
+ # # continue-on-error: true # Fail if even fail the 3rd try
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: false
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: echo "Generated AVD snapshot for caching."
+ # ## Redundancy End
+
+ # - name: Prepare deps
+ # shell: bash
+ # run: |
+ # ls -alh
+ # cd code/mobile/android/PhoneVR
+ # chmod +x prepare-alvr-deps.sh
+ # bash prepare-alvr-deps.sh
+
+ # - name: Change gradle wrapper permissions
+ # run: |
+ # echo "GLESDynamicVersion = on" >> ~/.android/advancedFeatures.ini # OpenGL3 Support on AVDs
+ # cat ~/.android/advancedFeatures.ini
+
+ # cd code/mobile/android/PhoneVR
+ # chmod +x ./gradlew
+ # ls -alh
+ # ls -alh app
+
+ # # Cache APK gradle tasks
+ # - name: Build apk debug project (APK)
+ # run: |
+ # cd code/mobile/android/PhoneVR
+ # ./gradlew :${{ env.MAIN_PROJECT_MODULE }}:assembleDebug --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+
+ # - name: Start PVR ADB-Telnet Server
+ # working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ # run: |
+ # brew install telnet
+
+ # chmod +x pvr-adb-telnet.sh
+ # bash pvr-adb-telnet.sh >> log.txt 2>&1 &
+
+ # - name: Install recorder and record session
+ # env:
+ # SUFFIX: ${{ matrix.api-level }}
+ # run: |
+ # brew install glfw3
+ # brew install glew
+ # brew install glxinfo
+
+ # # glxinfo | grep -i opengl
+
+ # brew install ffmpeg
+ # ffmpeg -f avfoundation -i 0 -t 840 out_API$SUFFIX.mov &
+
+ # ## Create AVD with some redundancy - 3 Checks
+ # - name: Run tests
+ # uses: reactivecircus/android-emulator-runner@v2
+ # id: avd_run_1
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: |
+ # adb shell "logcat -b all -v color" &
+ # ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb shell "logcat -b all" >> logcat.log
+
+ # - name: Run tests try#2
+ # uses: reactivecircus/android-emulator-runner@v2
+ # if: steps.avd_run_1.outcome == 'failure'
+ # id: avd_run_2
+ # continue-on-error: true
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: |
+ # adb shell "logcat -b all -v color" &
+ # ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb shell "logcat -b all" >> logcat.log
+
+ # - name: Run tests try#3
+ # uses: reactivecircus/android-emulator-runner@v2
+ # if: steps.avd_run_2.outcome == 'failure'
+ # id: avd_run_3
+ # # continue-on-error: true # Fail if even fail the 3rd try
+ # with:
+ # working-directory: ${{env.GRADLE_DIR}}
+ # api-level: ${{ matrix.api-level }}
+ # target: ${{ env.EMU_TARGET }}
+ # force-avd-creation: false
+ # emulator-options: ${{ env.EMU_OPTS }}
+ # disable-animations: true
+ # profile: ${{ env.EMU_PROFILE }}
+ # avd-name: ${{ env.EMU_AVD_NAME }}
+ # script: |
+ # adb shell "logcat -b all -v color" &
+ # ./gradlew connectedCheck --warning-mode=all --stacktrace -Dorg.gradle.java.home=${{env.JAVA_HOME}}
+ # adb shell "logcat -b all" >> logcat.log
+ # ## Redundancy End
+
+ # - name: Get Bug Report & tombstones
+ # if: always()
+ # run: |
+ # adb bugreport bugreport.zip
+
+ # - name: Shutdown PVR ADB-Telnet Server and log
+ # working-directory: ${{env.GRADLE_DIR}}/app/src/androidTest/java/viritualisres/phonevr/utils/
+ # if: always()
+ # run: |
+ # echo "shutdown meow !" >> pvr-adb-telnet.sd
+ # cat log.txt
+
+ # build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/GPlay_Pixel_2_API_30(AVD) - 11/ALVRActivityTest_saveDeviceScreenBitmap.png
+ # **/app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*
+ # **/app/build/reports
+ # **/app/build/test-results
+ # **/app/build/outputs/androidTest-results
+ # ${{env.GRADLE_DIR}}/logcat.log
+ # bugreport.zip
+ # - uses: actions/upload-artifact@v3
+ # if: always()
+ # with:
+ # name: Test results
+ # path: |
+ # .*.mov
+ # .*.png
+ # .*.jpg
+
+ # # app\build\outputs\androidTest-results\connected\TEST-GPlay_Pixel_2_API_30(AVD) - 11-_app-.xml
+ # - name: Publish Test Results in Comment
+ # uses: EnricoMi/publish-unit-test-result-action/composite@v2
+ # # if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ # if: always()
+ # with:
+ # report_individual_runs: true
+ # report_suite_logs: 'any'
+ # deduplicate_classes_by_file_name: true
+ # comment_title: '🛠Test Results'
+ # files: |
+ # code/mobile/android/PhoneVR/app/build/outputs/androidTest-results/**/TEST-*.xml
+
+ # - uses: iterative/setup-cml@v1
+ # if: always()
+
+ # - name: Publish Screenshots - Find Comment
+ # if: always()
+ # uses: peter-evans/find-comment@v2
+ # id: fc
+ # with:
+ # issue-number: ${{ github.event.number }}
+ # body-includes: '# 📷 Screenshots of tests:'
+ # direction: last
+ # comment-author: 'github-actions[bot]'
+
+ # - name: Publish Screenshots - build comment
+ # if: always()
+ # env:
+ # REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # EVENT: ${{ github.event_name }}
+ # REF: ${{ github.ref }}
+ # WK_DIR: ${{env.GRADLE_DIR}}
+ # shell: bash
+ # working-directory: ${{env.GRADLE_DIR}}
+ # run: |
+ # echo "# 📷 Screenshots of tests:" >> comment.md
+ # echo "" >> comment.md
+
+ # ls -alh
+ # ls -alh app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/
+
+ # # for each AVD Image
+ # for ss_test_avd in app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/*; do
+
+ # ls -alh "$ss_test_avd"
+ # echo "$ss_test_avd"
+ # ss_test_avd_desc=$(basename "$ss_test_avd")
+
+ # echo "" >> comment.md
+ # echo "### 📱 $ss_test_avd_desc" >> comment.md
+ # echo "" >> comment.md
+
+ # # for each .png in that AVD folder
+ # for ss_test in "app/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/$ss_test_avd_desc/"*.png; do
+
+ # ss_test_desc=$(basename "$ss_test" .png)
+
+ # echo "#### 🔧 $ss_test_desc" >> comment.md
+
+ # echo "$WK_DIR/$ss_test"
+ # echo '' >> comment.md
+ # cml-publish "$WK_DIR/$ss_test" | sed -E 's/.+/
/' >> comment.md
+ # echo '
' >> comment.md
+
+ # done
+ # done
+
+ # if [ "$EVENT" == 'pull_request' ]
+ # then
+ # sha=${{ github.event.pull_request.head.sha}}
+ # elif [ "$EVENT" == 'workflow_run' ]
+ # then
+ # sha=${{ github.event.workflow_run.head_sha}}
+ # else
+ # sha=$GITHUB_SHA
+ # fi
+
+ # echo "" >> comment.md
+ # echo "###### For commit $sha" >> comment.md
+
+ # - name: Publish Screehnshots - Update or Create Comment
+ # if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && always()
+ # uses: peter-evans/create-or-update-comment@v3
+ # with:
+ # comment-id: ${{ steps.fc.outputs.comment-id }}
+ # body-file: comment.md
+ # edit-mode: replace
+ # issue-number: ${{ github.event.number }}
+
+ # # - name: Save AVD Cache
+ # # uses: actions/cache/save@v3
+ # # if: always() && !steps.avd-cache.outputs.cache-hit
+ # # with:
+ # # path: |
+ # # ~/.android/avd/*
+ # # ~/.android/adb*
+ # # key: avd-${{ matrix.api-level }}
diff --git a/code/mobile/android/PhoneVR/app/build.gradle b/code/mobile/android/PhoneVR/app/build.gradle
index 997b2193..92ffe246 100644
--- a/code/mobile/android/PhoneVR/app/build.gradle
+++ b/code/mobile/android/PhoneVR/app/build.gradle
@@ -11,18 +11,21 @@ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
signingConfigs {
releaseconfig {
- if( System.env.github && System.env.github.event_name && System.env.github.event_name == 'pull_request' ) {
+ if( System.getenv('GITHUB_EVENT_NAME') == 'pull_request' || System.getenv("Store") == null || System.getenv("Key") == null ) {
// If its a PR Supply a dummy KeySigningConfig
+ // Or in Local env if Store and Keys are not present in ENV Vars do the same
storeFile file("PhoneVRKeyStorePR.jks")
storePassword "test1234"
keyAlias "PhoneVRKeyPR"
keyPassword "test1234"
+ println "Configuring releaseconfigs for testing a PR..."
}
else {
storeFile file(keystoreProperties['storeFile'])
storePassword System.getenv("Store")
keyAlias keystoreProperties['keyAlias']
keyPassword System.getenv("Key")
+ println "Configuring releaseconfigs for release (push) (not a PR)"
}
}
}
@@ -86,6 +89,17 @@ android {
path "CMakeLists.txt"
}
}
+ project.gradle.taskGraph.whenReady {
+ android.productFlavors.all { flavor ->
+ // Capitalize (as Gralde is case-sensitive).
+ def flavorName = flavor.name.substring(0, 1).toUpperCase() + flavor.name.substring(1)
+
+ // At last, configure.
+ "connected${flavorName}DebugAndroidTest" {
+ ignoreFailures = true
+ }
+ }
+ }
// CompileOptions required for ARCA
compileOptions {
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/ALVRActivityTest.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/ALVRActivityTest.kt
index 827c75cf..7f01b659 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/ALVRActivityTest.kt
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/ALVRActivityTest.kt
@@ -1,7 +1,6 @@
package viritualisres.phonevr
import android.annotation.SuppressLint
-import android.os.Environment.DIRECTORY_DOWNLOADS
import android.util.Log
import androidx.test.core.app.takeScreenshot
import androidx.test.core.graphics.writeToTestStorage
@@ -13,11 +12,17 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.rule.GrantPermissionRule
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiObjectNotFoundException
+import androidx.test.uiautomator.UiSelector
+import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
+import viritualisres.phonevr.utils.PVRInstrumentationBase
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
@@ -33,8 +38,8 @@ import java.lang.Thread.sleep
* or
* build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2_API_30(AVD) - 11
*/
-@RunWith(AndroidJUnit4::class)
-class ALVRActivityTest {
+// @RunWith(AndroidJUnit4::class)
+class ALVRActivityTest: PVRInstrumentationBase() {
private val TAG: String? = javaClass.simpleName
@@ -46,26 +51,6 @@ class ALVRActivityTest {
@get:Rule
var perms7: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.CAMERA);
- /*@get:Rule
- var perms3: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.VIBRATE);
-
- @get:Rule
- var perms1:GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE);
-
- @get:Rule
- var perms4: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.NFC);
-
- @get:Rule
- var perms5: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.INTERNET);
-
- @get:Rule
- var perms6: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_LOGS);
-
- @get:Rule
- var perms9: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WAKE_LOCK);
-
- @get:Rule
- var perms10: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_WIFI_STATE);*/
@get:Rule
var nameRule = TestName()
@@ -166,11 +151,48 @@ class ALVRActivityTest {
// set gravity acceleration g in Y Direction - real Mock
sendADBCommand("sensor set acceleration 9.77622:0:0");
}
- /**
- * Captures and saves an image of the entire device screen to storage.
- */
+
@SuppressLint("CheckResult")
- @Test
+ // @Test TODO: Fix Crash related to OpenGL on MacOS - after pulling upstream changes (for extra info, bug in alvr_client_core's frames)
+ // 05-01 07:58:27.665 7493 7493 F DEBUG : backtrace:
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #00 pc 00000b99 [vdso] (__kernel_vsyscall+9)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #01 pc 0005ad68 /apex/com.android.runtime/lib/bionic/libc.so (syscall+40) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #02 pc 00076511 /apex/com.android.runtime/lib/bionic/libc.so (abort+209) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #03 pc 002ff2de /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk (offset 0x150c000)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #04 pc 002ffe01 /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk (offset 0x150c000)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #05 pc 00300d6e /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk (offset 0x150c000)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #06 pc 002904cf /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk (offset 0x150c000) (alvr_render_lobby_opengl+127)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #07 pc 00062920 /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk!libnative-lib.so (offset 0x1e4f000) (Java_viritualisres_phonevr_ALVRActivity_renderNative+3968) (BuildId: 6c0e91c7da5ce75187f221277be2b84bed4be231)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #08 pc 00142132 /apex/com.android.art/lib/libart.so (art_quick_generic_jni_trampoline+82) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.666 7493 7493 F DEBUG : #09 pc 0013b922 /apex/com.android.art/lib/libart.so (art_quick_invoke_stub+338) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #10 pc 001d0381 /apex/com.android.art/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+241) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #11 pc 00386701 /apex/com.android.art/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+385) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.662 7333 7440 I CardboardSDK: PosePrediction::GetRotationFromGyroscope: Velocity really small, returning identity rotation.
+ // 05-01 07:58:27.667 5178 7519 I Fitness : OnPackageChangedOperation got intent: Intent { act=android.intent.action.PACKAGE_CHANGED dat=package:com.google.android.gms flg=0x45000010 cmp=com.google.android.gms/.chimera.PersistentIntentOperationService (has extras) } [CONTEXT service_id=17 ]
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #12 pc 0037aa3e /apex/com.android.art/lib/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+1070) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #13 pc 007a4179 /apex/com.android.art/lib/libart.so (MterpInvokeDirect+633) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #14 pc 001358a1 /apex/com.android.art/lib/libart.so (mterp_op_invoke_direct+33) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #15 pc 0000399c [anon:dalvik-classes3.dex extracted in memory from /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk!classes3.dex] (viritualisres.phonevr.ALVRActivity.access$300)
+ // 05-01 07:58:27.667 7493 7493 F DEBUG : #16 pc 007a505e /apex/com.android.art/lib/libart.so (MterpInvokeStatic+1454) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #17 pc 00135921 /apex/com.android.art/lib/libart.so (mterp_op_invoke_static+33) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #18 pc 00003880 [anon:dalvik-classes3.dex extracted in memory from /data/app/~~6OpgdUaw8JphsNXgyGM1Sg==/viritualisres.phonevr-NkgO07jPDvzXvA_dHjnXNA==/base.apk!classes3.dex] (viritualisres.phonevr.ALVRActivity$Renderer.onDrawFrame+4)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #19 pc 007a355e /apex/com.android.art/lib/libart.so (MterpInvokeInterface+2126) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #20 pc 001359a1 /apex/com.android.art/lib/libart.so (mterp_op_invoke_interface+33) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #21 pc 0034a3b4 /system/framework/framework.jar (offset 0x92b000) (android.opengl.GLSurfaceView$GLThread.guardedRun+1092)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #22 pc 007a44ae /apex/com.android.art/lib/libart.so (MterpInvokeDirect+1454) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #23 pc 001358a1 /apex/com.android.art/lib/libart.so (mterp_op_invoke_direct+33) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #24 pc 0034a9ac /system/framework/framework.jar (offset 0x92b000) (android.opengl.GLSurfaceView$GLThread.run+48)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #25 pc 0036fb02 /apex/com.android.art/lib/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.llvm.16375758241455872412)+370) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #26 pc 00379b00 /apex/com.android.art/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+176) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.668 7493 7493 F DEBUG : #27 pc 0078b325 /apex/com.android.art/lib/libart.so (artQuickToInterpreterBridge+1061) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #28 pc 0014220d /apex/com.android.art/lib/libart.so (art_quick_to_interpreter_bridge+77) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #29 pc 0013b922 /apex/com.android.art/lib/libart.so (art_quick_invoke_stub+338) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #30 pc 001d0381 /apex/com.android.art/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+241) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #31 pc 0062f37c /apex/com.android.art/lib/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+620) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #32 pc 0062f595 /apex/com.android.art/lib/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues<_jmethodID*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, jvalue const*)+85) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #33 pc 00697701 /apex/com.android.art/lib/libart.so (art::Thread::CreateCallback(void*)+1537) (BuildId: 8191579dfafff37a5cbca70f9a73020f)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #34 pc 000e6974 /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+100) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
+ // 05-01 07:58:27.669 7493 7493 F DEBUG : #35 pc 00078567 /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+71) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
@Throws(IOException::class)
fun saveDeviceScreenBitmap() {
// SKIP Cardboard API Asking to Scan QR
@@ -180,7 +202,6 @@ class ALVRActivityTest {
// View is not in hierarchy - which is okay
}
- Log.d(TAG, "saveDeviceScreenBitmap: Test")
rotateAVDLandscape()
waitForADBTelnetServer() // Wait for ADBTelnetServer to execute rotation
@@ -189,6 +210,7 @@ class ALVRActivityTest {
// Wait for Rendering to settle
sleep(1000)
+ Log.d(TAG, "saveDeviceScreenBitmap: Executed AVD Commands, Taking screenshot...")
takeScreenshot()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}")
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/AppPackageTest.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/AppPackageTest.kt
index 57b3956b..98e1610f 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/AppPackageTest.kt
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/AppPackageTest.kt
@@ -2,14 +2,18 @@ package viritualisres.phonevr
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
+import org.junit.BeforeClass
+import viritualisres.phonevr.utils.PVRInstrumentationBase
@RunWith(AndroidJUnit4::class)
-class AppPackageTest {
+class AppPackageTest: PVRInstrumentationBase() {
@Test
fun useAppContext() {
// Context of the app under test.
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/InitActivityTest.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/InitActivityTest.kt
index 520bd1a1..bdd78e5e 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/InitActivityTest.kt
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/InitActivityTest.kt
@@ -9,10 +9,15 @@ import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
+import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
+import viritualisres.phonevr.utils.PVRInstrumentationBase
import java.io.IOException
import java.lang.Thread.sleep
@@ -26,7 +31,7 @@ import java.lang.Thread.sleep
* build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2_API_30(AVD) - 11
*/
@RunWith(AndroidJUnit4::class)
-class InitActivityTest {
+class InitActivityTest: PVRInstrumentationBase() {
// a handy JUnit rule that stores the method name, so it can be used to generate unique
// screenshot files per test method
@get:Rule
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/MainActivityTest.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/MainActivityTest.kt
index 8797ffe7..c5106875 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/MainActivityTest.kt
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/MainActivityTest.kt
@@ -7,11 +7,16 @@ import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
+import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
+import viritualisres.phonevr.utils.PVRInstrumentationBase
import java.io.IOException
import java.lang.Thread.sleep
@@ -26,7 +31,7 @@ import java.lang.Thread.sleep
* build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2_API_30(AVD) - 11
*/
@RunWith(AndroidJUnit4::class)
-class MainActivityTest {
+class MainActivityTest: PVRInstrumentationBase() {
@get:Rule
var perms1:GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE);
@@ -34,30 +39,6 @@ class MainActivityTest {
@get:Rule
var perms2:GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
- /*@get:Rule
- var perms3: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.VIBRATE);
-
- @get:Rule
- var perms4: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.NFC);
-
- @get:Rule
- var perms5: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.INTERNET);
-
- @get:Rule
- var perms6: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_LOGS);
-
- @get:Rule
- var perms7: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.CAMERA);
-
- @get:Rule
- var perms8: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.RECORD_AUDIO);
-
- @get:Rule
- var perms9: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WAKE_LOCK);
-
- @get:Rule
- var perms10: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_WIFI_STATE);*/
-
@get:Rule
var nameRule = TestName()
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/SettingsActivityTest.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/SettingsActivityTest.kt
index 539c3411..cea60f11 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/SettingsActivityTest.kt
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/SettingsActivityTest.kt
@@ -7,10 +7,15 @@ import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
+import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
+import viritualisres.phonevr.utils.PVRInstrumentationBase
import java.io.IOException
import java.lang.Thread.sleep
@@ -25,7 +30,7 @@ import java.lang.Thread.sleep
* build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/Pixel_2_API_30(AVD) - 11
*/
@RunWith(AndroidJUnit4::class)
-class SettingsActivityTest {
+class SettingsActivityTest: PVRInstrumentationBase() {
// a handy JUnit rule that stores the method name, so it can be used to generate unique
// screenshot files per test method
@get:Rule
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/PVRInstrumentationBase.kt b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/PVRInstrumentationBase.kt
new file mode 100644
index 00000000..aadd1cf4
--- /dev/null
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/PVRInstrumentationBase.kt
@@ -0,0 +1,82 @@
+package viritualisres.phonevr.utils
+
+import android.util.Log
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.base.DefaultFailureHandler
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.rule.GrantPermissionRule
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
+import org.junit.Before
+import org.junit.BeforeClass
+import org.junit.Rule
+import java.util.Locale
+
+open class PVRInstrumentationBase {
+ //Running count of the number of Android Not Responding dialogues to prevent endless dismissal.
+ private var anrCount = 0
+ //`RootViewWithoutFocusException` class is private, need to match the message (instead of using type matching).
+ private val rootViewWithoutFocusExceptionMsg = java.lang.String.format(
+ Locale.ROOT,
+ "Waited for the root of the view hierarchy to have "
+ + "window focus and not request layout for 10 seconds. If you specified a non "
+ + "default root matcher, it may be picking a root that never takes focus. "
+ + "Root:")
+
+ /*@get:Rule
+ var perms2: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+ @get:Rule
+ var perms8: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.RECORD_AUDIO);
+
+ @get:Rule
+ var perms7: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.CAMERA);
+ @get:Rule
+ var perms3: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.VIBRATE);
+
+ @get:Rule
+ var perms1:GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE);
+
+ @get:Rule
+ var perms4: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.NFC);
+
+ @get:Rule
+ var perms5: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.INTERNET);
+
+ @get:Rule
+ var perms6: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_LOGS);
+
+ @get:Rule
+ var perms9: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WAKE_LOCK);
+
+ @get:Rule
+ var perms10: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_WIFI_STATE);*/
+
+ @Before
+ fun setUpHandler() {
+ Espresso.setFailureHandler { error, viewMatcher ->
+
+ if (error.message!!.contains(rootViewWithoutFocusExceptionMsg) && anrCount < 3) {
+ anrCount++
+ dismissANRSystemDialog()
+ } else { // chain all failures down to the default espresso handler
+ DefaultFailureHandler(InstrumentationRegistry.getInstrumentation().targetContext).handle(error, viewMatcher)
+ }
+ }
+ }
+
+ companion object {
+ // This is a specific fix for CIs (github-actions, etc) to close ANR dialog
+ @JvmStatic
+ @BeforeClass
+ fun dismissANRSystemDialog() {
+ Log.d("PVR-Test-Debug", "dismissANRSystemDialog: Called")
+ val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+ // If running the device in English Locale
+ val waitButton = device.findObject(UiSelector().textContains("wait"))
+ if (waitButton.exists()) {
+ waitButton.click()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/pvr-adb-telnet.sh b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/pvr-adb-telnet.sh
index c576ed59..b8cec556 100644
--- a/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/pvr-adb-telnet.sh
+++ b/code/mobile/android/PhoneVR/app/src/androidTest/java/viritualisres/phonevr/utils/pvr-adb-telnet.sh
@@ -3,12 +3,14 @@
cmdFile="/data/data/viritualisres.phonevr/files/pvr-adb-telnet" # Will made and written by Android; Deleted by Server
lockFile="/sdcard/pvr-adb-telnet.lock" # will be made, written and deleted by Server
shutdownFile="/data/data/viritualisres.phonevr/files/pvr-adb-telnet.sd" # will be made by Android; Deleted by Server
+shutdownFile2="pvr-adb-telnet.sd" # made by host (the one who runs this server)
+
lenShutdownFile=0
GREEN='\033[0;32m'
NC='\033[0m'
-while [ $lenShutdownFile -eq 0 ]
+while [ $lenShutdownFile -eq 0 ] && [ ! -e $shutdownFile2 ]
do
cmd=$(adb shell "run-as viritualisres.phonevr cat $cmdFile")
len=${#cmd}
@@ -45,4 +47,5 @@ done
echo "Shutting down Server..."
adb shell "run-as viritualisres.phonevr rm -f $shutdownFile"
+rm -f $shutdownFile2
echo "Server down."
\ No newline at end of file
diff --git a/code/mobile/android/PhoneVR/app/src/main/AndroidManifest.xml b/code/mobile/android/PhoneVR/app/src/main/AndroidManifest.xml
index 61d68bf1..a0e97b0d 100644
--- a/code/mobile/android/PhoneVR/app/src/main/AndroidManifest.xml
+++ b/code/mobile/android/PhoneVR/app/src/main/AndroidManifest.xml
@@ -13,7 +13,7 @@
+