pull/828/head
deniscerri 1 year ago
parent 6cd3688767
commit d4fd4a48f3
No known key found for this signature in database
GPG Key ID: 95C43D517D830350

@ -58,7 +58,9 @@ interface DownloadDao {
@Query("SELECT DISTINCT type from downloads where status = 'Processing' and id in (:ids)") @Query("SELECT DISTINCT type from downloads where status = 'Processing' and id in (:ids)")
fun getProcessingDownloadTypesByIDs(ids: List<Long>) : List<String> fun getProcessingDownloadTypesByIDs(ids: List<Long>) : List<String>
@Query("""SELECT DISTINCT container from downloads where status = 'Processing'""") @Query("""
SELECT DISTINCT container from downloads where status = 'Processing'
""")
fun getProcessingDownloadContainers() : List<String> fun getProcessingDownloadContainers() : List<String>
@Query("""SELECT DISTINCT container from downloads where id in (:ids)""") @Query("""SELECT DISTINCT container from downloads where id in (:ids)""")

@ -1200,8 +1200,10 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
} }
suspend fun continueUpdatingFormatsOnBackground(selectedItems: List<Long>?){ suspend fun continueUpdatingFormatsOnBackground(selectedItems: List<Long>?){
val allProcessing = repository.getAllProcessingDownloads().map { it.id }
val ids = if (selectedItems.isNullOrEmpty()) { val ids = if (selectedItems.isNullOrEmpty()) {
repository.getAllProcessingDownloads().map { it.id } allProcessing
}else { }else {
selectedItems selectedItems
} }
@ -1213,7 +1215,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
.setInputData( .setInputData(
Data.Builder() Data.Builder()
.putLongArray("ids", ids.toLongArray()) .putLongArray("ids", ids.toLongArray())
.putLongArray("other_ids_in_bundle", selectedItems?.toLongArray() ?: longArrayOf()) .putLongArray("other_ids_in_bundle", allProcessing.filter { !ids.contains(it) }.toLongArray())
.putInt("id", id) .putInt("id", id)
.build()) .build())
.addTag("updateFormats") .addTag("updateFormats")

@ -64,6 +64,8 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener
} }
fun getCheckedItemsOrNull(): List<Long>? { fun getCheckedItemsOrNull(): List<Long>? {
if (!_isCheckingItems) return null
val res = if (inverted) { val res = if (inverted) {
currentItems.filter { !checkedItems.contains(it) } currentItems.filter { !checkedItems.contains(it) }
}else { }else {

@ -33,6 +33,7 @@ import androidx.core.view.isVisible
import androidx.core.view.setPadding import androidx.core.view.setPadding
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeLifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
@ -41,6 +42,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.utils.MDUtil.getStringArray import com.afollestad.materialdialogs.utils.MDUtil.getStringArray
import com.deniscerri.ytdl.R import com.deniscerri.ytdl.R
import com.deniscerri.ytdl.database.models.CommandTemplate
import com.deniscerri.ytdl.database.models.DownloadItem import com.deniscerri.ytdl.database.models.DownloadItem
import com.deniscerri.ytdl.database.models.DownloadItemConfigureMultiple import com.deniscerri.ytdl.database.models.DownloadItemConfigureMultiple
import com.deniscerri.ytdl.database.models.Format import com.deniscerri.ytdl.database.models.Format
@ -55,12 +57,14 @@ import com.deniscerri.ytdl.ui.adapter.ConfigureMultipleDownloadsAdapter
import com.deniscerri.ytdl.util.Extensions.enableFastScroll import com.deniscerri.ytdl.util.Extensions.enableFastScroll
import com.deniscerri.ytdl.util.FileUtil import com.deniscerri.ytdl.util.FileUtil
import com.deniscerri.ytdl.util.UiUtil import com.deniscerri.ytdl.util.UiUtil
import com.deniscerri.ytdl.util.UiUtil.populateCommandCard
import com.facebook.shimmer.ShimmerFrameLayout import com.facebook.shimmer.ShimmerFrameLayout
import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomappbar.BottomAppBar
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.chip.Chip
import com.google.android.material.color.MaterialColors import com.google.android.material.color.MaterialColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.elevation.SurfaceColors import com.google.android.material.elevation.SurfaceColors
@ -103,6 +107,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
private lateinit var currentHistoryIDs: List<Long> private lateinit var currentHistoryIDs: List<Long>
private var processingItemsCount : Int = 0 private var processingItemsCount : Int = 0
private lateinit var formatBtn : MenuItem
private lateinit var moreBtn : MenuItem
private lateinit var containerBtn : MenuItem private lateinit var containerBtn : MenuItem
private lateinit var containerTextView: TextView private lateinit var containerTextView: TextView
@ -172,8 +178,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
bottomAppBar = view.findViewById(R.id.bottomAppBar) bottomAppBar = view.findViewById(R.id.bottomAppBar)
val preferredDownloadType = bottomAppBar.menu.findItem(R.id.preferred_download_type) val preferredDownloadType = bottomAppBar.menu.findItem(R.id.preferred_download_type)
val formatBtn = bottomAppBar.menu.findItem(R.id.format) formatBtn = bottomAppBar.menu.findItem(R.id.format)
val moreBtn = bottomAppBar.menu.findItem(R.id.more) moreBtn = bottomAppBar.menu.findItem(R.id.more)
containerBtn = bottomAppBar.menu.findItem(R.id.container) containerBtn = bottomAppBar.menu.findItem(R.id.container)
containerTextView = containerBtn.actionView as TextView containerTextView = containerBtn.actionView as TextView
val incognitoBtn = bottomAppBar.menu.findItem(R.id.incognito) val incognitoBtn = bottomAppBar.menu.findItem(R.id.incognito)
@ -202,48 +208,14 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
updateFileSize(items) updateFileSize(items)
if (items.isNotEmpty()){ if (items.isNotEmpty()){
lifecycleScope.launch { val checkedItems = listAdapter.getCheckedItemsOrNull() ?: listOf()
val haveSameType = if (listAdapter.isCheckingItems()) { val firstItem = if (checkedItems.isNotEmpty()) {
val res = withContext(Dispatchers.IO) { items.firstOrNull { it.id == checkedItems.first() } ?: items.first()
downloadViewModel.checkIfAllProcessingItemsHaveSameType(listAdapter.getCheckedItemsOrNull()) }else {
} items.first()
res.first
}else {
items.all { it2 -> it2.type == items[0].type }
}
if (haveSameType) {
formatBtn.icon?.alpha = 255
if (items[0].type != DownloadViewModel.Type.command) {
moreBtn.icon?.alpha = 255
}
containerBtn.isVisible = items.first().type != DownloadViewModel.Type.command
}else {
formatBtn.icon?.alpha = 30
moreBtn.icon?.alpha = 30
}
val haveSameContainer = if (listAdapter.isCheckingItems()) {
val res = withContext(Dispatchers.IO) {
downloadViewModel.checkIfAllProcessingItemsHaveSameContainer(listAdapter.getCheckedItemsOrNull())
}
res.first
}else {
items.all { it.container == items[0].container }
}
if (haveSameContainer) {
setContainerText(items[0].container)
}else {
setContainerText("")
}
} }
updateBottomAppBarMenuItemsVisibility(firstItem)
val type = items.first().type val type = items.first().type
when(type){ when(type){
DownloadViewModel.Type.audio -> { DownloadViewModel.Type.audio -> {
preferredDownloadType.setIcon(R.drawable.baseline_audio_file_24) preferredDownloadType.setIcon(R.drawable.baseline_audio_file_24)
@ -417,21 +389,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.audio) downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.audio)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main){
preferredDownloadType.setIcon(R.drawable.baseline_audio_file_24)
formatBtn.icon?.alpha = 255
moreBtn.icon?.alpha = 255
bottomSheet.cancel() bottomSheet.cancel()
} }
val res = downloadViewModel.checkIfAllProcessingItemsHaveSameContainer(listAdapter.getCheckedItemsOrNull())
withContext(Dispatchers.Main) {
if (!res.first) {
setContainerText("")
}else{
setContainerText(res.second)
}
}
} }
} }
@ -439,20 +398,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
CoroutineScope(Dispatchers.IO).launch{ CoroutineScope(Dispatchers.IO).launch{
downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.video) downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.video)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main){
preferredDownloadType.setIcon(R.drawable.baseline_video_file_24)
formatBtn.icon?.alpha = 255
moreBtn.icon?.alpha = 255
bottomSheet.cancel() bottomSheet.cancel()
} }
val res = downloadViewModel.checkIfAllProcessingItemsHaveSameContainer(listAdapter.getCheckedItemsOrNull())
withContext(Dispatchers.Main) {
if (!res.first) {
setContainerText("")
}else{
setContainerText(res.second)
}
}
} }
} }
@ -460,11 +407,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
CoroutineScope(Dispatchers.IO).launch{ CoroutineScope(Dispatchers.IO).launch{
downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.command) downloadViewModel.updateProcessingType(listAdapter.getCheckedItemsOrNull(), DownloadViewModel.Type.command)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main){
preferredDownloadType.setIcon(R.drawable.baseline_insert_drive_file_24)
formatBtn.icon?.alpha = 255
moreBtn.icon?.alpha = 30
bottomSheet.cancel() bottomSheet.cancel()
containerBtn.isVisible = false
} }
} }
@ -748,6 +691,84 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
) )
} }
DownloadViewModel.Type.command -> { DownloadViewModel.Type.command -> {
val bottomSheet = BottomSheetDialog(requireContext())
bottomSheet.requestWindowFeature(Window.FEATURE_NO_TITLE)
bottomSheet.setContentView(R.layout.adjust_command)
val sheetView = bottomSheet.findViewById<View>(android.R.id.content)!!
sheetView.findViewById<View>(R.id.adjust).setPadding(padding)
val items = withContext(Dispatchers.IO){
downloadViewModel.getProcessingDownloads(listAdapter.getCheckedItemsOrNull())
}
UiUtil.configureCommand(
sheetView,
1,
0,
newTemplateClicked = {
UiUtil.showCommandTemplateCreationOrUpdatingSheet(
null, requireActivity(), sheetView.findViewTreeLifecycleOwner()!!, commandTemplateViewModel,
newTemplate = { nt ->
items.forEach { it2 -> it2.format = Format(
nt.title,
"",
"",
"",
"",
0,
nt.content
) }
CoroutineScope(Dispatchers.IO).launch {
commandTemplateViewModel.insert(nt)
items.forEach { downloadViewModel.updateDownload(it) }
}
preferences.edit().putString("lastCommandTemplateUsed", nt.content).apply()
bottomSheet.dismiss()
},
dismissed = {}
)
},
editSelectedClicked = {
val current = CommandTemplate(
0,
"",
items[0].format.format_note,
useAsExtraCommand = false, useAsExtraCommandAudio = false, useAsExtraCommandVideo = false, useAsExtraCommandDataFetching = false
)
UiUtil.showCommandTemplateCreationOrUpdatingSheet(
current, requireActivity(), sheetView.findViewTreeLifecycleOwner()!!, commandTemplateViewModel,
newTemplate = { nt ->
items.forEach { it2 -> it2.format = Format(
nt.title,
"",
"",
"",
"",
0,
nt.content
) }
CoroutineScope(Dispatchers.IO).launch {
commandTemplateViewModel.insert(nt)
items.forEach { downloadViewModel.updateDownload(it) }
}
preferences.edit().putString("lastCommandTemplateUsed", nt.content).apply()
bottomSheet.dismiss()
},
dismissed = {}
)
},
shortcutClicked = {}
)
bottomSheet.show()
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
bottomSheet.behavior.peekHeight = displayMetrics.heightPixels
bottomSheet.window!!.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
} }
else -> {} else -> {}
@ -889,6 +910,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
selectRangeBtn.isVisible = false selectRangeBtn.isVisible = false
selectItemsOpenBtn.isVisible = true selectItemsOpenBtn.isVisible = true
listAdapter.clearCheckedItems() listAdapter.clearCheckedItems()
updateBottomAppBarMenuItemsVisibility()
} }
} }
@ -1059,6 +1081,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
selectItemsMenuBtn.isVisible = true selectItemsMenuBtn.isVisible = true
val checkedSize = listAdapter.getCheckedItemsSize() val checkedSize = listAdapter.getCheckedItemsSize()
count.text = "$checkedSize ${getString(R.string.selected)}" count.text = "$checkedSize ${getString(R.string.selected)}"
updateBottomAppBarMenuItemsVisibility()
} }
override fun onCardUnChecked(id: Long) { override fun onCardUnChecked(id: Long) {
@ -1067,6 +1090,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
selectItemsMenuBtn.isVisible = false selectItemsMenuBtn.isVisible = false
} }
count.text = "$checkedSize ${getString(R.string.selected)}" count.text = "$checkedSize ${getString(R.string.selected)}"
updateBottomAppBarMenuItemsVisibility()
} }
override fun onDelete(id: Long) { override fun onDelete(id: Long) {
@ -1223,5 +1247,32 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
containerBtn.isVisible = true containerBtn.isVisible = true
} }
private fun updateBottomAppBarMenuItemsVisibility(item: DownloadItemConfigureMultiple? = null) {
CoroutineScope(Dispatchers.IO).launch {
val haveSameType = downloadViewModel.checkIfAllProcessingItemsHaveSameType(listAdapter.getCheckedItemsOrNull())
withContext(Dispatchers.Main){
if (haveSameType.first) {
formatBtn.icon?.alpha = 255
moreBtn.icon?.alpha = 255
}else {
formatBtn.icon?.alpha = 30
moreBtn.icon?.alpha = 30
}
}
val haveSameContainer = downloadViewModel.checkIfAllProcessingItemsHaveSameContainer(listAdapter.getCheckedItemsOrNull())
withContext(Dispatchers.Main) {
if (haveSameContainer.first && item != null) {
setContainerText(item.container)
}else {
setContainerText("")
}
containerBtn.isVisible = haveSameContainer.first && haveSameType.first && haveSameType.second != DownloadViewModel.Type.command
}
}
}
} }

Loading…
Cancel
Save