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 @@
+
+
+
+
+
+
+
+
+
+
+
+