Commit Graph
6369 Commits
Author SHA1 Message Date
Narasimha-sc 5afce0e600 docs: plan - part 3 review follow-ups; reference sections not in-branch hashes 2026-07-23 15:24:11 +00:00
Narasimha-sc 47134350a9 android, desktop, ios: review follow-ups to the pending invitee preview
Four fixes from adversarial review of the branch.

ios: clamp the unread counter at the apply point. changeUnreadCounter(chatIndex:)
applied the delta unclamped, so unreadCount could go negative and the app icon badge
with it - a state that persists until the chat list reloads and that also suppresses
the badge for genuinely unread messages arriving after. Reachable because the
edit/delete sync added removeChatItem as a decrement source for member support items,
while the count being decremented excludes them (the chat list queries filter
group_scope_tag IS NULL): after a restart, moderating a still-unread support message
decrements a zero. Clamped at the collector flush - its only caller - so it is correct
regardless of how the debounced deltas batch, and the user/badge counter is fed the
delta actually applied. Android has always done this in decreaseCounterInPrimaryContext.

android, desktop: gate both primary-context mirrors on memberPending. The primary's
preview block runs for a scoped ChatInfo only when memberPending, so for anyone else
the mirrored call could not update a preview - it only had side effects. addChatItem's
mirror re-ordered the group in the main chat list when a non-pending member replied in
a member support chat, and, lacking a scope check, also re-ran the primary for sent
items the dispatcher had already given it. ComposeView's edit mirror is on the live
message path, so it fired on every tick to do nothing.

android, desktop, ios: don't let upsertChatItem create a chat entry from a scoped
ChatInfo. The memberPending exception made its "chat not found" branch reachable for
support items, seeding the main list with a support item as preview - and since
ChatInfo.Group.id ignores the scope, shadowing the real group rather than showing as a
duplicate. On iOS it also set itemAdded, which chatItemSimpleUpdate turns into a new
message notification. addChatItem never did this either.

android, desktop, ios: gate the media preview exception on showChatPreviews. Treating a
caption-less media support message as "has content" skips the status branch, but the
next branch needs showChatPreviews and Android/desktop have no trailing else (the
thumbnail is gated by the same flag) - so with previews off the row rendered empty
where master showed "reviewed by admins". iOS redacted it rather than dropping it, but
also lost the status. Falls back to hasMsgContent when previews are off.
2026-07-23 15:24:11 +00:00
Narasimha-sc 5bcba9e0b2 android, desktop, ios: simplify pending-invitee preview selection
Collapse the four nested branches in addChatItem's preview pick into a
single "keep the current preview" predicate: the new item wins by default,
and only the comparison criterion changes for a pending invitee. Same
behaviour, addresses review feedback (4 branches for 2 outcomes).
2026-07-20 19:31:30 +00:00
Narasimha-sc 627598d5b3 docs: plan - drop unread clamp (out of scope); note pre-existing iOS over-decrement left untouched 2026-07-20 13:31:05 +00:00
Narasimha-sc d2fedbe66b ios: drop the unread-counter clamp - out of scope for this PR
The apply-point clamp in changeUnreadCounter (342e270a1/fb849aa2c) guarded a pre-existing, general
iOS over-decrement (markChatItemsRead decrements by the requested id count regardless of whether each
item still counted) that this feature neither introduces nor worsens - Android already self-clamps in
decreaseCounterInPrimaryContext, iOS never did. The pending-invitee preview's support-item unread is
balanced without it (+1 on receive, -1 on read/delete). Leave iOS unread untouched here; a general
clamp belongs in its own change.
2026-07-20 13:31:05 +00:00
Narasimha-sc 3f8b4b89e9 docs: plan - fix Verification line refs; justify the apply-point unread clamp (reachable via markChatItemsRead, Android parity) 2026-07-20 13:31:05 +00:00
Narasimha-sc 7bca62dccd docs: plan - apply-point unread clamp + document dispatcher double-touch and delete-text findings; consistency nits 2026-07-20 13:31:05 +00:00
Narasimha-sc cf6ed70e70 ios: clamp unread at the apply point, not the debounced call site
342e270a1 clamped removeChatItem's decrement by reading unreadCount synchronously, but
UnreadCollector debounces ~1s, so the read saw a stale value: receiving an unread item then deleting
it within the window skipped the -1 and left the badge +1 too high - a regression, since the
unconditional -1 had netted to 0 in the collector. Revert that call-site clamp and instead clamp in
changeUnreadCounter(chatIndex:) - the point the accumulated delta is applied (its only caller is the
collector flush): clamp the per-chat count at 0 and feed the badge the clamped delta. Correct
regardless of debounce ordering, and still prevents the original negative drift.
2026-07-20 13:31:05 +00:00
Narasimha-sc ce7a7c7bf0 docs: plan 2b - prefer-content uses msgContent so caption-less media wins 2026-07-20 13:31:05 +00:00
Narasimha-sc cb4b1b7f50 android, desktop, ios: let caption-less media become the pending invitee preview
The prefer-content check used hasMsgContent (msgContent != null AND non-empty text), so a
caption-less photo/voice/file was treated like a no-content event and could not become the preview
when a prior text message was shown. Use msgContent != null (is-a-message) instead; the no-content
event re-cover guard still holds (events have msgContent == null).
2026-07-20 13:31:05 +00:00
Narasimha-sc 204cd2b835 docs: plan - note iOS removeChatItem unread clamp 2026-07-20 13:31:05 +00:00
Narasimha-sc 780e1d4965 ios: clamp removeChatItem unread decrement to match Android (avoid negative badge drift)
removeChatItem decremented the unread counter unconditionally for an RcvNew item. iOS, unlike
Android's self-clamping decreaseCounterInPrimaryContext, could drive the badge negative if the item
entered the list via upsertChatItem's addChat path (no increment) and was then deleted unread. Only
decrement when the chat's unreadCount > 0.
2026-07-20 13:31:05 +00:00
Narasimha-sc 725b651298 docs: plan 2e - scope media preview to pending invitee 2026-07-20 13:31:05 +00:00
Narasimha-sc e2459715d9 android, desktop, ios: scope media support-message preview to pending invitee only
The prior change to render caption-less media (instead of the status text) used the shared
ChatPreviewView condition, so it affected every chat with a status preview (direct connection
states, other group states). Gate it on memberPending so only the pending invitee's member-support
preview changes; all other chats keep the original hasMsgContent behaviour.
2026-07-20 13:31:05 +00:00
Narasimha-sc 99e78ae573 android, desktop, ios: tighten pending-invitee preview comments 2026-07-20 13:31:05 +00:00
Narasimha-sc 22897c5141 docs: plan Part 2 intro - include edit/delete and media fixes 2026-07-20 13:31:05 +00:00
Narasimha-sc 86a534f8bb docs: plan 2e - render media support messages in preview; media limitation resolved 2026-07-20 13:31:05 +00:00
Narasimha-sc c31aebca67 android, desktop, ios: render media support messages in the chat list preview, not the status text
ChatPreviewView showed the status info text (e.g. a pending invitee's 'reviewed by admins')
whenever the last item's text was empty (hasMsgContent), which also caught caption-less media — so
a photo/voice/file support message showed the status text next to its already-rendered thumbnail.
Show the status only for true no-content items (events, msgContent == null); any message, including
caption-less media, falls through to render its content.
2026-07-20 13:31:05 +00:00
Narasimha-sc 1a2b05bfd8 docs: plan 2d - own-edit dispatch to primary context 2026-07-20 13:31:05 +00:00
Narasimha-sc 08ada4b200 android, desktop: reflect a pending invitee's support-message edit in the main chat list preview
Editing in a member-support scope calls upsertChatItem on the active (secondary) context only, so
the primary context that owns the main-list preview was never updated (same asymmetry as sends).
Also update the primary context on edit when the active context is a member-support scope. iOS is
unaffected (single chats list).
2026-07-20 13:31:05 +00:00
Narasimha-sc 91ece03120 docs: plan - edit/delete preview sync (2d) and known limitations (media preview, out-of-order, unread lag) 2026-07-20 13:31:05 +00:00
Narasimha-sc 7c63ed5f41 android, desktop, ios: keep pending invitee preview in sync on support message edit/delete
upsertChatItem/removeChatItem gated their main-list preview update on groupChatScope()==null, so
once a pending invitee's support message was the preview, editing it left stale text and
deleting/moderating it left a phantom. Add the same memberPending exception addChatItem has (both
already match the preview item by id). On iOS, restrict the 'update preview for an item not in the
open scope' clause to main scope so a support item's status updates don't churn the preview.
2026-07-20 13:31:05 +00:00
Narasimha-sc f5e6400402 docs: add prefer-content commit to plan header 2026-07-20 13:31:05 +00:00
Narasimha-sc 4009414c89 docs: plan - prefer content in pending preview; document re-covering events 2026-07-20 13:31:05 +00:00
Narasimha-sc 6fc546b27f android, desktop, ios: keep pending invitee preview on the support message, not a re-covering group event
A pending invitee's member-support no-content group events (SGEUserPendingReview on the
PendingApproval->PendingReview transition, member-connected/E2EE/feature items) are delivered
as new chat items in member-support scope. The pending preview took the newest item, so such
an event re-covered the first message and rendered as the static "reviewed by admins" text.
Prefer a content message: a no-content item no longer displaces an already-shown message.
2026-07-20 13:31:05 +00:00
Narasimha-sc 172b63437a docs: update plan - pending invitee preview (sent/received); reload persistence deferred for performance 2026-07-20 13:31:05 +00:00
Narasimha-sc 8a102ee55e ios: show pending invitee's received support messages in chat list preview
Mirror the android/desktop fix: a pending invitee's received support message was
dropped from the main chat list preview by the group itemTs comparison (received
broker clock vs locally-stamped group-event clock - not comparable). Bypass the
comparison when memberPending so the received support item surfaces in the preview.
2026-07-20 13:31:05 +00:00
Narasimha-sc 96c5dc6f9c android, desktop: show pending invitee's received support messages in chat list preview
- Narrow the sent-item mirror (previous commit) to GroupChatScopeContext (member
  support); the reports view has no compose, so it shouldn't trigger it.
- A pending invitee's RECEIVED support message was dropped from the main chat list
  preview: the group preview keeps the higher-itemTs item, but a received message's
  itemTs is the broker clock while the placeholder group event's itemTs is the local
  device clock - an unreliable cross-clock comparison. Bypass it when memberPending
  so received support items surface in the preview the same way sent ones do.
2026-07-20 13:31:04 +00:00
Narasimha-sc f518fecc20 android, desktop: keep sent support message in main chat preview for pending invitee
A message sent in a secondary scope (member support / "chat with admins") is
added only to the active context (ComposeView passes its own chatsCtx), unlike
received items which the NewChatItems handler delivers to both the primary and
secondary contexts. After the index-correct revert of #5909's chatsContext.chats[i]
write, a pending invitee's sent support message no longer appeared in the main
chat list preview.

Mirror the receive path: when adding a sent item on a secondary context, also
update the primary context, so the main chat list preview updates at the correct
index. Sent items are not RcvNew, so this adds no unread double-count.
2026-07-20 13:31:04 +00:00
Narasimha-sc d127643115 docs: add plan justifying wrong-chat preview/unread fix 2026-07-20 13:31:04 +00:00
Narasimha-sc 0812748df5 android, desktop: fix message preview and unread count applied to the wrong chat
When a member support chat or group reports view is open (a secondary chats
context is active), incoming messages could overwrite the last-message preview
of an unrelated chat in the main chat list, increment the wrong chat's unread
badge, and pop the wrong chat to the top.

ChatsContext.addChatItem computed the chat index against the receiver context's
own list via getChatIndex, but then read/wrote chatsContext.chats[i], which
always refers to the primary (main) chat list. On the secondary context the two
lists are ordered differently, so the index pointed at a different chat.

Use the receiver context's own list (chats[i]) consistently, matching every
other method in ChatsContext and the iOS implementation. No change for the
primary context, where chats and chatsContext.chats are the same list.
2026-07-20 13:31:04 +00:00
spaced4ndyandGitHub 966c9f7947 core: fail compilation on name shadowing (#7283) 2026-07-20 13:20:37 +00:00
spaced4ndyandGitHub ba6f5386c8 core: allow moderators to change member <-> observer roles in groups (#7279) 2026-07-20 12:56:23 +00:00
SimpleX ChatandEvgeny Poberezkin bd55fedc2d 7.0.0-beta.4: android 363, desktop 152, ios 342 v7.0.0-beta.4 2026-07-20 10:25:58 +01:00
Narasimha-scandGitHub 147355b76a desktop: don't delete shared temp dirs from a transient second instance (#7168)
On an incoming call the desktop window blinked continuously (FileNotFoundException
from SoundPlayer.start writing into a missing ...\Temp\simplex).

Root cause: Files.desktop top-level val initializers run in any process that
touches the facade class, including a transient second instance (which reaches
acquireSingleInstance -> dataDir). Two of them deleted shared state used by the
running primary:
- tmpDir had .also { deleteOnExit() } - the second instance's normal exit deleted
  ...\Temp\simplex, so the primary then failed to write call sounds/recordings.
- preferencesTmpDir had .also { deleteRecursively() } - the second instance's
  <clinit> wiped configPath\tmp (same anti-pattern, firing even earlier).

Make both declarations pure and do the destructive cleanup in Main, past the
single-instance check, so only the owning instance performs it (preferencesTmpDir
kept early, before any settings write). The remaining val-initializer side effects
are idempotent creations (mkdirs) that destroy nothing and are left in place.
2026-07-18 20:34:34 +01:00
+16 fb3357c638 ui: translations (#7275)
* ui: what's new in 7.0 (#7265)

* docs: add Hosting your own Chat Relay guide  (#7263)

* docs: add Hosting your own Chat Relay guide

* cli: run headless relay without a terminal

--headless (no -e) now runs via simplexChatCore instead of the terminal
UI, so the relay runs as a systemd service without a TTY (withTerminal
requires one). Drains the event queue logging only errors, and sets
stdout to line-buffering so logs reach the journal.

* docs/chat-relay: debounce service

* Apply suggestions from code review

Co-authored-by: Evgeny <evgeny@poberezkin.com>

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>

* Translated using Weblate (German)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Russian)

Currently translated at 96.5% (2381 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/

* Translated using Weblate (Russian)

Currently translated at 96.5% (2381 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/

* Translated using Weblate (Russian)

Currently translated at 96.5% (2381 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/

* Translated using Weblate (French)

Currently translated at 93.6% (2309 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.9% (2867 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 98.6% (2431 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* Translated using Weblate (Dutch)

Currently translated at 82.5% (2035 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/

* Translated using Weblate (Arabic)

Currently translated at 29.8% (735 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ar/

* Translated using Weblate (Ukrainian)

Currently translated at 87.0% (2145 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/uk/

* Translated using Weblate (Polish)

Currently translated at 87.6% (2161 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/pl/

* Translated using Weblate (Turkish)

Currently translated at 86.8% (2140 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 86.8% (2140 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2868 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Indonesian)

Currently translated at 94.8% (2719 of 2868 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/id/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2867 of 2867 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (2867 of 2867 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2880 of 2880 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2880 of 2880 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2880 of 2880 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.3% (2450 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/

* Translated using Weblate (German)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.9% (2884 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2885 of 2885 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2886 of 2886 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.9% (2885 of 2886 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2886 of 2886 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2890 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.9% (2889 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2890 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2890 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/

* Translated using Weblate (German)

Currently translated at 100.0% (2890 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2890 of 2890 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2465 of 2465 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* process translations

* restore and fix

* process xliff

* ui: fix translation typos and mistranslations (de, es, it, tr, hu, id, ar, zh-CN)

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
Co-authored-by: Evgeny <evgeny@poberezkin.com>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Pixelcode <pixelcode@dismail.de>
Co-authored-by: J R <jr@simplex.chat>
Co-authored-by: Evgeny Poberezkin <e.poberezkin@me.com>
Co-authored-by: Evgeny <ep@simplex.chat>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate user 54392 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: re me <jisizhang001@gmail.com>
Co-authored-by: No name <usir.alerts@onionmail.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Muhammad <muhammad.aem@outlook.com>
Co-authored-by: Max <worklmaksim@gmail.com>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: Abdullah Koyuncu <wisewebworks@outlook.com>
Co-authored-by: Omer <abulomer2001@gmail.com>
Co-authored-by: echoloji <mehmetksm@tuta.io>
Co-authored-by: summoner001 <summoner@disroot.org>
Co-authored-by: Rafi <rafimuhmad90@protonmail.com>
Co-authored-by: BlacAmDK <BD1079259369@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com>
2026-07-18 20:33:10 +01:00
Narasimha-scandGitHub c125836d85 android, desktop: fix empty area below wide images (beta.3 regression) (#7223)
Wide images size their preview box with a fixed width of DEFAULT_MAX_IMAGE_WIDTH
(500dp). #7125 switched the box from .aspectRatio() to a fixed .height() computed
from that nominal width; on screens narrower than 500dp, .width(500dp) is clamped
to the available width but the fixed height is not, so the top-aligned FillWidth
image is shorter than its box, leaving an empty strip below.

Compute the height from the width actually granted via a small Modifier.layout so
it tracks the clamped width, restoring the self-correcting behaviour .aspectRatio()
had. coerceAtMost(w) keeps the box within its nominal width (and bounds the
unbounded intrinsic-measurement pass), and coerceAtLeast(0) mirrors what
Modifier.width()'s SizeNode does for a negative w on a tiny window - so both
dimensions stay in range and the #7123 Constraints overflow crash cannot recur.
2026-07-18 14:58:25 +01:00
590707915c website: translations (#7273)
* ui: what's new in 7.0 (#7265)

* docs: add Hosting your own Chat Relay guide  (#7263)

* docs: add Hosting your own Chat Relay guide

* cli: run headless relay without a terminal

--headless (no -e) now runs via simplexChatCore instead of the terminal
UI, so the relay runs as a systemd service without a TTY (withTerminal
requires one). Drains the event queue logging only errors, and sets
stdout to line-buffering so logs reach the journal.

* docs/chat-relay: debounce service

* Apply suggestions from code review

Co-authored-by: Evgeny <evgeny@poberezkin.com>

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 47.9% (179 of 373 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hant/

* Translated using Weblate (Turkish)

Currently translated at 63.0% (235 of 373 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/tr/

* Translated using Weblate (Indonesian)

Currently translated at 95.7% (357 of 373 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/id/

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
Co-authored-by: Evgeny <evgeny@poberezkin.com>
Co-authored-by: HUGOALH <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: Omer <abulomer2001@gmail.com>
Co-authored-by: Rafi <rafimuhmad90@protonmail.com>
2026-07-18 14:55:32 +01:00
Narasimha-scandGitHub 7adadfe2cd desktop: show only desktop .deb packages for current architecture in updater (#7270) 2026-07-18 14:20:53 +01:00
a1325c9788 ios, desktop, android: clearer error message when connecting via removed link (AUTH) (#7268)
* ios, desktop, android: clearer error message when connecting via removed link (AUTH)

* Update apps/ios/Shared/Model/SimpleXAPI.swift

Co-authored-by: Evgeny <evgeny@poberezkin.com>

* android, desktop: use concise AUTH error message to match iOS

* update localizations

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-07-18 08:45:07 +01:00
Evgeny Poberezkin 5d67cf8969 ios: export localizations 2026-07-18 08:19:14 +01:00
EvgenyGitHubEvgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
d95f924b73 ui: improve profile descriptions (#7262)
* ui: improve profile descriptions

* update

* fix

* improve layout

* fix alert

* more improvements

* recizable iOS field

* change max lines

* fixes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-07-18 08:13:05 +01:00
Evgeny Poberezkin 79660e1dc6 core: 7.0.0.9 (simplexmq 7.0.0.5) 2026-07-18 08:09:23 +01:00
spaced4ndyandGitHub 93831a0f24 core: signed history in channels, auto-sign based on preference (#7257) 2026-07-17 19:44:51 +00:00
a81baebed5 docs: add Hosting your own Chat Relay guide (#7272)
* docs: add Hosting your own Chat Relay guide

* cli: run headless relay without a terminal

--headless (no -e) now runs via simplexChatCore instead of the terminal
UI, so the relay runs as a systemd service without a TTY (withTerminal
requires one). Drains the event queue logging only errors, and sets
stdout to line-buffering so logs reach the journal.

* docs/chat-relay: debounce service

* Apply suggestions from code review

Co-authored-by: Evgeny <evgeny@poberezkin.com>

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-07-17 17:09:38 +01:00
shandGitHub 27da94e11d desktop: fix low-quality image previews from over-downsampling (#7267)
getLoadedImage subsampled with an OR cap on the larger side, so tall
images (e.g. phone screenshots) were reduced far below the display size
and rendered blurry. Mirror Android's calculateInSampleSize (keep the
smaller side at the target) so previews stay sharp, and add a decoded-
pixel ceiling so extreme aspect ratios can't blow up decode memory.
2026-07-17 16:58:40 +01:00
shandGitHub bd86d6f403 website: add Chat Relay guide to the docs navbar (#7271)
Adds a 'Host Chat Relay' entry to the Reference dropdown, after 'Host
XFTP Server', linking to /docs/chat-relay.html.
2026-07-17 16:57:21 +01:00
Narasimha-scandGitHub 11f0b6bd51 desktop: show startup errors in a copyable window instead of bare "Failed to launch JVM" (#7261)
* desktop: show startup errors in a copyable window instead of bare "Failed to launch JVM"

When any exception escapes main() before the app window appears - a missing
DLL, a failed migration, broken AWT init - the jpackage launcher shows only
"Failed to launch JVM" and the cause is recorded nowhere: the launcher runs
without a console, so stderr is lost. Every report in #4146 stalled on this.

Catch the error and show it in a native Win32 window laid out like a message
box: an error icon and message, two clickable report links (the GitHub issue
tracker and the support email) above a read-only selectable box with the stack
trace, and an OK button. The links are SS_NOTIFY statics opened with
ShellExecute (browser for the URL, mail client for the email). Native, not
Swing, because broken AWT initialization is one of the failure causes. On
Windows the process then exits cleanly so the launcher does not also show its
own box; on other systems the error is rethrown to stderr.

* docs: plan justifying desktop startup error window (#4146)
2026-07-17 15:41:54 +01:00
spaced4ndy d60da754dc ui: what's new in 7.0 (#7265) 2026-07-17 18:36:45 +04:00
Narasimha-scandGitHub cbd625d57a desktop: fix "Failed to launch JVM" on Windows when Java Access Bridge is enabled (one cause of #4146) (#7260)
* desktop: bundle jdk.accessibility to fix "Failed to launch JVM" when assistive technologies are enabled (#4146)

The jlinked runtime shipped in desktop packages did not include the
jdk.accessibility module. On Windows, when Java Access Bridge is enabled
(jabswitch -enable, "Enable Java Access Bridge" in Ease of Access, or a
screen reader creating %USERPROFILE%\.accessibility.properties), AWT
throws AWTError "Assistive Technology not found:
com.sun.java.accessibility.AccessBridge" during Toolkit init, before any
window or log output, and the jpackage launcher reports "Failed to
launch JVM".

* docs: plan justifying jdk.accessibility fix for Windows JVM launch (#4146)

* desktop: bundle jdk.accessibility only when building the Windows package
2026-07-16 13:49:10 +01:00