* light wallpapers: v4 color formula
all 6 light wallpapers recalculated with the new formula: received
messages are white (read more often, max readability), sent messages
muted in the hue — same pattern as Telegram. tint/chroma tuned per
wallpaper on device.
the formula lives outside the app (node script), only the resulting
oklch constants are in kotlin. LIGHT is served from _background/_tint/
_colors; DARK/SIMPLEX/BLACK keep the generator.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* wallpapers: tune dark theme + refine light pattern intensity
Calibrated full dark theme palette for all 6 preset wallpapers using the
shared chroma formula (bg-anchored, two-cluster muted/color, per-hue P3
saturation). Each wallpaper now has its own dark bg, tint, and bubble
colors instead of a shared neutral gray. Hearts hue shifted from 15° to
5° (slightly cooler), school from 239° to 249° (slightly warmer); hearts,
school and travel had per-wallpaper saturation reduced for visual
balance. wallpaperBackgrounds() now accepts a dark color override.
Light pattern tint also refined for flowers/hearts/kids/school/travel
using a coverage+sharpness regression on the pattern textures, so dense
patterns like hearts read calmer and sparse ones like flowers read
clearer. Light bubbles and backgrounds unchanged from the v4 formula.
Cats remains the calibration anchor for both themes.
* wallpapers: tune black theme (#6912)
* wallpapers: tune black theme
Replaced the legacy hex-derived BLACK palette with calibrated values for
all 6 preset wallpapers. Pure black bg (#000000) replaces the near-black
gray (#070707) — with the chroma formula's "muted side at zero" rule the
BLACK theme now reads as truly hyper-contrast. Each wallpaper's tint and
bubble colors are tuned to its own hue (cats 70°, flowers 130°, hearts 5°,
kids 192°, school 249°, travel 315°) with chroma pulled to per-hue P3
boundary, capped to keep pattern visibility consistent across textures.
* fix color space
* wallpapers: recalibrate all presets + hue-tinted panels
Recalculated bg/tint/bubble colors for all 6 wallpapers across LIGHT/DARK/BLACK
using unified oklch formula. Added subtle hue tint to panel backgrounds (status bar,
top app bar, nav bar) so they pick up the wallpaper's color. Hearts and school use
different hues in dark themes, so added PresetWallpaper.hue(theme) to handle that.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: formula dev tools, normalized patterns, desktop fixes
- Formula dev UI (developer tools only): sliders for all color parameters
per theme (LIGHT/DARK/BLACK), live preview, copyable Kotlin code output
- oklch color formula ported to Kotlin (generateSchemeLight/Dark/Black)
- sRGB gamut boundary for Desktop (maxChromaSRGB), P3 for Android
- Normalized pattern PNGs (consistent element size across wallpapers)
- Desktop pattern scale 0.55 + draft/final rendering (fast during drag,
SCALE_SMOOTH on release)
- Hue-tinted toolbar via ThemeColor.TOOLBAR + AppColors.toolbar
- Received tint slider for light themes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: fix toolbar color picker + received tint default
Toolbar color: direct replacement instead of alpha-mixing, picker
opens with actual visible toolbar color (panelBackgroundColor),
copy-code hint shows file and line number.
Received tint: default derived from hardcoded colors (fallback 0.005).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: extend pattern depth slider range to 10
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: add BG Lightness slider for light themes
Offset ±0.05 to formula background L, independent of other slots.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: denser hearts pattern + recalibrated LIGHT colors
Tuned LIGHT theme colors for all 6 presets via the formula sliders.
Hearts pattern PNG replaced with a denser variant (all four density
variants regenerated).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* wallpapers: revert iOS hearts variants to old format
The denser hearts PNG is shipped only as the multiplatform @4x file
(used by Android and Desktop). iOS still uses the old pattern renderer
which expects the old non-normalized layout, so the @1x/@2x/@3x
variants are reverted to their previous state to avoid visual breakage
on iOS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
* ui: fix crash and logo cutoff on About SimpleX Chat
OnboardingShrinkingLayout calls .first() on each slot's measurables,
crashing when the button slot is empty. About passes onboardingStage =
null, in which case the button slot emits no children. Have the About
branch emit a 0x0 Spacer so the slot always has one measurable.
Also add a top inset for the SimpleX logo when reached from About in
non-oneHandUI mode — without it the top app bar overlaps the logo.
* style
Co-authored-by: Evgeny <evgeny@poberezkin.com>
* Apply suggestion from @epoberezkin
Co-authored-by: Evgeny <evgeny@poberezkin.com>
---------
Co-authored-by: Evgeny <evgeny@poberezkin.com>
* android: fix link preview fetch via SOCKS
* fix: add timeouts to link preview image fetch
Match the 10s timeout already on the Jsoup HTML fetch. Without these,
a slow or dead SOCKS proxy hangs the image fetch indefinitely, holding
the previewMutex and blocking every subsequent preview.
* timeout
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
* android, desktop: fix link previews bypassing SOCKS proxy
getLinkPreview used Jsoup.connect() and URL.openStream() directly,
bypassing the configured SOCKS proxy. Both the HTML fetch and image
download now route through the proxy when one is configured.
If the proxy address is misconfigured (unparseable port), the preview
is cancelled and the user is alerted rather than falling back to a
direct connection.
When enabling SOCKS proxy with link previews active, or enabling link
previews while SOCKS is active, the user is warned that DNS lookups
may still occur locally and given the option to disable previews.
Updates the SOCKS proxy limitations notice to clarify that calls
cannot be proxied, and highlights it in warning colour.
Note: DNS lookups may still occur locally before the SOCKS connection
is established. Full SOCKS5h hostname forwarding is a separate follow-up.
* android, desktop: fix SOCKS proxy parser, auth credentials, and repeated alert in link previews
- Build proxy from typed NetworkProxy fields instead of parsing socksProxy string, fixing breakage on IPv6 hosts and USERNAME auth configurations
- Register java.net.Authenticator for SOCKS5 credential negotiation (Java 21 SocksSocketImpl uses RequestorType.SERVER for this callback)
- Remove per-keystroke invalid-proxy alert, which fired on every URL change for valid but unparseable proxy strings
* ui: drop link preview SOCKS warnings and strings
* ui: soften link preview alert when SOCKS is on
Show the link previews opt-in alert in both SOCKS-on and SOCKS-off
cases (previously skipped entirely when SOCKS was on). When SOCKS
is on, use a softer description that mentions the proxy and the
remaining local DNS lookup risk, and render the Disable button in
primary colour instead of red.
Also drop the link-previews caveat from the SOCKS limitations
footer since previews now go through the proxy.
* fix: harden socks proxy auth in link previews
- Gate the SOCKS5 Authenticator on host:port match so destination 401
challenges no longer leak proxy credentials via the JDK auto-retry.
- Snapshot Authenticator.getDefault() and restore in finally to stop
leaking process-global state.
- Mutex around getLinkPreview to serialize concurrent calls.
- Generate a random UUID per call in ISOLATE mode for stream isolation.
- Skip auth when USERNAME mode has empty username or password.
* ui: shift red emphasis from Disable to Enable in link preview alert
Disable is now always primary; Enable is red by default and primary
when SOCKS is on. The dangerous action is enabling without proxy
protection, not disabling.
* ui: append SOCKS notice to link preview alert
---------
Co-authored-by: iversonianGremling <24989959+iversonianGremling@users.noreply.github.com>
* directory: re-invite owner who left owners' group
The /invite command's alreadyMember check treated any GroupMember row as
a current member, including rows with status GSMemLeft or GSMemRemoved.
Owners who had left the owners' group could therefore not be re-invited.
Use memberCurrent to only block re-invite when the member is actually in
the group.
* directory tests: account for admin notification and renamed group on re-invite
The owners' group has no GroupReg by design, so when an owner leaves it
the directory service notifies admins with "Error: contact left, group: N
owners, group registration not found" - expected behavior, but the test
for re-inviting an owner who left the owners' group did not consume this
DM and failed at bracket cleanup.
The test also assumed bob's new invitation would land in #owners, but the
chat client disambiguates it to #owners_1 because bob's old left
membership of #owners is still present locally.
Consume the admin DM explicitly and update the invitation assertions to
#owners_1 / /j owners_1.
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
The active-call action button row (mute, speaker, hang up, flip/toggle camera)
was rendered with only a fixed 20.dp bottom padding. Under edge-to-edge layout
on devices with 3-button navigation, the system nav bar (~48.dp) drew on top
of these buttons, hiding part of them.
Add `.navigationBarsPadding()` to the BoxWithConstraints holding the buttons
so the row floats above the system nav bar inset. No effect on devices using
gesture nav (the inset there is small enough to not collide).