mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Fix persistence bug
This commit is contained in:
parent
1164177384
commit
c5d2b30bc8
3 changed files with 92 additions and 13 deletions
app/src/main/java/com/lagradost/cloudstream3/ui/download
|
@ -91,6 +91,7 @@ class DownloadAdapter(
|
|||
) : ListAdapter<VisualDownloadCached, DownloadAdapter.DownloadViewHolder>(DiffCallback()) {
|
||||
|
||||
private var showDeleteCheckbox: Boolean = false
|
||||
private val selectedIds: HashMap<Int, Boolean> = HashMap()
|
||||
|
||||
companion object {
|
||||
private const val VIEW_TYPE_HEADER = 0
|
||||
|
@ -125,6 +126,14 @@ class DownloadAdapter(
|
|||
if (card.child != null) {
|
||||
handleChildDownload(card, formattedSize)
|
||||
} else handleParentDownload(card, formattedSize)
|
||||
|
||||
deleteCheckbox.apply {
|
||||
isVisible = showDeleteCheckbox
|
||||
isChecked = selectedIds[card.data.id] == true
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
selectedChangedCallback.invoke(card.data.id, card.data.name, isChecked)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,7 +179,7 @@ class DownloadAdapter(
|
|||
|
||||
deleteCheckbox.apply {
|
||||
isVisible = showDeleteCheckbox
|
||||
isChecked = card.selected
|
||||
isChecked = selectedIds[card.data.id] == true
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
selectedChangedCallback.invoke(card.data.id, card.data.name, isChecked)
|
||||
}
|
||||
|
@ -183,7 +192,7 @@ class DownloadAdapter(
|
|||
formattedSize: String
|
||||
) {
|
||||
downloadButton.isVisible = false
|
||||
downloadHeaderGotoChild.isVisible = true
|
||||
downloadHeaderGotoChild.isVisible = !showDeleteCheckbox
|
||||
|
||||
try {
|
||||
downloadHeaderInfo.text = downloadHeaderInfo.context.getString(R.string.extra_info_format).format(
|
||||
|
@ -199,6 +208,14 @@ class DownloadAdapter(
|
|||
episodeHolder.setOnClickListener {
|
||||
headerClickCallback.invoke(DownloadHeaderClickEvent(DOWNLOAD_ACTION_GO_TO_CHILD, card.data))
|
||||
}
|
||||
|
||||
deleteCheckbox.apply {
|
||||
isVisible = showDeleteCheckbox
|
||||
isChecked = selectedIds[card.data.id] == true
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
selectedChangedCallback.invoke(card.data.id, card.data.name, isChecked)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun bindChild(card: VisualDownloadChildCached?) {
|
||||
|
@ -279,6 +296,29 @@ class DownloadAdapter(
|
|||
notifyItemRangeChanged(0, itemCount)
|
||||
}
|
||||
|
||||
fun updateSelectedItem(id: Int, isSelected: Boolean) {
|
||||
if (isSelected) {
|
||||
selectedIds[id] = true
|
||||
} else selectedIds.remove(id)
|
||||
val position = currentList.indexOfFirst { it.data.id == id }
|
||||
if (position != -1) {
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateSelectedItems(updatedList: List<VisualDownloadCached>) {
|
||||
updatedList.forEach { item ->
|
||||
val position = currentList.indexOfFirst { it.data.id == item.data.id }
|
||||
if (position != -1) {
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun clearSelectedIds() {
|
||||
selectedIds.clear()
|
||||
}
|
||||
|
||||
class DiffCallback : DiffUtil.ItemCallback<VisualDownloadCached>() {
|
||||
override fun areItemsTheSame(oldItem: VisualDownloadCached, newItem: VisualDownloadCached): Boolean {
|
||||
return oldItem.data.id == newItem.data.id
|
||||
|
|
|
@ -93,7 +93,7 @@ class DownloadFragment : Fragment() {
|
|||
|
||||
// We always want fresh selections
|
||||
// when navigating to downloads
|
||||
downloadsViewModel.resetSelected()
|
||||
downloadsViewModel.clearSelectedIds()
|
||||
|
||||
observe(downloadsViewModel.headerCards) {
|
||||
(binding?.downloadList?.adapter as? DownloadAdapter)?.submitList(it)
|
||||
|
@ -128,6 +128,10 @@ class DownloadFragment : Fragment() {
|
|||
downloadClickEvent.data.id,
|
||||
it
|
||||
)
|
||||
(binding?.downloadList?.adapter as? DownloadAdapter)?.updateSelectedItem(
|
||||
downloadClickEvent.data.id,
|
||||
true
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -196,7 +200,7 @@ class DownloadFragment : Fragment() {
|
|||
context?.let { ctx -> downloadsViewModel.handleMultiDelete(ctx) }
|
||||
}
|
||||
binding?.downloadDeleteToolbar?.btnCancel?.setOnClickListener {
|
||||
downloadsViewModel.resetSelected()
|
||||
downloadsViewModel.clearSelectedIds()
|
||||
}
|
||||
|
||||
adapter?.setDeleteCheckboxVisibility(true)
|
||||
|
@ -206,16 +210,41 @@ class DownloadFragment : Fragment() {
|
|||
// Make sure we don't display it early
|
||||
!downloadsViewModel.headerCards.value.isNullOrEmpty() &&
|
||||
downloadsViewModel.usedBytes.value?.let { it > 0 } == true
|
||||
|
||||
adapter?.setDeleteCheckboxVisibility(false)
|
||||
adapter?.clearSelectedIds()
|
||||
|
||||
downloadsViewModel.clearSelectedIds()
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateSelectedState(selected: HashMap<Int, String>) {
|
||||
val currentList = downloadsViewModel.headerCards.value ?: return
|
||||
val updatedList = currentList.map { header ->
|
||||
header.copy(selected = selected.keys.contains(header.data.id))
|
||||
if (selected == downloadsViewModel.selectedIds.value) return
|
||||
val currentSelectedIds = downloadsViewModel.selectedIds.value ?: HashMap()
|
||||
|
||||
// Remove deselected items
|
||||
currentSelectedIds.keys.retainAll(selected.keys)
|
||||
|
||||
// Add newly selected items
|
||||
selected.forEach { (id, name) ->
|
||||
currentSelectedIds[id] = name
|
||||
}
|
||||
(binding?.downloadList?.adapter as? DownloadAdapter)?.submitList(updatedList)
|
||||
|
||||
downloadsViewModel.setSelected(currentSelectedIds)
|
||||
|
||||
val currentList = downloadsViewModel.headerCards.value ?: return
|
||||
val updatedList = currentList.map { item ->
|
||||
item.copy(selected = currentSelectedIds.containsKey(item.data.id))
|
||||
}
|
||||
|
||||
val adapter = binding?.downloadList?.adapter as? DownloadAdapter
|
||||
|
||||
// Pass the IDs of the updated list to the ViewModel for filtering
|
||||
val updatedIds = updatedList.filter { it.selected }.map { it.data.id }.toSet()
|
||||
downloadsViewModel.filterSelectedIds(updatedIds)
|
||||
|
||||
val selectedItems = updatedList.filter { it.selected }
|
||||
adapter?.updateSelectedItems(selectedItems)
|
||||
}
|
||||
|
||||
private fun setUpDownloadDeleteListener() {
|
||||
|
|
|
@ -45,29 +45,39 @@ class DownloadViewModel : ViewModel() {
|
|||
private var previousVisual: List<VisualDownloadHeaderCached>? = null
|
||||
|
||||
fun addSelected(id: Int, name: String) {
|
||||
_selectedIds.value?.let { selectedIds ->
|
||||
selectedIds.value?.let { selectedIds ->
|
||||
selectedIds[id] = name
|
||||
_selectedIds.postValue(selectedIds)
|
||||
}
|
||||
}
|
||||
|
||||
fun setSelected(selected: HashMap<Int, String>) {
|
||||
_selectedIds.postValue(selected)
|
||||
}
|
||||
|
||||
fun removeSelected(id: Int) {
|
||||
_selectedIds.value?.let { selectedIds ->
|
||||
selectedIds.value?.let { selectedIds ->
|
||||
selectedIds.remove(id)
|
||||
_selectedIds.postValue(selectedIds)
|
||||
}
|
||||
}
|
||||
|
||||
fun resetSelected() {
|
||||
fun filterSelectedIds(updatedIds: Set<Int>) {
|
||||
val currentSelectedIds = _selectedIds.value ?: return
|
||||
val filteredIds = currentSelectedIds.filterKeys { updatedIds.contains(it) }
|
||||
_selectedIds.value = HashMap(filteredIds)
|
||||
}
|
||||
|
||||
fun clearSelectedIds() {
|
||||
_selectedIds.postValue(HashMap())
|
||||
}
|
||||
|
||||
private fun getSelectedIds(): List<Int> {
|
||||
return _selectedIds.value?.keys?.toList() ?: emptyList()
|
||||
return selectedIds.value?.keys?.toList() ?: emptyList()
|
||||
}
|
||||
|
||||
private fun getSelectedNames(): List<String> {
|
||||
return _selectedIds.value?.values?.toList() ?: emptyList()
|
||||
return selectedIds.value?.values?.toList() ?: emptyList()
|
||||
}
|
||||
|
||||
fun updateList(context: Context) = viewModelScope.launchSafe {
|
||||
|
|
Loading…
Reference in a new issue