diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 35e96aac7..c5d8ae675 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -96,7 +96,7 @@ class ChaptersFragment : return when (item.itemId) { R.id.action_save -> { DownloadService.start( - context ?: return false, + binding.recyclerViewChapters, viewModel.getRemoteManga() ?: viewModel.manga.value ?: return false, selectionController?.snapshot(), ) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index a7f66a2bc..9e4cf2886 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -277,7 +277,7 @@ class DetailsActivity : ) } setNeutralButton(R.string.download) { _, _ -> - DownloadService.start(this@DetailsActivity, remoteManga, setOf(chapterId)) + DownloadService.start(binding.appbar, remoteManga, setOf(chapterId)) } setCancelable(true) }.show() diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt index bdcc179b1..4592b4976 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt @@ -86,7 +86,7 @@ class DetailsMenuProvider( if (chaptersCount > 5 || branches.size > 1) { showSaveConfirmation(it, chaptersCount, branches) } else { - DownloadService.start(activity, it) + DownloadService.start(snackbarHost, it) } } } @@ -140,7 +140,7 @@ class DetailsMenuProvider( val chaptersIds = manga.chapters?.mapNotNullToSet { c -> if (c.branch in selectedBranches) c.id else null } - DownloadService.start(activity, manga, chaptersIds) + DownloadService.start(snackbarHost, manga, chaptersIds) } } else { dialogBuilder.setMessage( @@ -149,7 +149,7 @@ class DetailsMenuProvider( activity.resources.getQuantityString(R.plurals.chapters, chaptersCount, chaptersCount), ), ).setPositiveButton(R.string.save) { _, _ -> - DownloadService.start(activity, manga) + DownloadService.start(snackbarHost, manga) } } dialogBuilder.show() 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 365c51c39..cc0875da5 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 @@ -7,7 +7,7 @@ import android.content.IntentFilter import android.os.Binder import android.os.IBinder import android.os.PowerManager -import android.widget.Toast +import android.view.View import androidx.annotation.MainThread import androidx.core.app.ServiceCompat import androidx.core.content.ContextCompat @@ -15,6 +15,7 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.Flow 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.download.domain.DownloadManager 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.utils.ext.getParcelableExtraCompat 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_CANCEL_ID = "cancel_id" - fun start(context: Context, manga: Manga, chaptersIds: Collection? = null) { + fun start(view: View, manga: Manga, chaptersIds: Collection? = null) { if (chaptersIds?.isEmpty() == true) { return } - val intent = Intent(context, DownloadService::class.java) + val intent = Intent(view.context, DownloadService::class.java) intent.putExtra(EXTRA_MANGA, ParcelableManga(manga, withChapters = false)) if (chaptersIds != null) { intent.putExtra(EXTRA_CHAPTERS_IDS, chaptersIds.toLongArray()) } - ContextCompat.startForegroundService(context, intent) - Toast.makeText(context, R.string.manga_downloading_, Toast.LENGTH_SHORT).show() + ContextCompat.startForegroundService(view.context, intent) + showStartedSnackbar(view) } - fun start(context: Context, manga: Collection) { + fun start(view: View, manga: Collection) { if (manga.isEmpty()) { return } 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)) - ContextCompat.startForegroundService(context, intent) + ContextCompat.startForegroundService(view.context, intent) } + showStartedSnackbar(view) } - fun confirmAndStart(context: Context, items: Set) { - MaterialAlertDialogBuilder(context) + fun confirmAndStart(view: View, items: Set) { + MaterialAlertDialogBuilder(view.context) .setTitle(R.string.save_manga) .setMessage(R.string.batch_manga_save_confirm) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(R.string.save) { _, _ -> - start(context, items) + start(view, items) }.show() } @@ -264,5 +267,12 @@ class DownloadService : BaseService() { } 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() + } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index ba9ccf454..7527a2c44 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -327,7 +327,7 @@ abstract class MangaListFragment : } R.id.action_save -> { - DownloadService.confirmAndStart(requireContext(), selectedItems) + DownloadService.confirmAndStart(binding.recyclerView, selectedItems) mode.finish() true } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt index 72d2cf8b1..1e762e3ef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt @@ -164,7 +164,7 @@ class MultiSearchActivity : } R.id.action_save -> { - DownloadService.confirmAndStart(this, collectSelectedItems()) + DownloadService.confirmAndStart(binding.recyclerView, collectSelectedItems()) mode.finish() true } diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt index 0eccc248e..7e4919013 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt @@ -68,7 +68,7 @@ class ShelfSelectionCallback( } R.id.action_save -> { - DownloadService.confirmAndStart(context, collectSelectedItems(controller)) + DownloadService.confirmAndStart(recyclerView, collectSelectedItems(controller)) mode.finish() true } @@ -125,7 +125,7 @@ class ShelfSelectionCallback( if (ids.isEmpty()) { return } - MaterialAlertDialogBuilder(context ?: return) + MaterialAlertDialogBuilder(context) .setTitle(R.string.delete_manga) .setMessage(context.getString(R.string.text_delete_local_manga_batch)) .setPositiveButton(R.string.delete) { _, _ -> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb794a531..579d88ae6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -423,4 +423,5 @@ Services Allow unstable updates Propose updates to beta versions of the app + Download started