Commit Graph
597 Commits
Author SHA1 Message Date
evgeny 3daacc07b7 Select any joined channel when opening an Android server link 2026-10-28 11:06:24 +01:00
evgeny f2d6561509 Route Android server links through channel selection and ordinary JOIN request 2026-10-28 11:05:23 +01:00
evgeny 1ad00c12ad Fix attachment sending, media manifests and storage defaults 2026-10-28 01:47:17 +01:00
evgeny 005d136dc7 Make Android microphone capture stoppable and cleanup resilient
Use nonblocking AudioRecord reads with data and timestamp deadlines. Serialize idempotent close, finish interrupted joins before release, isolate callback failures, and abort stereo fallback when partial-record cleanup fails.

Close failed shared readers to new subscriptions, roll back worker startup, isolate observers, preserve interrupt state, and release the last consumer exactly once. Add an independent capture-tests JVM module to the standard Android unit-test task.

Validation: 38 capture scenarios (25 AudioRecord plus 13 PCM/PTT), 455 JVM tests, assembleDebug, core build, and full check.sh (225 tests plus proxy/burst/load) passed.
2026-10-28 00:53:01 +01:00
evgeny 74035fc043 Recover Android media audio sessions with explicit resource ownership
Retry monitor and capture setup after invalidating failed attempts. Bind output leases and callbacks to registration identity, cancel confirmation timers, and keep hardware cleanup independent from device enumeration during call handoff.

Commit profiles only after successful storage writes, acquire mode ownership before Android side effects, and reject blocking operations on main or the control worker. Keep the app singleton backed by an isolated MediaAudioSession with a single executor.

Validation: 30 media session scenarios, 420 JVM tests, assembleDebug, core build, and full check.sh (225 tests plus proxy/burst/load) passed.
2026-10-28 00:28:42 +01:00
evgeny a6ae4df3ff Harden Android audio router lifecycle and route selection
Roll back failed startup, finish independent stop cleanup, invalidate stale device and Telecom callbacks, and serialize router mutations. Publish input/output targets after accepted selection and support retries of rejected requests.

Separate modern communication device selection from legacy SCO, refresh replaced descriptors, and support A2DP and USB input-only devices in per-track mode. Clarify routing and observer ownership contracts.

Validation: 45 router scenarios, 390 JVM tests, assembleDebug, core build, and full check.sh (225 tests plus proxy/burst/load) passed. Previous router fails 25 of the 30 new cases.
2026-10-27 23:53:21 +01:00
evgeny 0d45bdbad6 Own Android incoming call alerts and notification actions
Bind notification tokens to full call IDs and call kinds, cancel actions on stop, and reject decline callbacks after ringing ends. Serialize alert state on main and recover notification channel setup after Android API failures.

Keep sound independent of wake-lock and notification failures. Remove orphaned notifications on cold start, preserve idempotent alerts during duplicate delivery and language changes, and document lifecycle contracts.

Validation: 32 new lifecycle cases, 360 JVM tests, assembleDebug, core build, and full check.sh (225 tests plus proxy/burst/load) passed.
2026-10-27 23:31:56 +01:00
evgeny 5a6eabf4fc Fix Android alert profiles and playback resource ownership
Configure audio attributes before MediaPlayer preparation, keep vibration independent from sound failures, and guard loop/focus cleanup against stale callbacks. Preserve ringback players on repeated phase requests.

Add 35 alert lifecycle tests against real Kotlin sources with controlled Android API failures. Validation: 328 JVM tests, assembleDebug, core build, and full check.sh (225 tests plus proxy/burst/load) passed. Previous sources fail 32 of the 35 new cases.
2026-10-27 23:12:11 +01:00
evgeny f4ef949482 Guard Android radio configuration with worker-owned tasks 2026-10-27 22:41:30 +01:00
evgeny f71aff3e11 Document Android radio automatic capture and background window contracts 2026-10-27 21:58:02 +01:00
evgeny d6dc6234d5 Recover SIM observers without losing healthy subscription state 2026-10-27 21:49:15 +01:00
evgeny 142cc1a7a1 Verify Android phone state publishing and JNI restart recovery 2026-10-27 21:30:07 +01:00
evgeny 4859d03f29 Return Android phone state queue acceptance through JNI 2026-10-27 21:25:51 +01:00
evgeny b92727e66a Make proximity observation safe across failures and restarts 2026-10-27 20:57:24 +01:00
evgeny ed1f4d8ea8 Preserve pending CoreActivity intent when the native queue rejects a request 2026-10-27 20:39:19 +01:00
evgeny 1ed110d47c Validate CoreActivity ownership before mutations and cache completed JNI requests 2026-10-27 20:02:55 +01:00
evgeny 64c1019a52 Verify cancelled Android workers retain callbacks and keep SQLite owned by the core 2026-10-27 19:30:29 +01:00
evgeny 823bae076f Run Android service shutdown off the main thread and await it before startup 2026-10-27 19:07:05 +01:00
evgeny d83d58c874 Keep Android shutdown independent of a retiring service 2026-10-27 18:55:29 +01:00
evgeny 11b3ceaa9b Wait for Android core readiness before applying settings 2026-10-27 18:27:14 +01:00
evgeny 8e0090b54b Track Android startup until native core readiness is confirmed 2026-10-27 18:20:48 +01:00
evgeny a09b67a70f Fix the key regeneration job type in ChatViewModel 2026-10-27 18:10:09 +01:00
evgeny 848247bde6 Exercise Android identity regeneration through JNI on devices 2026-10-27 18:08:29 +01:00
evgeny 50ea132c15 Recreate the Android core when regenerating its identity 2026-10-27 18:05:06 +01:00
evgeny 02ec6a50a5 Verify config saves survive cancellation of their submitting scope 2026-10-27 17:35:26 +01:00
evgeny 5382b686e9 Keep config snapshots and network diagnostics precise 2026-10-27 17:18:13 +01:00
evgeny 893e714422 Show a specific error when database reset cannot finish 2026-10-27 17:18:13 +01:00
evgeny b8e7b18937 Serialize Android config transactions and await them through UI lifecycles 2026-10-27 17:18:13 +01:00
evgeny 3ba581770c Build Android configuration from one preferences and key snapshot 2026-10-27 17:18:13 +01:00
evgeny 482026e208 Add an application-owned queue for atomic Android config writes 2026-10-27 17:18:13 +01:00
evgeny 6d925fecd1 Serialize Android network snapshots across monitor and core lifecycles 2026-10-27 15:04:27 +01:00
evgeny 7b526ba681 Own Android network activity registrations across start and stop 2026-10-27 15:04:27 +01:00
evgeny 7f0c080492 Validate saved Android socket ports before reuse 2026-10-27 14:22:32 +01:00
evgeny 080c7a5fd5 Clarify Android auto socket identity and port reuse contracts 2026-10-27 14:22:32 +01:00
evgeny 0fe14699b0 Document Android conversation targets and test message ID conversion 2026-10-27 14:22:32 +01:00
evgeny f04637a257 Keep Android message link parsing linear and validate authority 2026-10-27 14:22:32 +01:00
evgeny 3e96e429eb Preserve unsigned node IDs in Android invite previews
Encode JNI node IDs as decimal strings and decode both uint64 fields without floating point or signed parsing. Compare all invitation fields and binary contents. Cover boundary IDs, malformed JSON types, and model equality with nine JVM tests. Native build, invite codec/build tests, and both debug APK ABIs passed.
2026-10-27 14:22:32 +01:00
evgeny 9876677a5f Refresh committed feedback without repeating user actions after readback errors 2026-10-27 03:49:38 +01:00
evgeny 13039933da android: separate avatar taps from conversation context menus 2026-10-27 00:49:00 +01:00
evgeny b19e6797c9 Preserve Android edit drafts across screen recreation and serialize saves 2026-10-26 22:54:36 +01:00
evgeny 0a75a53ed9 Correct Android attachment submission argument after editor integration 2026-10-26 22:45:04 +01:00
evgeny 93057c9eb7 Adapt signed history regression fixtures to canonical revision envelopes 2026-10-26 22:41:56 +01:00
evgeny b0d246913d Complete Android navigation after PM conversation deletion 2026-10-26 22:11:39 +01:00
evgeny f83033d3a1 Guard Android PM history and pending deletion across asynchronous sends 2026-10-26 22:11:39 +01:00
evgeny f521bb37f4 fix(call): align audio frontend ownership with core lifecycle
Keep the borrowed audio provider on UTUN_INSTANCE across chat service restarts.
Attach and detach Android voice from the core worker and reject DSP startup
after detach. Preserve TX owner epochs, pending slots and foreign-instance RX
isolation. Remove the unused cross-thread online API and keep its check local
to call.c.

Add eight lifecycle regressions with real cores and the Android host bridge.
Audit public call, DSP, clock, headless and desktop audio contracts and record
the findings and validation scope.

Validation: voice/desktop 38/38, four native call suites, native and both Android
ABI builds, full check 204/204 plus proxy/burst/load. JVM results remain Gradle
UP-TO-DATE (155 app and 15 router). No hardware runtime validation.
2026-10-26 20:22:46 +01:00
evgeny 2e8885548b docs(call): clarify Android output and Bluetooth proxy ownership 2026-10-26 20:21:58 +01:00
evgeny 83df895532 build(android): run router lifecycle regressions with app unit tests 2026-10-26 20:21:58 +01:00
evgeny de83d7bbf4 fix(android): own Bluetooth proxies across router lifecycle 2026-10-26 20:21:58 +01:00
evgeny 000b28027c Preserve Android raw capture through AEC and apply mute before Opus 2026-10-26 17:14:18 +01:00
evgeny 9ab9d01907 Fix Android config storage limits for the strict parser 2026-10-26 10:12:30 +01:00