diff --git a/app/src/main/java/ru/vtosters/lite/music/callback/MusicCallbackBuilder.java b/app/src/main/java/ru/vtosters/lite/music/callback/MusicCallbackBuilder.java index 7b9f2249d..d88016e83 100644 --- a/app/src/main/java/ru/vtosters/lite/music/callback/MusicCallbackBuilder.java +++ b/app/src/main/java/ru/vtosters/lite/music/callback/MusicCallbackBuilder.java @@ -1,9 +1,12 @@ package ru.vtosters.lite.music.callback; import android.util.Log; + import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; + import com.vtosters.lite.R; + import ru.vtosters.lite.downloaders.notifications.NotificationChannels; import ru.vtosters.lite.music.interfaces.Callback; import ru.vtosters.lite.utils.AndroidUtils; @@ -40,12 +43,12 @@ public class MusicCallbackBuilder { } catch (UnsatisfiedLinkError e) { Log.e("AudioDownloader", "native libs"); Log.e("AudioDownloader", e.getMessage()); - onFailure(); + onFailure(e); } } @Override - public void onFailure() { + public void onFailure(Throwable e) { notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false); notificationManager.notify(notificationId, notification.build()); } @@ -77,7 +80,7 @@ public class MusicCallbackBuilder { } @Override - public void onFailure() { + public void onFailure(Throwable e) { notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false); notificationManager.notify(notificationId, notification.build()); } diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/CachedDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/CachedDownloader.java index 3d5472066..c8da526dc 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/CachedDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/CachedDownloader.java @@ -2,8 +2,6 @@ package ru.vtosters.lite.music.downloader; import com.vk.dto.music.MusicTrack; -import java.io.IOException; - import ru.vtosters.lite.music.cache.MusicCacheImpl; import ru.vtosters.lite.music.interfaces.Callback; import ru.vtosters.lite.music.interfaces.ITrackDownloader; @@ -18,16 +16,36 @@ public final class CachedDownloader implements ITrackDownloader { @Override - public void downloadTrack(MusicTrack track, Callback callback) { - var d = new Callback.CompletableFutureCallback(callback); - origin.downloadTrack(track, d); - d.thenAccept(result -> { - try { - ThumbnailDownloader.downloadThumbnails(track); + public void download(MusicTrack track, Callback callback) { + origin.download(track, new Callback() { + @Override + public void onProgress(int progress) { } + + @Override + public void onSuccess() { + new ThumbnailDownloader().download(track, new Callback() { + @Override public void onProgress(int progress) {} + + @Override public void onSuccess() {} + + @Override + public void onFailure(Throwable e) { + callback.onFailure(e); + } + + @Override public void onSizeReceived(long size, long header) {} + }); MusicCacheImpl.addTrack(track); - } catch (IOException e) { - callback.onFailure(); - throw new RuntimeException(e); + } + + @Override + public void onFailure(Throwable e) { + callback.onFailure(e); + } + + @Override + public void onSizeReceived(long size, long header) { + callback.onSizeReceived(size, header); } }); } diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/Mp3Downloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/Mp3Downloader.java index 62a1ef444..e3dec42ca 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/Mp3Downloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/Mp3Downloader.java @@ -24,7 +24,7 @@ public final class Mp3Downloader implements ITrackDownloader { } @Override - public void downloadTrack(MusicTrack track, Callback callback) { + public void download(MusicTrack track, Callback callback) { String uri = track.D; if (Objects.requireNonNull(uri).isEmpty()) { String msg = "link error: " + @@ -48,7 +48,7 @@ public final class Mp3Downloader implements ITrackDownloader { callback.onProgress(100); callback.onSuccess(); } else - callback.onFailure(); + callback.onFailure(new RuntimeException(session.getLogsAsString())); }, log -> callback.onProgress(Math.min(100, progress.incrementAndGet())), statistics -> {} ); 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 a9de892a8..4d4e59f78 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 @@ -59,8 +59,8 @@ public class PlaylistDownloader { } @Override - public void onFailure() { - origin.onFailure(); + public void onFailure(Throwable e) { + origin.onFailure(e); } @Override public void onSizeReceived(long size, long header) {} diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/ThumbnailDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/ThumbnailDownloader.java index a08b94e4b..99f9141a2 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/ThumbnailDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/ThumbnailDownloader.java @@ -1,18 +1,23 @@ package ru.vtosters.lite.music.downloader; -import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import com.vk.dto.music.MusicTrack; + import org.json.JSONArray; import org.json.JSONObject; -import ru.vtosters.lite.utils.IOUtils; -import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; import java.io.IOException; import java.net.URL; -public class ThumbnailDownloader { +import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; +import ru.vtosters.lite.music.interfaces.Callback; +import ru.vtosters.lite.music.interfaces.ITrackDownloader; +import ru.vtosters.lite.utils.IOUtils; +import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; - public static void downloadThumbnails(MusicTrack track) throws IOException { +public final class ThumbnailDownloader implements ITrackDownloader { + + @Override + public void download(MusicTrack track, Callback callback) { JSONObject json = track.J(); JSONObject album = json.optJSONObject("album"); if (album == null) return; @@ -20,24 +25,30 @@ public class ThumbnailDownloader { if (thumb == null) return; JSONArray sizes = thumb.optJSONArray("sizes"); String trackId = LibVKXClient.asId(track); - if (sizes == null) { - JSONArray names = thumb.names(); - if (names == null) return; - for (int i = 0; i < names.length(); ++i) { - String name = names.optString(i); - downloadThumbnail(thumb.optString(name), Integer.parseInt(name.substring(6)), trackId); - } - } else { - for (int i = 0; i < sizes.length(); ++i) { - JSONObject size = sizes.optJSONObject(i); - int width = size.optInt("width"); - String src = size.optString("src"); - downloadThumbnail(src, width, trackId); + try { + if (sizes == null) { + JSONArray names = thumb.names(); + if (names == null) return; + for (int i = 0; i < names.length(); ++i) { + String name = names.optString(i); + downloadThumbnail(thumb.optString(name), Integer.parseInt(name.substring(6)), trackId); + } + } else { + for (int i = 0; i < sizes.length(); ++i) { + JSONObject size = sizes.optJSONObject(i); + int width = size.optInt("width"); + String src = size.optString("src"); + downloadThumbnail(src, width, trackId); + } } + callback.onSuccess(); + } catch (IOException e) { + callback.onFailure(e); + throw new RuntimeException(e); } } - private static void downloadThumbnail(String url, int res, String trackId) throws IOException { IOUtils.writeToFile(MusicCacheStorageUtils.getTrackThumb(trackId, res), IOUtils.readFully(new URL(url).openStream())); } + } diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/TrackDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/TrackDownloader.java index f92e3f9a4..419c32760 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/TrackDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/TrackDownloader.java @@ -24,7 +24,7 @@ public final class TrackDownloader { else Log.e("TrackDownloader", "Directory creation failed"); } - new Mp3Downloader(outDir).downloadTrack(track, callback); + new Mp3Downloader(outDir).download(track, callback); } public static void @@ -36,6 +36,6 @@ public final class TrackDownloader { new CachedDownloader( new Mp3Downloader(path) - ).downloadTrack(track, callback); + ).download(track, callback); } } diff --git a/app/src/main/java/ru/vtosters/lite/music/interfaces/Callback.java b/app/src/main/java/ru/vtosters/lite/music/interfaces/Callback.java index c4ad96d53..64e34693b 100644 --- a/app/src/main/java/ru/vtosters/lite/music/interfaces/Callback.java +++ b/app/src/main/java/ru/vtosters/lite/music/interfaces/Callback.java @@ -7,7 +7,7 @@ public interface Callback { void onSuccess(); - void onFailure(); + void onFailure(Throwable e); void onSizeReceived(long size, long header); @@ -33,9 +33,9 @@ public interface Callback { } @Override - public void onFailure() { - completeExceptionally(new RuntimeException("callback failed")); - origin.onFailure(); + public void onFailure(Throwable e) { + completeExceptionally(e); + origin.onFailure(e); } @Override diff --git a/app/src/main/java/ru/vtosters/lite/music/interfaces/ITrackDownloader.java b/app/src/main/java/ru/vtosters/lite/music/interfaces/ITrackDownloader.java index df670d46f..a1d33533e 100644 --- a/app/src/main/java/ru/vtosters/lite/music/interfaces/ITrackDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/interfaces/ITrackDownloader.java @@ -12,5 +12,5 @@ public interface ITrackDownloader { * @param track Music track * @param callback Callback to call when download status changes */ - void downloadTrack(MusicTrack track, Callback callback); + void download(MusicTrack track, Callback callback); } \ No newline at end of file