Commit Graph

1823 Commits

Author SHA1 Message Date
Jorge Martin Espinosa af9db20f4f Add extra vertical padding to ReplyToInvalidContent and ReplyToNotFoundContent (#7288)
* Add extra vertical padding to `ReplyToInvalidContent` and `ReplyToNotFoundContent`

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-30 10:30:22 +02:00
Jorge Martin Espinosa 9ab679566d Don't check enterprise previews in KonsistPreviewTest (#7297)
Don't check enterprise previews in `KonsistPreviewTest`
2026-07-30 10:29:43 +02:00
Jorge Martín d711922325 Remove test for detecting m prefix for fields
I'm not sure anyone will actually use `m` prefixes on Kotlin anymore
2026-07-29 13:28:57 +02:00
Jorge Martín ddc972a365 Run Konsist tests sequentially
It's sadly faster that way:

Every time we run a test class in parallel a new JVM is started, and the `KoScope` contents can't be shared between them.
This scope can take a few minutes to load, so having several instances of this happening at the same time is a terrible idea.
It's actually faster to run the tests sequentially, at least locally.
2026-07-29 13:28:22 +02:00
Jorge Martin Espinosa adc1b50492 Fix insets in several screens (#7285)
* Fix insets in several screens

UI components in the room list, room member list, etc. now have better insets based on `WindowInsets.safeDrawing`

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-28 10:29:42 +02:00
Matt Van Horn 9042b4be4f Make settings section separators visible in black theme (#7039)
* Make settings section separators visible in black theme

In the Black (OLED) theme the canvas is forced to pure black while the
section-separator divider keeps its standard-dark colour (outlineVariant,
~10% alpha white), leaving dividers in Settings and related screens almost
invisible. Add an OLED-aware listSectionDivider alias that lightens the
divider only when the black theme is active, and use it for the
ListSectionHeader divider. Light and standard-dark themes are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>

* Set separatorSecondary for Black theme instead of a custom divider alias

Following review feedback: now that the global HorizontalDivider uses
separatorSecondary (#7054), give the Black/OLED theme a visible
separatorSecondary value in ElementTheme instead of carrying a bespoke
listSectionDivider alias. This fixes all separators on pure black, not
just section headers. The exact color is pending design confirmation.

* chore(theme): remove in-code design discussion comment

Move design discussion out of the code per review; the divider color
decision lives in the PR thread.

* Update screenshots

Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>

---------

Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: ElementBot <android@element.io>
Co-authored-by: Jorge Martin Espinosa <jorgem@element.io>
2026-07-28 09:51:15 +02:00
Jorge Martin Espinosa cc3c68411e Try making HeaderFooterView more robust (#7267)
* Try making `HeaderFooterView` more robust

Create `HeaderFooterLayout` to properly calculate the content size when the component is scrollable so it's at least the size of the available space.

* Make `DesktopNoticeView` scrollable

For this, `NumberedListOrganism` can't be a `LazyColumn`, since that's a lazy layout with no intrinsic height and Compose doesn't know how to size it.

* Fix the case where no header or content composables are supplied

* Fix insets in non-scrollable UI

* Remove `movableContentOf`, suppress the warning instead since the `isScrollable` parameter should never toggle this behavior

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-28 09:38:56 +02:00
Jorge Martin Espinosa 77edfec61a Use the right insets in the home screen UI (#7271)
* Use the right insets in the home screen UI

That's `WindowInsets.statusBar` for the `Scaffold` component, then `WindowInsets.navigationBar` for the `LazyColum.contentPadding`

* Apply it to other screens with long lists of items too

* Apply the insets to `PreferencePage` too

* Apply inset changes to other screens with scrollable content

* Add helper insets/padding values based on review suggestions.

* Use the newly added insets/padding values in several scaffold and scrollable columns

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-27 18:17:14 +02:00
Jorge Martin Espinosa 0442fbd307 Fix media viewer for medias not related to events displaying invalid state (#7280)
* When no URL is provided to `ContentValidationState.collectMediaState`, assume it's valid

That way we can do:

`if (validationState.isValid() && state.collectMediaState(possiblyNullUrl).isValid()) ...`

* Remove the `eventId` param from `ContentScannerService.scan`

It's not really used, since we then provide a state that can be mutated, and fetching that is what the previous parameter was used for

* Make sure to always validate the medias in the viewer, both the actual media and the thumbnail

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-27 18:16:35 +02:00
Jorge Martin Espinosa bbb83c2ff0 Localazy: improve search, parallelize checks (#7261)
* Remove no longer temporary string

These are now in localazy and the sync strings CI flow was failing because we have 2 conflicting values in `temporary.xml` and `localazy.xml`

* Use the right placeholder value in `screen_local_network_opt_in_subtitle`

* Localazy: improve search, parallelize checks

The search for XML files has been narrowed down and it's several times faster now, and processing the files is now done in parallel

* Improve script to also find and delete previous files

Also add the option of having a `-v|--verbose` flag to print which files we're modifying

* Use `LocalBuildMeta` to get the app name inside `LocalNetworkPermissionDialogView`

* Allow finding all the forbidden terms in the strings and translations and then return an error exit code instead of a success one

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-27 15:12:53 +02:00
renovate[bot] 91ec818522 Update dependency org.jetbrains.kotlinx:kover-gradle-plugin to v0.9.9 (#7273)
* Update dependency org.jetbrains.kotlinx:kover-gradle-plugin to v0.9.9

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: ElementBot <android@element.io>
2026-07-27 09:23:13 +02:00
ganfra e798eed816 Merge pull request #7051 from element-hq/feature/valere/timeline_active_call_rendering
feat(call): Active call timeline rendering
2026-07-24 13:43:43 +02:00
Jorge Martin Espinosa 1595830541 Remove no longer temporary strings (#7260)
* Remove no longer temporary string

These are now in localazy and the sync strings CI flow was failing because we have 2 conflicting values in `temporary.xml` and `localazy.xml`

* Use the right placeholder value in `screen_local_network_opt_in_subtitle`

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-24 09:00:45 +00:00
ElementBot f5b05f93c1 Update screenshots 2026-07-23 16:07:28 +00:00
ganfra 29d9e7c1ba Merge branch 'develop' into feature/valere/timeline_active_call_rendering
# Conflicts:
#	tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction_EmojiItemWithPopup_Night_0_en.png
2026-07-23 16:24:11 +02:00
ElementBot 44f027514e Update screenshots 2026-07-23 13:48:37 +00:00
Jorge Martin Espinosa 72c47f7c41 Add warning to the 'Scan QR code' screen (#7264)
* Add warning to the 'Scan QR code' screen

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-23 15:38:33 +02:00
ganfra 907579d59f Merge pull request #7232 from element-hq/feature/fga/display_user_status
WIP : display user status
2026-07-23 15:10:19 +02:00
Valere f22e4b3314 Merge branch 'develop' into feature/valere/timeline_active_call_rendering 2026-07-23 13:40:38 +02:00
ElementBot 2f09585b81 Update screenshots 2026-07-22 19:22:11 +00:00
ElementBot 140074f23c Update screenshots 2026-07-22 17:28:30 +02:00
ElementBot e24e15a0c4 Update screenshots 2026-07-22 14:25:10 +00:00
Jorge Martin Espinosa 05917bd65f Fix padding for captions of media in 'not found' state (#7247)
* Fix padding for captions of media in 'not found' state

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-22 13:36:21 +02:00
Jorge Martin Espinosa 925376b6af Allow adding extra elements to the developer settings from external modules (#7230)
* Add `ExtraDeveloperOptionsRenderer` to display extra UI components in the developer settings screen. It defaults to not displaying anything, using `NoopExtraDeveloperOptionsRenderer`

* Add `EnterpriseService.overriddenElementWellKnown` method to fetch the current overridden element well known value, if any

* Modify the well known retrievers to use the overridden value if it's there. Also extract the JSON parsing to its own `ElementWellKnownParser` component.

* Bump enterprise repo reference.
2026-07-21 10:18:56 +02:00
Jürgen Wischer 3cef8c2796 Announce expanded/collapsed state on the timeline group header (#7226)
* Announce expanded/collapsed state on the timeline group header

GroupHeaderView (the accordion-style header used for grouped state
events in the timeline) uses toggleable() combined with
clearAndSetSemantics { contentDescription = text }. The
clearAndSetSemantics block discards the state information that
toggleable() would otherwise expose, so TalkBack never announces
whether the group is currently expanded or collapsed.

Add an explicit stateDescription (two new a11y_state_expanded /
a11y_state_collapsed strings in temporary.xml) alongside the existing
contentDescription so the expanded/collapsed state is communicated to
assistive technology.

Internal note: this single-file/single-root-cause fix addresses three
separate BITV findings raised in the same accessibility audit against
this component's toggle semantics.

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-20 08:50:51 +02:00
Valere e9fa6435fb Merge branch 'develop' into feature/valere/timeline_active_call_rendering 2026-07-17 15:33:33 +02:00
Jorge Martin Espinosa 2705efad15 Add content scanner support to media gallery and viewer (Element Pro) (#7233)
* Add content scanner support to media gallery and viewer

* Improve UI and previews

* Remove default content validation state in media content views

* Disable click for invalid media items in the gallery events

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-17 15:26:13 +02:00
Thirumani Vihaan f005693874 Fix #7181: Remove back arrow from device verified screen and use 'Done' text (#7222)
* Fix #7181: Remove back arrow from device verified screen and use 'Done' text

* Update screenshots

* Fix failing Maestro test by tapping 'Done' instead of 'Continue'

---------

Co-authored-by: ElementBot <android@element.io>
Co-authored-by: thirumani-vihaan <your-github-email@example.com>
2026-07-16 16:50:58 +02:00
ElementBot 2112e1bf04 Update screenshots 2026-07-16 12:19:40 +00:00
Benoit Marty 3eea53840f Merge pull request #7182 from element-hq/feature/bma/focussedButton
[A11y] Improve rendering on focused UI items
2026-07-16 10:47:19 +02:00
Jorge Martin Espinosa 0d03472c60 Content scanner (Element Pro): scan timeline events for unsafe content (#7159)
* Simplify how event content with captions are displayed

The caption component will now be added in `TimelineItemEventContentView` instead of separately in each `TimelineItem__View` component

* Make sure `CoilMediaFetcher` methods to fetch media throw errors

We need to catch them later to check if the content scanner marked some thumbnails or medias as invalid/unsafe in `AsyncImage` instances

* Add a `ContentScannerService` that allows us to manually scan a list of medias in an event and then update and store the results

The results take the form of `ContentValidationValue`, stored in a `ContentValidationState` instance tied to the event

* Create `EventContentValidationCache` to keep the `ContentValidationStates` for events in a room

* Expose `EventContentValidationCache` to Compose using `LocalEventContentValidationState`

Also add a couple of helper functions to avoid having to manually remember the states

* Use the new components to display invalid content in the timeline items

* Add `blurhash` to most media items so we can use it while validating the thumbnails/medias

* Fix custom layout issues with screenshot and UI tests

* Also check the validation state for replied-to events in the composer

* Fix and add tests

* Handle unrecoverable content validation errors too: display a 'not found' UI

* Improve the performance of `EqualWidthColumn` for the single item case

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
2026-07-16 07:59:51 +00:00
ElementBot 058b494d82 Update screenshots 2026-07-15 14:17:15 +00:00
Benoit Marty 0fe423757f Merge branch 'develop' into feature/bma/focussedButton 2026-07-15 15:58:01 +02:00
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
ElementBot 03304b3ece Sync Strings (#7192)
* Sync Strings from Localazy

* Update screenshots

---------

Co-authored-by: jmartinesp <480955+jmartinesp@users.noreply.github.com>
2026-07-13 12:21:55 +02:00
ElementBot e42f974c00 Update screenshots 2026-07-10 14:43:36 +00:00
Benoit Marty 2baeca5edf Merge branch 'develop' into feature/bma/focussedButton 2026-07-10 14:49:49 +02:00
ElementBot a7502a8fe1 Update screenshots 2026-07-10 12:23:53 +00:00
ElementBot 3ad0ca7974 Update screenshots 2026-07-10 07:46:06 +00:00
ganfra 3f7ed5d87a Merge branch 'develop' into feature/fga/local_network_permission
# Conflicts:
#	libraries/androidutils/src/main/AndroidManifest.xml
2026-07-09 17:50:24 +02:00
ganfra 02a40cf2d5 Merge pull request #7094 from element-hq/feature/fga/set_user_status
WIP : Set user status
2026-07-09 14:34:23 +02:00
Benoit Marty b8d934058c Merge pull request #7132 from element-hq/fix/a11y-pin-screen
Add programmatic label and focus indicator to PIN entry field
2026-07-09 09:02:16 +02:00
ganfra d25362dd36 Merge branch 'develop' into feature/fga/set_user_status 2026-07-08 17:59:30 +02:00
ElementBot f25ca5b963 Update screenshots 2026-07-08 17:11:27 +02:00
ElementBot 4190939ff8 Update screenshots 2026-07-07 14:54:55 +00: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 7c3d1e2e80 Merge pull request #7158 from element-hq/renovate/androidx.compose.material3-material3-1.x
Update dependency androidx.compose.material3:material3 to v1.5.0-alpha22
2026-07-07 10:29:42 +02:00
ElementBot 56ad052575 Update screenshots 2026-07-07 07:53:22 +00:00
Benoit Marty 445b9a1ee7 Merge pull request #7157 from element-hq/feature/bma/updateOnboarding
Update onboarding screen text style
2026-07-07 09:40:29 +02:00