From 28ee64fc30194c22f564298b0e03b59f8846d01d Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:01:47 +0300 Subject: [PATCH] create notifications for music downloading --- .../lite/downloaders/AudioDownloader.java | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java b/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java index c5a8734be..6b269da0b 100644 --- a/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java @@ -1,8 +1,13 @@ package ru.vtosters.lite.downloaders; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.os.Environment; import android.util.Log; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + import com.vk.core.util.ToastUtils; import com.vk.dto.music.MusicTrack; @@ -12,19 +17,26 @@ import java.util.Random; import ru.vtosters.lite.music.Callback; import ru.vtosters.lite.music.FFMpeg; import ru.vtosters.lite.music.M3UDownloader; +import ru.vtosters.lite.utils.Globals; public class AudioDownloader { + private static NotificationManagerCompat notificationManager = NotificationManagerCompat.from(Globals.getContext()); + public static void downloadAudio(MusicTrack track) { if (track.D == null) { ToastUtils.a("Не удалось найти ссылку на аудиозапись"); return; } var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath(); - var downloadPath = musicPath + File.separator + new Random().nextInt(100); + var tempId = new Random().nextInt(100); + var downloadPath = musicPath + File.separator + tempId; + var notification = buildDownloadNotification(track, tempId); - downloadAudioAsync(track, downloadPath, new Callback() { + downloadM3U8(track, downloadPath, new Callback() { @Override public void onProgress(int progress) { + notification.setProgress(100, progress, false); + notificationManager.notify(tempId, notification.build()); } @Override @@ -32,10 +44,15 @@ public class AudioDownloader { try { var fileName = track.toString(); var success = FFMpeg.convert(downloadPath, musicPath + File.separator + fileName + ".mp3"); - if (success) - ToastUtils.a("Загрузка завершена"); - else + if (success) { + notification + .setContentText("Загрузка завершена") + .setProgress(0, 0, false) + .setSmallIcon(android.R.drawable.stat_sys_download_done); + notificationManager.notify(tempId, notification.build()); + } else { onFailure(); + } } catch (UnsatisfiedLinkError e) { Log.e("AudioDownloader","Опять эти нативные либы"); @@ -46,7 +63,8 @@ public class AudioDownloader { @Override public void onFailure() { - ToastUtils.a("Не удалось загрузить аудиозапись"); + notification.setContentText("Не удалось загрузить аудиозапись").setProgress(0, 0, false); + notificationManager.notify(tempId, notification.build()); } @Override @@ -56,14 +74,27 @@ public class AudioDownloader { }); } - private static void downloadAudioAsync(MusicTrack track, String path, Callback callback) { + private static void downloadM3U8(MusicTrack track, String path, Callback callback) { File outDir = new File(path); if (!outDir.exists()) if (outDir.mkdir()) - Log.i("AudioDownloader", "Directory created"); + Log.v("AudioDownloader", "Directory created"); else Log.e("AudioDownloader", "Directory creation failed"); Log.i("AudioDownloader", "Downloading audio to " + path); new M3UDownloader(track.D, outDir, callback).execute(); } + + private static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) { + var notificationBuilder = new NotificationCompat.Builder(Globals.getContext(), "music_downloads") + .setSmallIcon(android.R.drawable.stat_sys_download) + .setContentTitle("Загрузка аудиозаписи") + .setContentText(track.toString()) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setCategory(NotificationCompat.CATEGORY_PROGRESS) + .setAutoCancel(true); + notificationBuilder.setProgress(100, 0, false); + notificationManager.notify(id, notificationBuilder.build()); + return notificationBuilder; + } }