added hold to boost speed android

This commit is contained in:
tapframe 2025-10-24 21:38:40 +05:30
parent 7c4dec9e7a
commit 83df75915e

View file

@ -5,7 +5,7 @@ import Video, { VideoRef, SelectedTrack, SelectedTrackType, BufferingStrategyTyp
import FastImage from '@d11/react-native-fast-image'; import FastImage from '@d11/react-native-fast-image';
import { useNavigation, useRoute, RouteProp, useFocusEffect } from '@react-navigation/native'; import { useNavigation, useRoute, RouteProp, useFocusEffect } from '@react-navigation/native';
import { RootStackParamList } from '../../navigation/AppNavigator'; import { RootStackParamList } from '../../navigation/AppNavigator';
import { PinchGestureHandler, PanGestureHandler, TapGestureHandler, State, PinchGestureHandlerGestureEvent, PanGestureHandlerGestureEvent, TapGestureHandlerGestureEvent } from 'react-native-gesture-handler'; import { PinchGestureHandler, PanGestureHandler, TapGestureHandler, LongPressGestureHandler, State, PinchGestureHandlerGestureEvent, PanGestureHandlerGestureEvent, TapGestureHandlerGestureEvent, LongPressGestureHandlerGestureEvent } from 'react-native-gesture-handler';
import RNImmersiveMode from 'react-native-immersive-mode'; import RNImmersiveMode from 'react-native-immersive-mode';
import * as ScreenOrientation from 'expo-screen-orientation'; import * as ScreenOrientation from 'expo-screen-orientation';
import { storageService } from '../../services/storageService'; import { storageService } from '../../services/storageService';
@ -216,6 +216,10 @@ const AndroidVideoPlayer: React.FC = () => {
const [rnVideoAudioTracks, setRnVideoAudioTracks] = useState<Array<{id: number, name: string, language?: string}>>([]); const [rnVideoAudioTracks, setRnVideoAudioTracks] = useState<Array<{id: number, name: string, language?: string}>>([]);
const [rnVideoTextTracks, setRnVideoTextTracks] = useState<Array<{id: number, name: string, language?: string}>>([]); const [rnVideoTextTracks, setRnVideoTextTracks] = useState<Array<{id: number, name: string, language?: string}>>([]);
// Speed boost state for hold-to-speed-up feature
const [isSpeedBoosted, setIsSpeedBoosted] = useState(false);
const [originalSpeed, setOriginalSpeed] = useState<number>(1.0);
// Debounce track updates to prevent excessive processing // Debounce track updates to prevent excessive processing
const trackUpdateTimeoutRef = useRef<NodeJS.Timeout | null>(null); const trackUpdateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
@ -805,6 +809,26 @@ const AndroidVideoPlayer: React.FC = () => {
} }
}; };
// Long press gesture handlers for speed boost
const onLongPressActivated = useCallback(() => {
if (!isSpeedBoosted && playbackSpeed !== 2.0) {
setOriginalSpeed(playbackSpeed);
setPlaybackSpeed(2.0);
setIsSpeedBoosted(true);
logger.log('[AndroidVideoPlayer] Speed boost activated: 2x');
}
}, [isSpeedBoosted, playbackSpeed]);
const onLongPressEnd = useCallback(() => {
if (isSpeedBoosted) {
setPlaybackSpeed(originalSpeed);
setIsSpeedBoosted(false);
logger.log('[AndroidVideoPlayer] Speed boost deactivated, restored to:', originalSpeed);
}
}, [isSpeedBoosted, originalSpeed]);
const resetZoom = () => { const resetZoom = () => {
const targetZoom = is16by9Content ? 1.1 : 1; const targetZoom = is16by9Content ? 1.1 : 1;
setZoomScale(targetZoom); setZoomScale(targetZoom);
@ -3216,55 +3240,71 @@ const AndroidVideoPlayer: React.FC = () => {
} }
]} ]}
> >
{/* Combined gesture handler for left side - brightness + tap */} {/* Combined gesture handler for left side - brightness + tap + long press */}
<PanGestureHandler <LongPressGestureHandler
onGestureEvent={onBrightnessGestureEvent} onActivated={onLongPressActivated}
activeOffsetY={[-5, 5]} onEnded={onLongPressEnd}
failOffsetX={[-20, 20]} minDurationMs={500}
shouldCancelWhenOutside={false} shouldCancelWhenOutside={false}
simultaneousHandlers={[]} simultaneousHandlers={[]}
maxPointers={1}
> >
<TapGestureHandler <PanGestureHandler
onActivated={toggleControls} onGestureEvent={onBrightnessGestureEvent}
activeOffsetY={[-5, 5]}
failOffsetX={[-20, 20]}
shouldCancelWhenOutside={false} shouldCancelWhenOutside={false}
simultaneousHandlers={[]} simultaneousHandlers={[]}
maxPointers={1}
> >
<View style={{ <TapGestureHandler
position: 'absolute', onActivated={toggleControls}
top: screenDimensions.height * 0.15, // Back to original margin shouldCancelWhenOutside={false}
left: 0, simultaneousHandlers={[]}
width: screenDimensions.width * 0.4, // Back to larger area (40% of screen) >
height: screenDimensions.height * 0.7, // Back to larger middle portion (70% of screen) <View style={{
zIndex: 10, // Higher z-index to capture gestures position: 'absolute',
}} /> top: screenDimensions.height * 0.15, // Back to original margin
</TapGestureHandler> left: 0,
</PanGestureHandler> width: screenDimensions.width * 0.4, // Back to larger area (40% of screen)
height: screenDimensions.height * 0.7, // Back to larger middle portion (70% of screen)
zIndex: 10, // Higher z-index to capture gestures
}} />
</TapGestureHandler>
</PanGestureHandler>
</LongPressGestureHandler>
{/* Combined gesture handler for right side - volume + tap */} {/* Combined gesture handler for right side - volume + tap + long press */}
<PanGestureHandler <LongPressGestureHandler
onGestureEvent={onVolumeGestureEvent} onActivated={onLongPressActivated}
activeOffsetY={[-5, 5]} onEnded={onLongPressEnd}
failOffsetX={[-20, 20]} minDurationMs={500}
shouldCancelWhenOutside={false} shouldCancelWhenOutside={false}
simultaneousHandlers={[]} simultaneousHandlers={[]}
maxPointers={1}
> >
<TapGestureHandler <PanGestureHandler
onActivated={toggleControls} onGestureEvent={onVolumeGestureEvent}
activeOffsetY={[-5, 5]}
failOffsetX={[-20, 20]}
shouldCancelWhenOutside={false} shouldCancelWhenOutside={false}
simultaneousHandlers={[]} simultaneousHandlers={[]}
maxPointers={1}
> >
<View style={{ <TapGestureHandler
position: 'absolute', onActivated={toggleControls}
top: screenDimensions.height * 0.15, // Back to original margin shouldCancelWhenOutside={false}
right: 0, simultaneousHandlers={[]}
width: screenDimensions.width * 0.4, // Back to larger area (40% of screen) >
height: screenDimensions.height * 0.7, // Back to larger middle portion (70% of screen) <View style={{
zIndex: 10, // Higher z-index to capture gestures position: 'absolute',
}} /> top: screenDimensions.height * 0.15, // Back to original margin
</TapGestureHandler> right: 0,
</PanGestureHandler> width: screenDimensions.width * 0.4, // Back to larger area (40% of screen)
height: screenDimensions.height * 0.7, // Back to larger middle portion (70% of screen)
zIndex: 10, // Higher z-index to capture gestures
}} />
</TapGestureHandler>
</PanGestureHandler>
</LongPressGestureHandler>
{/* Center area tap handler - handles both show and hide */} {/* Center area tap handler - handles both show and hide */}
<TapGestureHandler <TapGestureHandler