From 5b38e2b38f93fe5159dd05a1ea4544571c42fdba Mon Sep 17 00:00:00 2001
From: birdbird <6892457-tzugen@users.noreply.gitlab.com>
Date: Thu, 20 Oct 2022 20:07:45 +0000
Subject: [PATCH] Allow resumption of partial tracks, use Coroutines
---
.../ultrasonic/util/CancellableTask.java | 100 ------
.../fragment/TrackCollectionFragment.kt | 64 ++--
.../ultrasonic/model/TrackCollectionModel.kt | 58 ++++
.../ultrasonic/service/DownloadService.kt | 65 ++--
.../moire/ultrasonic/service/DownloadTask.kt | 299 +++++++++---------
.../org/moire/ultrasonic/util/CacheCleaner.kt | 2 +-
.../org/moire/ultrasonic/util/FileUtil.kt | 45 ++-
.../org/moire/ultrasonic/util/Storage.kt | 30 +-
.../org/moire/ultrasonic/util/StorageFile.kt | 6 +-
9 files changed, 334 insertions(+), 335 deletions(-)
delete mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java
diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java
deleted file mode 100644
index 6c70339d..00000000
--- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- This file is part of Subsonic.
-
- Subsonic is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Subsonic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Subsonic. If not, see .
-
- Copyright 2009 (C) Sindre Mehus
- */
-package org.moire.ultrasonic.util;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-import timber.log.Timber;
-
-/**
- * @author Sindre Mehus
- * @version $Id$
- */
-public abstract class CancellableTask
-{
- private final AtomicBoolean running = new AtomicBoolean(false);
- private final AtomicBoolean cancelled = new AtomicBoolean(false);
- private final AtomicReference thread = new AtomicReference();
- private final AtomicReference cancelListener = new AtomicReference();
-
- public void cancel()
- {
- Timber.i("Cancelling %s", CancellableTask.this);
- cancelled.set(true);
-
- OnCancelListener listener = cancelListener.get();
- if (listener != null)
- {
- try
- {
- listener.onCancel();
- }
- catch (Throwable x)
- {
- Timber.w(x, "Error when invoking OnCancelListener.");
- }
- }
- }
-
- public boolean isCancelled()
- {
- return cancelled.get();
- }
-
- public void setOnCancelListener(OnCancelListener listener)
- {
- cancelListener.set(listener);
- }
-
- public boolean isRunning()
- {
- return running.get();
- }
-
- public abstract void execute();
-
- public void start()
- {
- thread.set(new Thread()
- {
- @Override
- public void run()
- {
- running.set(true);
- Timber.i("Starting thread for %s", CancellableTask.this);
- try
- {
- execute();
- }
- finally
- {
- running.set(false);
- Timber.i("Stopping thread for %s", CancellableTask.this);
- }
- }
- });
- thread.get().start();
- }
-
- public interface OnCancelListener
- {
- void onCancel();
- }
-}
\ No newline at end of file
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
index 2f16475c..433cec6a 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
@@ -15,6 +15,7 @@ import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveData
+import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewModelScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
@@ -23,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.button.MaterialButton
import io.reactivex.rxjava3.disposables.CompositeDisposable
import java.util.Collections
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.moire.ultrasonic.R
@@ -37,8 +39,6 @@ import org.moire.ultrasonic.domain.MusicDirectory
import org.moire.ultrasonic.domain.Track
import org.moire.ultrasonic.fragment.FragmentTitle.Companion.setTitle
import org.moire.ultrasonic.model.TrackCollectionModel
-import org.moire.ultrasonic.service.DownloadService
-import org.moire.ultrasonic.service.DownloadState
import org.moire.ultrasonic.service.MediaPlayerController
import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.service.plusAssign
@@ -150,16 +150,16 @@ open class TrackCollectionFragment : MultiListFragment() {
if (it.progress != null) return@subscribe
val selectedSongs = getSelectedSongs()
if (!selectedSongs.any { song -> song.id == it.id }) return@subscribe
- enableButtons(selectedSongs)
+ triggerButtonUpdate(selectedSongs)
}
- enableButtons()
+ triggerButtonUpdate()
// Update the buttons when the selection has changed
viewAdapter.selectionRevision.observe(
viewLifecycleOwner
) {
- enableButtons()
+ triggerButtonUpdate()
}
}
@@ -367,41 +367,27 @@ open class TrackCollectionFragment : MultiListFragment() {
}
}
- @Suppress("ComplexMethod")
- internal open fun enableButtons(selection: List