fix(android-call): no hole-punch without native video (white meeting bg)

On an Android native call the WebView turned on hole-punch (transparent
meeting grid, so native video can show BEHIND the WebView) whenever the
plugin exposed setHolePunch — but on the 2a audio-only build there is no
native video behind it, so the transparent grid revealed the white Android
window (reported: white meeting background; tiles stayed visible as they're
opaque web elements). iOS never showed this because CallKit covers the view.

Gate hole-punch on native video actually existing: new ANDROID_NATIVE_VIDEO
server flag (mirrors ANDROID_NATIVE_MEDIA, default off) exposed via
/api/meetings/config. Web: bzNativeVideoOn() — iOS always, Android only when
the flag is on (Increment 2b APK). While off, hole-punch stays off and the
grid keeps its dark background; the native-tile poll doesn't run. iOS
unchanged. Flip the flag on once the 2b native-video APK is installed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
SravanandClaude Opus 4.8 committed 2026-11-03 20:12:21 +05:30
1 parent ea4d65274e
commit ae607f44b5
3 files changed
+20 -4

No files matched your search

+9
View File
@@ -63,6 +63,14 @@ const ANDROID_CALLS = process.env.ANDROID_CALLS === '1';
// the LiveKit-Android plugin. Set ANDROID_NATIVE_MEDIA=1.
const ANDROID_NATIVE_MEDIA = process.env.ANDROID_NATIVE_MEDIA === '1';
// Native call VIDEO on Android (Increment 2b): the plugin captures/publishes the camera and renders remote video
// tiles natively via hole-punch (a transparent WebView over native VideoViews), mirroring iOS. INDEPENDENT of
// ANDROID_NATIVE_MEDIA (audio) so video can be enabled only once a 2b-capable APK is installed. OFF (default) →
// Android native calls are AUDIO-ONLY and the WebView keeps its normal (opaque, dark) meeting grid — hole-punch
// stays off, so no transparent grid reveals the page behind it. ON → native video + hole-punch. Requires an app
// build carrying the 2b native-video plugin. Set ANDROID_NATIVE_VIDEO=1.
const ANDROID_NATIVE_VIDEO = process.env.ANDROID_NATIVE_VIDEO === '1';
module.exports = {
PORT: process.env.PORT || 8090,
HTTPS_PORT: process.env.HTTPS_PORT || 8443,
@@ -82,6 +90,7 @@ module.exports = {
CALLKIT_ENABLED,
ANDROID_CALLS,
ANDROID_NATIVE_MEDIA,
ANDROID_NATIVE_VIDEO,
PUBLIC_DIR,
REC_DIR,
TRANS_DIR,