feat(call): implement CallKeep integration and enhance group call support
Some checks failed
Frontend CI / ota-android (push) Successful in 1m27s
Frontend CI / build-and-push-web (push) Failing after 1m28s
Frontend CI / ota-ios (push) Successful in 2m58s
Frontend CI / build-android-apk (push) Successful in 51m46s

Integrate `expo-callkit-telecom` to support native system call handling (answering, ending, and muting via system UI). This includes a new `callKeepService` and a `CallKeepBootstrap` component to manage the lifecycle of system call events.

Additionally, improves the calling experience by:
- Adding support for group calls with participant tracking and UI indicators.
- Enhancing LiveKit integration by replacing polling with event-driven video track synchronization.
- Updating `WebSocketService` to prevent disconnection when the app enters the background during an active call.
- Adding new WebSocket message types for participant join/leave events and group invites.
- Refining call UI components (`CallScreen`, `FloatingCallWindow`, `IncomingCallModal`) for better visual feedback and safe area handling.

Refactor LiveKit service to use event-driven updates for local and remote tracks, improving performance and reliability.
This commit is contained in:
2026-06-03 01:56:02 +08:00
parent d6a94c7b4d
commit 2e6912dddf
18 changed files with 1635 additions and 507 deletions

View File

@@ -17,13 +17,14 @@
"@expo/vector-icons": "^15.1.1",
"@livekit/react-native": "^2.11.0",
"@livekit/react-native-webrtc": "^144.1.0",
"@react-native-async-storage/async-storage": "^2.2.0",
"@react-native-async-storage/async-storage": "^3.1.1",
"@shopify/flash-list": "^2.3.1",
"@tanstack/react-query": "^5.90.21",
"axios": "^1.13.6",
"date-fns": "^4.1.0",
"@tanstack/react-query": "^5.100.14",
"axios": "^1.16.1",
"date-fns": "^4.4.0",
"expo": "^56.0.8",
"expo-background-task": "~56.0.16",
"expo-callkit-telecom": "^0.3.8",
"expo-camera": "~56.0.7",
"expo-constants": "~56.0.16",
"expo-dev-client": "~56.0.18",
@@ -44,34 +45,34 @@
"expo-task-manager": "~56.0.16",
"expo-updates": "~56.0.17",
"expo-video": "~56.1.2",
"jcore-react-native": "^2.3.5",
"jpush-react-native": "^3.2.6",
"katex": "^0.16.42",
"jcore-react-native": "^2.3.6",
"jpush-react-native": "^3.2.7",
"katex": "^0.17.0",
"livekit-client": "^2.19.0",
"markdown-it": "^14.1.1",
"markdown-it": "^14.2.0",
"pako": "^2.1.0",
"prismjs": "^1.30.0",
"react": "19.2.3",
"react-dom": "19.2.3",
"react-native": "0.85.3",
"react-native-gesture-handler": "~2.31.1",
"react-native-pager-view": "8.0.1",
"react-native-paper": "^5.15.0",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "~5.7.0",
"react-native-gesture-handler": "^3.0.0",
"react-native-pager-view": "^8.0.2",
"react-native-paper": "^5.15.3",
"react-native-reanimated": "^4.4.0",
"react-native-safe-area-context": "~5.8.0",
"react-native-screens": "4.25.2",
"react-native-share": "^12.2.6",
"react-native-share": "^12.3.1",
"react-native-sse": "^1.2.1",
"react-native-web": "^0.21.0",
"react-native-webview": "13.16.1",
"react-native-worklets": "0.8.3",
"zod": "^4.3.6",
"zustand": "^5.0.11"
"react-native-worklets": "^0.9.1",
"zod": "^4.4.3",
"zustand": "^5.0.14"
},
"devDependencies": {
"@react-native-community/cli": "^20.1.2",
"@react-native-community/cli": "^20.1.3",
"@types/pako": "^2.0.4",
"@types/react": "~19.2.2",
"@types/react": "~19.2.16",
"@types/react-native-vector-icons": "^6.4.18",
"typescript": "~6.0.3"
},