From 0a46baaa9ba5bec9934278aa112e2aa7875d1133 Mon Sep 17 00:00:00 2001 From: orfelorfel23 Date: Mon, 1 Jun 2026 10:39:06 +0200 Subject: [PATCH] Fix Android ViewShot dropping frames and date overlays by temporarily lifting pointerEvents=none during capture --- src/components/FrameOverlay.tsx | 5 +++-- src/screens/PreviewScreen.tsx | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/FrameOverlay.tsx b/src/components/FrameOverlay.tsx index fbcef5c3..b4c6d0a6 100644 --- a/src/components/FrameOverlay.tsx +++ b/src/components/FrameOverlay.tsx @@ -3,6 +3,7 @@ import { StyleSheet, Image, View } from 'react-native'; interface FrameOverlayProps { frameAsset: any; // require() asset + isCapturing?: boolean; } /** @@ -10,11 +11,11 @@ interface FrameOverlayProps { * The frame PNG must have a transparent center (alpha=0) so the photo shows through. * Positioned absolutely to cover the entire photo canvas. */ -export default function FrameOverlay({ frameAsset }: FrameOverlayProps) { +export default function FrameOverlay({ frameAsset, isCapturing = false }: FrameOverlayProps) { if (!frameAsset) return null; return ( - + ('single'); const [isProcessing, setIsProcessing] = useState(false); + const [isCapturing, setIsCapturing] = useState(false); const [statusMessage, setStatusMessage] = useState(''); @@ -204,14 +205,21 @@ export default function PreviewScreen({ try { logger.log(`captureComposite started. Has ViewShot ref: ${!!viewShotRef.current}`); if (viewShotRef.current) { + setIsCapturing(true); + // Wait for React to re-render and remove pointerEvents="none" which blocks ViewShot on Android + await new Promise(resolve => setTimeout(resolve, 300)); + logger.log('Executing viewShotRef.current.capture()...'); const uri = await viewShotRef.current.capture(); + + setIsCapturing(false); logger.log(`ViewShot successfully generated collage URI: ${uri}`); return uri; } logger.log('[WARNING] viewShotRef.current was null, falling back to raw photo.'); return fallbackPhoto; } catch (e: any) { + setIsCapturing(false); logger.error('Failed to capture composite (ViewShot crashed)', e?.message || e); return fallbackPhoto; } @@ -453,11 +461,11 @@ export default function PreviewScreen({ {renderCollageView()} {/* Frame Overlay */} - {activeFrame && } + {activeFrame && } {/* Date/Time Overlay */} {dateOverlay !== 'off' && ( - + {formatDate(dateOverlay)}