Download options dialog
parent
02c9a933d2
commit
84e5400522
@ -0,0 +1,64 @@
|
|||||||
|
package org.koitharu.kotatsu.details.ui
|
||||||
|
|
||||||
|
import android.content.DialogInterface
|
||||||
|
import android.view.View
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.core.model.ids
|
||||||
|
import org.koitharu.kotatsu.core.ui.dialog.RecyclerViewAlertDialog
|
||||||
|
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
||||||
|
import org.koitharu.kotatsu.download.ui.dialog.DownloadOption
|
||||||
|
import org.koitharu.kotatsu.download.ui.dialog.downloadOptionAD
|
||||||
|
|
||||||
|
class DownloadDialogHelper(
|
||||||
|
private val host: View,
|
||||||
|
private val viewModel: DetailsViewModel,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun show(callback: OnListItemClickListener<DownloadOption>) {
|
||||||
|
val branch = viewModel.selectedBranchValue
|
||||||
|
val allChapters = viewModel.manga.value?.chapters ?: return
|
||||||
|
val branchChapters = viewModel.manga.value?.getChapters(branch).orEmpty()
|
||||||
|
val history = viewModel.history.value
|
||||||
|
|
||||||
|
val options = buildList {
|
||||||
|
add(DownloadOption.WholeManga(allChapters.ids()))
|
||||||
|
if (branch != null && branchChapters.isNotEmpty()) {
|
||||||
|
add(DownloadOption.AllChapters(branch, branchChapters.ids()))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (history != null) {
|
||||||
|
val unreadChapters = branchChapters.takeLastWhile { it.id != history.chapterId }
|
||||||
|
if (unreadChapters.isNotEmpty() && unreadChapters.size < branchChapters.size) {
|
||||||
|
add(DownloadOption.AllUnreadChapters(unreadChapters.ids(), branch))
|
||||||
|
if (unreadChapters.size > 5) {
|
||||||
|
add(DownloadOption.NextUnreadChapters(unreadChapters.take(5).ids()))
|
||||||
|
if (unreadChapters.size > 10) {
|
||||||
|
add(DownloadOption.NextUnreadChapters(unreadChapters.take(10).ids()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (branchChapters.size > 5) {
|
||||||
|
add(DownloadOption.FirstChapters(branchChapters.take(5).ids()))
|
||||||
|
if (branchChapters.size > 10) {
|
||||||
|
add(DownloadOption.FirstChapters(branchChapters.take(10).ids()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
add(DownloadOption.SelectionHint())
|
||||||
|
}
|
||||||
|
var dialog: DialogInterface? = null
|
||||||
|
val listener = OnListItemClickListener<DownloadOption> { item, _ ->
|
||||||
|
callback.onItemClick(item, host)
|
||||||
|
dialog?.dismiss()
|
||||||
|
}
|
||||||
|
dialog = RecyclerViewAlertDialog.Builder<DownloadOption>(host.context)
|
||||||
|
.addAdapterDelegate(downloadOptionAD(listener))
|
||||||
|
.setCancelable(true)
|
||||||
|
.setTitle(R.string.download)
|
||||||
|
.setNegativeButton(android.R.string.cancel)
|
||||||
|
.setItems(options)
|
||||||
|
.create()
|
||||||
|
.also { it.show() }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,99 @@
|
|||||||
|
package org.koitharu.kotatsu.download.ui.dialog
|
||||||
|
|
||||||
|
import android.content.res.Resources
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
import java.util.Locale
|
||||||
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
|
sealed interface DownloadOption {
|
||||||
|
|
||||||
|
val chaptersIds: Set<Long>
|
||||||
|
|
||||||
|
@get:DrawableRes
|
||||||
|
val iconResId: Int
|
||||||
|
|
||||||
|
val chaptersCount: Int
|
||||||
|
get() = chaptersIds.size
|
||||||
|
|
||||||
|
fun getLabel(resources: Resources): CharSequence
|
||||||
|
|
||||||
|
class AllChapters(
|
||||||
|
val branch: String,
|
||||||
|
override val chaptersIds: Set<Long>,
|
||||||
|
) : DownloadOption {
|
||||||
|
|
||||||
|
override val iconResId = R.drawable.ic_select_group
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return resources.getString(R.string.download_option_all_chapters, branch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class WholeManga(
|
||||||
|
override val chaptersIds: Set<Long>,
|
||||||
|
) : DownloadOption {
|
||||||
|
|
||||||
|
override val iconResId = materialR.drawable.abc_ic_menu_selectall_mtrl_alpha
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return resources.getString(R.string.download_option_whole_manga)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirstChapters(
|
||||||
|
override val chaptersIds: Set<Long>,
|
||||||
|
) : DownloadOption {
|
||||||
|
|
||||||
|
override val iconResId = R.drawable.ic_list_start
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return resources.getString(
|
||||||
|
R.string.download_option_first_n_chapters,
|
||||||
|
resources.getQuantityString(R.plurals.chapters, chaptersCount, chaptersCount)
|
||||||
|
.lowercase(Locale.getDefault()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AllUnreadChapters(
|
||||||
|
override val chaptersIds: Set<Long>,
|
||||||
|
val branch: String?,
|
||||||
|
) : DownloadOption {
|
||||||
|
|
||||||
|
override val iconResId = R.drawable.ic_list_end
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return if (branch == null) {
|
||||||
|
resources.getString(R.string.download_option_all_unread)
|
||||||
|
} else {
|
||||||
|
resources.getString(R.string.download_option_all_unread_b, branch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NextUnreadChapters(
|
||||||
|
override val chaptersIds: Set<Long>,
|
||||||
|
) : DownloadOption {
|
||||||
|
|
||||||
|
override val iconResId = R.drawable.ic_list_next
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return resources.getString(
|
||||||
|
R.string.download_option_next_unread_n_chapters,
|
||||||
|
resources.getQuantityString(R.plurals.chapters, chaptersCount, chaptersCount)
|
||||||
|
.lowercase(Locale.getDefault()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SelectionHint : DownloadOption {
|
||||||
|
|
||||||
|
override val chaptersIds: Set<Long> = emptySet()
|
||||||
|
override val iconResId = R.drawable.ic_tap
|
||||||
|
|
||||||
|
override fun getLabel(resources: Resources): CharSequence {
|
||||||
|
return resources.getString(R.string.download_option_manual_selection)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package org.koitharu.kotatsu.download.ui.dialog
|
||||||
|
|
||||||
|
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
||||||
|
import org.koitharu.kotatsu.databinding.ItemDownloadOptionBinding
|
||||||
|
|
||||||
|
fun downloadOptionAD(
|
||||||
|
onClickListener: OnListItemClickListener<DownloadOption>,
|
||||||
|
) = adapterDelegateViewBinding<DownloadOption, DownloadOption, ItemDownloadOptionBinding>(
|
||||||
|
{ layoutInflater, parent -> ItemDownloadOptionBinding.inflate(layoutInflater, parent, false) },
|
||||||
|
) {
|
||||||
|
|
||||||
|
binding.root.setOnClickListener { v -> onClickListener.onItemClick(item, v) }
|
||||||
|
|
||||||
|
bind {
|
||||||
|
with(binding.root) {
|
||||||
|
title = item.getLabel(resources)
|
||||||
|
subtitle = if (item.chaptersCount == 0) null else resources.getQuantityString(
|
||||||
|
R.plurals.chapters,
|
||||||
|
item.chaptersCount,
|
||||||
|
item.chaptersCount,
|
||||||
|
)
|
||||||
|
setIconResource(item.iconResId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12C7,9.58 8.72,7.56 11,7.1V3H13V7.1C15.28,7.56 17,9.58 17,12M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z" />
|
||||||
|
</vector>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12C17,14.42 15.28,16.44 13,16.9V21H11V16.9C8.72,16.44 7,14.42 7,12M12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15M13,3V5H11V3H13Z" />
|
||||||
|
</vector>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M12,7A5,5 0 0,1 17,12C17,14.42 15.28,16.44 13,16.9V21H11V16.9C8.72,16.44 7,14.42 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z" />
|
||||||
|
</vector>
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M5 3A2 2 0 0 0 3 5H5M7 3V5H9V3M11 3V5H13V3M15 3V5H17V3M19 3V5H21A2 2 0 0 0 19 3M3 7V9H5V7M7 7V11H11V7M13 7V11H17V7M19 7V9H21V7M3 11V13H5V11M19 11V13H21V11M7 13V17H11V13M13 13V17H17V13M3 15V17H5V15M19 15V17H21V15M3 19A2 2 0 0 0 5 21V19M7 19V21H9V19M11 19V21H13V19M15 19V21H17V19M19 19V21A2 2 0 0 0 21 19Z" />
|
||||||
|
</vector>
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<org.koitharu.kotatsu.core.ui.widgets.TwoLinesItemView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/button_file"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawablePadding="?android:listPreferredItemPaddingStart"
|
||||||
|
android:minHeight="?android:listPreferredItemHeightSmall"
|
||||||
|
android:paddingStart="?android:listPreferredItemPaddingStart"
|
||||||
|
android:paddingEnd="?android:listPreferredItemPaddingEnd"
|
||||||
|
tools:subtitle="@string/chapters"
|
||||||
|
tools:title="@string/download_option_whole_manga" />
|
||||||
|
|
||||||
Loading…
Reference in New Issue