)
* Security: P-256 key generation, ECDH key agreement and HKDF on every port
KeyGenerator.ec, KeyAgreement.ecdh and Hkdf (RFC 5869, pure Java, shared with
the backend). JavaSE and Android use the JCA; iOS Security.framework, Linux
OpenSSL EVP, Windows BCrypt and the browser Web Crypto. EcP256Codec keeps the
DER in Java so every port hands out byte-identical SPKI/PKCS#8.
Fixes ECDSA on iOS (cn1_crypto_sign loaded every key as RSA) and in the
browser (the bridge refused EC signatures outright).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: messaging sample skeleton, shared contracts and backend
Reactor, shared DTO/RestClient contracts, and the Codename One backend:
accounts, devices and prekeys, conversations and groups, the per-device
envelope queue, media blobs, live frames and push, privacy and moderation,
call signalling with TURN credentials, Telegram and WhatsApp Cloud bridges,
demo seed and bot. Client modules follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: client messaging - chats, groups, media, privacy, admin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* WebRTC: com.codename1.webrtc with Android, iOS, browser and simulator ports
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: voice and video calls over WebRTC with system call integration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: browser e2e as a linked device, admin console from the overflow menu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: Initializr template, CI workflow and developer guide chapters
Adds the PARLEY full-stack template, parley.yml (backend, simulator and
browser e2e, template, Android and iOS builds), the user's and implementor's
guide chapters, a WebRTC chapter and the ECDH/HKDF security section. A
full-stack template generated for Java 17 now raises the root pom's compiler
level too, which the server and the shared module inherit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Initializr: track the parley template archives
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: review fixes, safe-area layout, browser WebRTC bridge, guide screenshots
Server: a stale device copy is detected by device and owner, direct chats
are unique in the database, each person holds one call line, and the
offer and early ICE wait for a callee that was not connected.
Client: call failures only end the call they belong to, a repeated offer
is ignored, the media cache is bounded and cleared on wipe, acks survive
a restart, expiry runs from the summary, and a registration answer is
only applied to the identity it was sent for.
Ports: iOS queues ICE until the remote description is set and detaches
remote tracks on close; Android enters communication mode for a call;
the browser WebRTC runs in the host bridge; the JavaSE desktop app has
no simulator WebRTC.
UI: the chat composer carries the bottom safe area, the title is centred
on its avatar and buttons, and segmented choices always show the chosen
option. Guide images were recaptured.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* WebRTC: runnable javadoc examples; call and server snippets opt out of Try it
A call needs a second device the Playground does not have, and the
Parley security rules are server code.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: no regex split in the compiled server, guide prose, a sturdier admin menu pick
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: atomic prekey claim, busy on a lost call line, call-line cleanup, reject unauthenticated plaintext, WebRTC remote track lifetime and browser audio; Initializr Parley README and selector; snippets; JS size baseline
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: crash-safe vault writes, prekeys spent after authentication, envelopes announced after commit, raced direct chats and bridge links, webhook dedupe, unsent messages resent, rotation without prekey growth; P-256-only ECDH; WebRTC audio source and iOS audio session cleanup; Android Ant build excludes webrtc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: entity column types match the migrations on PostgreSQL and MySQL; VoIP token unregistered on sign-out; Android call pushes reconnect and the server replays rings to a connecting device; signalling devices must be the signaller's; conversation frames after commit; reaped calls notify both peers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: V0 migration makes MySQL/MariaDB text keys case sensitive and NO PAD (no-op on SQLite and PostgreSQL)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: messages bound to their conversation; calls end on sign-out; signals of one call serialized and a late second answer refused; busy only on a real line conflict; bridges relay after commit; message sends rate limited; a direct chat goes with a closed account; chat screens release the recorder, its clock and the store listener
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: vault promotes a recovered side file before overwriting it; blocked callers never take the callee's line; call frames and ring cancels sent after commit; uploads capped by bytes per day; one-time prekeys rate limited per target device; attachments bounded before buffering; muted bridged chats stop pushing; expired unread messages leave the badge; TeaVM WebRTC fallback plays remote audio; browser ECDSA signs on the key's curve; Call Management keeps its default anchor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Starter launchers: macOS job timeout fits the thirty-odd Initializr downloads it now runs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: received plaintext journaled before the ratchet moves and kept until acknowledged; typing indicators sent outside the ratchet; a payload must match its envelope kind
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley: Initializr template synced
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Flutter bench: PR overlay re-measured on top of master's moved JavaScript size row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parley CI: server tests on PostgreSQL and MySQL, as Savor and Wayline run them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Baselines: repair #5976's merged overlays (rows master already moved are dropped or re-anchored); Parley's own JS size overlay is covered by #5976's and goes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Flutter bench: Parley's JavaScript and Linux size rows, measured on top of master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Flutter bench: re-measure Parley's Linux size rows on top of current master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Flutter bench: re-measure Parley's Linux zipped download on top of current master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* JavaScript screenshots: present the phone-sized harness as a touch-only pointer
#6073 gives any browser with a fine pointer desktop scrollbars. Headless
Chromium reports a mouse, so every scrollable screen in the phone-sized
suite gained an always-visible gutter and 48 goldens stopped matching.
Answer only (any-pointer: fine) as a touch device would; the coarse query
isPrimaryPointerMouse() reads keeps Chromium's answer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
In a web build, scrollbars behaved like touch scrolling even under a desktop theme: dragging the thumb scrolled the content the opposite way (it was a swipe), and clicking the gutter did nothing.
Cause: the core's interactive (desktop) scrollbar is enabled by the
interactiveScrollBooltheme constant, which only the JavaSE port injects.HTML5Implementationnever did, so the browser always used touch semantics.Changes
HTML5Implementation.installNativeThemesets@interactiveScrollBoolwhen(any-pointer: fine)matches, unless the theme already declares it. Any fine pointer, not only the primary one, so a touch laptop gets a draggable scrollbar; the scrollbar only claims presses that land on it, so finger swipes over content still scroll.interactiveScrollTrackJumpBool(default off,LookAndFeel.isInteractiveScrollTrackJump()): a track click centers the thumb on the click and keeps it grabbed for dragging, instead of paging one viewport.InteractiveScrollbarTest.trackClickJumpsToPositionWhenEnabled.Verified locally:
InteractiveScrollbarTest10/10, core-unittests SpotBugs 0 findings, JS port classes compile. Not exercised in a real browser.🤖 Generated with Claude Code