Commit Graph
1521 Commits
Author SHA1 Message Date
Narasimha-sc b7cce5513e core, tests, ui: keep member order with role index, skip down-migration schema comparison, reload support list on return with older remote hosts 2026-09-27 10:16:52 +00:00
Narasimha-sc 2698b0e12d core, ui: load only members with support chats for the support chats list 2026-09-26 19:58:32 +00:00
Narasimha-sc 5f52f5db8c ui: keep support list load running when a member chat is opened, avoid repeated loads 2026-09-26 18:36:48 +00:00
Narasimha-sc 4fc47fde19 ui: skip support list load after chat change, reload iOS list on members reset 2026-09-26 18:18:44 +00:00
Narasimha-sc ca826445ca android: reload support list when members are reset while it is open 2026-09-26 18:09:18 +00:00
Narasimha-sc 9de8a82cfd core, ui: total match in moderation path, merge member profile, reload list for another group on iOS 2026-09-26 17:36:58 +00:00
Narasimha-sc de0b293da7 core, ui: keep loaded support stats on member join, handle failed loads on iOS, write members on main thread 2026-09-26 17:27:37 +00:00
Narasimha-sc 1c5b15e7ef core, ui: carry updated support member in internal items, merge only support stats, handle failed member loads 2026-09-26 17:18:54 +00:00
Narasimha-sc b8102803a6 core, ui: return updated support member on send, ignore stale member loads 2026-09-26 17:07:27 +00:00
Narasimha-sc 954295ce50 ui: update member support chats list from delete responses 2026-09-26 16:59:23 +00:00
Narasimha-sc 97f6bc1411 core, ui: update member support chats list from events instead of reloading all members 2026-09-26 16:58:22 +00:00
Narasimha-scandEvgeny Poberezkin 294fbf1b7d desktop: fix crash at startup on Windows when WMI does not answer (#7581)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-09-26 13:42:02 +01:00
Evgeny Poberezkin 2f6e4d556d Merge branch 'stable' 2026-09-26 13:31:47 +01:00
Evgeny e33163ee92 android: fix SimpleX links (#7596) 2026-09-26 13:31:16 +01:00
Narasimha-scandEvgeny 8e35c05fc0 android: match app links by exact path so simplex.chat pages open in the browser (#7565)
* android: match app links by exact path so simplex.chat pages open in the browser

* simpler

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-09-26 13:23:54 +01:00
Narasimha-scandEvgeny 11ecd0f5b7 android: match app links by exact path so simplex.chat pages open in the browser (#7565)
* android: match app links by exact path so simplex.chat pages open in the browser

* simpler

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-09-26 13:21:05 +01:00
Narasimha-sc b85313b61f desktop: fix app freeze when a video is stopped during format negotiation (#7582)
video().track() in the buffer format callback takes the libvlc input lock,
which stop() holds while it waits for the decoder thread running that
callback. Take the video track from the media info only.
2026-09-26 13:14:13 +01:00
Narasimha-scandEvgeny Poberezkin 67c619acff android, desktop: open group member profile without waiting for the core (#7485)
* android, desktop: open group member profile without waiting for the core

Tapping a member avatar awaited apiGroupMemberInfo and apiGetGroupMemberCode
before the profile modal was created. Both are single-row queries, 1-2 ms when
the core is idle, but sendCmd is serialized against everything else the core is
doing, so while it is busy - startup, a batch of incoming events, a long database
operation - the tap produces nothing at all until the core drains.

The modal is now opened first and the two values arrive in state the tap handler
creates, so the profile opens at the speed of the UI. The card is shown from the
member that is already known at the tap, preferring the model's copy once it is
there, so the member no longer has to be written to the model before the modal
can be shown.

* plans: open member profile without waiting for the core

* android, desktop: keep member profile rows in place while they load

The security code and the connection stats arrive after the profile is shown, so
"Verify security code" and the Servers section appeared under the already
visible card and pushed the rows below them down.

They are now rendered from the first frame in their final positions, disabled,
and enabled in place when the data arrives - SectionItemView already drops the
clickable modifier when disabled, so nothing moves. Only what can be decided from
the member known at the tap is reserved: "Fix connection" is not, as it applies
only while a ratchet needs syncing and a placeholder for it would disappear on
nearly every open.

* android, desktop: reserve the network status row with the servers

The reserved Servers section had three rows where the loaded one has four, so
everything below it - "Block member" - moved down by one row when the stats
arrived.

Network status looks like agent state that cannot be predicted before loading,
but connSubStatus returns Just whenever the connection has receiving queues, and
that is the same list that decides whether "Receiving via" is rendered. The two
rows appear together, so the status row is now reserved with them.

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-09-26 13:13:36 +01:00
Narasimha-sc c0344a9a61 android, desktop: make media blur much lighter on CPU (#7483)
* ui: blur media by resampling the preview, not a per-frame effect

Modifier.blur put a BlurEffect on a display-sized graphics layer, so the
Gaussian was re-evaluated on every frame the media was drawn. It also
requires RenderEffect, which Android applies only from API 31, so below
Android 12 media was drawn unblurred while the setting read as on.

A blur and a downscale discard the same thing - detail finer than their
radius - so the preview is now resampled to about one pixel per radius and
stretched back. That runs once when the item composes, needs no
RenderEffect, and removes the detail irreversibly rather than convolving
it. The first resampling step bounds both sides, so no image, however
shaped, can produce a large intermediate.

While the blur hides the media the file is also left unread, so an image
scrolled past is no longer read, decoded at its full size and kept in the
image cache only to be hidden again. blurHidesMedia() is the single
definition that both the drawing and the loading decision use, so they
cannot disagree about whether the media is on screen.

* plans: blur media by resampling the preview

* ui: shorten comments in media blur

* ui: smooth the media blur and match its strength to the old one

Stretching the resampled preview straight to the screen showed its pixel grid. Double it back
up until its longest side is at least half the reference width before drawing, so the last
stretch is short and the tents compose into a bell. The reference width moves from 360 to 400:
fitted against Gaussians, 360 blurred 5-75% more than Modifier.blur did, 400 is within 10% at
every setting.
2026-09-26 12:49:36 +01:00
Narasimha-scandEvgeny Poberezkin ef66e5e520 desktop: fix laggy bars blur by blurring a narrower offscreen copy (#7556)
Skia's raster blur runs at full resolution, so each bar blurred width x (bar + 6 sigma) pixels every frame: about
80 ms per frame for the two bars of a chat at the default radius, which cut scrolling to 5-9 fps on the software
renderer. Scaling the layer cannot help, because a layer's filter is evaluated in device space and the scale is
applied to the sigma too. The bar is now drawn into an offscreen surface up to 8x narrower and blurred there, which
measured 5-6x cheaper and within 0.25/255 of the original.

Blurring a copy means the bar no longer follows the content on its own, so the scroll containers bump a version on
the app bar handler and the bar depends on it.

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-09-26 12:42:36 +01:00
sh 7596b4f850 ui: news channel (#7594)
* ui: wefunder utm link, news channel in help

* android: close modals when opening chat via link
2026-09-26 11:06:47 +01:00
sh 02fa39e766 ui: news channel (#7594)
* ui: wefunder utm link, news channel in help

* android: close modals when opening chat via link
2026-09-26 10:37:13 +01:00
Evgeny Poberezkin b8d87ca967 Merge branch 'stable' 2026-09-25 22:17:32 +01:00
EvgenyandEvgeny @ SimpleX Chat 67f4c3d085 ui: update crowdfunding title (#7593)
* ui: update crowdfunding title

* update images

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-25 22:16:40 +01:00
EvgenyandEvgeny @ SimpleX Chat 9a9ce70b2f core: fix connecting via prepared connection with contact card (#7575)
* core: fix connecting via prepared connection with contact card

* simplify

* merge transactions

* update query plans

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-24 08:11:29 +01:00
spaced4ndy 0b9ae4d6de ui: open support SimpleX screen from badge and file alerts (#7563) 2026-09-23 09:34:47 +00:00
spaced4ndy fae017d5b3 ui: show close button on badges banner only after it was opened (#7560) 2026-09-22 13:40:56 +00:00
spaced4ndy 150897d637 core, ui: alert the user when badge renewal is failing (#7532) 2026-09-22 12:55:08 +00:00
spaced4ndy a3ac420e91 ui: one banner at a time in chat list (#7554) 2026-09-21 16:51:14 +00:00
spaced4ndy 9a583d394f Merge branch 'stable' 2026-09-21 20:33:31 +04:00
spaced4ndy fd16048598 ui: replace wefunder logo with simplex logo on crowdfunding banner (#7555) 2026-09-21 16:28:58 +00:00
spaced4ndy 45d674c067 Merge branch 'stable' 2026-09-21 18:17:36 +04:00
spaced4ndy 7e24ecb982 ui: add wefunder logo to crowdfunding banner (#7553) 2026-09-21 14:16:38 +00:00
spaced4ndy f68bccecfb Merge branch 'stable' 2026-09-21 17:31:29 +04:00
spaced4ndy c8c05359b5 ui: crowdfunding banner on onboarding and in chat list (#7552) 2026-09-21 12:01:57 +00:00
SimpleX Chat 3326f9db2a 7.1-beta.4: android 379, desktop 162, ios 357 2026-09-19 14:25:57 +00:00
EvgenyandEvgeny @ SimpleX Chat 0183a36058 ui: update text about badges (#7544)
* ui: update text about badges

* update

* update

* update

* update

* update

* update

* update kotlin

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-19 14:16:39 +01:00
Evgeny Poberezkin 25c5b3cdfd Merge branch 'stable' 2026-09-19 12:21:53 +01:00
Narasimha-scandEvgeny Poberezkin ecb9d87157 android, desktop: fix Submit button not visible in passcode view in split screen (#7497)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-09-19 10:13:52 +01:00
Narasimha-sc 463761cc8e ui: use backward compatible Java api in stripFormattedTextLink (#7464) 2026-09-19 08:31:52 +01:00
Narasimha-sc 6f85f1d4f0 android, desktop: offer key verification when member profile is opened from chat (#7486)
In channels members are usually connected via relays, so they are memberCurrent
but not memberActive, and #7255 widened the condition for requesting the member
security code to cover them. It updated GroupChatInfoView and
MemberSupportChatView, but not the same code in ChatView, so "Verify security
code" is not offered when the profile is opened by tapping member avatar in the
chat, while it is offered for the same member in the members list.
2026-09-19 08:13:05 +01:00
spaced4ndy c7b3e362ec core, ui: badge credential details in developer tools (#7527) 2026-09-17 16:18:04 +00:00
spaced4ndy 746d33ff6d multiplatform: remove unused strings (#7529) 2026-09-17 15:12:14 +00:00
spaced4ndy dd5c47d02d ui: "how it works" link and card styling on badge screen (#7524) 2026-09-16 15:13:01 +00:00
spaced4ndy c52044f3c3 ui: show progress spinner on redeeming code (#7523) 2026-09-16 14:43:28 +00:00
spaced4ndy f38c7e0f2b core, ui: badge redeem errors and fixes (#7515)
- redeem errors are typed (CEBadgeRedeemError) instead of matched by text in the apps
- service timeout (A_SERVICE) decodes in the apps and offers Retry via the existing retry alert
- unexpected redeem errors show the error itself instead of a generic message
- service error codes are a typed enum in the apps (BadgeServiceErrorCode)
- CRBadgeRedeemed returns badge state, so the apps skip a second round-trip after redeem
- setBadgeAlertAcked is scoped to user_id
- badgeChanged updates non-active profiles, so other profiles' badges don't go stale
- pitch banner is not shown to a profile that already has a badge
- one badgeTypeName per platform, used by the badge screen and the badge info alert
- BadgeAlertKind and BadgeAlertPrice decode via standard JSON, no custom decoders
- dead "Support ended" title branch removed from Your Badge view
- kotlin: users from badge responses carry remoteHostId
- kotlin: redeem code field keeps the IME's cursor and composition state
- kotlin: "Get your code" shown in all flavours
- kotlin: "Don't show again" -> "Dismiss", matching iOS
- kotlin: parseBadgeCode moved next to its FFI in platform/Core.kt
- kotlin: BadgesView no longer cross-fades on badge state updates
- kotlin: section title not uppercased
- ios: redeem code field parses once per change
- ios: A_SERVICE rejected reason is not decoded
- CLI: "cannot redeem badge code: ..." with the source of the error
- comments clarified
2026-09-16 14:15:11 +00:00
SimpleX Chat 172c6d9ca3 7.1-beta.3: android 378, desktop 161, ios 356 2026-09-15 16:59:06 +00:00
spaced4ndy b0a7219db2 android: show "Get your code" button in all app flavours (#7514) 2026-09-15 15:32:10 +00:00
spaced4ndy 6a7eae2751 ui: redeem code (#7482) 2026-09-15 14:23:13 +00:00
spaced4ndy bac8d187ba Merge branch 'master' into badges 2026-09-14 17:13:58 +04:00