ntfy.sh silently blocks Matrix gateway traffic, which is why the embedded
provider never delivered despite a sound code path. Existing installs
re-register against the new server automatically on next app open
(ensurePusherIsRegistered runs every launch).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rail: desktop parity (element-web rootSpaces) — spaces nested inside another
joined space no longer get a rail entry; their rooms stay reachable through
the parent space. Nested set persisted for clean cold starts.
Updater: new libraries/blapupdate module checks the git.utn.lol release feed
(6h throttle), offers a banner at the top of the chat list, downloads the
ABI-matched APK and hands it to the system installer. Per-version dismissal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Match desktop's SpaceStore.showInHomeSpace exactly: Home = orphaned rooms +
all DMs (bridged included) + invites. Space-owned non-DM rooms stay inside
their spaces. Replaces the previous too-aggressive rule that also hid
bridged DMs, and no longer exempts filter chips (desktop does not).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upstream's non-enterprise build hardcoded Posthog+Sentry providers into the
APK (opt-in prompt, Element endpoints). Analytics is now always
AnalyticsConfig.Disabled: the no-op service compiles in, the provider
modules never enter the dependency graph.
Drops upstream's CalVer versionCode entirely; one-time downgrade means
pre-1.0.4 installs need a single uninstall/reinstall (accepted).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
versionCode stays on the monotonic CalVer formula (Android forbids downgrades);
only the user-visible version name changes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Everything from port rounds 1-5 plus today's fixes, on top of upstream develop:
- Branding: Blap name/id (lol.utn.blap), purple #7c66e0 accent (both colorGreen*
and colorAlphaGreen* Compound ramps remapped), Hanken Grotesk, squircle
avatars, five-dot notification icon, de-branded strings across all locales
- Push: new libraries/pushproviders/ntfy module — FGS websocket to an ntfy
server's Matrix gateway, no Google. Includes base64 payload decode, restart
on boot/update/app-open, background-FGS-start crash guard, and a proactive
battery-optimization banner (Doze kills the socket without the exemption)
- Spoilers (MSC2010, interops with Blap desktop 1.0.3): render + tap-to-reveal,
Discord ||text|| send syntax, SPOILER_ filename convention for media both ways
- Home: Discord-style space rail, client-side room-list sections, DM-first sort
- Calls: embedded Element Call fork 0.20.3 assets (camera-off joins, bottom strip)
- Threads on by default; RTC ping timeline items hidden; reply-quote restyle
- URLs now point at git.utn.lol/enki/blap (was codeberg); version 26.07.2
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Update android.gradle.plugin to v9
* Separate extensions between app and library ones
`CommonExtension` has been split and its properties are now duplicated in `ApplicationExtension` and `LibraryExtension` without a shared interface, so we now need to duplicate the helper extension functions
* Bump Gradle wrapper to `9.3.1`
* Remove `kotlin-android` plugin usage: it's no longer needed
* Enable `resValues` build feature for the modules that have resources in custom variants like gplay, debug, etc.
Otherwise this now fails saying the resources are there but the feature is disabled
* Remove `retrofit` dependency from `:features:call:impl`
It wasn't in use and the build was failing
* Update kotlin to v2.4.0
* Update plugin paparazzi to v2.0.0-alpha05
* Update gradle wrapper to 9.5.1
./gradlew wrapper --gradle-version 9.5.1 --gradle-distribution-sha256-sum bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f
* Update com.android.tools.build:gradle to 9.2.1
* Update plugin sonarqube to v7.3.1.8318
* Kotlin 2.4.0
* Context parameters are enabled by default in Kotlin 2.4.0
* Fix code issue
* Fix record screenshot issue
* Workaround for https://github.com/cashapp/paparazzi/issues/2342
* Workaround for another issue with Paparazzi
* Remove unused import
* Update screenshots
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoitm@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
Co-authored-by: ElementBot <android@element.io>
* 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
* Add support for slash commands
* Update screenshots
* Rename module `slash` to `slashcommands`
* Rename `SlashCommand` to `SlashCommandService`
* Introduce MsgType in order to send text message with a different msgtype value.
* Format file and add parameter names, add default values and cleanup
* Add isSupported parameter to filter out unsupported yet commands.
* Slash commands: disable suggestions if the feature is disabled.
* Fix sending shrug command.
* Add missing test on SuggestionsProcessor
* Add tests on MessageComposerPresenter about slash command.
* Fix import ordering
* Add missing tests on CommandExecutor
* Add missing tests in MarkdownTextEditorStateTest
* Slash commands: Improve code when sending message with prefix.
* Slash commands: Add support for /unflip
---------
Co-authored-by: ElementBot <android@element.io>
* Fix `TransactionTooLargeExceptions` caused by Appyx
After a long debugging session, we discovered the code Appyx uses to clear the saved state of nodes that have been removed is not working because of a race condition, causing this saved state to grow indefinitely.
To fix it, we need to wait until the node has been disposed, which will call `SaveableStateHolder.removeState` once, removing the associated `SaveableStateRegistry`, and *then* call `removeState` again when we detect the node has been removed from the navigation graph.
Since these classes and APIs are private in Appyx, we had to copy and modify and use these copies.
* Remove ktlint checks on `SafeChildrenTransitionScope.kt`
* Don't count the new code for coverage
* Remove explicit dependency for `androix.compose.material` for compose library modules
* Ensure `Button` uses the `material3.Icon` instead of the `material.Icon`
* Remove entry in `libs.versions.toml`