From b070e7f5b76c93a6a6149fd9ff17ea6439ec4612 Mon Sep 17 00:00:00 2001 From: nullbyze <260057645+nullbyze@users.noreply.github.com> Date: Wed, 20 May 2026 22:08:43 +0200 Subject: [PATCH 1/2] Fixed focus and controls timeout Focus on details and player. Also fixed the controls timeout when a modal is closed. --- packages/app/src/views/Details/Details.js | 7 +++++++ packages/app/src/views/Player/TizenPlayer.js | 17 +++++++++------- packages/app/src/views/Player/WebOSPlayer.js | 21 ++++++++++---------- 3 files changed, 28 insertions(+), 17 deletions(-) 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..8f083fa 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) @@ -968,11 +969,9 @@ const Player = ({item, resume, initialMediaSourceId, initialAudioIndex, initialS 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]); From da7c7811591d14221a1cf527f71567db9d62ac7e Mon Sep 17 00:00:00 2001 From: nullbyze <260057645+nullbyze@users.noreply.github.com> Date: Thu, 21 May 2026 22:26:07 +0200 Subject: [PATCH 2/2] fixed tizenplayer.js --- packages/app/src/views/Player/TizenPlayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/views/Player/TizenPlayer.js b/packages/app/src/views/Player/TizenPlayer.js index 8f083fa..9357808 100644 --- a/packages/app/src/views/Player/TizenPlayer.js +++ b/packages/app/src/views/Player/TizenPlayer.js @@ -963,7 +963,7 @@ 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);