simplified code across the app and consolidated duplicated helpers

This commit is contained in:
2026-09-27 17:29:54 +02:00
parent 3e856d0b1c
commit ee1240f71a
155 changed files with 1772 additions and 2546 deletions
+1 -5
View File
@@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import '../../routing/app_routes.dart';
import '../../utils/downloads/download_job.dart';
import '../../utils/downloads/download_manager.dart';
import '../../utils/haptics.dart';
import 'downloads_sheet.dart';
import 'stale_download_guard.dart';
@@ -204,10 +203,7 @@ class _DownloadTrayHostState extends State<DownloadTrayHost>
_manager.markOpened(job);
return;
}
if (!ensureDownloadStillExists(ctx, job)) return;
_manager.markOpened(job);
Haptics.success();
AppRoutes.openFileViewer(ctx, path, remoteFile: job.remoteFile);
openFinishedDownload(ctx, job, path);
}
/// Distance from the bottom to float the chip. Anchored bottom-LEFT (FABs are
+6 -13
View File
@@ -2,10 +2,8 @@ import 'dart:async';
import 'package:flutter/material.dart';
import '../../routing/app_routes.dart';
import '../../utils/downloads/download_job.dart';
import '../../utils/downloads/download_manager.dart';
import '../../utils/haptics.dart';
import '../../view/pages/files/data/file_type_icon.dart';
import '../centered_leading.dart';
import '../details_bottom_sheet.dart';
@@ -90,14 +88,7 @@ class _DownloadsListState extends State<_DownloadsList> {
// Pop the sheet first so a stale-file dialog lands on the underlying
// screen instead of an emptied sheet.
Navigator.of(widget.sheetContext).pop();
if (!ensureDownloadStillExists(widget.rootContext, job)) return;
Haptics.success();
DownloadManager.instance.markOpened(job);
AppRoutes.openFileViewer(
widget.rootContext,
path,
remoteFile: job.remoteFile,
);
openFinishedDownload(widget.rootContext, job, path);
}
}
@@ -140,8 +131,7 @@ class _DownloadRow extends StatelessWidget {
DownloadInProgress() => IconButton(
icon: const Icon(Icons.close),
tooltip: 'Abbrechen',
onPressed: () =>
unawaited(DownloadManager.instance.cancel(job)),
onPressed: () => unawaited(DownloadManager.instance.cancel(job)),
),
DownloadFailed() => IconButton(
icon: const Icon(Icons.refresh),
@@ -167,7 +157,10 @@ class _DownloadRow extends StatelessWidget {
alignment: Alignment.centerRight,
padding: const EdgeInsets.only(right: 24),
color: theme.colorScheme.errorContainer,
child: Icon(Icons.delete_outline, color: theme.colorScheme.onErrorContainer),
child: Icon(
Icons.delete_outline,
color: theme.colorScheme.onErrorContainer,
),
),
onDismissed: (_) => DownloadManager.instance.dismiss(job),
child: tile,
+42 -15
View File
@@ -3,8 +3,10 @@ import 'dart:io';
import 'package:flutter/material.dart';
import '../../routing/app_routes.dart';
import '../../utils/downloads/download_job.dart';
import '../../utils/downloads/download_manager.dart';
import '../../utils/haptics.dart';
import '../confirm_dialog.dart';
import '../info_dialog.dart';
@@ -21,20 +23,45 @@ bool ensureDownloadStillExists(BuildContext context, DownloadJob job) {
if (path == null || File(path).existsSync()) return true;
DownloadManager.instance.markOpened(job);
if (job.remotePath.isNotEmpty) {
ConfirmDialog(
title: 'Datei nicht mehr verfügbar',
content:
'Die heruntergeladene Datei wurde vom System aus dem Zwischenspeicher entfernt.\nErneut herunterladen?',
confirmButton: 'Herunterladen',
onConfirm: () => unawaited(DownloadManager.instance.retry(job)),
).asDialog(context);
} else {
InfoDialog.show(
context,
'Die heruntergeladene Datei wurde vom System aus dem Zwischenspeicher entfernt. Bitte lade sie erneut herunter.',
title: 'Datei nicht mehr verfügbar',
);
}
showFileGoneDialog(
context,
subject: 'Die heruntergeladene Datei',
onRedownload: job.remotePath.isEmpty
? null
: () => unawaited(DownloadManager.instance.retry(job)),
);
return false;
}
/// Opens a finished download in the viewer, unless its file vanished.
void openFinishedDownload(BuildContext context, DownloadJob job, String path) {
if (!ensureDownloadStillExists(context, job)) return;
DownloadManager.instance.markOpened(job);
Haptics.success();
AppRoutes.openFileViewer(context, path, remoteFile: job.remoteFile);
}
/// Tells the user that the system cleared a cached file ([subject], e.g.
/// "Die Datei") and offers a re-download when [onRedownload] is given.
void showFileGoneDialog(
BuildContext context, {
required String subject,
VoidCallback? onRedownload,
}) {
const title = 'Datei nicht mehr verfügbar';
final gone = '$subject wurde vom System aus dem Zwischenspeicher entfernt.';
if (onRedownload == null) {
InfoDialog.show(
context,
'$gone Bitte lade sie erneut herunter.',
title: title,
);
return;
}
ConfirmDialog(
title: title,
content: '$gone\nErneut herunterladen?',
confirmButton: 'Herunterladen',
onConfirm: onRedownload,
).asDialog(context);
}