Commit Graph

155 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 a5d8b6eb2a Merge branch 'develop' into feat/skin-tone-picker 2026-07-07 15:21:27 +02:00
Benoit Marty 243acf1ee0 Add more screenshots 2026-07-07 15:19:18 +02:00
Benoit Marty ac1be8c87a Merge branch 'develop' into feature/bma/scroll-to-unread-messages 2026-07-03 14:30:14 +02:00
bxdxnn 87aff40b26 Support gallery messages (#6519)
* 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>
2026-06-26 16:00:56 +02:00
Jorge Martín bfcce0e94b Tweak Konsist check to allow LongPress actions 2026-06-01 11:38:35 +02:00
Jenna Vassar 8d8ac9373e Rename preview to reflect actual state 2026-05-11 12:27:00 -07:00
Jenna Vassar 0daf7ecc7d Konsist fixes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 06:49:42 -07:00
Jenna Vassar 7148f2f28f Semantic fixes: clearer naming conventions, when statements 2026-05-01 09:01:32 -07:00
Jenna Vassar 9f26079b84 Add missing preview: both fabs have counts 2026-04-29 16:34:47 -07:00
Jenna Vassar 7f5ce76860 Feature: add jump to unread button with badge count 2026-04-29 15:41:05 -07:00
Benoit Marty ae94e0c746 Merge pull request #6441 from timurgilfanov/feature-oled-black
Add Black theme option for battery saving on OLED displays
2026-04-17 15:41:49 +02:00
Jorge Martin Espinosa a341a1a59e Replace rustls-platform-verifier-android.aar with single class (#6610)
* Replace the `rustls-platform-verifier-android.aar` with the actual source code

* Exclude the platform-verifier code from linters

* Add manual update instructions

* Exclude from Kover too
2026-04-17 14:48:50 +02:00
Timur Gilfanov d0dcbab750 Merge branch 'develop' into feature-oled-black 2026-03-30 11:08:53 +04:00
Timur Gilfanov a96c146d30 Introduce "Black" theme and refactor theme handling
* Add `Theme.Black` to the `Theme` enum and update `isDark()` to include it.
* Refactor `ElementTheme` to accept a `Theme` object instead of a `darkTheme` boolean, allowing for more specific color mapping (e.g., setting `bgCanvasDefault` to `Color.Black` for the Black theme).
* Update `AdvancedSettingsPresenter` and `AdvancedSettingsState` to include "Black" as a user-selectable theme option.
* Adjust `ElementThemeApp` and `MaterialTextPreview` to handle the expanded theme selection.
* Add `ElementPreviewBlack` and update existing preview components to support the new theme.
* Update Konsist tests to ensure `@PreviewsDayNight` annotated functions don't have "BlackPreview" suffix.
2026-03-23 15:26:16 +04:00
Benoit Marty 6a646550c8 Improve preview by adding a background color. 2026-03-11 15:43:15 +01:00
Jorge Martin Espinosa e821f75a88 Add code to help debugging the saved nav state graph (#6295)
* Add code to help debugging the saved nav state graph: this would help us diagnose the `TransactionTooLargeException` reports we've been seeing for months.
2026-03-06 14:44:30 +00:00
Benoit Marty 86dea41951 Fix Konsist test. 2026-02-25 15:51:21 +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
ganfra c7015c367c Add tests for SpaceFiltersPresenter and SpaceFiltersView and fix quality 2026-02-04 14:42:57 +01:00
Skye Elliot 03bd85b3fc Remove "history may be shared" banner. (#6087)
* Revert "Add alert to encrypted rooms with visible history (Android). (#5709)"

This reverts commit 59f51d8627.

* fix: Restore identity state change preview and snapshot.
2026-01-27 14:15:41 +00:00
Jorge Martin Espinosa 62768359cb Create a new room in a space (#6061)
* Add `SpaceService.editableSpaces` and `SpaceService.addChildToSpace`

* Add `parentSpace` to `CreateRoomConfig`

* Allow setting a parent space to a room in `ConfigureRoomPresenter`, make sure the room is added to the parent space when creating it

* `ConfigureRoomPresenter`: Load the list of possible spaces a room can be added to

* Refactor `RoomVisibilityState` to internally use `JoinRuleItem`

This gets rid of `RoomAccess` and `RoomAccessItem`, and it will allow us to map the join rule items in a cleaner way to both join rules and the UI

* Implement the UI changes:

- Display the parent space.
- Allow selecting a new one.
- Import needed strings.

* Fix existing tests

* Add `@Immutable` annotation to `SpaceRoom`, since it was detected as unstable.

Maybe because of `RoomType`?

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-01-26 18:23:02 +01:00
Benoit Marty c901772145 Metro 0.10.0: Classes annotated with ContributesIntoSet do not need to be annotated with Inject. 2026-01-20 10:13:39 +01:00
Jorge Martin Espinosa 6d1ed5967b Create spaces (#5982)
* Allow creating a space with `CreateRoomParameters`

* Add 'Create space' menu item in the spaces home screen. Also, imports new strings related to spaces.

* Link the 'Create space' button with the screen to create the space

* Unify room access and visibility for `ConfigureRoom`, use the updated design

* Fix `EditRoomDetails` avatar size (68dp)

* Replace `EditableAvatarView` and `UnsavedAvatar` copmonents with `AvatarPickerView`

* `AvatarDataFetcherFactory`: Make sure we use a fallback image fetcher when the URL is not an MXC one (a local one, i.e.). This removes the previous need for a separate `UnsavedAvatarView`

* Use `AvatarPickerView` in all the screens where `EditableAvatarView` was used

* Improve naming and previews

* Update strings, remove unused ones for `RoomAccessItem`

* Make `isSpace` part of the `CreateRoomConfig`

* Ensure the content fits in the screenshots for `AvatarPickerSizesPreview`

* Add `AvatarDataFetcherFactoryTest`

* Add new feature flag for creating spaces

* Fix ripple being too large for the `Pick` state

* Tweak margins and section titles a bit

* Add preview for `HomeTopBar` with the spaces case

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-01-13 14:35:49 +01:00
Benoit Marty bd5857ae23 Fix konsist test. 2026-01-09 15:36:10 +01:00
Benoit Marty ac7321f841 Add exceptions. 2025-12-19 09:44:58 +01:00
Skye Elliot 59f51d8627 Add alert to encrypted rooms with visible history (Android). (#5709)
* feat: Add visible history alert to encrypted rooms.

- Adds a dismissable alert that is displayed whenever the user opens a
  room with `history_visibility` != `joined`. When cleared, this is
  recorded in the app's data store.
- When opening a room with `history_visibility` = `joined`, this flag is
  cleared.`

Issue: https://github.com/element-hq/element-meta/issues/2875

* chore: Fix linting issues.

* feat: Move alert showing logic into state presenter.

* chore: Fix linting issues.

* tests: Fixup tests.

* feat: Use real link.

* chore: Update license header.

* chore: Add (c) to license headers.

* chore: Add `.` to license header.

* feat: Lock alert behind history sharing developer setting.

* ci: Trigger record screenshots

* feat: Create repo key using session ID for multi-account support.

* feat: Use session ID hash for constructing data store.

* tests: Correct and update tests.

* tests: Update snapshots.

* feat: Prevent identity alert from displaying with history visibility alert.

* feat: Tidy up HistoryVisibleStatePresenter logic, update previews.

* chore: Remove unused import.

* chore: Update screenshots.

* feat: Add translation string.

* chore: Remove redundant temporary translation file.
2025-12-08 21:19:15 +01:00
ganfra 6467912c69 quality: fix warnings 2025-11-25 14:30:59 +01:00
Benoit Marty 65171c7d92 Enable Konsist test. 2025-11-17 18:03:43 +01:00
Benoit Marty c3875e4d95 Copyright: update test 2025-11-10 11:25:37 +01:00
Benoit Marty 336e35da2e Copyright: update enterprise code. 2025-11-10 11:23:26 +01:00
Benoit Marty f16040a64d Copyright: Update Konsist test 2025-11-10 11:05:28 +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 318ad1edbd design(home) : clean up 2025-10-23 17:22:39 +02:00
ganfra ddf2007bb3 design(home): rename RomListTopBar to HomeTopBar 2025-10-23 16:11:26 +02:00
Benoit Marty 76493f52ec Merge branch 'develop' into feature/bma/metro070 2025-10-23 11:30:25 +02:00
Benoit Marty dc217cca0d Ignore the new test for now. 2025-10-23 08:56:32 +02:00
Benoit Marty 7b9ca041b2 Add test around metro annotation.
Metro 0.7.0 make optional to use @Inject when the class is annotation by @ContributesBinding
2025-10-22 17:34:07 +02:00
Benoit Marty ddbe67cf7b Remove exception 2025-10-22 17:25:59 +02:00
Jorge Martin Espinosa ebe94f873e Sync notifications using WorkManager (#5545)
* Initial implementation of notification sync using `WorkManager`

* Use custom `MetroWorkerFactory` to allow assisted injection in WorkManager Workers

* Add tests for `FetchNotificationWorker`. Create `FakeNotificationResolverQueue` to help testing.

* Add more tests, fix Konsist checks

* Add tests for `SyncNotificationWorkManagerRequest`

* Simplify `FakeNotificationResolverQueue`
2025-10-17 09:51:27 +00:00
Benoit Marty ac246dd521 Remove custom color for enterprise build. 2025-10-15 14:10:42 +02:00
Benoit Marty 844e1d2ce5 Let the enterprise build be able to update the colors. 2025-10-15 11:25:58 +02:00
Benoit Marty 015ed10a4e Add exception to Konsist test. 2025-10-13 09:25:24 +02:00
Benoit Marty c98ac80285 Add Konsist test on Immutable annotation 2025-10-09 15:36:06 +02:00
Benoit Marty 67c9daa0bf Add Konsist test to check that toPersistentList() is not used.
Same for `toPersistentSet()` and `toPersistentMap()`.
Fix existing issues.
2025-10-08 15:51:18 +02:00
Benoit Marty 97efdfd017 Add exception for Konsist test. 2025-10-06 10:17:31 +02:00
Benoit Marty 0f479c1947 Add Konsist test to check Metro annotation. 2025-09-29 09:32:44 +02:00
Benoit Marty 1e546335df Multi accounts - experimental first implementation (#5285)
* Multi account - Do not reset analytics store on sign out.

Else when 1 of many accounts is removed, the analytics opt in screen is displayed again.

* Multi accounts - first implementation.

* Multi accounts - Prevent user from logging twice with the same account

* Multi accounts - ignore automatic GoBack in case of error.

* Multi accounts - update first view when adding an account.

* Rename method storeData to addSession.

* Multi accounts - handle account switch when coming from a notification

* Multi accounts - handle login link when there is already an account.

* Multi accounts - handle click on push history for not current account.

* Multi accounts - improve layout and add preview.

* Add accountselect modules

* Multi accounts - incoming share with account selection

* Multi accounts - check the feature flag before allowing login using login link.

* Multi accounts - swipe on account icon

* Cleanup

* Multi accounts - fix other implementation of SessionStore

* Multi accounts - fix PreferencesRootPresenterTest

* Multi accounts - Add test on AccountSelectPresenter

* Multi accounts - Fix test on HomePresenter - WIP

* Update database to be able to sort accounts by creation date.

* Add unit test on takeCurrentUserWithNeighbors

* Fix test and improve code.

* Add exception

* Multi accounts - handle permalink

* Code quality

* Multi accounts - localization

* Fix issue after rebase on develop

* Fix issue after rebase on develop

* Fix tests

* Fix tests

* Fix tests

* Fix tests

* Update Multi accounts flag details.

* Add missing test on DatabaseSessionStore

* Add missing preview on LoginModeView

* Remove dead code.

* Add missing preview on PushHistoryView

* Document API.

* Rename API and update test.

* Remove MatrixAuthenticationService.loggedInStateFlow()

* Update screenshots

* Remove unused import

* Add exception

* Fix compilation issue after rebase on develop.

* Update screenshots

* Fix test

* Avoid calling getLatestSession() twice

* Rename `matrixUserAndNeighbors` to `currentUserAndNeighbors`

* Extract code to its own class.

* Add comment to clarify the code.

* Init current user profile with what we now have in the database.

It allows having the cached data (user display name and avatar) when starting the application when no network is available.

* Let the RustMatrixClient update the profile in the session database

* Fix test.

* When logging out from Pin code screen, logout from all the sessions.

tom

* Make PushData.clientSecret mandatory.
Also do not restore the last session as a fallback, it can lead to error in a multi account context, or even when a ghost pusher send a Push.

* Change test in RustMatrixAuthenticationServiceTest

* Do not use MatrixAuthenticationService in RootFlowNode, only use SessionStore

* Remove MatrixAuthenticationService.getLatestSessionId()

* Fix compilation issue after merging develop

* Add test on DefaultAccountSelectEntryPoint

* Fix compilation issue after merging develop

* Introduce LoggedInAccountSwitcherNode, to improve animation when switching between accounts.

* Rename Node to follow naming convention.

* Fix navigation issue after login.

* Remove unused import

* Revert "Fix navigation issue after login."

This reverts commit e409630856d7a7e741548016d7afe174ff1b40f7.

* Revert "Rename Node to follow naming convention."

This reverts commit 883b1f37c7207512d9f6605749977ad9045846a1.

* Revert "Introduce LoggedInAccountSwitcherNode, to improve animation when switching between accounts."

This reverts commit 9c698ff8152aceb5fd2b8b5ab5f609d28de64d24.

* Metro now have `@AssistedInject`.

* Update screenshots

* Introduce DelegateTransitionHandler and use it in RootFlowNode

---------

Co-authored-by: ElementBot <android@element.io>
Co-authored-by: ganfra <francoisg@element.io>
2025-09-26 15:45:06 +02:00