diff --git a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadState.kt b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadState.kt index d7f86abfb..4ed75b514 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadState.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadState.kt @@ -108,34 +108,6 @@ sealed interface DownloadState { } } - @Deprecated("TODO: remove") - class WaitingForNetwork( - override val startId: Int, - override val manga: Manga, - override val cover: Drawable?, - ) : DownloadState { - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as WaitingForNetwork - - if (startId != other.startId) return false - if (manga != other.manga) return false - if (cover != other.cover) return false - - return true - } - - override fun hashCode(): Int { - var result = startId - result = 31 * result + manga.hashCode() - result = 31 * result + (cover?.hashCode() ?: 0) - return result - } - } - class Done( override val startId: Int, override val manga: Manga, @@ -252,4 +224,4 @@ sealed interface DownloadState { return result } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt index 476f6efb6..5dcf4fd9e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt @@ -12,15 +12,13 @@ import org.koitharu.kotatsu.databinding.ItemDownloadBinding import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.parsers.util.format import org.koitharu.kotatsu.utils.ext.* -import org.koitharu.kotatsu.utils.progress.ProgressJob fun downloadItemAD( scope: CoroutineScope, coil: ImageLoader, -) = adapterDelegateViewBinding, ProgressJob, ItemDownloadBinding>( - { inflater, parent -> ItemDownloadBinding.inflate(inflater, parent, false) } +) = adapterDelegateViewBinding( + { inflater, parent -> ItemDownloadBinding.inflate(inflater, parent, false) }, ) { - var job: Job? = null val percentPattern = context.resources.getString(R.string.percent_string_pattern) @@ -44,6 +42,8 @@ fun downloadItemAD( binding.progressBar.isVisible = true binding.textViewPercent.isVisible = false binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = false + binding.buttonResume.isVisible = false } is DownloadState.Done -> { binding.textViewStatus.setText(R.string.download_complete) @@ -51,6 +51,8 @@ fun downloadItemAD( binding.progressBar.isVisible = false binding.textViewPercent.isVisible = false binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = false + binding.buttonResume.isVisible = false } is DownloadState.Error -> { binding.textViewStatus.setText(R.string.error_occurred) @@ -59,6 +61,8 @@ fun downloadItemAD( binding.textViewPercent.isVisible = false binding.textViewDetails.text = state.error.getDisplayMessage(context.resources) binding.textViewDetails.isVisible = true + binding.buttonCancel.isVisible = state.canRetry + binding.buttonResume.isVisible = state.canRetry } is DownloadState.PostProcessing -> { binding.textViewStatus.setText(R.string.processing_) @@ -66,6 +70,8 @@ fun downloadItemAD( binding.progressBar.isVisible = true binding.textViewPercent.isVisible = false binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = false + binding.buttonResume.isVisible = false } is DownloadState.Preparing -> { binding.textViewStatus.setText(R.string.preparing_) @@ -73,6 +79,8 @@ fun downloadItemAD( binding.progressBar.isVisible = true binding.textViewPercent.isVisible = false binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = true + binding.buttonResume.isVisible = false } is DownloadState.Progress -> { binding.textViewStatus.setText(R.string.manga_downloading_) @@ -83,6 +91,8 @@ fun downloadItemAD( binding.textViewPercent.text = percentPattern.format((state.percent * 100f).format(1)) binding.textViewPercent.isVisible = true binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = true + binding.buttonResume.isVisible = false } is DownloadState.Queued -> { binding.textViewStatus.setText(R.string.queued) @@ -90,13 +100,8 @@ fun downloadItemAD( binding.progressBar.isVisible = false binding.textViewPercent.isVisible = false binding.textViewDetails.isVisible = false - } - is DownloadState.WaitingForNetwork -> { - binding.textViewStatus.setText(R.string.waiting_for_network) - binding.progressBar.isIndeterminate = false - binding.progressBar.isVisible = false - binding.textViewPercent.isVisible = false - binding.textViewDetails.isVisible = false + binding.buttonCancel.isVisible = true + binding.buttonResume.isVisible = false } } }.launchIn(scope) @@ -106,4 +111,4 @@ fun downloadItemAD( job?.cancel() job = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt index 0c3629d1b..de75277bf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt @@ -5,12 +5,14 @@ import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter import kotlinx.coroutines.CoroutineScope import org.koitharu.kotatsu.download.domain.DownloadState -import org.koitharu.kotatsu.utils.progress.ProgressJob +import org.koitharu.kotatsu.utils.progress.PausingProgressJob + +typealias DownloadItem = PausingProgressJob class DownloadsAdapter( scope: CoroutineScope, coil: ImageLoader, -) : AsyncListDifferDelegationAdapter>(DiffCallback()) { +) : AsyncListDifferDelegationAdapter(DiffCallback()) { init { delegatesManager.addDelegate(downloadItemAD(scope, coil)) @@ -21,20 +23,24 @@ class DownloadsAdapter( return items[position].progressValue.startId.toLong() } - private class DiffCallback : DiffUtil.ItemCallback>() { + private class DiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: ProgressJob, - newItem: ProgressJob, + oldItem: DownloadItem, + newItem: DownloadItem, ): Boolean { return oldItem.progressValue.startId == newItem.progressValue.startId } override fun areContentsTheSame( - oldItem: ProgressJob, - newItem: ProgressJob, + oldItem: DownloadItem, + newItem: DownloadItem, ): Boolean { - return oldItem.progressValue == newItem.progressValue + return oldItem.progressValue == newItem.progressValue && oldItem.isPaused == newItem.isPaused + } + + override fun getChangePayload(oldItem: DownloadItem, newItem: DownloadItem): Any { + return Unit } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt index 5a6997de7..b5f4d90d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt @@ -41,14 +41,14 @@ class DownloadNotification(private val context: Context, startId: Int) { context, startId * 2 + 1, DownloadService.getResumeIntent(startId), - PendingIntent.FLAG_CANCEL_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE - ) + PendingIntent.FLAG_CANCEL_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE, + ), ) private val listIntent = PendingIntent.getActivity( context, REQUEST_LIST, DownloadsActivity.newIntent(context), - PendingIntentCompat.FLAG_IMMUTABLE + PendingIntentCompat.FLAG_IMMUTABLE, ) init { @@ -142,13 +142,6 @@ class DownloadNotification(private val context: Context, startId: Int) { builder.setOngoing(true) builder.addAction(cancelAction) } - is DownloadState.WaitingForNetwork -> { - builder.setProgress(0, 0, false) - builder.setContentText(context.getString(R.string.waiting_for_network)) - builder.setStyle(null) - builder.setOngoing(true) - builder.addAction(cancelAction) - } } return builder.build() } diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt index dd58ee6a1..bf54797be 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt @@ -171,7 +171,7 @@ class DownloadService : BaseService() { class DownloadBinder(private val service: DownloadService) : Binder() { - val downloads: Flow>> + val downloads: Flow>> get() = service.jobCount.mapLatest { service.jobs.values } } diff --git a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt index 2068db53b..43f45bef2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.content.ContextCompat.startActivity import androidx.core.graphics.Insets import androidx.core.view.updatePadding import androidx.fragment.app.viewModels diff --git a/app/src/main/res/layout/item_download.xml b/app/src/main/res/layout/item_download.xml index 101df297e..980e54799 100644 --- a/app/src/main/res/layout/item_download.xml +++ b/app/src/main/res/layout/item_download.xml @@ -1,101 +1,123 @@ - + app:cardCornerRadius="16dp"> - + - - + - + - + - + - + - +