Commit Graph

15776 Commits

Author SHA1 Message Date
renovate[bot] a52d13ab5f Update dependency org.unifiedpush.android:connector to v3.3.4 (#7586)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-28 10:08:53 +02:00
Benoit Marty 3ec30d7c94 Merge pull request #7539 from hayaksi1/fix/5356-sender-name-fallback
Name a sender the timeline has no profile for from the room member list
2026-08-27 23:19:05 +02:00
hayaksi1 e8e67dc0c5 Merge remote-tracking branch 'upstream/develop' into fix/5356-sender-name-fallback
# Conflicts:
#	features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactoryTest.kt
2026-08-27 21:19:35 +03:00
Benoit Marty 0c65dcea9d Merge pull request #7571 from hayaksi1/fix/7397-keep-thread-after-redaction
Don't hide the thread of a deleted message inside the removed messages group
2026-08-27 20:06:17 +02:00
Benoit Marty 3fecabfe3e Merge pull request #7584 from element-hq/feature/bma/fixSilentNotification
Ensure that noisy notifications are still noisy when the app has a PIN code.
2026-08-27 20:02:51 +02:00
renovate[bot] c986a2a971 Update dependency com.google.guava:guava to v33.7.1-android (#7534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 20:01:45 +02:00
renovate[bot] b8981ff493 Update dependency io.github.sergio-sastre.ComposablePreviewScanner:android to v0.9.3 (#7535)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 20:01:26 +02:00
renovate[bot] 616ed92d00 Update dependency com.google.firebase:firebase-bom to v34.18.0 (#7581)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 18:47:58 +02:00
renovate[bot] f0c88eb12e Update dependency net.zetetic:sqlcipher-android to v4.18.0 (#7552)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 18:47:22 +02:00
Benoit Marty 586ae00cda Ensure that noisy notifications are still noisy when content is hidden when a PIN code is protecting the application.
Closes #7575
2026-08-27 16:22:28 +02:00
hayyaksi e19cfbb423 Merge branch 'develop' into fix/7397-keep-thread-after-redaction 2026-08-27 16:51:44 +03:00
Benoit Marty eb946c6daf Merge pull request #7583 from element-hq/feature/bma/releaseV2NoEditor
Do not open the editor when finishing the release
2026-08-27 15:31:54 +02:00
hayaksi1 0832b7de23 Merge remote-tracking branch 'upstream/develop' into fix/7397-keep-thread-after-redaction
# Conflicts:
#	features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt
#	features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactoryTest.kt
#	features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt
#	libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactoryTest.kt
2026-08-27 16:27:18 +03:00
Benoit Marty 8645260d46 Do not open the editor when finishing the release
`git flow release finish` opened the editor three times, and the content was
never edited: twice for the merge commits, where the message generated by git is
always kept, and once for the message of the annotated tag, where a placeholder
was typed by hand. The last tags carry the message "tag" for that reason.

GIT_MERGE_AUTOEDIT=no keeps the merge messages git already generates, and -m
provides the tag message. git flow appends the tag name to that message, so the
tag of the next release will read "Release v26.09.0".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 14:58:39 +02:00
Benoit Marty 4996819812 Changelog for version 26.08.4 2026-08-27 14:53:48 +02:00
Benoit Marty 743aefbe37 Merge tag 'v26.08.4' into develop
tag
2026-08-27 14:21:59 +02:00
Benoit Marty ec3286ef8f Merge branch 'release/26.08.4' 2026-08-27 14:21:20 +02:00
Benoit Marty 383519aff5 Adding fastlane file for version 26.08.4 2026-08-27 14:21:17 +02:00
Benoit Marty 2f3d197060 Setting version for the release 26.08.4 2026-08-27 14:20:36 +02:00
Benoit Marty 5e87387dac Merge pull request #7582 from element-hq/feature/bma/updateSubmoduleRef
Update submodule ref.
2026-08-27 14:14:40 +02:00
Benoit Marty 103c606968 Merge pull request #7579 from element-hq/feature/bma/improveReleaseScript
Add releaseV2.sh, a release script automating the GitHub release
2026-08-27 12:20:52 +02:00
Benoit Marty 6fbccbc897 Update submodule ref. 2026-08-27 12:17:03 +02:00
Benoit Marty 4800bbc63f Merge pull request #7546 from hayaksi1/fix/4475-element-call-docs
Document how the Element Call base URL developer option is used
2026-08-27 11:20:04 +02:00
Benoit Marty d3ab1ce43c Merge pull request #7562 from hayaksi1/fix/1548-dm-preview-sender
Drop the sender's name from the room list preview of two-person rooms
2026-08-27 11:19:32 +02:00
Benoit Marty d9c39e8f98 Merge pull request #7480 from bxdxnn/fix/deleted-messages-thread
Fix removed messages hiding its thread on deletion
2026-08-27 10:04:36 +02:00
Benoit Marty 740e3b621b Merge pull request #7344 from hayaksi1/fix/6371-save-file-name-conflicts
Keep saving files to Downloads once 32 files share the same name
2026-08-27 10:01:57 +02:00
Benoit Marty 3758aac6d3 Do not build the enterprise build, it's built elsewhere. 2026-08-27 08:52:44 +02:00
Benoit Marty c5f70de904 Add releaseV2.sh, a release script automating the GitHub release
releaseV2.sh is a copy of release.sh in which the GitHub CLI is mandatory and
does what was previously done by hand: it finds and waits for the release.yml
run, downloads and extracts its artifacts, creates the pre-release with its 6
assets and the generated release notes, and prepends those notes to CHANGES.md.
It also compares the version code and version name of the signed artifacts to
the expected values instead of asking the user to check them, and no longer
needs ELEMENT_GITHUB_TOKEN, since the CLI uses its own credentials. release.sh
is left untouched, so that the next release can be done with releaseV2.sh while
keeping a way back if something goes wrong. The installation documentation is
also fixed, as it referred to an asset name that does not exist anymore.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 22:15:54 +02:00
Benoit Marty dd7a7d57be Merge pull request #7567 from hayaksi1/fix/4099-server-unreachable
Say when the server cannot be reached instead of showing nothing
2026-08-26 16:56:40 +02:00
Benoit Marty c56001fc98 Merge pull request #7572 from hayaksi1/fix/6730-keep-caption-formatting
Keep the formatting of a caption that is being edited
2026-08-26 16:47:59 +02:00
Benoit Marty 0e86de4e58 Changelog for version 26.08.3 2026-08-26 15:35:00 +02:00
Benoit Marty b8dd1ce2d2 Merge tag 'v26.08.3' into develop
tag
2026-08-26 13:56:54 +02:00
Benoit Marty 0977ebd104 Merge branch 'release/26.08.3' 2026-08-26 13:56:44 +02:00
Benoit Marty cbc7de9982 Adding fastlane file for version 26.08.3 2026-08-26 13:56:41 +02:00
Benoit Marty 94259962a0 Setting version for the release 26.08.3 2026-08-26 13:56:12 +02:00
Benoit Marty dba8f1b276 Merge pull request #7577 from element-hq/feature/bma/explorePushRules
Add a "Push rules" entry in the developer options
2026-08-26 13:54:07 +02:00
Benoit Marty 267e48aa69 Add instructions to let the CI record the screenshot if necessary.
Also update instruction about PR size.
2026-08-26 13:50:45 +02:00
ElementBot 0e93a943a5 Update screenshots 2026-08-26 11:16:07 +00:00
Benoit Marty 2fcf806f59 Pretty print the push rules content before displaying it
The raw push rules returned by the SDK are a single long line of json, which is
hard to read on a phone. Re-encode the content with a pretty printer using a two
space indentation before handing it to the file viewer.

Parsing to a JsonElement and re-encoding preserves the order of the keys, so the
rules are still listed in the order the server returned them. Content which
cannot be parsed is passed through unchanged, so that a malformed payload remains
viewable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 12:55:07 +02:00
Benoit Marty 373d2f1eb5 Add a Push rules entry to the developer options
Add a "Push rules" item in the Notifications section of the developer options,
above "Push history". It displays the raw push rules of the account, which were
only available as a rageshake attachment so far.

The content is read using NotificationSettingsService.getRawPushRules(), then
rendered by the new FileViewerEntryPoint, so that the screen looks like the media
viewer rendering a file, with Share and Download actions on a
push_rules<userId>.json file. The user id contains a colon, which is not a valid
file name character on all the file systems, so it is replaced by an underscore.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 12:11:16 +02:00
Benoit Marty 0801a415b5 Add a FileViewerEntryPoint to render in-memory content as a file
Introduce io.element.android.libraries.mediaviewer.api.FileViewerEntryPoint, a
reusable screen which renders content that is not a Matrix media the same way the
media viewer renders a file, with Share and Download actions.

The caller provides a filename, a mime type and the whole content as a String.
The node writes it to a temporary file in the cache directory, then reuses
LocalMediaView (so text content goes through TextFileViewer) and LocalMediaActions
for sharing and saving on disk. The node is contributed to AppScope so that the
screen can be used from any graph, since MediaViewerNode itself is bound to
RoomScope and depends on the timeline data sources.

Also route MimeTypes.Json to TextFileView in LocalMediaView, so that a json file
is rendered as text instead of falling back to the generic file card.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 12:11:04 +02:00
Benoit Marty c9da3ab490 Merge pull request #7520 from element-hq/feature/bma/updateFonts
Update fonts on the headings
2026-08-26 09:51:50 +02:00
Benoit Marty 3bdff12e6e Merge pull request #7570 from hayaksi1/fix/7509-run-database-migrations
Run the database migrations again when a database is upgraded
2026-08-26 09:38:05 +02:00
hayaksi1 4290a9c3b3 Keep the formatting of a caption that is being edited
Editing the caption of a media message dropped all of its formatting: bold,
links and the rest came back as plain text, and saving wrote that plain text
over the formatted caption.

The composer was being opened on the plain caption. Editing a message body
already starts from its HTML when rich text editing is on, and the caption
path was the only one that did not - it read `captionOrNull()` and never had
the caption's HTML to read, because the timeline content only kept the
already-parsed `formattedCaption`.

Media contents now carry the caption's HTML alongside the parsed one, the
same way text contents carry `htmlBody`, and editing a caption starts from it
when rich text editing is on. The save path already sent the composer's HTML,
so nothing changes there.

Part of #6730
2026-08-25 22:03:14 +03:00
hayaksi1 2278116579 Keep the thread of a message that has been deleted
Deleting a message that headed a thread took the thread with it: the "N
replies" summary under the message disappeared and there was no way back to
the replies, which are still there.

Every branch of the timeline content mapper passes `MsgLikeContent`'s thread
information on except the redacted one, which returned a bare
`RedactedContent` and dropped it. The thread summary lives on
`MsgLikeContent` next to `kind`, so it survives the redaction; only the app
was throwing it away. `RedactedContent` now carries the thread info like the
other contents do, and `EventTimelineItem.threadInfo()` reads it.

A deleted message that still heads a thread is also left out of the "N
removed messages" group, which would otherwise hide the summary again as soon
as three deletions ended up next to each other.

Part of #7397
2026-08-25 21:52:20 +03:00
hayaksi1 594a5612ad Register the second sync state preview with konsist 2026-08-25 21:45:59 +03:00
hayaksi1 362acd6cab Run the database migrations again when a database is upgraded
Upgrading over an older install crashed before the login screen with
`SQLiteException: no such column: SessionData.position`. The session, cache
and push databases were opened at their new schema version but their tables
were never migrated.

`SqlCipherDriverFactory` overrides `AndroidSqliteDriver.Callback.onUpgrade` so
the database key can be replaced, and never called through to the base
implementation - which is the only thing that runs `schema.migrate`. Every
SQLDelight migration in the app was skipped as a result.

The override now calls `super.onUpgrade` after the re-key, so a database that
crosses the re-key version is still re-encrypted before its tables are
migrated. It moved out of an anonymous object into a named `MigrationCallback`
so the behaviour can be tested.

Part of #7509
2026-08-25 21:41:17 +03:00
ElementBot 69ba9cf21e Update screenshots 2026-08-25 18:10:19 +00:00
hayaksi1 65c2cd8a79 Drop the sender's name from the room list preview of two-person rooms
The room list preview prefixes the sender's name unless the room is a
direct message. A room that was created as a group and later converted to
a direct message is not marked as one by the server, so its preview kept
naming the only other person in it on every message, while iOS did not.

The prefix now depends on how many people are actually in the room rather
than on the direct message flag, which is the behaviour asked for in the
issue: no name while only two people can be talking, the name back as
soon as a third joins.

Part of #1548
2026-08-25 20:55:38 +03:00
hayaksi1 30c18b8a00 Say when the server cannot be reached instead of showing nothing
While the homeserver is unreachable but the device still has a working
network, the app showed no indication at all: the syncing chip is hidden
as soon as the SDK reports the session offline, and the offline banner
only appears when the device itself has no connectivity. A blocked or
down server was therefore indistinguishable from a quiet, healthy one.

The chip now has three states rather than a boolean, and the third says
"Server unreachable" for exactly that case. When the device has no
network the chip stays hidden, because the offline banner already says so
and two overlapping messages would be worse than one.

Part of #4099
2026-08-25 20:51:27 +03:00