Commit Graph

16436 Commits

Author SHA1 Message Date
Sedat Qaja f18c3acdfc docs(healthchat): record the ruleset toggle for the sync force-push healthchat-v26.10.0 2026-10-20 15:01:37 +02:00
Sedat Qaja 767703f845 chore(release): date the 26.10.0 release notes 2026-10-20 13:58:51 +02:00
Sedat Qaja 67dadb4571 feat(healthchat): drop Element links, labs, bug reports and location sharing
Bloom gradient fades the brand blue instead of Compound's green.
2026-10-20 13:39:31 +02:00
Sedat Qaja 9df5d95732 docs(healthchat): add the upstream sync skill 2026-10-20 11:03:45 +02:00
ElementBot 44451c733f Update screenshots 2026-10-19 17:33:31 +02:00
Sedat Qaja 2a79103060 ci(release): pin the actions and keep inputs out of the shell
zizmor flags the HealthChat release workflow now that the rebase PR shows
the whole file as new: five actions referenced by floating major tags, the
workflow_dispatch version input expanded straight into a shell script, and
a Gradle cache on a release build.

- Pin checkout, setup-java, setup-gradle, upload-artifact and
  upload-google-play to commit SHAs with their version in a comment, the
  way every upstream workflow does.
- Pass the version input through the environment instead of expanding it
  into the run script.
- Disable the Gradle cache for the release build so a poisoned cache from
  another workflow cannot reach the signed bundle.
2026-10-19 16:42:35 +02:00
Sedat Qaja b0a577d2b2 ci: let the screenshot recorder pull LFS on the private fork
The cached LFS checkout action checks out with persist-credentials: false
and then runs `git lfs pull` on a cache miss. Upstream is public, so that
pull works anonymously; on this private fork it fails with
`could not read Username for 'https://github.com'`, which is why the
Record-Screenshots label never produced a recording here (the only
successful runs were manual dispatches with a warm LFS cache).

Keep the job token configured for both LFS checkout steps. The push of
the recorded goldens already authenticates with the same token.
2026-10-19 16:34:45 +02:00
Sedat Qaja db839dc5c3 Adapt HealthChat to upstream v26.10.0
Follow-ups needed after rebasing the HealthChat series from v26.07.0 onto
v26.10.0 that span several of the replayed commits:

- Rename the five PreviewParameterProvider subclasses in features/healthchat
  to the *PreviewParam suffix now enforced by Konsist.
- Rename MemberDirectoryEvents and HealthChatProfileSectionEvents to the
  *Event suffix used by every upstream sealed interface.
- Import FakeStartDMAction from features/startchat/test, where it lives now.
- ListItem lost its headlineContent parameter in favour of content.
- HomeView gained onAddAccountClick and onSwitchToAccount, and onRoomClick
  now carries an EventId; update HomeViewBackHandlingTest accordingly.
- Restore upstream's codecov-action pin (v7.1.1) that the CI squash carried
  back to v7.0.0.
- Gate the new pr-checks.yml on the upstream repository: this fork does not
  use the PR- label convention.
- Add the 26.10.0 section to HEALTHCHAT_CHANGES.md.
2026-10-19 09:05:35 +02:00
joel.poyet 9cb72c74aa chore(release): prepare 26.08.0 release notes
Fold the member directory, profile editor, invite and status banner features into the unreleased 26.08.0 changelog section.
2026-10-19 08:56:59 +02:00
joel.poyet eabfca5c75 Add profile editor, member invite and status banners (#4)
* feat(healthchat): add profile editor, member invite and status banners

Native 13-field profile editor with diff-only saves and avatar upload
through the HealthChat API (replaces the upstream display-name editor),
email invitation for approved accounts, and non-dismissible account
status banners in settings and the member directory.

* fix(healthchat): satisfy detekt and konsist rules

Konsist presenter helper shape, no '=' in state parameter docs, present-tense invite callback, and complete renderer KDoc.
2026-10-19 08:56:59 +02:00
joel.poyet 1cf01cdc62 Add member directory tab to home navigation (#3)
* feat(healthchat): add member directory tab to home navigation

Third bottom-nav tab backed by the HealthChat API: searchable member
cards with native start-chat, approval-pending banner, retry on
failure and navigation into the native profile screens.

* fix(healthchat): stop tab back handler swallowing back presses

While a screen is pushed on top of Home, the still-composed tab
BackHandler intercepted back presses during the transition and
invisibly switched to the Chats tab. Gate it on the node's target
visibility in both the parent and Home's own backstack.

* fix(healthchat): satisfy detekt, ktlint and konsist rules

Import alias order, composable parameter order in HomeView, and konsist presenter helper shape.

* ci: pass the real repository name to the screenshot recorder

recordScreenshots.yml set GITHUB_REPOSITORY from `secrets.GITHUB_REPOSITORY`.
No such secret exists on this fork, so the expression expands to an empty
string and overrides the built-in environment variable of the same name.
recordScreenshots.sh checks it up front and exits 1 with "No repo specified",
so the workflow could never record anything here.

Use the `github.repository` context instead, which is always populated.

Claude-Session: https://claude.ai/code/session_01MQbp1EPM4TSXq8P8Pyq44F

* Update screenshots

* Revert "Update screenshots"

This reverts commit b99e0d643f.

* Reapply "Update screenshots"

This reverts commit 85bceb6d67.

* test(screenshots): stop a LayoutLib teardown crash failing the shard tests

Paparazzi 2.0.0-alpha05 / LayoutLib 16.2.1 races on HandlerThread startup:
HandlerThread_Delegate.run calls Process.setThreadPriority, which throws
NoSuchMethodError for Thread.setPosixNicenessInternal and kills the
"android.bg" thread. If the test thread reaches getLooper() after that, it
gets null, BackgroundThread.ensureThreadReady() NPEs, and the static
initialiser of LatencyTracker fails. The JVM then marks that class erroneous
for the lifetime of the fork, so every later preview showing the soft
keyboard dies with NoClassDefFoundError.

LayoutLibErrorFilterStatement already swallowed the bare NoSuchMethodError,
but PaparazziLogger re-throws collected background errors from teardown()
wrapped in a MultipleFailuresException when there is more than one, and that
wrapper slipped through. A recent run reported 17 failures with zero image
comparisons failing and zero delta images written.

Unwrap the wrapper by reflection and swallow it only when every collected
cause matches the known-bug list; anything unrecognised, and anything that
cannot be decomposed, is rethrown.

Also close a hole this filter had from the start. Paparazzi runs the test as
`try { body } finally { teardown() }`, so a teardown error discards whatever
the body threw — including a genuine snapshot mismatch. renderFailureCapture
is registered inside the Paparazzi rule to record the body's exception so it
wins over any teardown error, and the filter refuses to swallow anything if
that rule is not registered. Two HorizontalFloatingToolbar previews have been
mismatching silently behind this, and may now surface as real failures.

Claude-Session: https://claude.ai/code/session_01MQbp1EPM4TSXq8P8Pyq44F

---------

Co-authored-by: ElementBot <android@element.io>
2026-10-19 08:56:59 +02:00
joel.poyet 21444b45e7 test(healthchat): satisfy konsist presenter helper rule
Konsist requires createPresenter helpers to omit the return type.
2026-10-19 08:47:59 +02:00
joel.poyet 8f82e578f4 feat(healthchat): show profile fields on profile screens
Renderer slot in UserProfileView (all three profile screens) shows
specialty, practice, address, contact links and further info from
the HealthChat API, with inline retry on failure.
2026-10-19 08:47:59 +02:00
joel.poyet 9f8a39bb74 Add HealthChat API service layer (#1)
* feat(healthchat): add HealthChat API service layer

New features/healthchat modules: typed Retrofit client with
per-request Matrix token auth, member directory, profile and
invite services, plus test fakes and fixtures.

* test(healthchat): use runCatchingExceptions

Detekt's RunCatchingNotAllowed rule forbids plain runCatching.
2026-10-19 08:47:34 +02:00
joel.poyet 5eee7737b9 fix(lint): drop dead onboarding title overrides 2026-10-19 08:47:33 +02:00
joel.poyet 345a6bb8ec feat(analytics): disable analytics unless credentials are configured
Removes the onboarding opt-in screen, the Analytics settings entry and
the unused Posthog and Sentry SDKs.
2026-10-19 08:47:33 +02:00
joel.poyet 55ea61bf5a fix(icon): ship the monochrome launcher icons as webp
Matches upstream's format, which is what tools/lint/lint.xml already
exempts from IconExpectedSize.
2026-10-19 08:47:33 +02:00
Sedat Qaja 708535469e ci: run the fork's pipelines on the self-hosted runners
Squash of ten CI commits from 2026-08-04 (all part of HealthChat release 26.08.0):

- ci(release): move releases to the persistent self-hosted runners
- ci: grant contents:read so checkout works on this private fork
- ci: disable the Label Community PRs job on this fork
- ci: run the heavy Gradle jobs on the self-hosted runners
- ci: rely on the runner image for the Android SDK
- ci: size the Gradle heap for the self-hosted containers
- ci: report runner capacity on the self-hosted jobs
- ci: record why the Gradle heap is reduced
- ci: cap Gradle workers so test JVMs fit the container
- ci: skip the codecov upload when no token is configured

The danger.yml hunk from the contents:read commit is omitted: upstream
replaced Danger with a github-script workflow in v26.09.
2026-10-19 08:47:32 +02:00
joel.poyet 3db17825de fix(release): drop changesNotSentForReview from Play upload
Play now sends this app's changes for review automatically and the Edits
API rejects the parameter, so the AAB uploaded but the edit never committed.
2026-10-19 08:46:59 +02:00
joel.poyet c8e444e2e0 feat(share): share user permalinks via to.healthchat.ch
Mention pills keep the matrix.to wire format other clients expect.
2026-10-19 08:46:59 +02:00
joel.poyet e4ca0e6208 feat(deeplink): point deeplinks at HealthChat hosts
Claims app.healthchat.ch and to.healthchat.ch as App Links, registers the
healthchat:// scheme, and drops the unreachable mobile.element.io handling.
2026-10-19 08:46:58 +02:00
joel.poyet fd29aea9a9 docs(release): document self-hosted runner and heap sizing 2026-10-19 08:46:58 +02:00
joel.poyet f49e5b8ac6 fix(gplay): strip permissions Play Console rejects 2026-10-19 08:46:58 +02:00
joel.poyet 4778fe4a98 ci(release): add HealthChat Play Store release pipeline 2026-10-19 08:46:57 +02:00
Sedat Qaja b975611e63 feat(branding): add HealthChat launcher icon and logo
Official cross-in-circle icon (same art as the iOS X app); onboarding
title localized for en/de/fr/it.
2026-10-19 08:46:57 +02:00
Sedat Qaja 659f3e174e feat(branding): rebrand app identity to HealthChat
App id ch.healthchat.element, locked matrix.healthchat.ch homeserver.
2026-10-19 08:46:57 +02:00
Benoit Marty 21a9411676 Merge branch 'release/26.10.0' 2026-10-16 11:54:56 +02:00
Benoit Marty e6aa7d5306 Adding fastlane file for version 26.10.0 2026-10-16 11:54:53 +02:00
Benoit Marty b199bc74c6 Setting version for the release 26.10.0 2026-10-16 11:51:28 +02:00
Benoit Marty 2df5591f8c Merge pull request #7947 from element-hq/feature/bma/fixMaestroLogout
Fix Maestro logout test when the device is the only session
2026-10-16 11:11:55 +02:00
Benoit Marty f18e699bbb Fix Maestro logout test when the device is the only session
Since #7861 all the sessions of the Maestro account are ended after each run,
so the device under test is always the last session. In this case the title of
the sign out screen does not contain "Remove this device" anymore, and tapping
on the second occurrence of this text fails. Tap on the submit button using its
test tag instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 09:21:26 +02:00
Benoit Marty b1f04799a4 Merge pull request #7940 from element-hq/update-matrix-rust-sdk
Update SDK bindings to `26.10.15`
2026-10-15 23:09:24 +02:00
Benoit Marty 68dca1450a Merge pull request #7943 from element-hq/feature/valere/bump_ec_native_to_0.1.0-rc.8
Bump element-call-android to 0.1.0-rc.8 and the Rust SDK to 26.10.15
2026-10-15 23:07:25 +02:00
Benoit Marty 8972098b4f Merge pull request #7935 from element-hq/feature/bma/fixBadRoomId
Fix invalid room id built from thread notification tags
2026-10-15 23:05:18 +02:00
Valere 54f0e03c46 Update element-call-android to 0.1.0-rc.8 and the Rust SDK to 26.10.15
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:25:54 +02:00
Valere 555dca38f5 Native call: always ask the core to ring, and ring a DM only once its member has joined
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:21:20 +02:00
Jorge Martín 646ef491ee Update SDK bindings to 26.10.15 2026-10-15 17:05:28 +02:00
ElementBot 4ebcf960ce Update Matrix Rust SDK to 26.10.14-nightly (#7930)
* Update Matrix Rust SDK to 26.10.14-nightly

* `withSearchIndexStore` now uses `key` instead of passphrase

* Fix `RustMatrixClient` now returning `searchIndex` size too

---------

Co-authored-by: Jorge Martín <jorgem@element.io>
2026-10-15 16:47:56 +02:00
Jorge Martin Espinosa 287001f9aa Prevent foreground backfill from running when the app is active (#7932)
* Prevent foreground backfill from running when the app is active

This should be a background task, since it can severely degrade performance if the app is in use while it runs.

The worker won't run any more if the app is in foreground and will stop running if it was in background and now it's in foreground.

* Fix return inside `withTimeout`

Co-authored-by: Benoit Marty <benoitm@element.io>

* Remove initial delay: it shouldn't be necessary if the foreground state of the app is checked when the worker starts

Instead, if the app was in foreground, cancel the work and retry in 5 minutes.

---------

Co-authored-by: Benoit Marty <benoitm@element.io>
2026-10-15 16:09:09 +02:00
ganfra 8689961f0d Merge pull request #7936 from element-hq/feature/fga/fix-pill-rendering
Fix mention pill overflowing the end of the line when too wide
2026-10-15 15:16:57 +02:00
Benoit Marty 9ac71fd35d Fix room id parsing from notification tags
Thread notification tags have the form "roomId|threadId". clearReadRoomsNotifications
was building a RoomId from the whole tag, which is only validated in debug builds, so
in release an invalid room id reached RoomListService.room(). Add
NotificationCreator.getMessageNotificationRoomId(), the inverse of messageTag(), which
only keeps the part before '|' and checks it is a valid room id.

Also make RoomListServiceInterface.roomOrNull take a RoomId instead of a String.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 12:56:46 +02:00
ganfra c27bbaa1f6 Fix mention pill overflowing the end of the line when too wide 2026-10-15 12:54:25 +02:00
Benoit Marty e1b9ba21dc Merge pull request #7929 from element-hq/renovate/com.google.firebase-firebase-bom-35.x
Update dependency com.google.firebase:firebase-bom to v35
2026-10-15 10:53:04 +02:00
renovate[bot] 70151591e2 Update dependency com.google.firebase:firebase-bom to v35 2026-10-14 22:42:17 +00:00
Benoit Marty f62f5be16c Merge pull request #7922 from element-hq/feature/bma/otherAccountUnreadCount
Show the unread count of the other accounts in the multi-account section
2026-10-14 21:30:36 +02:00
Benoit Marty a3fa7aeedd Merge branch 'develop' into feature/bma/otherAccountUnreadCount
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 20:15:02 +02:00
ganfra 7fe10b32b0 Merge pull request #7905 from element-hq/feature/fga/timeline-multi-forward-ay11
Improve accessibility of timeline selection mode
2026-10-14 18:56:38 +02:00
Benoit Marty 0cf2eeb931 Merge pull request #7904 from element-hq/feature/bma/swipeAvatarAnnouncement
Announce the swipe gesture on the account avatar to switch account
2026-10-14 18:19:48 +02:00
Benoit Marty 9efe0db570 Dismiss the swipe avatar announcement in the app coroutine scope
HomeView sends HomeEvent.DismissSwipeAvatarAnnouncement right before switching account. Switching
account replaces the LoggedInFlow root node, which destroys HomePresenter and cancels its
composition coroutine scope, so the dismissal could be cancelled before the announcement status
was stored. Use the app coroutine scope instead, which survives the account switch.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 18:00:56 +02:00
ElementBot c3f178985d Update screenshots 2026-10-14 16:00:19 +00:00