Commit Graph

203 Commits

Author SHA1 Message Date
Jorge Martin Espinosa f9112cc583 Collapse runs of deleted messages in the timeline (#7195)
* Collapse runs of deleted messages in the timeline (#7111)

* Collapse runs of deleted messages in the timeline

Collapse a run of three or more consecutive deleted messages into a single
expandable group, reusing the existing state-change grouping (the same way
element-web does it) instead of showing one "Message removed" placeholder per
deletion. The header shows the count only ("N deleted messages"); the Rust SDK
does not expose who performed the redaction, so we don't attribute it.

On by default. Runs shorter than three are left as individual placeholders, and
day dividers and read receipts are preserved (a run is broken by any
non-redacted item, so a day is never emptied).

Run the collapse as the final step of TimelineItemGrouper.group() instead of
a separate pass in the presenter, as suggested in review. Kept as its own
finalization step rather than via canBeGrouped() so the group stays all
redacted and the count-only header is preserved.
The group id is resolved through the grouper's existing id registry, like the
other groups, so it stays stable however the run grows and the user's
expand/collapse state is kept across timeline updates.

* Replace temporary strings with final ones

* Update screenshots

---------

Co-authored-by: Hi Dude! <klarkmonty@tuta.io>
Co-authored-by: manfrommedan <manfrommedan@users.noreply.github.com>
Co-authored-by: ElementBot <android@element.io>
2026-07-13 15:57:55 +02:00
Benoit Marty 355894cc74 Merge pull request #6944 from element-hq/feature/custom-recovery-key-wellknown
Add well-known parsing and extension seam for custom recovery passphrase
2026-06-17 13:58:22 +02:00
Benoit Marty 72e9371fa3 Custom recovery key: import strings from Localazy 2026-06-17 10:04:24 +02:00
Benoit Marty c88edc9621 Notification settings: pick custom sounds for messages and call ringtones (#6897)
* Notification settings: pick custom sounds for messages and call ringtones (#6702)

* Feature: add notification sound settings for messages and calls

* Add sound not available banner, accessibility checks

* Fix build and Konsist convention violations

- libraries:preferences:api now uses io.element.android-compose-library
  so NotificationSound's @Immutable annotation can resolve, matching the
  pattern in libraries:matrix:api.
- Rename SoundUnavailableBannerStateProvider to
  NotificationSoundUnavailableStateProvider so the class name contains
  the parameter type as required by KonsistClassNameTest.

* Suppress LargeClass on RoomListPresenterTest

The three new sound-unavailable tests pushed the class past Detekt's
default LargeClass threshold. Matches the suppression pattern already
used on five presenter test classes under features/messages/impl/test.

* NotificationSettingsView: guard ringtone-picker launchers in inspection mode

rememberLauncherForActivityResult requires a LocalActivityResultRegistryOwner,
which Paparazzi-driven preview snapshot tests don't provide, causing
NotificationSettingsViewPreview to throw IllegalStateException for every
preview parameter. Extract the click handlers into a helper that returns a
no-op when LocalInspectionMode.current is true; the runtime path is unchanged.

* Handle unresolved notification sounds mid session

* Quality checks, refactor mid session error ui

* Suppress detekt LargeClass on NotificationSettingsPresenterTest

* Remove notification sound resilience layer, replace with file copy

* Reselect element sound option, code cleanup

* Add element fade notification sound option

* Fix new file headers

* Revert to flowOf(Unit) for announcement service

* Add ringtone picker dialog to match message selector

* Update strings in conjunction with ios

* Update test to reflect new string

* Sync strings.

* Update screenshots

* Fix test

* Remove not properly located translations.
This will be fixed in the next String sync.

* Fix test on CI

---------

Co-authored-by: Jenna Vassar <jenna.vassar@toptal.com>
Co-authored-by: ElementBot <android@element.io>
2026-05-28 16:54:12 +02:00
Benoit Marty bb2779549e Update design and UX
Update and add tests
Improve preview
2026-05-22 10:29:36 +02:00
Benoit Marty 882d5577a7 Add "Mark as read", "Mark as unread" in room settings.
#6398
2026-05-19 18:06:11 +02:00
Benoit Marty 3ca06d71ef Rename keys on Localazy and add Black theme. 2026-05-12 17:57:55 +02:00
Benoit Marty 5508442222 [Link new device] Implement code confirmation screen. 2026-04-28 12:04:57 +02:00
Benoit Marty 8c5caabed4 Sign in with Classic 2026-04-13 11:16:05 +02:00
ganfra 1c5037f6e2 Add localazy config for location sharing 2026-03-24 11:13:40 +01:00
Benoit Marty faa97ff2f1 Update wording from "Enter recovery key" to "Use recovery key" 2026-03-16 17:19:49 +01:00
Skye Elliot 1e268b0709 Add history sharing badges to room details (#6132)
* feat: Add history sharing badges to room details view

* tests: Add snapshots for history sharing room details badges

* fix: Disable soft-wrapping in badges, use FlowRow

* tests: Add unit test for `RoomDetailsState` and history sharing badges.

* tests: Add `MatrixBadgeAtomNeutralWrappingPreview` to exceptions

* chore: Re-order `MatrixBadgeAtom` previews

* fix: Add `Immutable` annotation to `RoomHistoryVisibility`.

* fix: Correct translation for shared badge
2026-02-06 19:03:52 +00:00
Benoit Marty e8b14e62cf Sync all strings and fix compilation issue. 2026-01-26 14:13:06 +01:00
ganfra e9a55ea79a Sync strings 2026-01-21 19:49:47 +01:00
ganfra 57b89d241f Add proper localization for space room removal UI 2026-01-15 12:14:08 +01:00
ganfra 7645588b0f localazy : sync strings
# Conflicts:
#	features/roomdetails/impl/src/main/res/values/localazy.xml
#	features/securityandprivacy/impl/src/main/res/values/localazy.xml
#	libraries/ui-strings/src/main/res/values/localazy.xml
2025-12-23 15:23:45 +01:00
Benoit Marty 3ea10c2c62 Merge pull request #5909 from element-hq/feature/bma/qrCodeLogin
Link new device using QrCode - First version
2025-12-18 16:08:21 +01:00
Benoit Marty a073117d62 Link new device using QrCode. 2025-12-16 16:14:04 +01:00
ganfra c4a542dbf1 localazy: download strings to match module 2025-12-10 15:14:35 +01:00
ganfra c08de1f904 change(room details edit): move to his own module 2025-12-03 14:30:05 +01:00
ganfra c6ba2f5d10 change(security and privacy) : extract code to a separate module 2025-11-26 12:32:06 +01:00
ElementBot eff221645e Sync Strings (#5792)
* Sync Strings from Localazy

* Update localazy config and sync strings.

* Use the new localazy key.

* Sync strings again

* Sync strings again and fix compilation issue.

* Update screenshots

---------

Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com>
Co-authored-by: Benoit Marty <benoit@matrix.org>
2025-11-24 17:28:49 +01:00
Jorge Martin Espinosa 95c9e768f4 Use regex to check forbidden terms. (#5784)
We were returning and `Elementul` as a match for the forbidden term `Element`. It now checks for the full word.
2025-11-21 17:01:01 +01:00
Benoit Marty 017a259f1c Update notification content 2025-11-14 15:40:31 +01:00
Benoit Marty eb31505dc7 Copyright: Add Element Creations Ltd. copyright 2025-11-10 11:05:05 +01:00
Benoit Marty f86431e663 Copyright: Add final period 2025-11-10 10:13:41 +01:00
Benoit Marty c4e0370f41 Copyright: run command uv run license-editor --repository ../element-x-android 2025-11-10 10:09:26 +01:00
ganfra d9695ae6a0 change(roles and permissions): change title for space 2025-11-05 21:42:51 +01:00
ganfra 83a4457d6e Merge branch 'develop' into feature/fga/role_and_permissions_rework 2025-11-05 20:29:04 +01:00
ganfra ec207a548b change(roles and permissions): fix localazy strings 2025-11-03 18:35:18 +01:00
ganfra 4a56b13ecc feature(space) : update some strings 2025-10-31 15:01:03 +01:00
Benoit Marty a584a5c1c6 Update Localazy config and sync all the strings. 2025-10-07 15:53:53 +02:00
Jorge Martin Espinosa 9714abe032 Add Labs screen for beta testing of public features (#5465)
* Add Labs screen:

- Make `Feature` have an `isInLabs` boolean to distinguish private feature flags from public ones.
- Have `FeatureFlagsService` provide the list of available flags.
- Display the labs item in the settings screen only if there are available public features.
- Remove public feature toggles from developer options.
- Implement the labs screen with the public features.
- Add a clear cache step to the threads feature toggle
- Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2025-10-07 10:02:54 +00:00
Benoit Marty 2907f762f6 Announcement for Spaces 2025-10-03 00:15:27 +02:00
Benoit Marty 74c2ee46d8 Leave space - Add screen to leave a space. 2025-09-26 14:14:00 +02:00
Benoit Marty fa14e4c106 Add notification troubleshoot test about blocked users. 2025-09-23 08:59:40 +02:00
Benoit Marty 003249faa6 Use string from Localazy. 2025-08-14 11:46:28 +02:00
Benoit Marty 186d06c73e Cleanup Localazy config and do a sync. 2025-08-13 17:41:44 +02:00
ganfra 41cf1afce3 refactor (start chat) : start splitting things (create room, invite people, start chat) 2025-08-13 11:06:42 +02:00
Jorge Martin Espinosa adc61b3826 Add media file limit size warning and media quality selection (#5131)
* Add `VideoCompressorPreset` enum

This represents the different compression presets used for processing videos before uploading them

* Add `VideoCompressorHelper` util class to calculate the scaled output size of the video given an input size and its optimal bitrate

Also add `MediaOptimizationConfig` which will be used to decide how to apply compression in `MediaPreProcessor`

* Add `RustMatrixClient.getMaxFileUploadSize()` function and `MaxUploadSizeProvider` so we can import only this functionality into other components

* Try preloading the max file upload size the first time we get network connectivity - it's a best effort

This should help ensure we'll have this value available later, even if we still need to load it asynchronously.

* Split the `compressMedia` preference into `compressImages` and `compressMediaPreset`

* Modify the media processing parts to use the new classes and utils

* Add `MediaOptimizationSelectorPresenter`, which will retrieve the compression values and the max file upload size, also estimating the compressed video file sizes if needed.

* Add a feature flag to allow selecting the media upload quality per upload

* Integrate the previous changes with the attachments preview screen

Add strings from localazy too.

* Adapt the rest of the app calls to upload media to using the media optimization configs

* Allow modifying the default compression values in advanced settings, based on the feature flag value

* Pass the `fileSize` in `MediaUploadInfo` too, to be able to check it against the `maxUploadSize`

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2025-08-11 17:22:46 +02:00
Jorge Martin Espinosa 1a335698c0 Force last owner of a room to pass ownership when leaving (#5094)
* Move `ChangeRoles*` classes to their own module so they can be shared

* Hook the change roles screen to the leave room action, add confirmation dialogs

* Use enum instead of sealed interface for `ChangeRoomMemberRolesListType`

* Try to improve communications between nodes

* refactor (leave room) : makes sure to expose only necessary code from api module

* Add `:libraries:previewutils` module to share some test fixtures used for UI previews

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
Co-authored-by: ganfra <francoisg@matrix.org>
2025-08-05 17:24:14 +02:00
renovate[bot] 040fde7f22 Update dependency org.matrix.rustcomponents:sdk-android to v25.7.23 (#5073)
* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.23

* Adapt to SDK changes:

- Add 'creator' role, adapt existing logic to it.
- Remove `ReplyParameters`, replace with `EventId` where possible.
- Fix changes in OIDC auth methods.
- Add more join rules.

* Make sure both creators and users with power level >= 150 are displayed as 'owners' in the room member list.

* Don't close the roles and permissions screen if the user is a creator

* Use `MediaPreviewValue.DEFAULT` for `MediaPreviewConfig.DEFAULT` too

* Improve APIs around checking roles and power levels:
    - Ensure `RoomInfo.RoomPowerLevels.users` can't be directly used to check power levels since it can't check the power levels for creators.
    - Add a few helper functions to handle actions that relied on the previous `users` property, and docs to explain their usages.

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
2025-07-24 11:58:30 +02:00
Benoit Marty 36ad2432e1 Use icon for Spaces and update label and navigation bar design and behavior. 2025-07-08 10:28:26 +02:00
Benoit Marty 60083ad5ea Rename module roomlist to home 2025-06-27 15:24:50 +02:00
ganfra e2b1ab2632 Merge branch 'develop' into feature/fga/room-version-upgrade 2025-06-16 20:46:28 +02:00
Benoit Marty 8f94b4cd0e Merge pull request #4845 from element-hq/feature/bma/batteryOptimization
Add a banner to ask the user to disable battery optimization when Event cannot be resolved from Push
2025-06-16 11:19:15 +02:00
Jorge Martin Espinosa c598b0699e Disable BT audio devices for Element Call on Android < 12 (#4876)
Display an error dialog muting the call when a bluetooth audio device is selected on Android 11 or lower, re-enable the audio once another device is used.
2025-06-13 16:29:07 +02:00
Benoit Marty d15a352f74 Improve accessibility of Poll answers. 2025-06-13 10:15:37 +02:00
Benoit Marty d5dfceded7 Battery optimization banner: update wording. 2025-06-12 17:40:38 +02:00
ganfra 94e678a905 feature (room upgrade) : sync translations 2025-06-11 10:46:40 +02:00