mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-02 00:28:55 +00:00
9a152a017e1af14d48e9b14ea1d47b8cb9d74ca7
1228
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9a152a017e | Merge branch 'stable' | ||
|
+5 |
208ed0b46a |
ui: translations (#7401)
* Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Russian) Currently translated at 97.5% (2829 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.9% (2898 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2899 of 2899 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% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 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% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (French) Currently translated at 82.3% (2388 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 92.6% (2314 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2899 of 2899 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% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (French) Currently translated at 83.3% (2416 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 96.2% (2404 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Added translation using Weblate (Slovak) * Translated using Weblate (Slovak) Currently translated at 5.0% (146 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (French) Currently translated at 97.3% (2431 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Danish) Currently translated at 31.1% (903 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/da/ * Translated using Weblate (Slovak) Currently translated at 14.8% (431 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (French) Currently translated at 97.4% (2434 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Slovak) Currently translated at 16.2% (472 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Translated using Weblate (French) Currently translated at 97.7% (2440 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Danish) Currently translated at 32.1% (932 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/da/ * Translated using Weblate (Slovak) Currently translated at 18.1% (527 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 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% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (French) Currently translated at 98.7% (2466 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Slovak) Currently translated at 22.0% (638 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (French) Currently translated at 83.3% (2416 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 99.4% (2483 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Slovak) Currently translated at 22.3% (647 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 82.9% (2405 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 24.1% (700 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 83.1% (2411 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (French) Currently translated at 85.7% (2486 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 99.7% (2491 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 92.3% (2678 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (French) Currently translated at 99.7% (2491 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.2% (2791 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 26.0% (754 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (French) Currently translated at 86.6% (2512 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 99.7% (2492 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.3% (2794 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.8% (2809 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.9% (2811 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 26.9% (781 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.7% (2833 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (French) Currently translated at 88.8% (2576 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 100.0% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 26.9% (781 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/sk/ * Translated using Weblate (French) Currently translated at 90.4% (2622 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * ios: bump Xcode version in localization exports * process translations * ui: fix translation errors in fr, pt-BR, sk, da and de Review of the incoming Weblate batch found no malicious or deceptive translations: every URL, e-mail and format specifier matches the English source, and there are no bidi overrides, zero-width characters or homoglyphs. These are accuracy fixes. Security/privacy wording: - fr (iOS): "no E2E encryption" was rendered "chiffrement pair-à-pair" (peer-to-peer). The same file translates "peer-to-peer" that way, so the E2E warning for chats with admins in public channels read as the wrong guarantee. - pt-BR: "We don't store any of your contacts or messages (once delivered)" lost the first-person commitment and applied "once delivered" to contacts too; "your profile will be shared via the address" became a capability rather than a consequence; the "(your contact can mark them for deletion)" parenthetical was dropped from both irreversible-deletion descriptions. - fr + pt-BR: in why_built_p7 the anaphora ("ce pouvoir" / "esse poder") resolved to the power to identify you rather than the reader's own power, inverting the sentence. de, it, es, ru, sk and hu all get this right. Broken output: - da: proxy_destination_error_unknown_ca was wrapped in literal quotes (Android's whitespace-quoting syntax) and carried a double space. - fr (NSE): "De %d conversations(s)". - pt-BR: incognito_info_share had lost every diacritic; mark_unread was indicative instead of imperative. Terminology and grammar: - fr: the chat engine was translated as "conversation" on iOS (Start chat, Stop chat, Stopping chat, Chat migrated, and the multi-device delivery-failure warning) while Android used "messagerie"; "report" (a moderation report) was translated as "rapport"; empty-list strings read "Aucunes conversations". - pt-BR: "timeout" was dropped from two duration settings; "Proxied servers", "Reachable toolbar", "Allow downgrade" and "Proxy authentication" had drifted. - sk (new locale): ~120 fixes - typos and missing diacritics, Czech forms (databázi, události, není, jednorázový, language names), gender and number agreement, and 18 mistranslations including "encryption agreed" rendered as "allowed", "Non-profit governance" as "vláda" (government), "embed" as "vsadiť" (to wager) and "Decode link" as a noun phrase. - da: "Upgrader" -> "Opgrader", and name resolution described with "afkode" (decode). - de: "Privacy was never a feature" had gained a "nur". Verified after the change: XML well-formed, no duplicate/orphan/removed keys, format specifiers, markup, URLs and newline counts all match the English source, iOS .strings and .xliff stay in sync, and no unescaped apostrophes were introduced. --------- Co-authored-by: mlanp <github@lang.xyz> Co-authored-by: Evgeny Poberezkin <e.poberezkin@me.com> Co-authored-by: Hosted Weblate user 54392 <hamburger2048@users.noreply.hosted.weblate.org> Co-authored-by: No name <usir.alerts@onionmail.org> Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org> Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org> Co-authored-by: Ranakan <ranakan.dev@protonmail.ch> Co-authored-by: summoner001 <summoner@disroot.org> Co-authored-by: ND <nd@users.noreply.hosted.weblate.org> Co-authored-by: Martin Kozempel <rado2012mir@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Morten Juhl-Johansen <git@0b.dk> Co-authored-by: SanctumSaturn <oraculogithub@gmail.com> Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> |
||
|
|
ca8a7eda69 | desktop: build nanohttpd from a submodule (#7396) | ||
|
|
02106833fb | Merge branch 'stable' | ||
|
|
0ec028a668 |
ui: update post link in whats new (#7400)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> |
||
|
|
11c7a62a38 |
desktop: fix stretched video preview and playback for AV1 videos (#7391)
* desktop: fix stretched video preview and playback for AV1 videos libvlc passes the padded size the decoder allocated to the buffer format callback, not the size of the picture. dav1d pads to a multiple of 128, so a 1920x1080 AV1 video arrives as 1920x1152, and vlc scales the picture to fill it - the preview sent with the message, and desktop playback, were 6.7% too tall. H264 pads much less, so it was barely visible there. Ask for the size of the track being played instead. It is already populated when the buffer format is negotiated, and matching the track that is playing matters for files with more than one video track, where the first track is not necessarily the one being decoded. Falls back to the previous behaviour when the track is not known. * plans: desktop video preview aspect ratio |
||
|
|
222fc4ad99 |
android, desktop: open group member profile without loading all members (#7388)
* android, desktop: open group member profile without loading all members Clicking member avatar in chat loaded the whole member list (apiListMembers) before showing member profile, and it was repeated on every click - in a group with 10000 members it takes several seconds. The full list is not needed to show the profile of one member, so instead the opened member is added to the model, the same way as in iOS app. * plans: member profile in large groups * plans: correct relay warning section - it is not affected by the change |
||
|
|
ecb008b792 |
core, ui: auto-accept group invitations per user profile (#7377)
* core, ui: auto-accept group invitations per user profile Add a per-profile toggle for auto-accepting group invitations, and regroup it with the existing contact-requests setting under a single Auto-accept section in Privacy & Security, relabelled "Contact requests in groups". The join is fully async. processGroupInvitation already had an async accept path, used when the invitation matches a group link the user opened: prepareAgentJoin + createMemberConnectionAsync + joinAgentConnectionAsync, with the outcome reported later against the CFJoinConn command id. Auto-accept takes that same path instead of going through APIJoinGroup, so it works while the app is closed and never blocks message processing. An auto-accepted invitation still records a CIRcvGroupInvitation item in the chat with the inviting contact, so there is a record of who added the user to which group. Two details worth noting for review: hostContact is reported to clients only for group links. Clients respond to it by replacing the transient host connection view with the group and removing that chat - correct for a group link, where the contact is a placeholder, but wrong for a plain invitation, where it is a real contact. A resent invitation returns the existing group, because createGroupInvitation is idempotent on inv_queue_info. The join therefore only runs while the membership is still GSMemInvited, so a resend cannot open a second connection. * booldef * order * refactor * update translation key * query plans * ios: export translations --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> |
||
|
|
5464cd6ed7 | Merge branch 'stable' | ||
|
|
083fb0a705 |
ui: store country (#7389)
* ui: store country * ios: 7.0.1 build 348 * update version * android: update versions * remove UK |
||
|
|
9f710b32fa | Merge branch 'stable' | ||
|
|
a31efc81be |
desktop: fix the layout of the crowdfunding page (#7385)
* desktop: fix the layout of the crowdfunding page * change image width --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> |
||
|
|
d0757d7f55 | Merge branch 'stable' | ||
|
|
bdaa36e847 |
android, desktop: add CF page (#7373)
* android, desktop: add CF page * android, desktop: update CF page * android, desktop: sync ios changes * android, desktop: sync ios CF page changes * remove utm_source --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> |
||
|
|
3b1e5abcbc | android: prevent imported archive from being written outside the export folder (#7375) | ||
|
|
0f45645afe | Merge branch 'stable' | ||
|
|
abd5954675 |
ui: send dropped .webm as video only when it has a video track (#7354)
* ui: send dropped .webm as video only when it has a video track .webm is as commonly an audio-only container as a video one, so the extension alone cannot tell whether there is a frame to embed. Read the container to decide: files with a video track are sent as video, the rest as files. Only done for files attached without the user saying how to send them (drag & drop, paste). An explicitly picked video is still sent as one, so .webm is now listed in the video file picker too. * plan: send dropped .webm as video only when it has a video track |
||
|
|
0a61b0ddea |
android: add google and foss build flavors (#7328)
* android: add google and foss build flavors * android: get the Google Play account country in the google flavor * android, desktop: update whats new * temp: comment out wefunder link |
||
|
|
486c2abf26 |
ui: connect when a SimpleX link is pasted as a markdown hyperlink (#7348)
* ui: connect when a SimpleX link is pasted as a markdown hyperlink * remove comments Co-authored-by: Evgeny <evgeny@poberezkin.com> --------- Co-authored-by: Evgeny <evgeny@poberezkin.com> |
||
|
|
b832d7c8f7 | Merge branch 'stable' | ||
|
|
f921bd47bb |
android, desktop: fix live message sent to the chat opened after switching (#7323)
* android, desktop: fix live message sent to the chat opened after switching A live message is sent when the chat is switched, but by then this view already shows the chat that was opened - the effect that sends it runs with that chat, so the message typed in one chat was sent to another. The chat the message was composed in is passed to the send, and it is resolved by the chat id from before the switch. If that chat is no longer there the message is not sent at all, rather than sent to the chat opened instead. The draft cleared after sending is the one of that chat too. * plan: correct references; clear the draft of the chat the message is sent to * plan: note the blast radius and how to resolve the overlap with #7308 * android, desktop: only pass the chat to what a live message can reach A live message has no context item, so the forwarding, editing and reporting branches of the send cannot run for it - they keep using the chat of the view, and the chat it was composed in is passed only to the message send, to the update of an already sent live message, and to clearing the draft after sending. * android, desktop: give the opened chat its own compose state while the live message is sent Sending the live message to the chat it was composed in is not enough on its own: composeState is shared between the chats opened in this view, and the chat switch branch of KeyChangeEffect is the only one that neither resets it nor loads the opened chat's draft - the branch that loads a draft is later in the same if chain and cannot be reached. sendMessageAsync then made it visible. It runs on Dispatchers.Default, so its writes land after the switch: the whole composed state (via cs.copy(liveMessage = null)) and its spinner (sending()) were written to the compose state of a view that already shows another chat, which then displayed the text composed in the previous one until the send completed. The draft it should have shown was still in the model, and the next switch away dropped it. - sendMessageAsync takes composed, and sendMessage takes it as null by default, so only the chat switch passes a state and every other sender reads it inside the coroutine, where the send read it before. The chat switch captures it on the main thread before replacing it - otherwise the send would read the compose state of the chat that was opened and send its draft to the previous chat. - checkLinkPreview takes that state too. It re-read composeState rather than what was passed in, and every text live message reaches it through updateMsgContent, so it would have rebuilt the message from the opened chat's draft instead of committing what was composed. - every composeState write in sendMessageAsync is guarded by composeIsForSend() (toChat.id == chat.id), which compares the two chats instead of checking which one is open, so this send never takes the compose state back if that chat is opened again before it completes. - the chat switch branch then resets composeState to the opened chat's draft, or to an empty state, like the branches below it do. * plan: document the compose state handoff; correct the #7308 overlap resolution The note on resolving the overlap with #7308 said its cs.liveMessage != null clause "already covers the send made by the chat switch". It does not - in #7308 that clause sits outside the chatIsOpen check, which is correct only while a live message is always sent to the chat that is open, the assumption this fix removes. Read as written it exempts the chat switch send from the guard that protects the opened chat, and a merge that follows it reintroduces the leak. Also records what manual test 2 was found failing on, and adds a slow send variant so the window between the switch and the send completing is long enough to type in the chat that was opened. * android, desktop: keep reading the current state where a forward appends it checkLinkPreview taking the composed state is needed where a live message reaches it, but the forwarding branch is not one of those - it cannot run with a chat other than the view's - and forwardItem suspends before it. So there the captured state is stale by a network round trip, and text typed while the forward was in flight stopped being appended to the message it adds, while still being cleared when the send completed. * plan: correct references and the claims that no longer hold Line references were against the base this branch forked from, before #7308 landed. Also: the live message loop no longer exits because the send clears liveMessage - the chat switch replaces the compose state, on the main thread, before the send runs; checkLinkPreview is not passed the captured state everywhere; and chatsCtx.getChat can only return null in a secondary context, which is not how "the chat is gone" reads. Adds the two manual checks the review implied: a live message carrying a link preview, which is what breaks if checkLinkPreview stops reading the state it was given, and returning to the chat before the send completes. * android, desktop: narrow the change to what the fix needs - the draft id a failed message is saved under keeps using chat: that branch is behind !liveSend, which the send made by a chat switch never satisfies, so toChat is always chat where it is read; - the state the chat switch installs no longer carries maxFileSize over. That field is kept in sync on chat switch by LaunchedEffect(chat.chatInfo), which is why the branches below this one construct it without one, and the paths where that effect does not re-run are the ones where the send overwrites the state anyway; - sendMessageAsync takes its cs as a parameter rather than aliasing a separately named one. * plan: follow the narrowed change * android, desktop: shorten the comments The threading mechanism behind cs is explained where it is used, so the function comment only has to say what it is; the rest is rewording. |
||
|
|
1a56b7f0f8 | Merge branch 'stable' | ||
|
|
7e99e68950 |
android, desktop: fix draft appearing in another chat when switching chats while sending (#7308)
* ios, android, desktop: fix message being sent leaking into another chat Compose state is shared between the chats opened in the same view, and the send is launched in a scope that outlives the chat, so a send that was still in flight when the chat was switched put its message (with the reply context) into the compose state and then the draft of another chat, and a late success cleared whatever was typed in the meantime. The message being sent is no longer kept in the compose state when leaving the chat, and the compose state is only cleared or restored after sending if it still holds the message that was sent - the same check is used by the other senders that show progress in the compose. A message that failed to send is restored in the chat it was composed in, or kept as its draft when another chat is open (iOS has no failed message restore, there the message is dropped as before). * android, desktop: keep only the chat switch fix Revert the iOS changes and the same check in the three senders that connect a prepared chat, leaving the fix for the compose state shared between the chats opened in one view. * plan: document what the narrowed change leaves to the connect senders * android, desktop: use the same check where the sending flag is shared The senders that connect a prepared chat set the same inProgress flag, so a connect completing after the chat was switched cleared it for a send started in the chat opened next, and that sent message was then left in the compose. * android, desktop: keep the live message clauses inside the open chat check live and cs.liveMessage != null were alternatives to chatIsOpen, which holds only while a live message is always sent to the chat that is open. #7323 removes that: the live message committed by a chat switch is sent to the chat it was composed in, while this view already shows another one, so an unguarded clause here clears that chat's compose state - the leak this fix exists to prevent. liveSend stays an alternative to inProgress inside the guard, so a live send behaves exactly as before while its chat is open, and it is excluded from the restore/draft branch, which would otherwise write a draft on every failing keystroke send once that chat is no longer open. On this branch the only behaviour change is a live send completing after its chat was left, which now leaves the opened chat alone. Also load the draft of the chat opened next when the compose state is cleared on switching away from a send in flight: clearState() returns before the branch that loads a draft, so that draft was never shown, and being in the slot but in no compose state it was then dropped by clearPrevDraft on the next chat switch. * plan: explain why live sends are guarded by the open chat check Records that the exemption in "Deliberately unchanged" is from a guard based on inProgress, not from chatIsOpen, and why the earlier form broke once #7323 sends a live message to a chat other than the one open. |
||
|
|
0324517bfe |
android, desktop: keep database passphrase toggle inside the section card (#7326)
The "Save passphrase in settings/Keychain" label had no weight, so Row measured it at full available width, the weighted spacer collapsed to 0 and the trailing DefaultSwitch was placed past the row's right edge. Harmless until #6777: the section card is now inset by CARD_PADDING and clipped with SectionCardShape, which cut the row from 348dp to 316dp on the desktop start pane and made the overflowing switch both invisible and unclickable, since Modifier.clip clips pointer input too. With a custom passphrase set the toggle is enabled but unreachable, so the passphrase stays saved in settings and the app never prompts for it on start. Give the label weight(1f) and drop the weighted spacer, matching what SettingsActionItemWithContent does for every other toggle row. |
||
|
|
e1a349b90f |
core: support contact addresses with DR keys, service requests (#7310)
* core: use double ratchet keys in contact address (#7278) * core: use double ratchet keys in contact address * use PQ from the first message * query plans * update simplexmq * api to rotate keys, option to show full links in CLI * shorter description * ui: add error parameters * disable DR in addresses * core: parameter for create address command to configure ratchet keys * add pqRatchet param to address-related commands * query plan * fix parser * fix kotlin --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * core: contact request rejection and service requests (#7292) * update simplexmq * implement service requests and rejections * tests * migration * fix migration * add api event and response * bot api, postgres migration * nix shas * bot types, rename property * update bot type * sign service requests * update bots api * query plan * update plan * update simplexmq * fix test, update bot api * fix bot api * resolve name for service request * refactor --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * update simplexmq * update simplexmq * test delays --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> |
||
|
|
61012d208e |
core, ui: extend profile peer type (#7277)
* core, ui: extend profile peer type * remove comments Co-authored-by: Evgeny <evgeny@poberezkin.com> --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> |
||
|
|
bd298a1d4a |
ios, android, desktop: fix draft in support chat appearing in group chat (#7309)
Group chat and its support chats have the same chat id, so a draft saved in "chat with admins" was restored in the group chat and shown as its draft in the chat list. Include chat scope in the draft chat id. Also save the draft when support chat is closed without changing chat id - in that case KeyChangeEffect that saves drafts doesn't run. |
||
|
|
7c931d08ea |
ui: show "connect to name" button starting with 5 characters; ios: show button in New chat view search (#7318)
* ui: show "connect to name" button starting with 5 characters * show button in new chat view search |
||
|
|
a58cd51c49 |
ui: translations (#7317)
* Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Russian) Currently translated at 97.5% (2829 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.9% (2898 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2899 of 2899 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% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * ru translations * Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Russian) Currently translated at 97.5% (2829 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.9% (2898 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2899 of 2899 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% (2497 of 2497 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * process translations * ui: fix translation errors in es, ru, de, it, hu Review of the translations in this PR against the English originals. Values only - no keys added, removed or renamed. Spanish: - "The sender deleted the connection request." said "El servidor..." (the server), attributing the deletion to a server rather than the sender. Restored "El remitente". - "Require/Do not require signing messages." were rendered as statements ("Se requieren mensajes firmados."), making the toggle options read identically to the separate status strings "Message signing is (not) required.". Restored the imperative. - "...compare (or scan) the code on your devices." said "en tu dispositivo" (singular); the code has to be compared on both. - "How to register a test name" was pluralised to "nombres en pruebas". Russian: - "Помошь и поддержка" -> "Помощь и поддержка" (spelling). - "File servers" was the calque "Файл серверы" -> "Серверы файлов", matching the iOS translation of the same string. - "Если Вы выберите" -> "выберете" (imperative used for future). - "Create web preview." said "Создать веб страницу." (web page, also missing the hyphen) -> "Создать веб-предпросмотр.". - webpage_info dropped "to show your channel preview to visitors before they subscribe"; webpage_url_footer said "страницы канала" instead of the preview. Both restored from the iOS wording. - "Enter description (optional)" lost "(optional)"; "Error adding relays" was truncated to "Ошибка добавления". - "Add contributors." used "авторов"; the member role is "соавтор". - "удален(а)" -> "удалён", "подтвержденный" -> "подтверждённый". German, Italian, Hungarian: - The source strings "Names for your channel or business." and "SimpleX names (BETA)" were renamed to "Public names..." and "SimpleX public names (BETA)", but the old values were carried over, so "public" was missing. Android German and Chinese had already been updated in this PR; this brings iOS German, and both platforms for Italian and Hungarian, in line. - iOS German "How to register a test name" still read "Einen Test-Namen registrieren", while Android German was updated in this PR. --------- Co-authored-by: mlanp <github@lang.xyz> Co-authored-by: Evgeny Poberezkin <e.poberezkin@me.com> Co-authored-by: Hosted Weblate user 54392 <hamburger2048@users.noreply.hosted.weblate.org> Co-authored-by: No name <usir.alerts@onionmail.org> Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> |
||
|
|
02178fb611 |
android, desktop: fix accepting contact request from notification for non-active profile (#7316)
* android, desktop: switch to the request's profile when accepting contact request from notification * plans: justify accepting contact request from notification fix |
||
|
|
45ee868e0b | android, desktop: fix reply header not filling message width for emoji (#7314) | ||
|
|
1108e87ee2 |
desktop: fix forwarding moving message draft to another chat (#7307)
* desktop: fix forwarding moving message draft to another chat The same ComposeView is reused when switching chats, so the `chat` captured by the desktop-only `onDispose` is the chat that was open when the view was first composed, not the one the message is forwarded from. The draft was saved under that stale chat id, and when it happened to be the chat forwarded to, sending the forward restored the draft there. * plan: justify desktop forward/draft fix and cross-platform findings |
||
|
|
09254c5a53 | ui: update whats new | ||
|
+15 |
8c80e4fd57 |
ui: translations (#7305)
* Translated using Weblate (German) Currently translated at 100.0% (2897 of 2897 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% (2495 of 2495 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (French) Currently translated at 82.3% (2387 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (Italian) Currently translated at 100.0% (2897 of 2897 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% (2897 of 2897 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% (2495 of 2495 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% (2896 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 96.7% (2803 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hant/ * Translated using Weblate (Dutch) Currently translated at 82.2% (2382 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/ * Translated using Weblate (Japanese) Currently translated at 96.9% (2810 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ja/ * Translated using Weblate (Czech) Currently translated at 93.6% (2712 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 80.2% (2325 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2897 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Ukrainian) Currently translated at 91.8% (2660 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/uk/ * Translated using Weblate (Lithuanian) Currently translated at 58.5% (1696 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/lt/ * Translated using Weblate (Finnish) Currently translated at 49.2% (1427 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fi/ * Translated using Weblate (Korean) Currently translated at 50.5% (1463 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ko/ * Translated using Weblate (Polish) Currently translated at 86.8% (2516 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (Hebrew) Currently translated at 71.0% (2058 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Thai) Currently translated at 42.5% (1233 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/th/ * Translated using Weblate (Bulgarian) Currently translated at 85.4% (2476 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/bg/ * Translated using Weblate (Turkish) Currently translated at 98.7% (2862 of 2897 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% (2897 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 84.9% (2461 of 2897 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2495 of 2495 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.9% (2898 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Italian) Currently translated at 100.0% (2899 of 2899 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% (2495 of 2495 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (German) Currently translated at 100.0% (2899 of 2899 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% (2495 of 2495 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2899 of 2899 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * process translations * ui: fix translation errors found in review Android (strings.xml): - de: "Fehler beim SimpleX-Name" -> "-Namen" (dative of Name) - de: connection_error_auth title updated to match new EN "Connection link removed"; fix reflexive "Um Sie" -> "Um sich" - hu: typo "egyszer használató" -> "használható" - hu, it: connection_error_auth title updated to match new EN - ar: "استيثاق الجهاز غير مفعّلة" -> "مفعّل" (masculine agreement, stale after the المصادقة -> الاستيثاق terminology change) - ar: "الذين شاركَ الرابط معهم" -> "شاركتَ" (subjectless verb) - ar: "سيظل جميع جهات اتصالك متصلين" -> "ستظل ... متصلة" (x2, جهات is feminine plural) - ar: add missing trailing period to v7_0_channels_relays - ar: passive voice for skipped-message counters, matching EN - zh-rCN: connection_error_auth reworded as a title, not a subjectless clause; restore the \n dropped from _desc iOS: - de: same dative fix in Localizable.strings and de.xliff - de, hu, it: add missing File servers / "File servers: %@" targets, ported from the Android translations in this PR --------- Co-authored-by: mlanp <github@lang.xyz> Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com> Co-authored-by: Deleted User <noreply+6980@weblate.org> 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: Olivia Ng <uloo592@gmail.com> Co-authored-by: John m <jvanmanen@gmail.com> Co-authored-by: tomato potato <tomato.games@protonmail.com> Co-authored-by: M Sarmad Qadeer <msarmadqadeer@gmail.com> Co-authored-by: HypocrisyCollector <work.j6nnu@slmail.me> Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org> Co-authored-by: Maksym Lukashenko <livelmaxim@gmail.com> Co-authored-by: Anonimas <anonimas3@users.noreply.hosted.weblate.org> Co-authored-by: petri <pkajander@gmail.com> Co-authored-by: 5olivetree <5olivetree+github.com@mailbox.org> Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com> Co-authored-by: Roee Hershberg <roihershberg@protonmail.com> Co-authored-by: Titapa (PunPun) Chaiyakiturajai <titapapunne@gmail.com> Co-authored-by: elgratea <weblate@fastmail.com> Co-authored-by: Kaanito <kaanpeker196@gmail.com> Co-authored-by: summoner001 <summoner@disroot.org> Co-authored-by: Siavash <ciavash@proton.me> Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> |
||
|
|
c7e83d88ae | desktop: fix opening contact request leaving previous open chat in connecting state (#7302) | ||
|
|
e7c94472c4 |
desktop: fix chat switch deleting the in-app updater's download (#7295)
* desktop: fix chat switch deleting the in-app updater's download
createTmpFileAndDelete registered every temp file it created in
ChatModel.filesToDelete, which ComposeView.deleteUnusedFiles() empties on every
chat open/switch/close. The updater's ~350 MB download lives in such a file for
minutes, so switching chats during it deleted the file. copyTo kept writing
through the still-open fd, so the transfer completed and progress reached 100%;
only the following Files.move failed, with NoSuchFileException on the source,
and that went into a catch that logs to stdout only - no dialog, no error, no
file.
The registration was redundant for every caller: the helper's own
finally { tmpFile.delete() } already removes the file, deleteOnExit() covers a
clean JVM exit, and Main.kt wipes tmpDir at startup for crashes. It only ever
duplicated the finally while arming a trap for long-running lambdas - the same
window also existed for the settings and themes writers.
* desktop: download the app update into a file the updater owns
Per review of #7295: instead of removing the ChatModel.filesToDelete
registration from createTmpFileAndDelete, stop using that helper for the
downloaded file.
downloadAsset now writes into "<asset name>.part" in tmpDir and moves it onto
the asset name when the transfer completes, so the download is never registered
in ChatModel.filesToDelete and ComposeView.deleteUnusedFiles() can no longer
delete it mid-transfer. Cleanup is unchanged in substance: the finally block
removes the partial file when the download fails or is cancelled (and is a
no-op after a successful move, as the helper's own finally was), deleteOnExit
covers a clean exit, and Main.kt wipes tmpDir at startup after a crash.
createTmpFileAndDelete is restored to its previous behaviour, with a comment
warning that its file does not survive a chat switch.
* desktop: reduce comments in updater download fix
|
||
|
|
5c196d0e2d | ui: rename "how to register name" button (#7300) | ||
|
|
fc28914455 |
desktop: fix saving files with '[', '*', or '?' in name on Linux (#7290)
* desktop: fix saving files with '[', '*', or '?' in name on Linux
JFileChooser's BasicFileChooserUI treats filenames containing
'[', '*', or '?' as glob patterns on Unix when the file does not
exist on disk. The Save button's ApproveSelectionAction then
applies a GlobFilter and returns without saving — the dialog
stays open and nothing is written.
Regression introduced in #2789 (commit
|
||
|
|
172b11b511 |
android, desktop: don't allow swipe-to-reply to a marked-deleted message (#7214)
The swipe handler is created with rememberDismissState, whose lambda is frozen at first composition and captures a stale cItem. When a message is marked deleted while on screen, that lambda still sees the pre-deletion item, so an in-lambda itemDeleted check is bypassed and the quote is set, producing SEInvalidQuote on send. Disable the swipe modifier (recomputed live each recomposition) when itemDeleted != null so the gesture is removed entirely. |
||
|
|
8de39c25de |
android, desktop: fix video preview expanding into empty black area (#7286)
* android, desktop: fix video preview expanding into empty black area The video message box (CHAT_IMAGE_LAYOUT_ID) never gave itself a definite height - it took the height of its tallest child. That child is the player surface, which has no stable intrinsic height until playback starts: on Android an unprepared StyledPlayerView reports no video size, so its AspectRatioFrameLayout (RESIZE_MODE_FIXED_WIDTH, aspect 0) does not shrink. Before #6726 this was masked: the box was measured with unbounded height, so the surface collapsed to 0. #6726 bounded the box to 2.33x width to constrain tall images, and the unprepared surface then expanded to fill that height, showing as a long empty black strip below the preview once a video downloads. Give the box a definite size from the preview aspect ratio, mirroring CIImageView. Height follows the measured (clamped) width via Modifier.layout so wide videos on narrow screens don't leave an empty strip (the #7223 fix). * plans: justify video preview black-area fix |
||
|
|
ab691a4f82 |
android, desktop: remove stray card dividers in server info, connect-to-desktop, appearance and migration screens (#7118)
* android, desktop: remove stray card dividers in server info, connect-to-desktop, appearance and migration screens PR #6777 turned these into card screens, where SectionView draws a 2dp near-black divider between every direct child, but left content patterns that pre-date the card chrome: nested SectionViews (SMP/XFTP server detail), loose Text + Spacer + Text (connect-to-desktop device name and version), and a SectionDividerSpaced() as a middle child (Appearance with an image wallpaper, migrate-from-device "error stopping chat"). Each draws stray lines inside the card, most visible in dark/black themes. Restructure to the sibling pattern already used by DetailedSMPStatsLayout: un-nest the server-detail sub-sections (address its own card, stats/subs/sessions as siblings; subscription rows carded), wrap each device name/version block in a single Column, and drop the in-card spacers (the adjacent-row auto-divider already separates them). Layout-only; iOS is a separate codebase and is unaffected. * docs: add plan justifying removing stray card section dividers |
||
|
|
5a380a751f |
desktop: fix hand cursor over clickable commands; fix command clicks lost on quick successive clicks (#7249)
* desktop: fix pointer cursor not changing to hand over clickable commands (dropped hover events) * desktop: set hover cursor directly on every hover move; compose pointerHoverIcon is edge-triggered and loses updates when chat items shift under the cursor * plans: investigation and justification for command hover cursor fix * desktop: harden hover cursor fix after adversarial review: refresh on release, ignore button-held events, reset icon state on exit, cache canvas lookup failures * desktop: document two-stage verification, exit icon asymmetry and cache guard rationale in hover cursor fix * plans: reconcile performance and testing claims with hardened code * plans: correct recomposition count and note commit subject scoping * plans: clarify user-facing problem description * desktop: shorten comments in hover cursor fix * desktop: clarify comments in hover cursor fix * multiplatform: fix command clicks lost on quick successive clicks (serialize gesture press scope, don't restart pointerInput on recomposition) * plans: document lost-click defect (press-scope race, pointerInput restart) and fixes * multiplatform: don't cancel command click when chat list shifts under the pointer A press is cancelled when it goes out of the node's bounds, but when a sent message inserts into the chat the node moves out from under a stationary pointer, which is not a drag-away. Exempt out-of-bounds cancellation when the pointer did not move in window coordinates (within touch slop). * multiplatform: stop pointer handler resets on chat item recomposition (lost clicks, cursor flicker) bigTouchSlop() created a new ViewConfiguration instance on every recomposition of every chat item; pointer input nodes observe ViewConfiguration and reset their handler when it changes, so each inserted message killed all in-flight presses (lost command clicks) and hover handlers (hand cursor flicker) in the viewport. Provide a remembered instance instead. * plans: document list-shift press cancellation and ViewConfiguration reset defects * desktop: remove imperative hover cursor workaround, superseded by ViewConfiguration fix The evidence that the declarative path was insufficient was gathered while every message insertion was resetting all hover handlers (the ViewConfiguration identity defect, fixed in 6d24bd5d4) — which alone explains those failures. With handlers stable, the full hover matrix passes on pointerHoverIcon plus the lossless detectCursorMove alone, so the AWT canvas write and its expect/actuals are removed; only the icon state reset on Exit remains. * plans: document hover workaround removal and stage-1 evidence contamination |
||
|
|
3615927db5 |
multiplatform: remove unused clipboard state polling that froze desktop UI (#7237)
The desktop app polled full clipboard contents every second on the AWT event thread to update ChatModel.clipboardHasText. On X11, each read blocks up to sun.awt.datatransfer.timeout (10s) when the selection owner does not respond (e.g. after KeePassXC's clipboard auto-clear), making every click/scroll wait ~9s. clipboardHasText has had no readers since its only consumer was removed in #4398, so the whole mechanism (desktop poll, Android clip listener, onResume refresh, expect/actual, state field) is deleted. See plans/2026-07-11-fix-desktop-clipboard-freeze.md. |
||
|
|
7fc2a6e6bd |
android, desktop: fix draft loss when switching to chat where user cannot send messages (#7239)
* android, desktop: save draft when switching to chat where user cannot send messages On desktop, chat and chatId change in the same recomposition when another chat is opened from the always-visible chat list. The effect clearing compose state of a non-sendable chat (observer, channel subscriber, review by admins) was composed before the draft-saving KeyChangeEffect and ran first, wiping the live compose state before it could be saved and then clearing the previously saved draft via clearPrevDraft. Effects launch in composition order, so the clearing effect is moved after KeyChangeEffect: the previous chat's draft is saved first, and clearCurrentDraft is a no-op for it because draftChatId no longer matches the opened chat. Clearing the opened chat's own draft when it cannot send is preserved, as is clearing when the open chat itself becomes non-sendable (only the sendMsgEnabled key changes). * plans: investigation and justification for draft message loss fix |
||
|
|
9586c97439 |
ui: show XFTP servers used for a file in message info (#7088)
Surface the XFTP servers that hosted a file's chunks in the message info screen (Android, desktop, iOS), so a user can see which servers they are downloading from (or, for sent files, uploading to) whenever they want to know. APIGetChatItemInfo now returns fileXftpServers, derived from the stored file description (private snd descr for sent items, rcv descr for received items); extraction is best-effort and never fails the call. |
||
|
|
2ea5940e81 |
core, ui: per-server roles for self-hosted servers (#7254)
* core, ui: plan per-server roles for self-hosted servers * core: add per-server roles field to UserServer * core: add nullable role columns to protocol_servers * core: persist per-server roles * core: validate server coverage using per-server roles * test: cover per-server roles resolution and coverage * multiplatform: per-server role toggles for self-hosted servers * ios: per-server role toggles for self-hosted servers * core: per-server role overrides with per-role defaults * test: cover three-state per-server role resolution * fix: derive Eq for ServerRolesOverride * multiplatform: three-state role dropdowns on saved servers * ios: three-state role pickers on saved servers * test: per-server roles independent across two servers * test: enable names role in name-resolution tests * style: trim comments in per-server roles code * chore: rename server_roles migration to 20260716 (last) * core: per-server roles override operator roles, inherit when unset * multiplatform: per-server role default inherits from operator * ios: per-server role default inherits from operator * refactor(servers): tidy per-server roles per review - dedup no-operator default into ServerRoles.noOperatorDefault (Kotlin/Swift) - iOS: move roles-section control flow to the call site via a named gate, and parse the server address once instead of up to three times - Kotlin: collapse redundant derivedState; revert defaultOn->default rename for cross-platform parity - drop unused Hashable conformance on Swift ServerRoles - add agentServerCfgs test for names inheritance from an operator - remove no-op enableNamesRole calls from dormant DirectoryTests - fix ChatClient import ordering * chore(migration): date server_roles migration 20260720 * only show roles when server is enabled, move section above QR code --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> |
||
|
|
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.
|
||
|
+15 |
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> |
||
|
|
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. |
||
|
|
7adadfe2cd | desktop: show only desktop .deb packages for current architecture in updater (#7270) |