* Support gallery messages
* Address review
* Remove unused function
* Fix indent
* Add "Gallery" message prefix
* Support galleries for image editing
* Fix tapping on a tile opens the last item
* Fix overflow count
* Add caption editing to gallery messages
* Use the new gallery string for prefix
* Lock sending galleries behind a feature flag
* Fix detekts
* Fix
* Ensure image edition is saved when navigating
* Fix sending media broken on edited gallery.
* Fix tests
* Order imports
* Remove unused parameters.
* Fix copyright header of new files.
* Fix Konsist test
* Extract new previews to a dedicated file.
* Sync strings
* Remove unused import
* Update screenshots
* Trigger CI
* Remove parameters with default value.
* More cleanup
* Restore sendAsFile behavior.
* Improve Preview.
* Improve Preview.
* Improve Preview.
* Fix gallery sending cancel and retry issue
* Ensure any previous job is cancelled.
* Fix issue in summary message
* Gallery feature is disabled by default.
* Kotlin convention
* Remove useless parenthesis
* Update screenshots
* Fix test
* List -> ImmutableList
* Remove useless code.
* Render formatted caption for attachment list.
* Replace set of Booleans by an enum
* Remove unused model for individual caption in a gallery Event.
* Fix tests
* Fix tests
* Rework MediaViewer entry point.
And ensure that the clicked image from the gallery is displayed first.
* Ensure gallery item can be click in the pinned message list
Improve the gallery item click handling code.
* Improve code and fix separator color
Closes#7101
* React on attachment item click
Improve code
* Improve code and support 0 items in gallery.
* Fix click on attachment item not rendering anything.
---------
Co-authored-by: Benoit Marty <benoitm@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
Co-authored-by: ElementBot <android@element.io>
- Use `uniffi.ruma_events` types for `MessageLikeEventType` and `StateEventType`.
- Fix tests: using those 2 classes can sometimes call the SDK under the hood, trying to load the native library. We ignore the tests that cause it for now.
* Update dependency com.google.firebase:firebase-bom to v34.15.0
* Replace deprecated FCM `token` usages with `installationId`
Renamed a few components, changed the behaviour of `FirebaseTokenRotator` so it doesn't save the new token, `FirebaseMessagingService` will do it in its `onRegistered` method
* Enable firebase messaging installation_id
* Make sure we delete the FID when unregistering the app from Firebase
* Add `runFirebaseTask` util to convert `Task<T>` into a `Result<T>` returned from a suspending function
Also, rename the use cases and make them use the `invoke` pattern
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
This operation is not done by Android by default and doesn't properly support CRLs (Certificate Revocation Lists) which can be a problem with CAs like Let's Encrypt.
`rustls-platform-verifier` automatically checks the user certs too, so there's no need to provide them separately.
This should also improve start times since we don't need to load the user certs when starting the app, which was a really slow operation.
* Hide message notification content by default when the app is locked
* Make this the default without an option
* Fix test
* Update DefaultNotificationDrawerManager.kt
* Fix
* RolesAndPermissionsNode does not need to implement RolesAndPermissionsNavigator and simplify the code.
* Remove default implementation in `RoomMemberListNavigator`
* Remove dead code.
* Fix test compilation issue
* Update jna monorepo to v5.19.1
* Move JNA dependency to version catalog
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
* Fix ANRs when calculating DB sizes for Sentry
Instead of using the SDK's `Client.getStoreSizes()` method, manually check the sizes using the file system.
For this, the `SessionPaths` need to be synchronously accessible from a `MatrixClient`. I removed `SessionPathsProvider` too since it's not needed anymore.
When a `MediaSource` is disposed, the local temp file associated to it will be deleted from disk.
When we try sharing a media from the media viewer screen to another room, this will dismiss the screen, which in turn will dispose of the media source and remove the file, which then fails to be shared.
If we copy it first and then make sure we delete it after trying to send it, it works fine.
The merged element-enterprise#261 well-known schema advertises the feature
under custom_recovery_passphrase (no _settings/_requirements suffix), so the
parser previously looking for custom_recovery_passphrase_settings would never
activate the flow. Update the @SerialName and drop the narrow "Requirements"
suffix from the type — the block is now general, extensible feature settings —
to mirror the .pkl CustomRecoveryPassphrase class. Bumps the enterprise
submodule to the matching consumer change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Update android.gradle.plugin to v9
* Separate extensions between app and library ones
`CommonExtension` has been split and its properties are now duplicated in `ApplicationExtension` and `LibraryExtension` without a shared interface, so we now need to duplicate the helper extension functions
* Bump Gradle wrapper to `9.3.1`
* Remove `kotlin-android` plugin usage: it's no longer needed
* Enable `resValues` build feature for the modules that have resources in custom variants like gplay, debug, etc.
Otherwise this now fails saying the resources are there but the feature is disabled
* Remove `retrofit` dependency from `:features:call:impl`
It wasn't in use and the build was failing
* Update kotlin to v2.4.0
* Update plugin paparazzi to v2.0.0-alpha05
* Update gradle wrapper to 9.5.1
./gradlew wrapper --gradle-version 9.5.1 --gradle-distribution-sha256-sum bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f
* Update com.android.tools.build:gradle to 9.2.1
* Update plugin sonarqube to v7.3.1.8318
* Kotlin 2.4.0
* Context parameters are enabled by default in Kotlin 2.4.0
* Fix code issue
* Fix record screenshot issue
* Workaround for https://github.com/cashapp/paparazzi/issues/2342
* Workaround for another issue with Paparazzi
* Remove unused import
* Update screenshots
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoitm@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
Co-authored-by: ElementBot <android@element.io>
When the homeserver advertises custom_recovery_passphrase_settings, always run
the custom passphrase flow, flooring min_character_count at 1 (covering missing,
zero, and negative values) so the derived passphrase can never be empty. Any
stronger minimum stays the operator's choice. Replaces the previous behaviour of
dropping the spec and falling back to the auto-generated key.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Publish the current queue head via a StateFlow so any host that subscribes
after a message is posted (e.g. a screen recomposing as a flow pops back to it)
still observes it. The previous mutex-gated flow delivered each message to a
single parked collector, which could starve the host actually on screen and
drop the snackbar. Adds a regression test for the late-subscriber case.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>