[Video] Handle push/pop on Android for autoplay (#5194)

This commit is contained in:
Hailey 2024-09-06 15:01:05 -07:00 committed by GitHub
parent 00ce95893d
commit 7e4f8cabd3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 45 additions and 7 deletions

View file

@ -1,7 +1,7 @@
import React from 'react'
import {useVideoPlayer, VideoPlayer} from 'expo-video'
import {isNative} from '#/platform/detection'
import {isAndroid, isNative} from '#/platform/detection'
const Context = React.createContext<{
activeSource: string
@ -26,7 +26,18 @@ export function Provider({children}: {children: React.ReactNode}) {
})
const setActiveSourceOuter = (src: string | null, viewId: string | null) => {
setActiveSource(src ? src : '')
// HACK
// expo-video doesn't like it when you try and move a `player` to another `VideoView`. Instead, we need to actually
// unregister that player to let the new screen register it. This is only a problem on Android, so we only need to
// apply it there.
if (src === activeSource && isAndroid) {
setActiveSource('')
setTimeout(() => {
setActiveSource(src ? src : '')
}, 100)
} else {
setActiveSource(src ? src : '')
}
setActiveViewId(viewId ? viewId : '')
}

View file

@ -71,7 +71,7 @@ function InnerWrapper({embed}: Props) {
const [playerStatus, setPlayerStatus] = useState<
VideoPlayerStatus | 'paused'
>(player.playing ? 'readyToPlay' : 'paused')
>('paused')
const [isMuted, setIsMuted] = useState(player.muted)
const [isFullscreen, setIsFullscreen] = React.useState(false)
const [timeRemaining, setTimeRemaining] = React.useState(0)

View file

@ -8,6 +8,7 @@ import {useLingui} from '@lingui/react'
import {HITSLOP_30} from '#/lib/constants'
import {clamp} from '#/lib/numbers'
import {isAndroid} from 'platform/detection'
import {useActiveVideoNative} from 'view/com/util/post-embeds/ActiveVideoNativeContext'
import {atoms as a, useTheme} from '#/alf'
import {Mute_Stroke2_Corner0_Rounded as MuteIcon} from '#/components/icons/Mute'
@ -61,6 +62,9 @@ export function VideoEmbedInnerNative({
PlatformInfo.setAudioActive(true)
player.muted = false
setIsFullscreen(true)
if (isAndroid) {
player.play()
}
}}
onFullscreenExit={() => {
PlatformInfo.setAudioCategory(AudioCategory.Ambient)