mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Minor cleanup and add parent name to dialog
This commit is contained in:
parent
80281e9773
commit
df603b0838
2 changed files with 85 additions and 59 deletions
|
@ -101,12 +101,14 @@ class DownloadViewModel : ViewModel() {
|
||||||
val childItems = childCards.value
|
val childItems = childCards.value
|
||||||
|
|
||||||
if (headerItems != null &&
|
if (headerItems != null &&
|
||||||
headerItems.count() == currentSelected.count() &&
|
headerItems.count() == currentSelected.count() &&
|
||||||
headerItems.containsAll(currentSelected)) return true
|
headerItems.containsAll(currentSelected)
|
||||||
|
) return true
|
||||||
|
|
||||||
if (childItems != null &&
|
if (childItems != null &&
|
||||||
childItems.count() == currentSelected.count() &&
|
childItems.count() == currentSelected.count() &&
|
||||||
childItems.containsAll(currentSelected)) return true
|
childItems.containsAll(currentSelected)
|
||||||
|
) return true
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -147,14 +149,17 @@ class DownloadViewModel : ViewModel() {
|
||||||
// Gets all children downloads
|
// Gets all children downloads
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
children.forEach { c ->
|
children.forEach { c ->
|
||||||
val childFile = getDownloadFileInfoAndUpdateSettings(context, c.id) ?: return@forEach
|
val childFile =
|
||||||
|
getDownloadFileInfoAndUpdateSettings(context, c.id) ?: return@forEach
|
||||||
|
|
||||||
if (childFile.fileLength <= 1) return@forEach
|
if (childFile.fileLength <= 1) return@forEach
|
||||||
val len = childFile.totalBytes
|
val len = childFile.totalBytes
|
||||||
val flen = childFile.fileLength
|
val flen = childFile.fileLength
|
||||||
|
|
||||||
totalBytesUsedByChild[c.parentId] = totalBytesUsedByChild[c.parentId]?.plus(len) ?: len
|
totalBytesUsedByChild[c.parentId] =
|
||||||
currentBytesUsedByChild[c.parentId] = currentBytesUsedByChild[c.parentId]?.plus(flen) ?: flen
|
totalBytesUsedByChild[c.parentId]?.plus(len) ?: len
|
||||||
|
currentBytesUsedByChild[c.parentId] =
|
||||||
|
currentBytesUsedByChild[c.parentId]?.plus(flen) ?: flen
|
||||||
totalDownloads[c.parentId] = totalDownloads[c.parentId]?.plus(1) ?: 1
|
totalDownloads[c.parentId] = totalDownloads[c.parentId]?.plus(1) ?: 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,62 +244,72 @@ class DownloadViewModel : ViewModel() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun handleMultiDelete(context: Context, onDeleteConfirm: () -> Unit) = viewModelScope.launchSafe {
|
fun handleMultiDelete(context: Context, onDeleteConfirm: () -> Unit) =
|
||||||
val selectedItemsList = selectedItems.value ?: mutableListOf()
|
viewModelScope.launchSafe {
|
||||||
|
val selectedItemsList = selectedItems.value ?: emptyList()
|
||||||
|
|
||||||
val ids = selectedItemsList.flatMap { item ->
|
val ids = mutableListOf<Int>()
|
||||||
when (item) {
|
|
||||||
is VisualDownloadCached.Header -> {
|
var parentName: String? = null
|
||||||
if (item.data.type.isEpisodeBased()) {
|
val seriesNames = mutableListOf<String>()
|
||||||
context.getKeys(DOWNLOAD_EPISODE_CACHE)
|
val names = mutableListOf<String>()
|
||||||
.mapNotNull { context.getKey<VideoDownloadHelper.DownloadEpisodeCached>(it) }
|
|
||||||
.filter { it.parentId == item.data.id }
|
selectedItemsList.forEach { item ->
|
||||||
.map { it.id }
|
when (item) {
|
||||||
} else listOf(item.data.id)
|
is VisualDownloadCached.Header -> {
|
||||||
|
if (item.data.type.isEpisodeBased()) {
|
||||||
|
context.getKeys(DOWNLOAD_EPISODE_CACHE)
|
||||||
|
.mapNotNull {
|
||||||
|
context.getKey<VideoDownloadHelper.DownloadEpisodeCached>(
|
||||||
|
it
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.filter { it.parentId == item.data.id }
|
||||||
|
.mapTo(ids) { it.id }
|
||||||
|
|
||||||
|
val episodeInfo = "${item.data.name} (${item.totalDownloads} ${
|
||||||
|
context.resources.getQuantityString(
|
||||||
|
R.plurals.episodes,
|
||||||
|
item.totalDownloads
|
||||||
|
).lowercase()
|
||||||
|
})"
|
||||||
|
seriesNames.add(episodeInfo)
|
||||||
|
} else {
|
||||||
|
ids.add(item.data.id)
|
||||||
|
names.add(item.data.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is VisualDownloadCached.Child -> {
|
||||||
|
ids.add(item.data.id)
|
||||||
|
val parent = context.getKey<VideoDownloadHelper.DownloadHeaderCached>(
|
||||||
|
DOWNLOAD_HEADER_CACHE,
|
||||||
|
item.data.parentId.toString()
|
||||||
|
)
|
||||||
|
parentName = parent?.name
|
||||||
|
names.add(
|
||||||
|
context.getNameFull(
|
||||||
|
item.data.name,
|
||||||
|
item.data.episode,
|
||||||
|
item.data.season
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is VisualDownloadCached.Child -> listOf(item.data.id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val data = Triple(parentName, seriesNames.toList(), names.toList())
|
||||||
|
showDeleteConfirmationDialog(context, ids, data, onDeleteConfirm)
|
||||||
}
|
}
|
||||||
|
|
||||||
val (seriesNames, names) = selectedItemsList.map { item ->
|
|
||||||
when (item) {
|
|
||||||
is VisualDownloadCached.Header -> {
|
|
||||||
if (item.data.type.isEpisodeBased()) {
|
|
||||||
val episodeInfo = "${item.data.name} (${item.totalDownloads} ${
|
|
||||||
context.resources.getQuantityString(
|
|
||||||
R.plurals.episodes,
|
|
||||||
item.totalDownloads
|
|
||||||
).lowercase()
|
|
||||||
})"
|
|
||||||
episodeInfo to null
|
|
||||||
} else null to item.data.name
|
|
||||||
}
|
|
||||||
|
|
||||||
is VisualDownloadCached.Child -> null to context.getNameFull(
|
|
||||||
item.data.name,
|
|
||||||
item.data.episode,
|
|
||||||
item.data.season
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}.unzip()
|
|
||||||
|
|
||||||
showDeleteConfirmationDialog(
|
|
||||||
context,
|
|
||||||
ids,
|
|
||||||
names.filterNotNull(),
|
|
||||||
seriesNames.filterNotNull(),
|
|
||||||
onDeleteConfirm
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showDeleteConfirmationDialog(
|
private fun showDeleteConfirmationDialog(
|
||||||
context: Context,
|
context: Context,
|
||||||
ids: List<Int>,
|
ids: List<Int>,
|
||||||
names: List<String>,
|
data: Triple<String?, List<String>, List<String>>,
|
||||||
seriesNames: List<String>,
|
|
||||||
onDeleteConfirm: () -> Unit
|
onDeleteConfirm: () -> Unit
|
||||||
) {
|
) {
|
||||||
|
val (parentName, seriesNames, names) = data
|
||||||
|
|
||||||
val formattedNames = names.joinToString(separator = "\n") { "• $it" }
|
val formattedNames = names.joinToString(separator = "\n") { "• $it" }
|
||||||
val formattedSeriesNames = seriesNames.joinToString(separator = "\n") { "• $it" }
|
val formattedSeriesNames = seriesNames.joinToString(separator = "\n") { "• $it" }
|
||||||
|
|
||||||
|
@ -302,14 +317,23 @@ class DownloadViewModel : ViewModel() {
|
||||||
seriesNames.isNotEmpty() && names.isEmpty() -> {
|
seriesNames.isNotEmpty() && names.isEmpty() -> {
|
||||||
context.getString(R.string.delete_message_series_only).format(formattedSeriesNames)
|
context.getString(R.string.delete_message_series_only).format(formattedSeriesNames)
|
||||||
}
|
}
|
||||||
seriesNames.isNotEmpty() -> {
|
|
||||||
val seriesSection = context.getString(R.string.delete_message_series_section).format(formattedSeriesNames)
|
parentName != null && names.isNotEmpty() -> {
|
||||||
context.getString(R.string.delete_message_multiple).format(formattedNames) + "\n\n" + seriesSection
|
context.getString(R.string.delete_message_series_episodes)
|
||||||
|
.format(parentName, formattedNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seriesNames.isNotEmpty() -> {
|
||||||
|
val seriesSection = context.getString(R.string.delete_message_series_section)
|
||||||
|
.format(formattedSeriesNames)
|
||||||
|
context.getString(R.string.delete_message_multiple)
|
||||||
|
.format(formattedNames) + "\n\n" + seriesSection
|
||||||
|
}
|
||||||
|
|
||||||
else -> context.getString(R.string.delete_message_multiple).format(formattedNames)
|
else -> context.getString(R.string.delete_message_multiple).format(formattedNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
|
val builder = AlertDialog.Builder(context)
|
||||||
val dialogClickListener =
|
val dialogClickListener =
|
||||||
DialogInterface.OnClickListener { _, which ->
|
DialogInterface.OnClickListener { _, which ->
|
||||||
when (which) {
|
when (which) {
|
||||||
|
@ -320,6 +344,7 @@ class DownloadViewModel : ViewModel() {
|
||||||
onDeleteConfirm.invoke()
|
onDeleteConfirm.invoke()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogInterface.BUTTON_NEGATIVE -> {
|
DialogInterface.BUTTON_NEGATIVE -> {
|
||||||
// Do nothing on cancel
|
// Do nothing on cancel
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,8 +318,9 @@
|
||||||
<string name="go_forward_30">+30</string>
|
<string name="go_forward_30">+30</string>
|
||||||
<string name="delete_message" formatted="true">This will permanently delete %s\nAre you sure?</string>
|
<string name="delete_message" formatted="true">This will permanently delete %s\nAre you sure?</string>
|
||||||
<string name="delete_message_multiple" formatted="true">Are you sure you want to permanently delete the following items?\n\n%s</string>
|
<string name="delete_message_multiple" formatted="true">Are you sure you want to permanently delete the following items?\n\n%s</string>
|
||||||
<string name="delete_message_series_section">You will also permanently delete all episodes in the following series:\n\n%s</string>
|
<string name="delete_message_series_episodes" formatted="true">Are you sure you want to permanently delete the following episodes in %1$s?\n\n%2$s</string>
|
||||||
<string name="delete_message_series_only">Are you sure you want to permanently delete all episodes in the following series?\n\n%s</string>
|
<string name="delete_message_series_section" formatted="true">You will also permanently delete all episodes in the following series:\n\n%s</string>
|
||||||
|
<string name="delete_message_series_only" formatted="true">Are you sure you want to permanently delete all episodes in the following series?\n\n%s</string>
|
||||||
<string name="resume_time_left" formatted="true">%dm\nremaining</string>
|
<string name="resume_time_left" formatted="true">%dm\nremaining</string>
|
||||||
<string name="resume_remaining" formatted="true">%s\nremaining</string>
|
<string name="resume_remaining" formatted="true">%s\nremaining</string>
|
||||||
<string name="status_ongoing">Ongoing</string>
|
<string name="status_ongoing">Ongoing</string>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue