Commit Graph
3690 Commits
Author SHA1 Message Date
spacedandy-agents-simplex c8b8ba4d4f badge-service: credit a store subscription purchase
The catalog now tells subscription products from one-time ones and maps a
store plan to its tier and months. A subscription receipt is checked with
the store once: with a grantable charge, the service plans the charge's
rows from the store's period start, signs the first month, and writes the
payment, purchase, charge, ledger rows, issuance, state and Play token in
one transaction, answering with the subscription state. Without one, it
answers payment_pending (300 s while the period has not started or the
store is pending, a day otherwise), receipt_invalid for an ended Play
subscription, or test_purchase, and writes nothing. Replays carry the
state. The store verifier interface gains the subscription check, which no
real store implements yet; the fake store does.

Run: 001-badge-subscriptions, slice 3b
2026-10-14 04:36:13 +00:00
spacedandy-agents-simplex 648aee4cea core, badge-service: plan subscription charges and claim Apple subscriptions by original id
Add chargeEntries, the one planner for a store charge's ledger rows: a
lapse to the billing period start, the grant dated to that start, and a
lapse to now, so coverage follows the store's periods and every row
verifies by re-running it at its createdAt. A test runs its rows through
the client's own balanceChecked for first charges, monthly and annual
renewals, billing-retry recovery and grace.

An Apple auto-renewable transaction is now claimed by its original
transaction id, which every renewal keeps, so renewals resolve to one
purchase. One function names the ref for both the claim and the real
verifier, so they cannot disagree.

Run: 001-badge-subscriptions, slice 3a
2026-10-14 02:35:51 +00:00
spacedandy-agents-simplex 85901458ec core, badge-service: store subscription charges and carry the subscription state
Add the service migration 20261012_badge_subscriptions: the subscription
charges table, the ledger's charge_id, and the payment's subscription state,
check time and Play token, replacing three subscription columns nothing
wrote. The ledger now stores and reads back charge credits, and the badge
credential response gains an optional subscription state that older clients
ignore and that reads an unknown state without failing. Nothing writes a
charge or a state yet, so no behaviour changes.

Run: 001-badge-subscriptions, slice 2
2026-10-13 22:45:10 +00:00
spacedandy-agents-simplex dcbf3ee262 core, badge-service: name Apple claims by reference
Rename appleTransactionId to appleTransactionRef, matching googlePurchaseRef
and StoreTransactionRef. No behaviour change: the next change makes it
return a subscription's original transaction id, which the old name would
misstate.

Run: 001-badge-subscriptions, slice 1
2026-10-13 20:56:50 +00:00
spaced4ndy 59c588932e badge-service: verify App Store and Google Play purchases (#7654) 2026-10-13 15:24:07 +00:00
spaced4ndy cf3d6c45d0 ios, android: tell the buyer once a run when a swept purchase cannot be handed over (#7674) 2026-10-09 11:59:39 +00:00
spaced4ndy 57ab333a2b Merge branch 'master' into badge-in-app-checkout 2026-10-09 15:00:36 +04:00
spaced4ndy 7c2c7503f2 ui: do not show "No relays" while leaving a channel (#7673) 2026-10-09 10:56:00 +00:00
EvgenyandEvgeny @ SimpleX Chat f2b3fe385c core: remove legacy field to support contact connections in groups (#7671)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-09 07:00:27 +01:00
EvgenyandEvgeny @ SimpleX Chat 9c9c86f9c0 core, ui: fix profiles, add error alerts (#7663)
* core, ui: fix profiles, add error alerts

* simplify

* query plans

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-08 22:53:59 +01:00
EvgenyandEvgeny @ SimpleX Chat 96970373b0 core: add status when switching queue (#7664)
* core: add status when switching queue

* fix

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-08 16:31:29 +01:00
spaced4ndy 75e6fe8f5d ios, android: tell the buyer a badge was added when the store purchase completes off screen (#7662) 2026-10-08 15:29:05 +00:00
shandspaced4ndy efab293609 desktop: deep links on macOS, Windows and Linux (#7605)
* tests: close the walk stream in withTempDir

* desktop: receive app links from args and macOS

* desktop: forward an app link to the running app

* desktop: initialize the desktop platform lazily

* tests: share the temp directory helper

* desktop: register simplexchat scheme in packages

* desktop: register simplexchat scheme at runtime

* ui: end the badge page with a link on desktop

* desktop: raise the window over other apps

* docs: describe desktop deep links in the spec

* docs: plan desktop deep links

* docs: report on desktop deep links

* desktop: open simplex connection links

* docs: describe simplex links on desktop

* desktop: keep a link from opening twice

* desktop: retry taking a signal held open

* desktop: keep the user's AppImage link handler

* desktop: register Windows links through Capabilities

* desktop: add %u to the deb entry only once

* docs: describe the review fixes

* ui: open the badge link screen on the left

* ui: import moko accessors in the badge screens

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2026-10-08 14:48:50 +00:00
EvgenyandEvgeny @ SimpleX Chat 0c1ffa65bc core: group fixes/improvements (#7660)
* core: group fixes/improvements

* Large messages dropped by relays and hosts (the same 15602 limit was applied, without accounting for forwarding header)
* Members below v18 did not receive forwarded messages or history in p2p groups.
* Join confirmations near the size limit could fail.
* SMP servers are limited to 2 host names each.

* simplify

* remove legacy forwarding and history support

* only restrict p2p groups

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-08 15:06:18 +01:00
spaced4ndy b4f1249436 core, ios, android: name the resolved store purchase so the app finishes it without a sweep (#7659) 2026-10-08 13:46:27 +00:00
spaced4ndy c0c5ba8393 Merge branch 'master' into badge-in-app-checkout 2026-10-08 16:49:27 +04:00
sh dd7768e543 android, desktop: upgrade moko-resources to 0.27.1 (#7661) 2026-10-08 12:32:57 +00:00
spaced4ndy 80b7f96a96 merge master into badge-in-app-checkout 2026-10-08 14:31:30 +04:00
spaced4ndy 27d12f230d core, ui: buy a badge with an App Store or Google Play purchase (#7590) 2026-10-07 14:32:48 +00:00
sh 40478c1c45 android: target API 36, AGP 8.10.1 (#7656)
* android: migrate back handling to callbacks

* android: target API 36, AGP 8.10.1

* android: opt out of predictive back app-wide
2026-10-07 10:30:26 +01:00
EvgenyandEvgeny @ SimpleX Chat df95de8a2c tests, fix: execute in parallel, send connected events after creating chat items, fix race when merging multiple members to one contact (#7500)
* tests: execute in parallel

* remove race in terminal

* fix some tests

* stop chat controller on exit

* fix more tests

* fix tests

* query plans

* update simplexmq

* update direct-sqlcipher

* fix tests

* query plans

* ios: update core

* fix tests

* update simplexmq and direct-sqlcipher, fixes

* simplexmq

* update simplexmq

* parallel channel tests

* update tests

* fix tests

* fix tests

* query plans

* fix test

* more tests in CI

* use ram drive in CI

* fix tests, fix directory deleting voice file before it is uploaded

* fix query

* fix query to use index

* link contact and channel owner profile when connecting via a signed link

* update simplexmq, fix ghc 8.10.7

* fix tests

* avoid double stop

* query plans

* fix more test races

* more test fixes

* fix queries

* fixes

* more fixes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-07 08:12:02 +01:00
EvgenyandEvgeny @ SimpleX Chat 905df659d3 ios: show error when random database passphrase generation fails (#7621)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-05 09:46:55 +01:00
spaced4ndyandEvgeny Poberezkin 86671a1699 core, ui: confirm before connecting a call answered without e2e encryption (#7647)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-10-05 09:45:57 +01:00
a9322ff32c android: prevent access to chat list when accepting call in locked state (#7627)
* android: prevent access to chat list when accepting call in locked state

* android: request auth on resume during a call

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
2026-10-04 12:07:39 +01:00
shandNarasimha-sc be05a46628 android: StrongBox for new keystore keys, show key storage level (#7637)
* android: create new keystore keys in StrongBox

* android: show keystore key storage level

* ui: save keystore key before marking it stored

* android: show keystore storage level in the footer text instead of a separate row

* android: return keystore storage label, drop enum

---------

Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com>
2026-10-04 10:47:46 +01:00
1a969a6cb9 core, ui: remove database backups after key changes (#7628)
* core, ui: remove database backups after key changes

* ui: delete database backups on chat start without delaying encryption marker reset

Keeping encryptionStartedAt set until chat start made DatabaseErrorView show
"The attempt to change database passphrase was not completed" with a Restore
button after every successful passphrase change when the passphrase is not
stored. Restore the marker handling from master and delete backups
unconditionally after chat starts.

* another flag

---------

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>
2026-10-03 16:56:58 +01:00
SimpleX Chat 51630d61ef 7.1-beta.6: android 386, desktop 167, ios 362 2026-10-03 13:33:46 +00:00
Evgeny Poberezkin 6b596c0c35 Merge branch 'stable' 2026-10-03 08:05:19 +01:00
EvgenyandNarasimha-sc 53e6d435bc android, desktop: blur media thumbnails in reply quotes and the chat list (#7639)
"Blur media" hid images and videos in a chat but showed the same media
sharp as the thumbnail of a quoted message and as the last message's
image, video or link preview in the chat list.

Small views are now blurred with the same reveal as chat media. They are
resampled relative to the width they are drawn at, so a thumbnail is
blurred as much on screen as media in a chat, and drawn as the centre
crop the thumbnail shows. In-chat media keeps the same blur.

Blurring the chat list also needs: each last message gets its own blur
state, loaded chat-list videos use it and hide their full-screen play
button while blurred, a right-click on a thumbnail no longer leaves it
revealed on desktop, and leaving a chat mid-scroll no longer undoes
reveals in the list on Android.

Co-authored-by: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com>
2026-10-03 07:17:20 +01:00
EvgenyandEvgeny @ SimpleX Chat a1cf69e9a9 desktop: allow only one connection from call page (#7619)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-02 17:06:48 +01:00
EvgenyandEvgeny @ SimpleX Chat 806943bd62 android, desktop: do not show caller profile in hidden preview mode (#7620)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-02 17:02:24 +01:00
Narasimha-sc 205d17e2fa android, desktop: make media blur much lighter on CPU (#7483)
* ui: blur media by resampling the preview, not a per-frame effect

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

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

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

* plans: blur media by resampling the preview

* ui: shorten comments in media blur

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

Stretching the resampled preview straight to the screen showed its pixel grid. Double it back
up until its longest side is at least half the reference width before drawing, so the last
stretch is short and the tents compose into a bell. The reference width moves from 360 to 400:
fitted against Gaussians, 360 blurred 5-75% more than Modifier.blur did, 400 is within 10% at
every setting.

(cherry picked from commit c0344a9a61)
2026-10-02 15:59:38 +01:00
SimpleX Chat 2158f3039a 7.1-beta.5: android 383, desktop 165, ios 360 2026-09-30 15:58:31 +00:00
EvgenyandEvgeny @ SimpleX Chat 80f8757449 core: remove .exported db files when database is removed (#7615)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-30 10:09:18 +01:00
EvgenyandEvgeny @ SimpleX Chat 3d3dd421ff desktop: prevent desktop being locked after the call (#7505)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-30 09:28:58 +01:00
EvgenyandEvgeny @ SimpleX Chat 485bec5d5d android, desktop: reduce logging (#7618)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-30 09:18:26 +01:00
sh b1dc25dc3e badges: service group with multi-use codes (#7578)
* core: cancel the chat callback on interrupt

* badges: add multi-use codes

* badges: add the managed group

* badges: document multi-use codes and the group

* core: sign test badges with whole-second expiry

* badges: rework tracker and reply texts
2026-09-30 08:48:57 +01:00
EvgenyandEvgeny @ SimpleX Chat 3c0a6f0e29 ios: exclude app data from backup (#7623)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-30 08:23:51 +01:00
EvgenyandEvgeny @ SimpleX Chat 25d4bb8966 ui: add error constructor (#7610)
* ui: add error constructor

* string

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-29 19:25:14 +01:00
EvgenyandEvgeny @ SimpleX Chat 40ac97ff7a ios: fix frame decryptor crash on undersized frame (#7613)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-29 19:19:37 +01:00
Evgeny Poberezkin f76dd609dd ios: update core library 2026-09-29 19:12:49 +01:00
spaced4ndy 36da024394 ui: buy a badge in the browser, with a deep link back on mobile (#7592) 2026-09-29 10:30:57 +00:00
EvgenyandEvgeny @ SimpleX Chat 643a9afad6 bots: SimpleX Calculator demo bot (#7583)
* bots: SimpleX Calculator demo bot

* refactor

* use local server in test

* simplify

* icon

* simplify

* expression

* replies

* improve

* log

* update name in bot address

* @simplex-chat/type: 0.12.0

* simplex-chat nodejs: 7.1.0-beta.4.2

* update dependencies

* option to add domain to bot address

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-27 17:20:40 +01:00
SimpleX Chat b3907c9de7 7.0.3: android 381, desktop 164, ios 359 2026-09-26 14:28:35 +00:00
Narasimha-scandEvgeny Poberezkin 294fbf1b7d desktop: fix crash at startup on Windows when WMI does not answer (#7581)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-09-26 13:42:02 +01:00
Evgeny Poberezkin 2f6e4d556d Merge branch 'stable' 2026-09-26 13:31:47 +01:00
Evgeny e33163ee92 android: fix SimpleX links (#7596) 2026-09-26 13:31:16 +01:00
Narasimha-scandEvgeny 8e35c05fc0 android: match app links by exact path so simplex.chat pages open in the browser (#7565)
* android: match app links by exact path so simplex.chat pages open in the browser

* simpler

---------

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

* simpler

---------

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