Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
478 commits
Select commit Hold shift + click to select a range
14a2660
fix: audio routing if only one device (e.g avd simulator) (WT-1097) (…
digiboridev Apr 9, 2026
8d73954
fix(android): minimize app instead of destroying Activity when back p…
SERDUN Apr 10, 2026
6fea268
fix(signaling): bidirectional hub protocol + persistent-mode reconnec…
SERDUN Apr 10, 2026
0398512
refactor(WT-1221): centralize disconnect notification decisions in Si…
SERDUN Apr 10, 2026
07b3a66
fix: session status stuck on Connection in progress on devices withou…
SERDUN Apr 10, 2026
e15bd6b
fix(signaling): cancel in-flight connect on disconnect (#1093)
SERDUN Apr 10, 2026
6cf1120
fix(session): resolve stuck 'No internet' status after network restor…
SERDUN Apr 10, 2026
5f2f06a
fix(l10n): escape apostrophe in Italian ARB plural string (#1097)
SERDUN Apr 10, 2026
9212632
docs(signaling): add remoteMessaging FGS type rationale (#1098)
SERDUN Apr 10, 2026
1ed2931
fix(signaling): resolve ForegroundServiceDidNotStartInTimeException o…
SERDUN Apr 11, 2026
ef0e45e
feat(signaling-service): add simulateKill API for service-restart QA …
SERDUN Apr 13, 2026
7b29b71
fix(signaling): detect hub death via ping/pong and recover automatica…
SERDUN Apr 13, 2026
939af52
fix(signaling-service): recover from hub service death while Activity…
SERDUN Apr 13, 2026
4dbe791
fix(android): set extractNativeLibs=true to fix crash on sideloaded i…
SERDUN Apr 13, 2026
389b8a2
fix(signaling): silence controllerUnknownError (4400) on reconnect (W…
SERDUN Apr 13, 2026
8c03a07
fix(call): handle incoming call hangup when signaling is unavailable …
SERDUN Apr 13, 2026
f2d64b7
fix(ios): add 8s timeout to getUserMedia in incoming call handler (WT…
SERDUN Apr 13, 2026
89fb6ec
fix(signaling): guard Transaction against double-complete race (WT-10…
SERDUN Apr 13, 2026
040dd8a
fix: ensure system info is loaded before MainShell builds (#1105)
SERDUN Apr 13, 2026
71ee2db
fix(WT-1083): outgoing call offline-hangup — full fix (#1094)
SERDUN Apr 13, 2026
dcd7067
fix: remove redundant null-aware operator after catchError chain (#1120)
SERDUN Apr 13, 2026
8eafa4a
fix: signaling hub error encoding (#1121)
digiboridev Apr 14, 2026
ac2f292
refactor: wrong line errors handling (WT-1023, WT-1108) (#1123)
digiboridev Apr 14, 2026
7fe6746
fix: signaling hub presence parsing (#1124)
digiboridev Apr 14, 2026
c948eba
fix(push_tokens): guard add() calls after bloc close in token retriev…
SERDUN Apr 14, 2026
55b2da7
fix: signaling hub presence handshake parsing (#1125)
digiboridev Apr 15, 2026
9a24dca
feat: rtc media tracks pool (#1126)
digiboridev Apr 15, 2026
e501384
fix: pc logger namespace sanitizing (#1128)
digiboridev Apr 15, 2026
90b1209
fix(signaling-service): stop orphaned SignalingForegroundService in p…
SERDUN Apr 15, 2026
ccbec2f
fix: renegotiate with undefined line guard (#1131)
digiboridev Apr 15, 2026
45e8f88
fix(android): fix push-answered call handoff — handoffCall + Signalin…
SERDUN Apr 16, 2026
85c0284
fix: renegotiation handler test (#1133)
digiboridev Apr 16, 2026
5701317
fix(signaling): force reconnect on app resume + foreground call push …
SERDUN Apr 16, 2026
d82286a
fix(push-isolate): hand off ringing call to Activity on timeout inste…
SERDUN Apr 16, 2026
d4f9a0a
fix(call): fix answer race — UserMediaError pool race + DeclineReques…
SERDUN Apr 16, 2026
44d47f8
fix(call): suppress 'Disconnected from core' toast on SIP unregister …
SERDUN Apr 16, 2026
f633e6a
fix(signaling): guard _onError against secondary errors after connect…
SERDUN Apr 16, 2026
5366ef9
fix(recents): prevent 'Unknown'/empty string in call history (WT-1324…
SERDUN Apr 16, 2026
5535d9b
feat(WT-1157): battery optimization warning on persistent connection …
SERDUN Apr 17, 2026
b2979a0
fix(signaling): add missing warning logs for silent failure paths (#1…
SERDUN Apr 17, 2026
70ef445
fix: call drop on language/theme change (#1145)
digiboridev Apr 17, 2026
a481cab
fix: db lock (#1147)
digiboridev Apr 17, 2026
f330ffa
fix(settings): user-friendly error when delete account is not support…
SERDUN Apr 17, 2026
fb076cc
feat: remote video frame detector, show remote video if local disable…
digiboridev Apr 17, 2026
cd71ca1
feat: debounce call actions (#1150)
digiboridev Apr 17, 2026
b5a56ff
fix(signaling): improve FGS isolate reliability (Drift-inspired) (#1144)
SERDUN Apr 17, 2026
d8fae06
fix(WT-1339): fix incoming call frozen in accepting state on Android …
SERDUN Apr 17, 2026
3201d2e
fix(WT-1340): add bottom inset padding to Settings screen ListView (#…
SERDUN Apr 18, 2026
cf8b97e
fix(WT-1337): suppress spurious disconnect toast on post-Doze app res…
SERDUN Apr 18, 2026
3298c54
feat: add GitHub Actions workflow for Claude AI code review (#1154)
SERDUN Apr 18, 2026
01cd1a1
fix(signaling): ignore stale onDisconnect from superseded WS client (…
SERDUN Apr 18, 2026
455f170
fix(signaling): disable auto-plugin registration on FGS engine; add n…
SERDUN Apr 18, 2026
81e17fa
fix(signaling): replace bare FlutterJNI() with FlutterInjector factor…
SERDUN Apr 18, 2026
1aecbaa
fix: use inProgress color for SessionStatus.inProgress instead of rea…
SERDUN Apr 18, 2026
01812f5
fix(call): prevent local thumbnail disappearing when callee enables v…
SERDUN Apr 18, 2026
af7fa19
fix(signaling): fix FGS startup failures — background thread init + i…
SERDUN Apr 18, 2026
394c8ad
fix(signaling): reconnect FGS WebSocket after screen unlock in PUSH_B…
SERDUN Apr 19, 2026
843f843
fix(fgs): register callkeep bootstrap API on FGS engine — fixes incom…
SERDUN Apr 19, 2026
335160c
fix(diag): add diagnostic logs for incoming push call offer-wait fail…
SERDUN Apr 19, 2026
f43b017
fix(WT-1369): handle incoming call handshake when callLogs.length > 1…
SERDUN Apr 19, 2026
7096cb3
fix(contacts): use permission status check instead of request() in _o…
SERDUN Apr 19, 2026
0d8262f
fix(WT-1350): audio stuck in speaker after video disabled on iOS (#1167)
SERDUN Apr 19, 2026
018505b
fix(WT-1369): incoming call stuck in Preparing after wifi reconnect (…
SERDUN Apr 19, 2026
c4d20de
fix: reconnect renegotiate only connected (#1173)
digiboridev Apr 20, 2026
f1a89d3
fix(api): map 401 token_invalid to UnauthorizedException — auto-logou…
SERDUN Apr 20, 2026
404008f
fix(signaling): self-healing timer to recover from stuck _startPendin…
SERDUN Apr 20, 2026
5b1baad
fix(signaling): eliminate FGS restart crash during logout teardown (#…
SERDUN Apr 20, 2026
a0f0e2b
fix(signaling): handle unknown/provisional SIP dialog states without …
SERDUN Apr 20, 2026
ccfe757
fix(signaling): convert doWork to block body to fix Kotlin compilatio…
SERDUN Apr 20, 2026
6f8b476
fix(call): reset duration when acceptedTime changes in CallInfo (#1177)
SERDUN Apr 20, 2026
2a30d71
feat: call terminate queuee (#1178)
digiboridev Apr 20, 2026
266548a
fix(signaling): skip FGS restart in pushBound mode to prevent Foregro…
SERDUN Apr 20, 2026
e7a99f8
fix(signaling): add safety reconnect fallback when main isolate sync …
SERDUN Apr 21, 2026
a797bf9
fix(signaling): reset _syncSucceeded before reconnect sync to restore…
SERDUN Apr 21, 2026
acb01cc
fix(signaling): opportunistic reconnect on network restore in backgro…
SERDUN Apr 21, 2026
c1380f1
refactor: remove error messages (WT-1362, WT-1364) (#1184)
digiboridev Apr 21, 2026
c5c10b9
chore(signaling): add diagnostic logs to identify silent executeDartC…
SERDUN Apr 21, 2026
302606f
fix(signaling): use callbackName instead of non-existent callbackEntr…
SERDUN Apr 21, 2026
d04a81a
fix(WT-1393): restore call when blind transfer target declines (#1186)
SERDUN Apr 21, 2026
6cc3705
chore: suppress deprecated_subclass warnings from own-package depreca…
SERDUN Apr 21, 2026
d5bbf1a
fix(WT-1398): distinguish stale track error from permission denial (#…
SERDUN Apr 22, 2026
878d5a8
chore: cleanup after errors hide pr (#1195)
digiboridev Apr 22, 2026
0b24d9b
fix(call): skip ICE restart for calls without initialized PeerConnect…
SERDUN Apr 22, 2026
409bcbc
fix(user-media-builder): detach pooled tracks before stream dispose t…
SERDUN Apr 22, 2026
fa117d4
fix: log connectivity fails (#1198)
digiboridev Apr 22, 2026
b7f244c
fix(signaling): ignore late server ACK for already-timed-out transact…
SERDUN Apr 22, 2026
758f294
refactor: call initializing improvements (WT-1403, WT-1408) (#1202)
digiboridev Apr 22, 2026
2740efa
fix(wt-1416): show caller number instead of Unknown in missed call no…
SERDUN Apr 22, 2026
9b7b2ba
fix(signaling): align hub execute timeout with full retry cycle (#1201)
SERDUN Apr 22, 2026
26d4f95
fix: update call_controller_test for connectivityService dependency (…
SERDUN Apr 22, 2026
e178531
fix(signaling): fix 8-hour reconnect loop silence on Android FGS (WT-…
SERDUN Apr 23, 2026
6baf2c5
fix(call): show missed call notification on Android for signaling pat…
SERDUN Apr 23, 2026
e46b84b
fix(login): show error notification on password login failure (#1208)
SERDUN Apr 23, 2026
c638b0a
fix(wt-1417): treat ConnectivityResult.vpn as NetworkStatus.available…
SERDUN Apr 23, 2026
fe8838f
fix(wt-1417): debounce ICE restart on connectivity change (#1210)
SERDUN Apr 23, 2026
cdd9c56
fix(wt-1428): show user not found notification on OTP sign-in 404 (#1…
SERDUN Apr 23, 2026
22c3553
fix: media tracks lease race condition (#1212)
digiboridev Apr 23, 2026
7702076
fix: replace unnecessary double-underscore with wildcard _ in pool mu…
SERDUN Apr 23, 2026
c76f83d
feat: add call pull history to exclude recent calls, fix mapper (WT-1…
digiboridev Apr 23, 2026
4c19845
fix: call updating improvements (WT-1387) (#1215)
digiboridev Apr 24, 2026
2a3f1c6
fix: remove redundant hold on transfer init that causes race conditio…
digiboridev Apr 27, 2026
0ca7bf1
feat(call): introduce CallMediaManager for centralized audio/video ro…
SERDUN Apr 28, 2026
e960572
fix: call actions multi ringing support (#1218)
digiboridev Apr 28, 2026
ed74fe5
refactor: introduce sequential queue for mutations in CallBloc (#1220)
digiboridev Apr 28, 2026
c18eaf3
fix: ignore frame detector for incoming videocall (#1224)
digiboridev Apr 28, 2026
c9c3d67
fix(call): audio routing fixes for video calls (Android + iOS) (#1225)
SERDUN Apr 28, 2026
65d86c8
fix: handle glare janus error (#1223)
digiboridev Apr 28, 2026
3ee90ce
fix(test): stub getSenders/getReceivers in renegotiation handler test…
SERDUN Apr 28, 2026
34b3e9d
fix: unminimize call screen on call (#1231)
digiboridev Apr 29, 2026
8f0a819
fix: upgrade to video with zoiper (#1227)
digiboridev Apr 29, 2026
77e1410
fix: reset "updating" on update fail (#1229)
digiboridev Apr 29, 2026
f870917
fix: recents number mismatch log (#1228)
digiboridev Apr 29, 2026
623f54b
fix(call): prevent transient camera preview flash on signaling update…
SERDUN Apr 29, 2026
0b15a7a
fix(call): fast-path offer and line delivery to unblock push-answer m…
SERDUN Apr 30, 2026
32e9b77
feat(android): replace FGS with direct WebSocket for push-bound mode …
SERDUN Apr 30, 2026
90f4a63
fix: re-verify connectivity when cached state is false before blockin…
SERDUN Apr 30, 2026
5162e5f
fix(android): disable AudioSwitch audio focus to fix stuck volume con…
SERDUN Apr 30, 2026
c21a281
fix: dialogs info null pointer (#1240)
digiboridev May 4, 2026
d884c43
refactor: upgrade to video improvements (#1239)
digiboridev May 4, 2026
d903f65
fix: call to actions null check (#1245)
digiboridev May 4, 2026
b0567d2
fix(android): change SignalingForegroundService type from remoteMessa…
SERDUN May 4, 2026
fc4c4ad
fix: call pull show only pullable calls (#1246)
digiboridev May 4, 2026
9f55f41
fix: messaging day separator using local datetime (#1247)
digiboridev May 4, 2026
cdc96ce
fix(call): keep local controls active during SDP renegotiation (WT-14…
SERDUN May 4, 2026
98b1565
refactor: replace SessionStatus enum with class (signalingStatus + pu…
SERDUN May 5, 2026
7375209
fix(session-status): debounce transient reconnect status transitions …
SERDUN May 5, 2026
f281450
feat: rtp extensions remove, auto-bitrate fix (WT-1031) (#1252)
digiboridev May 6, 2026
df5e6b3
fix: logpretty in release mode (#1253)
digiboridev May 6, 2026
2dc466f
refactor(signaling): remove pushBound mode from FGS, extract WebtritS…
SERDUN May 6, 2026
329df08
fix(WT-1496): suppress uninformative CDR disconnect reasons from disp…
SERDUN May 7, 2026
c203317
fix(push): skip direct WS on persistent-session devices when push fal…
SERDUN May 7, 2026
b467488
fix(isolate): resilient IsolateContext and PushIsolateContext init (#…
SERDUN May 7, 2026
74ca8db
fix(signaling): prevent zombie race in WebtritSignalingServiceDirect …
SERDUN May 7, 2026
7d1780a
fix(push): remove legacy FGS timeout from pushBound isolate lifecycle…
SERDUN May 7, 2026
688d082
fix(signaling-hub): populate _callEventHistory from StateHandshake li…
SERDUN May 7, 2026
a75a97d
chore: update to webrtc 060526 branch (#1265)
digiboridev May 11, 2026
9e167b8
chore: remove deprecated setLogsDelegate calls from webtrit_phone (#1…
SERDUN May 11, 2026
7aa7595
refactor(wt-1421): unify call history tile layout via shared CallTile…
SERDUN May 11, 2026
1f8a122
refactor: keypad optimizatons for low-end (WT-1436) (#1267)
digiboridev May 11, 2026
49eb221
feat: add configurator:generate melos script for local Firebase setup…
SERDUN May 11, 2026
6676b5a
fix(voicemail): convert UTC date to local timezone before display (WT…
SERDUN May 11, 2026
1df8f02
fix(web): sync shareLogRecords web stub with native signature (#1270)
SERDUN May 12, 2026
621a6a6
fix: clean call queue on remote hangup (#1271)
digiboridev May 12, 2026
430e3af
fix(fgs): stop ringtone and dismiss notification on hangup in persist…
SERDUN May 13, 2026
3b5f97b
fix: guard NativeLogForwarder.start with Platform.isAndroid (#1272)
SERDUN May 14, 2026
3f81161
fix(wt-1525): iOS fresh-login dead signaling subscription (#1273)
SERDUN May 14, 2026
5e566ec
feat: network diagnostics (WT-1323, WT-1406, WT-1176) (#1274)
digiboridev May 19, 2026
fb1abee
fix: nsn matching only for nsn part (WT-1535) (#1275)
digiboridev May 19, 2026
1d3935d
refactor(backgroundMessage): expose AppPath in IsolateContext to avoi…
SERDUN May 19, 2026
9c5275e
refactor: replace AppDatabaseScope with DatabaseScope builder (#1278)
SERDUN May 19, 2026
39e23cb
fix: contact tile predictable UI (WT-1537) (#1279)
digiboridev May 20, 2026
c920f09
chore: add diagnostic logs to signaling connection lifecycle (#1281)
SERDUN May 21, 2026
4cff379
fix: reset NativeLogForwarder read offset and remainder on start (#1285)
SERDUN May 22, 2026
095ef9f
fix(signaling): recover WebSocket after network interface change on i…
SERDUN May 22, 2026
42f0277
fix(push): raise local notification channel importance for heads-up a…
SERDUN May 22, 2026
380e80b
feat: align OTP sign-in identifiers with backend (WT-1433) (#1288)
SERDUN May 22, 2026
713b535
chore(push): remove inspect-push debug scaffolding (#1289)
SERDUN May 22, 2026
55e03f2
chore: back-merge main into develop (converge histories, keep develop…
SERDUN May 22, 2026
8ed23dd
build: align develop app version with released main (1.15.3+0)
SERDUN May 22, 2026
11462af
fix: close popups on call compacting (#1292)
digiboridev May 25, 2026
7dd5bda
fix: voicemail unread count glitch (WT-1424) (#1295)
digiboridev May 25, 2026
18a8269
feat(android): host callkeep on the signaling FGS engine via WebtritC…
SERDUN May 26, 2026
2f8f6b5
feat(E2E): remote actions companion impl (#1300)
digiboridev May 26, 2026
e1f1ea2
fix: allow outgoing calls during re-registration window (WT-1554) (#1…
SERDUN May 27, 2026
c495407
feat: cold-start outgoing call works without routing-state wait (WT-1…
SERDUN May 27, 2026
5731174
chore: upgrade flutter_local_notifications to 21.0.0 (#1302)
SERDUN May 27, 2026
4deb20f
chore: upgrade dependencies (no API changes) (#1303)
SERDUN May 27, 2026
f6afa65
chore: upgrade Flutter to 3.44.0 (#1304)
SERDUN May 27, 2026
80a4aaf
chore: upgrade Gradle to 8.14 and migrate app to Built-in Kotlin (#1305)
SERDUN May 28, 2026
863265d
chore: upgrade flutter_contacts to 2.2.0 (#1307)
SERDUN May 28, 2026
a94f397
feat(e2e): call push interaction test (WT-1210) (#1308)
digiboridev May 28, 2026
a0412f7
chore: upgrade dependencies (#1309)
SERDUN May 29, 2026
714b8e9
fix: point flutter_contacts ref to main after upstream merge (#1313)
SERDUN Jun 1, 2026
72b1184
style(signaling): apply use_null_aware_elements in TransferRequest (#…
SERDUN Jun 1, 2026
4a86baa
fix(call): stabilize renegotiation guards (WT-1540) (#1312)
SERDUN Jun 2, 2026
e481773
fix(call): suppress recvonly video transceiver in audio-only renegoti…
SERDUN Jun 2, 2026
a3df1ad
feat(login): pre-populate core URL autocomplete from env (#1314)
SERDUN Jun 2, 2026
f15931b
chore(ios): bump permission_handler_apple to 9.4.9 for SPM support (#…
SERDUN Jun 2, 2026
30f51ce
fix(signaling): stop SignalingForegroundService crash loop on boot (W…
SERDUN Jun 2, 2026
c673a94
fix(ios): migrate to Swift Package Manager and fix Crashlytics symbol…
SERDUN Jun 2, 2026
4d2f4c2
fix(call): centralize OS connectivity behind ConnectivityService (WT-…
SERDUN Jun 3, 2026
29b94eb
feat(e2e): contacts and favorites tests remake (#1320)
digiboridev Jun 3, 2026
426ce72
feat: gate call-to-actions by adapter capability (WT-727) (#1323)
SERDUN Jun 3, 2026
8d4c041
feat(cdrs): gate call history by adapter capability (WT-727) (#1324)
SERDUN Jun 3, 2026
4968b53
feat(contacts): gate external (PBX) contacts by adapter capability (W…
SERDUN Jun 4, 2026
a511e80
feat(cdrs): make server capability the sole source of truth for call …
SERDUN Jun 4, 2026
8ab3205
build: pin Flutter via .fvmrc and drop flutter_version.yaml (#1329)
SERDUN Jun 4, 2026
012a380
feat(e2e): calls coverage improve, structure, docs (WT-1210) (#1328)
digiboridev Jun 4, 2026
f03b646
fix(cdrs): always register both recents route variants (WT-727) (#1332)
SERDUN Jun 4, 2026
69ba6cb
docs: relax comment standard to allow why-comments (#1333)
SERDUN Jun 4, 2026
c82ef58
fix(call): resolve health-check client per probe to follow session UR…
SERDUN Jun 4, 2026
3270842
docs: how the phone pins its callkeep version (#1330)
SERDUN Jun 5, 2026
14757f4
feat(ios): migrate to UIScene lifecycle (#1322)
SERDUN Jun 5, 2026
456f4ae
ci: guard callkeep dependency type (path on develop, pinned on releas…
SERDUN Jun 5, 2026
d969af6
chore: sort and group pubspec dependencies (#1343)
SERDUN Jun 5, 2026
493c649
refactor(keypad): seed input field from cubit state (#1344)
SERDUN Jun 5, 2026
b0fcfaf
feat(screenshots): interactive, parameterized login and main-screen p…
SERDUN Jun 5, 2026
2dd8c18
fix(theme): paint ThemedScaffold body above its background so tileCol…
SERDUN Jun 5, 2026
0433fd4
feat(settings): themeable separator style (visibility + color) (#1348)
SERDUN Jun 5, 2026
d78eddb
ci: auto-tag main with app_version on release merge (#1349)
SERDUN Jun 5, 2026
ed14bad
ci: allow capitalized commit description in git-lint (#1351)
SERDUN Jun 5, 2026
54c76df
docs: scope no-Cyrillic rule to exclude localization ARB values (#1353)
SERDUN Jun 5, 2026
a777ceb
feat(about): show webtrit_callkeep version on the About screen (#1352)
SERDUN Jun 5, 2026
adc601d
fix(settings): restore surface as the default separator color (#1354)
SERDUN Jun 5, 2026
91741a0
refactor: consolidate contact resolution onto ContactResolver (#1357)
SERDUN Jun 8, 2026
601c9d1
fix: prefer backend contact over local phonebook on number collision …
SERDUN Jun 8, 2026
67953bd
fix: do not resolve a local contact for your own number (self-call) (…
SERDUN Jun 8, 2026
b864a74
fix: do not show a local contact for your own number on the keypad (#…
SERDUN Jun 8, 2026
1a98292
fix: restore native dialer fallback for emergency numbers (WT-1600) (…
SERDUN Jun 8, 2026
31b8f17
fix: restore analyze on develop (screenshots ContactResolver + pjsua …
SERDUN Jun 8, 2026
bf51c82
fix: allow switching to earpiece in video calls on iOS (WT-1593) (#1360)
SERDUN Jun 8, 2026
e91328f
refactor(_wsc): migrate web impl from dart:html to package:web (#1362)
SERDUN Jun 8, 2026
b958fa7
fix: null check crash in CallToActionsCubit.changeLocale (WT-960) (#1…
SERDUN Jun 8, 2026
cbba947
fix: map password_change_required to a dedicated API exception (WT-95…
SERDUN Jun 8, 2026
3476834
feat: show limited standalone call mode on the diagnostic screen (#1365)
SERDUN Jun 9, 2026
c693be1
feat: generalized session side-issues with avatar indicator and accou…
SERDUN Jun 9, 2026
1787a15
fix: show account-not-found message on 404 logout (WT-956) (#1367)
SERDUN Jun 9, 2026
5eb6898
fix: handle messaging socket connect failures at the source (WT-961) …
SERDUN Jun 9, 2026
84b0ddb
fix: redact PII from Recents diagnostic logs (WT-1048) (#1370)
SERDUN Jun 9, 2026
43bea13
refactor: centralize local-vs-external contact collision tie-break (#…
SERDUN Jun 9, 2026
afd1268
fix: resolve recents number collisions to the external contact (WT-10…
SERDUN Jun 9, 2026
5f19f0f
fix: truncate long contact name in favorites tile (WT-1051) (#1373)
SERDUN Jun 9, 2026
baef4cc
feat: surface call network quality from Janus slowlink events (WT-100…
SERDUN Jun 9, 2026
689115a
fix(app_database): clear drift codegen warnings (#1374)
SERDUN Jun 9, 2026
c9815e2
feat(login): enforce deterministic login options order (#1375)
SERDUN Jun 9, 2026
77744c9
docs(call): add living feature overview under docs/features (#1377)
SERDUN Jun 10, 2026
743246a
fix: pin active call actions to the bottom for audio-only calls (#1383)
SERDUN Jun 10, 2026
662afce
feat: expandable quick actions on contact lists (#1391)
SERDUN Jun 10, 2026
e9f9f05
feat(call): list-based call screen(WT-1071) (#1382)
SERDUN Jun 10, 2026
7beff8a
feat: add Play Core in-app update flow for Android (WT-945) (#1396)
SERDUN Jun 11, 2026
faa426c
style: remove inaccurate comment from voicemail audio cache file guar…
SERDUN Jun 12, 2026
d11b177
fix: localize missed call notification title and unknown caller fallb…
SERDUN Jun 12, 2026
85ac98d
feat: surface camera-permission downgrade when answering a video call…
SERDUN Jun 15, 2026
7cfc253
feat: show third-party licenses in About and generate aggregated lice…
SERDUN Jun 15, 2026
03f97e6
fix: enforce exclusive voicemail playback via shared AudioPlayer (WT-…
SERDUN Jun 15, 2026
404500e
fix(recents): update RecentTile call logic and icons (#1395)
SERDUN Jun 15, 2026
b05a4bc
feat: notify the caller when an outgoing call fails for an unrecogniz…
SERDUN Jun 16, 2026
d7d77ce
docs: document background signaling reconnect edge in CallBloc (WT-10…
SERDUN Jun 16, 2026
a76d945
docs: explain call finalization on signaling loss in CallBloc (WT-107…
SERDUN Jun 16, 2026
91ef290
docs: feature-doc structure - _ux/_arch split, central index, authori…
SERDUN Jun 16, 2026
8b19d41
fix(call): end native call on signaling hangup for a call not in stat…
SERDUN Jun 18, 2026
98884d5
feat: add min_supported_app_version to system-info models (WT-1628) (…
SERDUN Jun 18, 2026
d3bc4b6
refactor: unify contact number actions into a single source of truth …
SERDUN Jun 18, 2026
06cfdcf
feat(cdrs): gate call history by local flag, Firebase override and se…
SERDUN Jun 19, 2026
b4ee5c8
fix(login): allow letters in OTP sign-in identifier field (WT-1642) (…
SERDUN Jun 19, 2026
8996833
feat: enforce min_supported_app_version force-update gate (WT-1628) (…
SERDUN Jun 19, 2026
7319004
build: align develop app version with released main (1.15.4+2)
SERDUN Jun 21, 2026
0279b8c
build: create a new release version 1.16.0
SERDUN Jun 21, 2026
f5a164d
feat(theme): configurable dialog theme and readable dialog background…
SERDUN Jun 22, 2026
b00905b
build: bump app_version build iteration to 1.16.0+1 (#1429)
SERDUN Jun 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .fvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"flutter": "3.44.0"
}
3 changes: 0 additions & 3 deletions .github/flutter_version.yaml

This file was deleted.

48 changes: 48 additions & 0 deletions .github/workflows/auto-tag-version.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: auto-tag-version

# After a release PR lands on main, publish the version tag automatically.
# Reads the app_version field from the root pubspec.yaml and creates an annotated
# tag X.Y.Z on the merged main commit if it does not already exist.
# Idempotent: pushes that do not change app_version (or where the tag already
# exists, e.g. a hotfix X.Y.Z+N reusing the same base) are no-ops.
# Note: app_version (not the standard version: field) is the release version.

on:
push:
branches:
- main
paths:
- pubspec.yaml

permissions:
contents: write

jobs:
tag:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Create version tag if missing
run: |
set -euo pipefail
# awk (not grep|awk): returns 0 even with no match, so a missing
# app_version yields an empty VERSION and reaches the error below
# instead of aborting on pipefail.
VERSION_FIELD=$(awk '/^app_version:/{print $2; exit}' pubspec.yaml)
VERSION="${VERSION_FIELD%%+*}"
if [ -z "$VERSION" ]; then
echo "::error::Could not read app_version from pubspec.yaml"
exit 1
fi
if git rev-parse -q --verify "refs/tags/$VERSION" >/dev/null; then
echo "Tag '$VERSION' already exists - nothing to do."
exit 0
fi
echo "Creating tag '$VERSION' on $GITHUB_SHA"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git tag -a "$VERSION" -m "release $VERSION"
git push origin "$VERSION"
31 changes: 31 additions & 0 deletions .github/workflows/callkeep-path-guard.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: callkeep-path-guard

# On develop, webtrit_callkeep must stay a path dependency (see docs/release_versioning.md).
# This catches a release `git:` ref accidentally back-merged onto develop.

on:
pull_request:
branches:
- develop

permissions:
contents: read

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# Uses Ruby's built-in YAML (psych) - always available on GitHub runners, no extra install.
- name: Ensure webtrit_callkeep is a path dependency
run: |
ruby -ryaml -e '
dep = (YAML.load_file("pubspec.yaml")["dependencies"] || {})["webtrit_callkeep"]
ok = dep.is_a?(Hash) && dep.key?("path") && !dep.key?("git")
unless ok
warn "::error::On develop, webtrit_callkeep must use a path dependency, not a git ref. A release pin was likely back-merged. See docs/release_versioning.md."
exit 1
end
puts "OK: webtrit_callkeep is a path dependency."
'
35 changes: 35 additions & 0 deletions .github/workflows/callkeep-pin-guard.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: callkeep-pin-guard

# On release branches and release tags, webtrit_callkeep must be pinned to a git ref
# (see docs/release_versioning.md). Mirror of callkeep-path-guard (which keeps develop on path).

on:
push:
tags:
- "*.*.*"
pull_request:
branches:
- "release/**"

permissions:
contents: read

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# Uses Ruby's built-in YAML (psych) - always available on GitHub runners, no extra install.
- name: Ensure webtrit_callkeep is pinned to a git ref
run: |
ruby -ryaml -e '
dep = (YAML.load_file("pubspec.yaml")["dependencies"] || {})["webtrit_callkeep"]
git = dep.is_a?(Hash) ? dep["git"] : nil
ref = git.is_a?(Hash) ? git["ref"].to_s : ""
if ref.empty?
warn "::error::On release branches and tags, webtrit_callkeep must be pinned to a git ref (got path/none). See docs/release_versioning.md."
exit 1
end
puts "OK: webtrit_callkeep is pinned to ref #{ref}."
'
18 changes: 15 additions & 3 deletions .github/workflows/git-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,25 @@ jobs:
exit 1
fi

REGEX="^(feat|fix|chore|refactor|test|docs|style|ci|perf|build|revert)(\([^)]+\))?: [^A-Z].+$"
# A capitalized first letter in the description is allowed (e.g. "fix: WebRTC ...").
REGEX="^(feat|fix|chore|refactor|test|docs|style|ci|perf|build|revert)(\([^)]+\))?: .+$"

# Legacy commits that predate the current convention and are already merged into
# shared history. Rewriting them would rewrite hundreds of commits across dozens of
# branches, so they are exempted by exact subject instead.
ALLOWLIST=(
"fix fix changing info icon color (#836)"
)

while IFS= read -r SUBJECT; do
if [ -z "$SUBJECT" ]; then continue; fi


for ALLOWED in "${ALLOWLIST[@]}"; do
if [ "$SUBJECT" = "$ALLOWED" ]; then continue 2; fi
done

if [[ ! "$SUBJECT" =~ $REGEX ]]; then
echo "Invalid format or capitalized description: '$SUBJECT'"
echo "Invalid commit message format: '$SUBJECT'"
exit 1
fi
done <<< "$COMMITS_SUBJECTS"
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,7 @@ makefile.shared
.claude/settings.local.json
CLAUDE.local.md
**/.claude/
integration_test/patrol_test_bundle.dart

# FVM SDK cache (managed by fvm; version pinned via .fvmrc)
.fvm/
30 changes: 27 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
# AGENTS.md

WebTrit Phone — Flutter VoIP app, Melos monorepo.
Flutter 3.32.4 (stable), Android SDK 35.0.1.
Flutter 3.44.0 (stable), Android SDK 35.0.1.

## Toolchain

- Flutter version is pinned **only** in `.fvmrc` — single source of truth, read by `fvm` locally and by the `webtrit_phone_builder` CI. When you bump it, update the version mentioned above in the same commit. (Older release branches may still carry the legacy `.github/flutter_version.yaml`; the builder falls back to it there.)
- Use `fvm flutter ...` / `fvm dart ...` so the pinned SDK is used; a bare `flutter` from `PATH` may be a different version. The `.fvm/` SDK cache is gitignored — run `fvm install` once per machine.

## Build & Test

Expand All @@ -16,8 +21,8 @@ dart run bin/create_new_schema_dump_and_test_migration.dart # after Drift tabl

## Code Standards

- No Cyrillic anywhere (source, comments, strings, logs, keys).
- No inline comments — DartDoc only for public APIs.
- No Cyrillic in source, comments, logs, strings, or keys, except translation values in localization ARB files (`lib/l10n/arb/*.arb`).
- Comments: no redundant *what* comments that restate the code; comments explain non-obvious *why* (rationale, gotchas, workarounds, links to issues). DartDoc for public APIs.
- No DI frameworks (`get_it`, `injectable`, Service Locator — forbidden).
- Single quotes; 120-char line width.
- Never edit `*.g.dart` / `*.freezed.dart` / `*.gr.dart` — regenerate via `build_runner`.
Expand Down Expand Up @@ -45,7 +50,26 @@ packages/ → shared libs (must NOT import from lib/)

- State: `@freezed` for state; `sealed class + Equatable` for events (never `freezed` on events).
- BLoC deps via `Provider`/`RepositoryProvider`; never pass `BuildContext` into BLoC/Service.
Exception: localized strings needed inside a callback may close over `context.l10n`, but ONLY
when the closure is evaluated lazily (after construction). Do NOT call `context.l10n` synchronously
inside `BlocProvider.create` — it uses `dependOnInheritedWidgetOfExactType` which throws
"Tried to listen to InheritedWidget in a life-cycle that will never be called again" there.
- DB: DAOs only — never `AppDatabase` directly; Drift-generated classes stay in repo layer.
- Theme: never raw `Colors.xxx` or `TextStyle` in widgets; `Theme.of(context).extension<T>()`.
- Widgets: `StatelessWidget` always (not helper methods); dumb widgets in `features/*/view/widgets/`.
- Tests: `MockClient`/`mocktail` — no real network calls; DB migrations via `SchemaVerifier`.
- Routing (`auto_route`): the `AppRouter.routes` tree must ALWAYS be complete — never gate route
*declarations* on async/runtime values (server capability, login state, feature flags).
`routeCollection` is `late final`, built once at router construction (before server `system-info`
loads), so any `if (capability) AutoRoute(...)` is frozen with whatever the value was at startup;
later navigation to a route omitted then throws `Failed to navigate to <Route>`. Register every
variant unconditionally and decide which one to *show* at navigation/build time (e.g.
`AutoTabsRouter.routes`, guards, initial-tab resolver). Sibling routes may share a `path`
(`recents`) — `RouteCollection` only requires unique route *names*, and tab matching is name-based.

## Documentation

- `docs/features/features.md` indexes the feature docs; the `docs/` root holds cross-cutting / component and app-level docs.
- Per feature `<name>` (kebab-case): a small one is a single `docs/features/<name>.md`. Split a grown one into `<name>_ux.md` (product/UX: what the user does, screen states, key widgets, in-progress redesign) + `<name>_arch.md` (code/architecture: bloc, events, state machine, flows, isolates, key patterns), and drop the plain `<name>.md` — `features.md` is the index, keep no redundant per-feature index.
- Cross-cutting components shared by several features live at the `docs/` root (e.g. `signaling_architecture_target.md`), not under features/; feature docs link to them rather than repeat them. Scenario docs (flows + diagrams) keep a descriptive name and live by scope — cross-component ones at the root (e.g. `incoming_call_scenarios.md`).
- Each doc: start with a one-line summary + a `Last reviewed:` date; describe current behavior first and put unfinished work under a marked "Redesign / in progress" section; link code by relative path (`lib/features/<name>/...`) and sibling docs relatively; update the doc in the same PR that changes the feature. Plain ASCII (repo convention).
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# WebTrit Phone — Claude Code

@AGENTS.md
@docs/call_architecture.md
@docs/features/call_arch.md

## Package Docs

Expand Down
52 changes: 14 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,48 +40,24 @@ The application offers extensive customization options:

# Testing

## Test commands
* Run unit and widget tests
### Unit and widget tests
* Run unit and widget tests:
```bash
flutter test
```
* Run integration tests in dev mode
```bash
patrol develop --dart-define-from-file=../dart_define.json --dart-define-from-file=dart_define.integration_test.json --flavor=deeplinkssmsReceiver
```
* Build integration tests
```bash
patrol build android/ios --dart-define-from-file=../dart_define.json --dart-define-from-file=dart_define.integration_test.json --flavor=deeplinkssmsReceiver
```
* To specify a test file, use the `-t` option:
```bash
patrol build -t patrol_test/call_and_recent_test.dart ...
```
* For build and deploy to Firebase Test Lab, use the following command from the `tool/scripts` directory:
```bash
./testlab_assemble_android.sh <testfile(optional)>
./testlab_assemble_ios.sh <testfile(optional)>
```
### Integration tests
- **Framework**: We use Patrol framework for integration testing.
It helps us to automate native iOS and Android behaviors and simplifyes routine tasks during testing.
You can find more information about it here: https://patrol.dev/
Integration tests are located in the `patrol_test` folder.

- **Configuration**: The configuration file `dart_define.integration_test.json` defines all the environment variables (login credentials, contacts, user info, and call settings) for the integration tests. [Integration Test Variables](docs/integration_test_variables.md).

- **Calls test**: For simulating SIP calls during tests, here is [pjsua Companion](packages/pjsua_companion/README.md) — an HTTP server that wraps the `pjsua` CLI to place and answer calls programmatically when app tests is running.

- **Commands**: See [Integration Test Commands](docs/integration_test_commands.md) for all patrol build, run, Firebase Test Lab, and local companion commands.

### Test variables

* `WEBTRIT_APP_TEST_CUSTOM_CORE_URL` (_example core.demo.mycompany.com_)
* `WEBTRIT_APP_TEST_EMAIL_CREDENTIAL` (_example myaccount@mail.com_)
* `WEBTRIT_APP_TEST_EMAIL_VERIFY_CREDENTIAL` (_example 123456_)
* `WEBTRIT_APP_TEST_OTP_CREDENTIAL` (_example +1234566789_)
* `WEBTRIT_APP_TEST_OTP_VERIFY_CREDENTIAL` (_example 123456_)
* `WEBTRIT_APP_TEST_PASSWORD_USER_CREDENTIAL` (_example username_)
* `WEBTRIT_APP_TEST_PASSWORD_PASSWORD_CREDENTIAL` (_example 123456_)
* `WEBTRIT_APP_TEST_DEFAULT_LOGIN_METHOD` (_email_ | _password_ | _otp_)
* `WEBTRIT_APP_TEST_EXT_CONTACT_A` (_example User A_)
* `WEBTRIT_APP_TEST_EXT_CONTACT_A_NUMBER` (_example 00123_)
* `WEBTRIT_APP_TEST_EXT_CONTACT_B` (_example User B_)
* `WEBTRIT_APP_TEST_EXT_CONTACT_B_NUMBER` (_example 00456_)
* `WEBTRIT_APP_TEST_ACCOUNT_NAME` (_example Test Account_)
* `WEBTRIT_APP_TEST_ACCOUNT_MAIN_NUMBER` (_example 1230000_)
* `WEBTRIT_APP_TEST_CALL_NUMBER_A` (_example 1111_)
* `WEBTRIT_APP_TEST_CALL_NUMBER_B` (_example 2222_)
* `WEBTRIT_APP_TEST_CROSS_CALL_SLEEP_SECONDS` (_example 10_)
- **Coverage**: See [Integration Test Coverage](docs/integration_test_coverage.md) for a description of every test file and its steps.

## Contributing

Expand Down
Loading
Loading