From c6c0b6d9a5df1b449d209a0e73f79d3088a66663 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=F0=9D=97=94=F0=9D=98=86=F0=9D=98=82=F0=9D=98=80?=
=?UTF-8?q?=F0=9D=97=B5=20=F0=9D=97=9E?= <100coldice@gmail.com>
Date: Tue, 20 Oct 2026 02:16:03 +0530
Subject: [PATCH 1/2] feat: restore previously downloaded songs automatically
after reinstall
---
app/src/main/AndroidManifest.xml | 3 +
.../com/lastwave/app/LastWaveApplication.kt | 1 +
.../app/data/download/TrackDownloadManager.kt | 406 ++++++++++++++++++
.../app/ui/settings/DownloadsViewModel.kt | 1 +
app/src/main/res/xml/backup_rules.xml | 4 +
.../main/res/xml/data_extraction_rules.xml | 9 +
6 files changed, 424 insertions(+)
create mode 100644 app/src/main/res/xml/backup_rules.xml
create mode 100644 app/src/main/res/xml/data_extraction_rules.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f050cce49..23fcd9d20 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -39,6 +39,7 @@
android:maxSdkVersion="28" />
+
{
+ val cleanName = cleanSongTitle(nameWithoutExt, songId)
+ return if (cleanName.contains(" - ")) {
+ val artist = cleanName.substringBefore(" - ").trim().ifBlank { "Unknown Artist" }
+ val title = cleanName.substringAfter(" - ").trim().ifBlank { cleanName }
+ artist to title
+ } else {
+ "Unknown Artist" to cleanName.ifBlank { nameWithoutExt }
+ }
+ }
}
// Dedicated HTTP client with extended timeouts and bounded pooling.
@@ -221,6 +270,7 @@ class TrackDownloadManager @Inject constructor(
private val activeFiles = ConcurrentHashMap()
private val reconnectGenerations = ConcurrentHashMap()
private val downloadSlots = Semaphore(MAX_CONCURRENT_DOWNLOADS)
+ private val restoreMutex = Mutex()
private val _downloads = MutableStateFlow