simplified code across the app and consolidated duplicated helpers
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user