Skip to content

Commit 36a5591

Browse files
authored
Feature/delete downloads (#773)
1 parent 24ad9aa commit 36a5591

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

lib/localization/app_en.arb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
"dateAdded": "Date Added",
5858
"default_": "Default",
5959
"delete": "Delete",
60+
"deleteDownloads": "Delete downloads",
61+
"deleteDownloadsQuestion": "Are you sure you want to delete all downloads?",
6062
"deleteFolder": "Delete folder",
6163
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",
6264
"deletePlaylist": "Delete playlist",
@@ -65,6 +67,7 @@
6567
"downloadCancelled": "Download cancelled",
6668
"downloadFailed": "Download failed",
6769
"downloadPlaylist": "Download playlist",
70+
"downloadsDeleted": "Downloads deleted successfully",
6871
"dynamicColor": "Dynamic accent color (Android 12+)",
6972
"editPlaylist": "Edit playlist",
7073
"emptyFolderMsg": "This folder is empty. Add playlists to organize your music.",
@@ -217,4 +220,4 @@
217220
"userPlaylists": "User playlists",
218221
"yes": "Yes",
219222
"youtubePlaylistLinkOrId": "YouTube playlist link or ID"
220-
}
223+
}

lib/screens/settings_page.dart

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import 'package:musify/main.dart';
2727
import 'package:musify/screens/search_page.dart';
2828
import 'package:musify/services/common_services.dart';
2929
import 'package:musify/services/data_manager.dart';
30+
import 'package:musify/services/playlist_download_service.dart';
3031
import 'package:musify/services/router_service.dart';
3132
import 'package:musify/services/settings_manager.dart';
3233
import 'package:musify/services/update_manager.dart';
@@ -313,6 +314,28 @@ class SettingsPage extends StatelessWidget {
313314
},
314315
),
315316
),
317+
CustomBar(
318+
context.l10n!.deleteDownloads,
319+
FluentIcons.delete_24_filled,
320+
onTap: () => _showConfirmationDialog(
321+
context: context,
322+
confirmationMessage: context.l10n!.deleteDownloadsQuestion,
323+
submitMessage: context.l10n!.delete,
324+
isDangerous: true,
325+
onSubmit: () async {
326+
try {
327+
await offlinePlaylistService.deleteAllDownloads();
328+
if (context.mounted) {
329+
showToast(context, context.l10n!.downloadsDeleted);
330+
}
331+
} catch (e) {
332+
if (context.mounted) {
333+
showToast(context, context.l10n!.error);
334+
}
335+
}
336+
},
337+
),
338+
),
316339
CustomBar(
317340
context.l10n!.backupUserData,
318341
FluentIcons.cloud_sync_24_filled,
@@ -718,13 +741,16 @@ class SettingsPage extends StatelessWidget {
718741
required BuildContext context,
719742
required String confirmationMessage,
720743
required VoidCallback onSubmit,
744+
String? submitMessage,
745+
bool isDangerous = false,
721746
}) {
722747
showDialog(
723748
context: context,
724749
builder: (BuildContext context) {
725750
return ConfirmationDialog(
726-
submitMessage: context.l10n!.clear,
751+
submitMessage: submitMessage ?? context.l10n!.clear,
727752
confirmationMessage: confirmationMessage,
753+
isDangerous: isDangerous,
728754
onCancel: () => Navigator.of(context).pop(),
729755
onSubmit: () {
730756
Navigator.of(context).pop();

lib/services/playlist_download_service.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323

2424
import 'dart:async';
2525
import 'dart:collection';
26+
import 'dart:io';
2627

2728
import 'package:flutter/material.dart';
2829
import 'package:hive/hive.dart';
2930
import 'package:musify/extensions/l10n.dart';
3031
import 'package:musify/main.dart';
3132
import 'package:musify/services/common_services.dart';
3233
import 'package:musify/services/data_manager.dart';
34+
import 'package:musify/services/io_service.dart';
3335
import 'package:musify/services/playlists_manager.dart';
3436
import 'package:musify/utilities/flutter_toast.dart';
3537

@@ -404,6 +406,40 @@ class OfflinePlaylistService {
404406
}
405407
}
406408

409+
Future<void> deleteAllDownloads() async {
410+
try {
411+
final tracksDir = Directory('$applicationDirPath/${FilePaths.tracksDir}');
412+
final artworksDir =
413+
Directory('$applicationDirPath/${FilePaths.artworksDir}');
414+
415+
if (await tracksDir.exists()) {
416+
await tracksDir.delete(recursive: true);
417+
}
418+
if (await artworksDir.exists()) {
419+
await artworksDir.delete(recursive: true);
420+
}
421+
422+
await FilePaths.ensureDirectoriesExist();
423+
424+
userOfflineSongs.clear();
425+
currentOfflineSongsLength.value = 0;
426+
427+
offlinePlaylists.value = [];
428+
429+
unawaited(addOrUpdateData('userNoBackup', 'offlineSongs', []));
430+
unawaited(addOrUpdateData('userNoBackup', 'offlinePlaylists', []));
431+
432+
logger.log('All downloads deleted successfully');
433+
} catch (e, stackTrace) {
434+
logger.log(
435+
'Error deleting all downloads',
436+
error: e,
437+
stackTrace: stackTrace,
438+
);
439+
rethrow;
440+
}
441+
}
442+
407443
void cleanupProgressNotifier(String playlistId) {
408444
try {
409445
if (downloadProgressNotifiers.containsKey(playlistId)) {

0 commit comments

Comments
 (0)