[music] move notification callback outside of PlaylistDownloader

This commit is contained in:
aliveoutside
2022-09-17 20:23:45 +03:00
parent 03c19bc9cf
commit f7c4663329
2 changed files with 76 additions and 45 deletions
@@ -18,6 +18,7 @@ import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import java8.util.concurrent.CompletableFuture;
@@ -43,19 +44,24 @@ public class AudioDownloader {
public static void downloadPlaylist(Playlist playlist) {
var tracks = PlaylistConverter.getPlaylist(playlist);
var tracksWithUrls = tracks.stream().filter(track -> !track.D.isEmpty()).collect(Collectors.toList());
var playlistName = IOUtils.getValidFileName(playlist.g);
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
var downloadPath = musicPath + File.separator + playlistName;
PlaylistDownloader.downloadPlaylist(tracks, IOUtils.getValidFileName(playlist.g), downloadPath);
var notificationId = playlistName.hashCode();
var notification = buildPlaylistDownloadNotification(playlistName, notificationId);
PlaylistDownloader.downloadPlaylist(
tracksWithUrls,
IOUtils.getValidFileName(playlist.g),
downloadPath,
buildPlaylistCallback(tracksWithUrls.size(), notification, notificationId)
);
}
private static void cachePlaylist(ArrayList<MusicTrack> playlist) {
for (MusicTrack musicTrack : playlist) {
CompletableFuture.runAsync(() -> cacheTrack(musicTrack), executor);
}
}
public static void downloadAudio(MusicTrack track) {
downloadM3U8(track, false);
@@ -72,7 +78,11 @@ public class AudioDownloader {
var downloadPath = musicPath + File.separator;
var notification = buildDownloadNotification(track, tempId);
TrackDownloader.downloadTrack(track, downloadPath, new Callback() {
TrackDownloader.downloadTrack(track, downloadPath, buildOneTrackCallback(tempId, notification), cache);
}
private static Callback buildOneTrackCallback(int notificationId, NotificationCompat.Builder notification) {
return new Callback() {
long startTime = 0;
long elapsedTime = 0;
@@ -80,7 +90,7 @@ public class AudioDownloader {
public void onProgress(int progress) {
if (elapsedTime > 1000) {
notification.setProgress(100, progress, false);
notificationManager.notify(tempId, notification.build());
notificationManager.notify(notificationId, notification.build());
startTime = System.currentTimeMillis();
elapsedTime = 0;
@@ -96,7 +106,7 @@ public class AudioDownloader {
.setContentText(AndroidUtils.getString("player_download_finished"))
.setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(tempId, notification.build());
notificationManager.notify(notificationId, notification.build());
} catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "native libs");
Log.e("AudioDownloader", e.getMessage());
@@ -107,14 +117,46 @@ public class AudioDownloader {
@Override
public void onFailure() {
notification.setContentText(AndroidUtils.getString("load_audio_error")).setProgress(0, 0, false);
notificationManager.notify(tempId, notification.build());
notificationManager.notify(notificationId, notification.build());
}
@Override
public void onSizeReceived(long size, long header) {
}
}, cache);
};
}
private static Callback buildPlaylistCallback(int playlistSize, NotificationCompat.Builder notification, int notificationId) {
return new Callback() {
@Override
public void onProgress(int progress) {
if (progress == playlistSize) {
onSuccess();
} else {
notification.setContentText("Downloaded " + progress + " of " + playlistSize + " tracks");
notification.setProgress(playlistSize, progress, false);
}
notificationManager.notify(notificationId, notification.build());
}
@Override
public void onSuccess() {
notification.setContentText("Download completed");
notification.setProgress(0, 0, false);
}
@Override
public void onFailure() {
}
@Override
public void onSizeReceived(long size, long header) {
}
});
};
}
public static void cacheTrack(MusicTrack track) {
@@ -133,6 +175,12 @@ public class AudioDownloader {
NotificationChannels.getNotificationManager().cancel(trackId.hashCode());
}
private static void cachePlaylist(ArrayList<MusicTrack> playlist) {
for (MusicTrack musicTrack : playlist) {
CompletableFuture.runAsync(() -> cacheTrack(musicTrack), executor);
}
}
private static void notifySavingToCache(MusicTrack track) {
Notification.Builder builder;
@@ -161,5 +209,16 @@ public class AudioDownloader {
return notificationBuilder;
}
private static NotificationCompat.Builder buildPlaylistDownloadNotification(String playlistName, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle("Загрузка плейлиста " + '«' + playlistName + '»')
.setContentText(playlistName)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true)
.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
}
}
@@ -2,7 +2,6 @@ package ru.vtosters.lite.music.downloader;
import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.vk.dto.music.MusicTrack;
@@ -10,30 +9,24 @@ import com.vk.dto.music.MusicTrack;
import java.io.File;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.music.Callback;
import ru.vtosters.lite.utils.AndroidUtils;
public class PlaylistDownloader {
private static NotificationManagerCompat notificationManager = NotificationChannels.getNotificationManager();
public static void downloadPlaylist(List<MusicTrack> playlist, String playlistName, String path) {
public static void downloadPlaylist(List<MusicTrack> playlist, String playlistName, String path, Callback callback) {
File outDir = new File(path);
if (!outDir.exists())
if (outDir.mkdirs())
Log.v("TrackDownloader", "Directory created");
Log.v("PlaylistDownloader", "Directory created");
else
Log.e("TrackDownloader", "Directory creation failed");
var notificationId = playlistName.hashCode();
var notification = buildDownloadNotification(playlistName, notificationId);
Log.e("PlaylistDownloader", "Directory creation failed");
var downloadedTracks = new AtomicInteger(0);
var tracksWithUrls = playlist.stream().filter(track -> !track.D.isEmpty()).collect(Collectors.toList());
for (MusicTrack musicTrack : tracksWithUrls) {
for (MusicTrack musicTrack : playlist) {
TrackDownloader.downloadTrack(musicTrack, path, new Callback() {
@Override
public void onProgress(int progress) {}
@@ -41,15 +34,7 @@ public class PlaylistDownloader {
@Override
public void onSuccess() {
var currentProgress = downloadedTracks.incrementAndGet();
if (currentProgress == tracksWithUrls.size()) {
notification.setContentText("Download complete");
notification.setProgress(0, 0, false);
} else {
notification.setContentText("Downloaded " + currentProgress + " of " + tracksWithUrls.size() + "tracks");
notification.setProgress(tracksWithUrls.size(), currentProgress, false);
}
notificationManager.notify(notificationId, notification.build());
callback.onProgress(currentProgress);
}
@Override
@@ -60,17 +45,4 @@ public class PlaylistDownloader {
}, false);
}
}
private static NotificationCompat.Builder buildDownloadNotification(String playlistName, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle("Загрузка плейлиста " + '«' + playlistName + '»')
.setContentText(playlistName)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true)
.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
}
}