Addresses multiple issues when enabling/disabling PiP dynamically:
1. External API: Replace dead config-overwrite event handler with
interception in executeCommand. This properly manages the intersection
observer and PiP state when pip config changes via overwriteConfig.
2. PiPVideoElement: Fix ref access pattern - access videoRef.current
inside useEffects instead of capturing at render time. The captured
value was null on first render, causing blur/focus listeners to never
be set up when component mounted into a stable conference.
3. useCanvasAvatar: Return streamRef object instead of refs.current.stream
so consumers can access .current inside their effects. The stream is
created in an effect and wasn't available at render time.
4. Add on-mount focus check with loadedmetadata wait to handle PiP enable
while app is in background, ensuring video source is ready before
attempting to enter PiP mode.
Implements Picture-in-Picture functionality for the Electron wrapper to maintain video engagement when users are not actively focused on the conference window. This feature addresses the need to keep users visually connected to the conference even when multitasking.
Key features:
- Automatic PiP mode activation and deactivation based on user interaction
- Displays large video participant's stream or renders their avatar on canvas when video unavailable
- Provides audio/video mute controls via MediaSession API directly in PiP window
- Adds API events (_pip-requested) for Electron wrapper integration
Implementation includes new pip feature module with Redux architecture, canvas-based avatar rendering with custom backgrounds support, and integration with existing mute/unmute logic. Depends on jitsi-meet-electron-sdk#479 for proper user gesture handling in Electron.