mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-05-11 12:30:46 +00:00
added hold to boost speed android
This commit is contained in:
parent
7c4dec9e7a
commit
83df75915e
1 changed files with 77 additions and 37 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue