diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java index 6e3cf12ff..edf93c27c 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java @@ -94,6 +94,7 @@ public class MusicCacheImpl { public static void clear() { MusicCacheDbDelegate.drop(AndroidUtils.getGlobalContext()); + PlaylistCacheDbDelegate.drop(AndroidUtils.getGlobalContext()); MusicCacheStorageUtils.clear(); } } \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/db/PlaylistCacheDb.java b/app/src/main/java/ru/vtosters/lite/music/cache/db/PlaylistCacheDb.java index 20120b53f..2d895cda0 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/db/PlaylistCacheDb.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/db/PlaylistCacheDb.java @@ -14,6 +14,7 @@ import org.json.JSONException; import org.json.JSONObject; import ru.vtosters.lite.music.cache.helpers.PlaylistHelper; import ru.vtosters.lite.music.cache.helpers.TracklistHelper; +import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -65,7 +66,7 @@ public class PlaylistCacheDb extends SQLiteOpenHelper implements AutoCloseable { getWritableDatabase().insert(Constants.TABLE_NAME, null, values); } - public void deletePlaylist(int id, int ownerId) { + private void deletePlaylist(int id, int ownerId) { getWritableDatabase().delete(Constants.TABLE_NAME, Constants.COLUMN_ID + " = ? AND " + Constants.COLUMN_OWNER_ID + " = ?", new String[]{String.valueOf(id), String.valueOf(ownerId)}); } @@ -80,6 +81,41 @@ public class PlaylistCacheDb extends SQLiteOpenHelper implements AutoCloseable { return DatabaseUtils.queryNumEntries(getReadableDatabase(), Constants.TABLE_NAME); } + public void deletePlaylistWithTracks(String playlistId) { + SQLiteDatabase db = getWritableDatabase(); + String[] parts = playlistId.split("_"); + int id = Integer.parseInt(parts[1]); + int ownerId = Integer.parseInt(parts[0]); + + // Get all tracks in the playlist + List tracks = getTracksInPlaylist(playlistId); + + // Delete the playlist + deletePlaylist(id, ownerId); + + // Delete each track, but only if it's not in any other playlists + for (MusicTrack track : tracks) { + String trackId = track.y1(); + if (!isTrackInAnyOtherPlaylist(trackId)) { + MusicCacheStorageUtils.removeTrackDirById(trackId); + } + } + } + + private boolean isTrackInAnyOtherPlaylist(String trackId) { + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.query( + Constants.TABLE_PLAYLIST_TRACKS, + null, + Constants.COLUMN_TRACK_ID + " = ?", + new String[]{trackId}, + null, null, null + ); + boolean exists = cursor.getCount() > 1; + cursor.close(); + return exists; + } + public List getAllPlaylists() { Cursor cursor = getReadableDatabase().query(Constants.TABLE_NAME, null, null, null, null, null, null); List playlists = getPlaylistsWithCursor(cursor); diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/delegate/PlaylistCacheDbDelegate.java b/app/src/main/java/ru/vtosters/lite/music/cache/delegate/PlaylistCacheDbDelegate.java index a82d36de8..eec75238a 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/delegate/PlaylistCacheDbDelegate.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/delegate/PlaylistCacheDbDelegate.java @@ -21,13 +21,9 @@ public class PlaylistCacheDbDelegate { } } - public static void deletePlaylist(Context context, String id) { + public static void deletePlaylist(Context context, String playlistId) { try (var db = connectToDb(context)) { - String[] parts = id.split("_"); - int playlistId = Integer.parseInt(parts[1]); - int ownerId = Integer.parseInt(parts[0]); - - db.deletePlaylist(playlistId, ownerId); + db.deletePlaylistWithTracks(playlistId); } } diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/PlaylistDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/PlaylistDownloader.java index de1406f0d..d2e25313a 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/PlaylistDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/PlaylistDownloader.java @@ -3,9 +3,7 @@ package ru.vtosters.lite.music.downloader; import android.util.Log; import com.vk.dto.music.MusicTrack; -import ru.vtosters.lite.music.cache.delegate.PlaylistCacheDbDelegate; import ru.vtosters.lite.music.interfaces.Callback; -import ru.vtosters.lite.utils.AndroidUtils; import java.io.File; import java.util.List; @@ -14,14 +12,13 @@ import java.util.concurrent.atomic.AtomicInteger; import java8.util.concurrent.CompletableFuture; public class PlaylistDownloader { - public static CompletableFuture - downloadPlaylist(List playlist, String playlistName, String path, Callback callback) { + public static void downloadPlaylist(List playlist, String playlistName, String path, Callback callback) { var outDir = new File(path); if (!outDir.exists()) if (outDir.mkdirs()) Log.v("PlaylistDownloader", "Directory created"); else Log.e("PlaylistDownloader", "Directory creation failed"); Callback delegate = new ProgressCallback(callback); - return CompletableFuture.allOf(playlist + CompletableFuture.allOf(playlist .stream() .map(x -> { Callback.CompletableFutureCallback d = new @@ -32,9 +29,9 @@ public class PlaylistDownloader { .toArray(CompletableFuture[]::new)); } - public static CompletableFuture cachePlaylist(List playlist, Callback callback, String playlistId) { + public static void cachePlaylist(List playlist, Callback callback, String playlistId) { Callback delegate = new ProgressCallback(callback); - return CompletableFuture.allOf(playlist + CompletableFuture.allOf(playlist .stream() .map(x -> { Callback.CompletableFutureCallback d = new Callback.CompletableFutureCallback(delegate);