diff --git a/components/AndroidVideoPlayer.tsx b/components/AndroidVideoPlayer.tsx new file mode 100644 index 000000000..8865071ae --- /dev/null +++ b/components/AndroidVideoPlayer.tsx @@ -0,0 +1,119 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { Platform } from 'react-native'; +import Video, { VideoRef, SelectedTrack, BufferingStrategyType } from 'react-native-video'; + +interface VideoPlayerProps { + src: string; + paused: boolean; + volume: number; + currentTime: number; + selectedAudioTrack?: SelectedTrack; + selectedTextTrack?: SelectedTrack; + onProgress?: (data: { currentTime: number; playableDuration: number }) => void; + onLoad?: (data: { duration: number }) => void; + onError?: (error: any) => void; + onBuffer?: (data: { isBuffering: boolean }) => void; + onSeek?: (data: { currentTime: number; seekTime: number }) => void; + onEnd?: () => void; +} + +export const AndroidVideoPlayer: React.FC = ({ + src, + paused, + volume, + currentTime, + selectedAudioTrack, + selectedTextTrack, + onProgress, + onLoad, + onError, + onBuffer, + onSeek, + onEnd, +}) => { + const videoRef = useRef(null); + const [isLoaded, setIsLoaded] = useState(false); + const [isSeeking, setIsSeeking] = useState(false); + const [lastSeekTime, setLastSeekTime] = useState(0); + + // Only render on Android + if (Platform.OS !== 'android') { + return null; + } + + useEffect(() => { + if (isLoaded && !isSeeking && Math.abs(currentTime - lastSeekTime) > 1) { + setIsSeeking(true); + videoRef.current?.seek(currentTime); + setLastSeekTime(currentTime); + } + }, [currentTime, isLoaded, isSeeking, lastSeekTime]); + + const handleLoad = (data: any) => { + setIsLoaded(true); + onLoad?.(data); + }; + + const handleProgress = (data: any) => { + if (!isSeeking) { + onProgress?.(data); + } + }; + + const handleSeek = (data: any) => { + setIsSeeking(false); + onSeek?.(data); + }; + + const handleBuffer = (data: any) => { + onBuffer?.(data); + }; + + const handleError = (error: any) => { + console.error('Video playback error:', error); + onError?.(error); + }; + + const handleEnd = () => { + onEnd?.(); + }; + + return ( +