diff --git a/packages/app/src/views/Details/Details.js b/packages/app/src/views/Details/Details.js index 8c8fa9a..c4b911b 100644 --- a/packages/app/src/views/Details/Details.js +++ b/packages/app/src/views/Details/Details.js @@ -178,6 +178,7 @@ const Details = ({itemId, initialItem, onPlay, onSelectItem, onSelectPerson, onI // Refs const pageScrollerRef = useRef(null); const pageScrollToRef = useRef(null); + const lastFocusedElementRef = useRef(null); // Data loading useEffect(() => { @@ -586,6 +587,7 @@ const Details = ({itemId, initialItem, onPlay, onSelectItem, onSelectPerson, onI }, [trailerOverlay]); const openModal = useCallback((modal) => { + lastFocusedElementRef.current = document.activeElement; setActiveModal(modal); window.requestAnimationFrame(() => { const modalId = `${modal}-modal`; @@ -608,6 +610,11 @@ const Details = ({itemId, initialItem, onPlay, onSelectItem, onSelectPerson, onI const closeModal = useCallback(() => { setActiveModal(null); + window.requestAnimationFrame(() => { + if (lastFocusedElementRef.current) { + Spotlight.focus(lastFocusedElementRef.current); + } + }); }, []); const handleSelectAudio = useCallback((e) => { diff --git a/packages/app/src/views/Player/TizenPlayer.js b/packages/app/src/views/Player/TizenPlayer.js index 3420e06..9357808 100644 --- a/packages/app/src/views/Player/TizenPlayer.js +++ b/packages/app/src/views/Player/TizenPlayer.js @@ -143,6 +143,7 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS const healthMonitorRef = useRef(null); const unregisterAppStateRef = useRef(null); const controlsTimeoutRef = useRef(null); + const lastFocusedElementRef = useRef(null); const timeUpdateIntervalRef = useRef(null); const avplayReadyRef = useRef(false); // Refs for stable callbacks inside AVPlay listener (avoids stale closures) @@ -962,17 +963,15 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS // ============================== // Controls Auto-hide // ============================== - const showControls = useCallback(() => { + const showControls = useCallback((isModalOpen = activeModal) => { setControlsVisible(true); if (controlsTimeoutRef.current) { clearTimeout(controlsTimeoutRef.current); } // Don't auto-hide controls in audio mode - if (!isAudioMode) { + if (!isAudioMode && !isModalOpen) { controlsTimeoutRef.current = setTimeout(() => { - if (!activeModal) { - setControlsVisible(false); - } + setControlsVisible(false); }, CONTROLS_HIDE_DELAY); } }, [activeModal, isAudioMode]); @@ -1232,10 +1231,10 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS // Modal handlers const openModal = useCallback((modal) => { + lastFocusedElementRef.current = document.activeElement; setActiveModal(modal); window.requestAnimationFrame(() => { const modalId = `${modal}-modal`; - const focusResult = Spotlight.focus(modalId); if (!focusResult) { @@ -1252,9 +1251,13 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS const closeModal = useCallback(() => { setActiveModal(null); - showControls(); + showControls(false); window.requestAnimationFrame(() => { - Spotlight.focus('player-controls'); + if (lastFocusedElementRef.current) { + Spotlight.focus(lastFocusedElementRef.current); + }else{ + Spotlight.focus('playerControls'); + } }); }, [showControls]); diff --git a/packages/app/src/views/Player/WebOSPlayer.js b/packages/app/src/views/Player/WebOSPlayer.js index 123184d..a81a84a 100644 --- a/packages/app/src/views/Player/WebOSPlayer.js +++ b/packages/app/src/views/Player/WebOSPlayer.js @@ -136,8 +136,7 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS }, [lyricsLines, currentTime]); const lyricsScrollRef = useRef(null); - - + const lastFocusedElementRef = useRef(null); const videoRef = useRef(null); const containerRef = useRef(null); @@ -1144,16 +1143,14 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS }; }, [mediaUrl, isLoading, mimeType, playMethod, error]); - const showControls = useCallback(() => { + const showControls = useCallback((isModalOpen = activeModal) => { setControlsVisible(true); if (controlsTimeoutRef.current) { clearTimeout(controlsTimeoutRef.current); } - if (!isAudioMode) { + if (!isAudioMode && !isModalOpen) { controlsTimeoutRef.current = setTimeout(() => { - if (!activeModal) { - setControlsVisible(false); - } + setControlsVisible(false); }, CONTROLS_HIDE_DELAY); } }, [activeModal, isAudioMode]); @@ -1629,10 +1626,10 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS }, [settings.skipForwardLength, settings.seekStep, seekByOffset, isInGroup]); const openModal = useCallback((modal) => { + lastFocusedElementRef.current = document.activeElement; setActiveModal(modal); window.requestAnimationFrame(() => { const modalId = `${modal}-modal`; - const focusResult = Spotlight.focus(modalId); if (!focusResult) { @@ -1649,9 +1646,13 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS const closeModal = useCallback(() => { setActiveModal(null); - showControls(); + showControls(false); window.requestAnimationFrame(() => { - Spotlight.focus('player-controls'); + if (lastFocusedElementRef.current) { + Spotlight.focus(lastFocusedElementRef.current); + }else{ + Spotlight.focus('playerControls'); + } }); }, [showControls]);