diff --git a/.github/workflows/maestro-local.yml b/.github/workflows/maestro-local.yml index b07eb196fd..cfb743934f 100644 --- a/.github/workflows/maestro-local.yml +++ b/.github/workflows/maestro-local.yml @@ -11,7 +11,7 @@ env: CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache ARCH: x86_64 DEVICE: pixel_7_pro - API_LEVEL: 35 + API_LEVEL: 33 TARGET: google_apis jobs: @@ -56,7 +56,7 @@ jobs: maestro-cloud: name: Maestro test suite runs-on: ubuntu-latest - needs: [build-apk] + needs: [ build-apk ] # Allow one per PR. concurrency: group: ${{ format('maestro-{0}', github.ref) }} @@ -80,6 +80,7 @@ jobs: - name: Install maestro run: curl -fsSL "https://get.maestro.mobile.dev" | bash - name: Run Maestro tests in emulator + id: maestro_test uses: reactivecircus/android-emulator-runner@v2 continue-on-error: true env: @@ -109,3 +110,8 @@ jobs: retention-days: 5 overwrite: true if-no-files-found: error + - name: Fail the workflow in case of error in test + if: steps.maestro_test.outcome != 'success' + run: | + echo "Maestro tests failed. Please check the logs." + exit 1 diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml new file mode 100644 index 0000000000..56d40d0cf6 --- /dev/null +++ b/.github/workflows/post-release.yml @@ -0,0 +1,28 @@ +name: Post-release + +on: + push: + tags: + - 'v*' + +jobs: + post-release: + runs-on: ubuntu-latest + # Skip in forks + if: github.repository == 'element-hq/element-x-android' + + steps: + - name: Trigger pipeline + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.ENTERPRISE_ACTIONS_TOKEN }} + script: | + const tag = context.ref.replace('refs/tags/', ''); + const inputs = { git_tag: tag }; + await github.rest.actions.createWorkflowDispatch({ + owner: 'element-hq', + repo: 'element-enterprise', + workflow_id: 'pipeline-android.yml', + ref: 'main', + inputs: inputs + }); diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 580f3799dd..a0ffe74f6f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -82,7 +82,7 @@ jobs: # https://github.com/codecov/codecov-action - name: ☂️ Upload coverage reports to codecov - uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2 + uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 131e44d798..1e16934f61 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.maestro/allTests.yaml b/.maestro/allTests.yaml index 927a1cb0e5..ecbde4dab9 100644 --- a/.maestro/allTests.yaml +++ b/.maestro/allTests.yaml @@ -1,4 +1,5 @@ appId: ${MAESTRO_APP_ID} +androidWebViewHierarchy: devtools --- ## Check that all env variables required in the whole test suite are declared (to fail faster) - runScript: ./scripts/checkEnv.js diff --git a/.maestro/tests/account/login.yaml b/.maestro/tests/account/login.yaml index 18054297d6..f3f584ef76 100644 --- a/.maestro/tests/account/login.yaml +++ b/.maestro/tests/account/login.yaml @@ -7,22 +7,39 @@ appId: ${MAESTRO_APP_ID} - runFlow: ../assertions/assertLoginDisplayed.yaml - tapOn: id: "login-continue" +## MAS page +## Conditional workflow to pass the Chrome first launch welcome page. +- runFlow: + when: + visible: 'Use without an account' + commands: + - tapOn: "Use without an account" +## For older chrome versions +- runFlow: + when: + visible: 'Accept & continue' + commands: + - tapOn: "Accept & continue" +- runFlow: + when: + visible: 'No thanks' + commands: + - tapOn: "No thanks" +## Working when running Maestro locally, but not on the CI yet. +- extendedWaitUntil: + visible: + id: "form-1" + timeout: 10000 - tapOn: - id: "login-email_username" + id: "form-1" - inputText: ${MAESTRO_USERNAME} - pressKey: Enter - tapOn: - id: "login-password" -- inputText: "wrong-password" -- pressKey: Enter -- tapOn: "Continue" -- tapOn: "OK" -- tapOn: - id: "login-password" -- eraseText: 20 + id: "form-3" - inputText: ${MAESTRO_PASSWORD} - pressKey: Enter - tapOn: "Continue" +## Back to native world - runFlow: ../assertions/assertSessionVerificationDisplayed.yaml - runFlow: ./verifySession.yaml - runFlow: ../assertions/assertAnalyticsDisplayed.yaml diff --git a/.maestro/tests/account/verifySession.yaml b/.maestro/tests/account/verifySession.yaml index a16322543f..f1f4552709 100644 --- a/.maestro/tests/account/verifySession.yaml +++ b/.maestro/tests/account/verifySession.yaml @@ -8,6 +8,6 @@ appId: ${MAESTRO_APP_ID} - hideKeyboard - tapOn: "Continue" - extendedWaitUntil: - visible: "Device verified" + visible: "Verification complete" timeout: 30000 - tapOn: "Continue" diff --git a/.maestro/tests/roomList/createAndDeleteDM.yaml b/.maestro/tests/roomList/createAndDeleteDM.yaml index 6e0d55ab26..7e33fd1d15 100644 --- a/.maestro/tests/roomList/createAndDeleteDM.yaml +++ b/.maestro/tests/roomList/createAndDeleteDM.yaml @@ -7,8 +7,9 @@ appId: ${MAESTRO_APP_ID} - tapOn: text: ${MAESTRO_INVITEE1_MXID} index: 1 +- tapOn: "Send invite" - takeScreenshot: build/maestro/330-createAndDeleteDM - tapOn: "maestroelement2" - scroll -- tapOn: "Leave conversation" +- tapOn: "Leave room" - tapOn: "Leave" diff --git a/.maestro/tests/roomList/timeline/call/call.yaml b/.maestro/tests/roomList/timeline/call/call.yaml new file mode 100644 index 0000000000..e390d0a3a1 --- /dev/null +++ b/.maestro/tests/roomList/timeline/call/call.yaml @@ -0,0 +1,13 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: "Start a call" +- takeScreenshot: build/maestro/700-Call +- extendedWaitUntil: + visible: "maestroelement" + timeout: 10000 +- takeScreenshot: build/maestro/710-Call +# Hangup +- tapOn: "End call" +- extendedWaitUntil: + visible: "MyRoom" + timeout: 10000 diff --git a/.maestro/tests/roomList/timeline/timeline.yaml b/.maestro/tests/roomList/timeline/timeline.yaml index 5f85366e9e..d82c5ea1ff 100644 --- a/.maestro/tests/roomList/timeline/timeline.yaml +++ b/.maestro/tests/roomList/timeline/timeline.yaml @@ -6,5 +6,6 @@ appId: ${MAESTRO_APP_ID} - runFlow: messages/text.yaml - runFlow: messages/location.yaml - runFlow: messages/poll.yaml +- runFlow: call/call.yaml - back - runFlow: ../../assertions/assertHomeDisplayed.yaml diff --git a/CHANGES.md b/CHANGES.md index 04a7fa528e..b06cdd6603 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,50 @@ + + +Changes in Element X v25.05.4 +============================= + +Rust SDK: https://github.com/matrix-org/matrix-rust-sdk/releases/tag/matrix-sdk-ffi%2F20250521 + +## What's Changed +### 🙌 Improvements +* Change (report room) : check if server supports the report room api by @ganfra in https://github.com/element-hq/element-x-android/pull/4718 +### 🐛 Bugfixes +* Improve audio focus management by @bmarty in https://github.com/element-hq/element-x-android/pull/4707 +* When transcoding a video fails, send it as a file by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4257 +* Disable mutliple click (parallel or serial) on a room by @bmarty in https://github.com/element-hq/element-x-android/pull/4683 +* Fix generic mime type used when externally sharing several files by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4715 +* Fix issues on JoinedRoom / BaseRoom by @bmarty in https://github.com/element-hq/element-x-android/pull/4724 +* Use the right live timeline instance in `RustRoomFactory` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4745 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4739 +### 🧱 Build +* Ensure the CI is marked as failed when Maestro test is failing by @bmarty in https://github.com/element-hq/element-x-android/pull/4700 +* Trigger pipeline build when a release tag is pushed by @bmarty in https://github.com/element-hq/element-x-android/pull/4741 +* Fix compilation issues. by @bmarty in https://github.com/element-hq/element-x-android/pull/4750 +### 📄 Documentation +* README.md: fix broken link by @richvdh in https://github.com/element-hq/element-x-android/pull/4728 +### Dependency upgrades +* chore(config): migrate renovate config by @renovate in https://github.com/element-hq/element-x-android/pull/4688 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.13 by @renovate in https://github.com/element-hq/element-x-android/pull/4716 +* fix(deps): update dependency io.sentry:sentry-android to v8.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4717 +* chore(deps): update plugin sonarqube to v6.2.0.5505 by @renovate in https://github.com/element-hq/element-x-android/pull/4725 +* fix(deps): update dependency com.posthog:posthog-android to v3.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4723 +* fix(deps): update dependency com.squareup.retrofit2:retrofit-bom to v2.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4727 +* chore(deps): update codecov/codecov-action action to v5.4.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4730 +* fix(deps): update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4713 +* fix(deps): update dependency com.squareup.retrofit2:retrofit-bom to v3 by @renovate in https://github.com/element-hq/element-x-android/pull/4729 +* fix(deps): update kotlinpoet to v2.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4732 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.21 by @renovate in https://github.com/element-hq/element-x-android/pull/4759 +### Others +* Remove event cache feature flag by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4719 +* Check homeserver when login using qr code by @bmarty in https://github.com/element-hq/element-x-android/pull/4708 +* Merge on boarding module to login module by @bmarty in https://github.com/element-hq/element-x-android/pull/4746 +* Allow configuration to provide multiple account providers. by @bmarty in https://github.com/element-hq/element-x-android/pull/4742 +* Reduce API of JoinedRoom, caller must use the Timeline API from liveTimeline instead by @bmarty in https://github.com/element-hq/element-x-android/pull/4731 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.05.3...v25.05.4 + Changes in Element X v25.05.3 ============================= diff --git a/README.md b/README.md index 37cfc58e9b..14acef0de2 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Just clone the project and open it in Android Studio. Make sure to select the `app` configuration when building (as we also have sample apps in the project). To build against a local copy of the Rust SDK, see the [Developer -onboarding](docs/_developer_onboarding.md#build-the-sdk-locally) instructions. +onboarding](docs/_developer_onboarding.md#building-the-sdk-locally) instructions. ## Support diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c26c9a5a51..6619603f93 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,11 +34,17 @@ android:value='androidx.startup' /> + @@ -54,6 +60,9 @@ android:host="open" android:scheme="elementx" /> + @@ -80,6 +89,21 @@ + + + + + + + + + + + +