Show download started snackbar

This commit is contained in:
Koitharu
2023-02-14 20:43:56 +02:00
parent f436a49e5f
commit a56e977058
8 changed files with 31 additions and 20 deletions

View File

@@ -96,7 +96,7 @@ class ChaptersFragment :
return when (item.itemId) { return when (item.itemId) {
R.id.action_save -> { R.id.action_save -> {
DownloadService.start( DownloadService.start(
context ?: return false, binding.recyclerViewChapters,
viewModel.getRemoteManga() ?: viewModel.manga.value ?: return false, viewModel.getRemoteManga() ?: viewModel.manga.value ?: return false,
selectionController?.snapshot(), selectionController?.snapshot(),
) )

View File

@@ -277,7 +277,7 @@ class DetailsActivity :
) )
} }
setNeutralButton(R.string.download) { _, _ -> setNeutralButton(R.string.download) { _, _ ->
DownloadService.start(this@DetailsActivity, remoteManga, setOf(chapterId)) DownloadService.start(binding.appbar, remoteManga, setOf(chapterId))
} }
setCancelable(true) setCancelable(true)
}.show() }.show()

View File

@@ -86,7 +86,7 @@ class DetailsMenuProvider(
if (chaptersCount > 5 || branches.size > 1) { if (chaptersCount > 5 || branches.size > 1) {
showSaveConfirmation(it, chaptersCount, branches) showSaveConfirmation(it, chaptersCount, branches)
} else { } else {
DownloadService.start(activity, it) DownloadService.start(snackbarHost, it)
} }
} }
} }
@@ -140,7 +140,7 @@ class DetailsMenuProvider(
val chaptersIds = manga.chapters?.mapNotNullToSet { c -> val chaptersIds = manga.chapters?.mapNotNullToSet { c ->
if (c.branch in selectedBranches) c.id else null if (c.branch in selectedBranches) c.id else null
} }
DownloadService.start(activity, manga, chaptersIds) DownloadService.start(snackbarHost, manga, chaptersIds)
} }
} else { } else {
dialogBuilder.setMessage( dialogBuilder.setMessage(
@@ -149,7 +149,7 @@ class DetailsMenuProvider(
activity.resources.getQuantityString(R.plurals.chapters, chaptersCount, chaptersCount), activity.resources.getQuantityString(R.plurals.chapters, chaptersCount, chaptersCount),
), ),
).setPositiveButton(R.string.save) { _, _ -> ).setPositiveButton(R.string.save) { _, _ ->
DownloadService.start(activity, manga) DownloadService.start(snackbarHost, manga)
} }
} }
dialogBuilder.show() dialogBuilder.show()

View File

@@ -7,7 +7,7 @@ import android.content.IntentFilter
import android.os.Binder import android.os.Binder
import android.os.IBinder import android.os.IBinder
import android.os.PowerManager import android.os.PowerManager
import android.widget.Toast import android.view.View
import androidx.annotation.MainThread import androidx.annotation.MainThread
import androidx.core.app.ServiceCompat import androidx.core.app.ServiceCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@@ -15,6 +15,7 @@ import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -29,6 +30,7 @@ import org.koitharu.kotatsu.base.ui.BaseService
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
import org.koitharu.kotatsu.download.domain.DownloadManager import org.koitharu.kotatsu.download.domain.DownloadManager
import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.download.domain.DownloadState
import org.koitharu.kotatsu.download.ui.DownloadsActivity
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat
import org.koitharu.kotatsu.utils.ext.throttle import org.koitharu.kotatsu.utils.ext.throttle
@@ -218,37 +220,38 @@ class DownloadService : BaseService() {
private const val EXTRA_CHAPTERS_IDS = "chapters_ids" private const val EXTRA_CHAPTERS_IDS = "chapters_ids"
private const val EXTRA_CANCEL_ID = "cancel_id" private const val EXTRA_CANCEL_ID = "cancel_id"
fun start(context: Context, manga: Manga, chaptersIds: Collection<Long>? = null) { fun start(view: View, manga: Manga, chaptersIds: Collection<Long>? = null) {
if (chaptersIds?.isEmpty() == true) { if (chaptersIds?.isEmpty() == true) {
return return
} }
val intent = Intent(context, DownloadService::class.java) val intent = Intent(view.context, DownloadService::class.java)
intent.putExtra(EXTRA_MANGA, ParcelableManga(manga, withChapters = false)) intent.putExtra(EXTRA_MANGA, ParcelableManga(manga, withChapters = false))
if (chaptersIds != null) { if (chaptersIds != null) {
intent.putExtra(EXTRA_CHAPTERS_IDS, chaptersIds.toLongArray()) intent.putExtra(EXTRA_CHAPTERS_IDS, chaptersIds.toLongArray())
} }
ContextCompat.startForegroundService(context, intent) ContextCompat.startForegroundService(view.context, intent)
Toast.makeText(context, R.string.manga_downloading_, Toast.LENGTH_SHORT).show() showStartedSnackbar(view)
} }
fun start(context: Context, manga: Collection<Manga>) { fun start(view: View, manga: Collection<Manga>) {
if (manga.isEmpty()) { if (manga.isEmpty()) {
return return
} }
for (item in manga) { for (item in manga) {
val intent = Intent(context, DownloadService::class.java) val intent = Intent(view.context, DownloadService::class.java)
intent.putExtra(EXTRA_MANGA, ParcelableManga(item, withChapters = false)) intent.putExtra(EXTRA_MANGA, ParcelableManga(item, withChapters = false))
ContextCompat.startForegroundService(context, intent) ContextCompat.startForegroundService(view.context, intent)
} }
showStartedSnackbar(view)
} }
fun confirmAndStart(context: Context, items: Set<Manga>) { fun confirmAndStart(view: View, items: Set<Manga>) {
MaterialAlertDialogBuilder(context) MaterialAlertDialogBuilder(view.context)
.setTitle(R.string.save_manga) .setTitle(R.string.save_manga)
.setMessage(R.string.batch_manga_save_confirm) .setMessage(R.string.batch_manga_save_confirm)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.save) { _, _ -> .setPositiveButton(R.string.save) { _, _ ->
start(context, items) start(view, items)
}.show() }.show()
} }
@@ -264,5 +267,12 @@ class DownloadService : BaseService() {
} }
return null return null
} }
private fun showStartedSnackbar(view: View) {
Snackbar.make(view, R.string.download_started, Snackbar.LENGTH_LONG)
.setAction(R.string.details) {
it.context.startActivity(DownloadsActivity.newIntent(it.context))
}.show()
}
} }
} }

View File

@@ -327,7 +327,7 @@ abstract class MangaListFragment :
} }
R.id.action_save -> { R.id.action_save -> {
DownloadService.confirmAndStart(requireContext(), selectedItems) DownloadService.confirmAndStart(binding.recyclerView, selectedItems)
mode.finish() mode.finish()
true true
} }

View File

@@ -164,7 +164,7 @@ class MultiSearchActivity :
} }
R.id.action_save -> { R.id.action_save -> {
DownloadService.confirmAndStart(this, collectSelectedItems()) DownloadService.confirmAndStart(binding.recyclerView, collectSelectedItems())
mode.finish() mode.finish()
true true
} }

View File

@@ -68,7 +68,7 @@ class ShelfSelectionCallback(
} }
R.id.action_save -> { R.id.action_save -> {
DownloadService.confirmAndStart(context, collectSelectedItems(controller)) DownloadService.confirmAndStart(recyclerView, collectSelectedItems(controller))
mode.finish() mode.finish()
true true
} }
@@ -125,7 +125,7 @@ class ShelfSelectionCallback(
if (ids.isEmpty()) { if (ids.isEmpty()) {
return return
} }
MaterialAlertDialogBuilder(context ?: return) MaterialAlertDialogBuilder(context)
.setTitle(R.string.delete_manga) .setTitle(R.string.delete_manga)
.setMessage(context.getString(R.string.text_delete_local_manga_batch)) .setMessage(context.getString(R.string.text_delete_local_manga_batch))
.setPositiveButton(R.string.delete) { _, _ -> .setPositiveButton(R.string.delete) { _, _ ->

View File

@@ -423,4 +423,5 @@
<string name="services">Services</string> <string name="services">Services</string>
<string name="allow_unstable_updates">Allow unstable updates</string> <string name="allow_unstable_updates">Allow unstable updates</string>
<string name="allow_unstable_updates_summary">Propose updates to beta versions of the app</string> <string name="allow_unstable_updates_summary">Propose updates to beta versions of the app</string>
<string name="download_started">Download started</string>
</resources> </resources>