From d4c51697d44ba5f7a91b97f754e2338c7ea5188a Mon Sep 17 00:00:00 2001 From: storm1er Date: Fri, 6 Jun 2025 11:00:52 +0200 Subject: [PATCH] feat: Persist ignore safe area accross stream and app restart (#701) --- app/(auth)/player/direct-player.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/(auth)/player/direct-player.tsx b/app/(auth)/player/direct-player.tsx index 1a247e08..9d8c370e 100644 --- a/app/(auth)/player/direct-player.tsx +++ b/app/(auth)/player/direct-player.tsx @@ -17,6 +17,7 @@ import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { useSettings } from "@/utils/atoms/settings"; import { getStreamUrl } from "@/utils/jellyfin/media/getStreamUrl"; import { writeToLog } from "@/utils/log"; +import { storage } from "@/utils/mmkv"; import generateDeviceProfile from "@/utils/profiles/native"; import { msToTicks, ticksToSeconds } from "@/utils/time"; import { @@ -49,6 +50,8 @@ const downloadProvider = !Platform.isTV ? require("@/providers/DownloadProvider") : null; +const IGNORE_SAFE_AREAS_KEY = "video_player_ignore_safe_areas"; + export default function page() { const videoRef = useRef(null); const user = useAtomValue(userAtom); @@ -58,7 +61,11 @@ export default function page() { const [isPlaybackStopped, setIsPlaybackStopped] = useState(false); const [showControls, _setShowControls] = useState(true); - const [ignoreSafeAreas, setIgnoreSafeAreas] = useState(false); + const [ignoreSafeAreas, setIgnoreSafeAreas] = useState(() => { + // Load persisted state from storage + const saved = storage.getBoolean(IGNORE_SAFE_AREAS_KEY); + return saved ?? false; + }); const [isPlaying, setIsPlaying] = useState(false); const [isMuted, setIsMuted] = useState(false); const [isBuffering, setIsBuffering] = useState(true); @@ -86,6 +93,11 @@ export default function page() { lightHapticFeedback(); }, []); + // Persist ignoreSafeAreas state whenever it changes + useEffect(() => { + storage.set(IGNORE_SAFE_AREAS_KEY, ignoreSafeAreas); + }, [ignoreSafeAreas]); + const { itemId, audioIndex: audioIndexStr, @@ -555,7 +567,7 @@ export default function page() { }} /> - {videoRef.current && !isPipStarted && isMounted === true ? ( + {videoRef.current && !isPipStarted && isMounted === true && item ? (