Hardening fixes: Camera cancellation, Android memory optimization, action button throttling

This commit is contained in:
2026-05-31 20:28:02 +02:00
parent cb453bf200
commit faa584ae0f
2 changed files with 24 additions and 6 deletions
+12 -5
View File
@@ -204,6 +204,7 @@ export default function PreviewScreen({
// Triggers the view capture and the print job
const handlePrint = async () => {
if (isProcessing) return;
setIsProcessing(true);
setStatusMessage('Dein Foto wird vorbereitet...');
try {
@@ -233,6 +234,7 @@ export default function PreviewScreen({
// Saves to gallery without printing
const handleSaveOnly = async () => {
if (isProcessing) return;
setIsProcessing(true);
setStatusMessage('Bild wird generiert...');
try {
@@ -255,6 +257,7 @@ export default function PreviewScreen({
// Auto-save and exit
const handleExit = useCallback(async () => {
if (isProcessing) return;
const state = stateRef.current;
if (state.stickers.length === 0 && state.layout === 'single' && !state.activeFrame && state.dateOverlay === 'off') {
state.onReset();
@@ -294,6 +297,7 @@ export default function PreviewScreen({
}, [resetIdleTimer]);
const handleRetakeClick = async () => {
if (isProcessing) return;
if (stickers.length > 0 || layout !== 'single' || activeFrame || dateOverlay !== 'off') {
setIsProcessing(true);
setStatusMessage('Wird vor dem Wiederholen gespeichert...');
@@ -523,7 +527,7 @@ export default function PreviewScreen({
{/* Action Buttons */}
<View style={styles.actions}>
<TouchableOpacity style={[styles.actionBtn, styles.printBtn]} onPress={handlePrint} activeOpacity={0.8}>
<TouchableOpacity style={[styles.actionBtn, styles.printBtn, isProcessing && styles.btnDisabled]} onPress={handlePrint} activeOpacity={0.8} disabled={isProcessing}>
<LinearGradient
colors={THEME.gradient.primary}
start={{ x: 0, y: 0.5 }}
@@ -535,25 +539,25 @@ export default function PreviewScreen({
</LinearGradient>
</TouchableOpacity>
<TouchableOpacity style={[styles.actionBtn, styles.saveBtn]} onPress={handleSaveOnly}>
<TouchableOpacity style={[styles.actionBtn, styles.saveBtn, isProcessing && styles.btnDisabled]} onPress={handleSaveOnly} disabled={isProcessing}>
<FontAwesomeIcon icon={faDownload} size={16} color={THEME.colors.accent} style={{ marginRight: 8 }} />
<Text style={[styles.actionBtnText, { color: THEME.colors.accent }]}>Nur auf Tablet speichern</Text>
</TouchableOpacity>
{photoUris.length < 4 && (
<TouchableOpacity style={[styles.actionBtn, styles.addBtn]} onPress={onAddAnother}>
<TouchableOpacity style={[styles.actionBtn, styles.addBtn, isProcessing && styles.btnDisabled]} onPress={onAddAnother} disabled={isProcessing}>
<FontAwesomeIcon icon={faPlus} size={16} color={THEME.colors.text} style={{ marginRight: 8 }} />
<Text style={styles.actionBtnText}>Weiteres Foto aufnehmen</Text>
</TouchableOpacity>
)}
<View style={styles.rowActions}>
<TouchableOpacity style={[styles.smallBtn, styles.retakeBtn]} onPress={handleRetakeClick}>
<TouchableOpacity style={[styles.smallBtn, styles.retakeBtn, isProcessing && styles.btnDisabled]} onPress={handleRetakeClick} disabled={isProcessing}>
<FontAwesomeIcon icon={faRotateLeft} size={14} color={THEME.colors.error} style={{ marginRight: 6 }} />
<Text style={[styles.smallBtnText, { color: THEME.colors.error }]}>Wiederholen</Text>
</TouchableOpacity>
<TouchableOpacity style={[styles.smallBtn, styles.resetBtn]} onPress={handleExit}>
<TouchableOpacity style={[styles.smallBtn, styles.resetBtn, isProcessing && styles.btnDisabled]} onPress={handleExit} disabled={isProcessing}>
<FontAwesomeIcon icon={faRightFromBracket} size={14} color={THEME.colors.textMuted} style={{ marginRight: 6 }} />
<Text style={styles.smallBtnText}>Beenden</Text>
</TouchableOpacity>
@@ -747,6 +751,9 @@ const styles = StyleSheet.create({
fontSize: 14,
fontWeight: '600',
},
btnDisabled: {
opacity: 0.5,
},
// ── Photo Canvases ──
singleCanvas: {
width: 480,