The custom passphrase entry/confirm UI now lives in the enterprise secure backup module behind the SecureBackupSetupEntryPoint seam. Reverts the setup presenter, view, state, state machine, state provider, and events to the auto-generated-key-only flow, deletes CustomPassphraseDerivations and the temporary strings, and drops the well-known and enterprise-test dependencies the feature required.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Introduces a FeatureEntryPoint for the recovery-key setup screen so enterprise builds can vend a richer setup node. The FOSS default builds the standard auto-generated-key node; SecureBackupFlowNode now resolves the Setup and Change targets through this seam instead of creating SecureBackupSetupNode directly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When the homeserver advertises custom_recovery_passphrase_settings (and
the enterprise gate is enabled), the secure-backup setup lets the user
enter and confirm their own recovery key with a live strength indicator,
instead of receiving a generated one. The SDK derives the 4S key from the
passphrase and the base58 key is scrubbed everywhere so it is never
shown. Falls back to the generated-key flow when no spec is present or
the well-known fetch fails.
Snapshot PNGs are intentionally left out; the core team regenerates them
after the PR is opened.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
enableRecovery now takes an optional passphrase and returns the recovery
key as the suspend result (like resetRecoveryKey), avoiding the
flow/return-value race. For the passphrase path the SDK-derived base58
key is kept out of the session-scoped progress flow so it is never
surfaced to the user; the caller receives it as the return value and is
responsible for scrubbing it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add isCustomRecoveryPassphraseEnabled() and
estimateCustomRecoveryPassphraseStrength() to EnterpriseService, plus the
CustomRecoveryPassphraseStrength result types. FOSS builds return
false/null so the feature stays gated off; the enterprise implementation
(estimator) lands separately in the enterprise repo.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add CustomRecoveryPassphraseRequirements to ElementWellKnown and decode
the custom_recovery_passphrase_settings block (currently just
min_character_count) from the homeserver's element.json. Invalid specs
(missing or non-positive min_character_count) are logged and mapped to
null so the setup flow falls back to the generated-key path. Field names
match the ESS well-known schema (element-enterprise#261).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extract the show/hide password trailing-icon into a reusable
PasswordVisibilityToggle so every password field reveals plaintext the
same way and announces the same a11y labels. Reuse it from the login and
reset-identity password fields. Pure refactor, no behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This happens when building a `ShortcutInfoCompat` in `DefaultNotificationConversationService.onSendMessage` when the provided room name is not null but it's empty.
* Fix media viewer flickering
This was caused by the data being loaded triggering an index update that got out of sync with the displayed items, and for an instant, the pager index pointed to the wrong data until it was refreshed
* Reuse the same 'displayer' function for both forwards and backwards pagination
* Make `dataFlow` a property so we don't create a new instance every time we access it
* Remove `pageDataComparator` as it prevented new items from being loaded when a pagination returned no valid items to display but has more items to load
Make sure we modify the current index when loading new data only if it was pointing to the input event id.
* Fix `MediaViewerDataSource` overriding the provided timestamp for `Loading` items
Test emitting different loading items from the data source results in the state displaying the different items, so they will trigger a new pagination attempt
* Add regression test to check loading -> error -> loading states will still trigger 2 separate `LoadMore` events
* Attempt to fix room list item duplicates at midnight
This seems to happen because of a race condition between `RoomListDataSource.observeDateTimeChanges` and `RoomListDataSource.replaceWith` being called at almost the same time and the first one using the newly received items from observing the timeline items but not updating the cache which will be later reused by `replaceWith`, containing incorrect indices
* Create a new room when inviting people to a DM
* Improve screenshot tests
* Update screenshots
---------
Co-authored-by: ElementBot <android@element.io>
* Fix Maestro: tap on confirmation for inviting unknown users to a room
* Tap on back after inviting some user
* Tap on back again
* Confirm inviting someone to a DM
* Make fix conditional