fixed app not downloading multiple items

This commit is contained in:
deniscerri 2023-03-14 17:37:40 +01:00
parent 4d959a0b05
commit ca6f5f6f20
No known key found for this signature in database
GPG key ID: 95C43D517D830350
13 changed files with 77 additions and 28 deletions

View file

@ -7,6 +7,7 @@ import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter import android.graphics.ColorMatrixColorFilter
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.format.DateFormat
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -25,6 +26,7 @@ import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -87,12 +89,12 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit
// TIME DOWNLOADED ---------------------------------- // TIME DOWNLOADED ----------------------------------
val datetime = card.findViewById<TextView>(R.id.downloads_info_time) val datetime = card.findViewById<TextView>(R.id.downloads_info_time)
val relativeTime = DateUtils.getRelativeTimeSpanString( // val relativeTime = DateUtils.getRelativeTimeSpanString(
item.time * 1000L, // item.time * 1000L,
System.currentTimeMillis(), // System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS // DateUtils.MINUTE_IN_MILLIS
) // )
datetime.text = relativeTime datetime.text = SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), "ddMMMyyyy - HHmm"), Locale.getDefault()).format(item.time * 1000L)
// BUTTON ---------------------------------- // BUTTON ----------------------------------
val btn = card.findViewById<MaterialButton>(R.id.downloads_download_button_type) val btn = card.findViewById<MaterialButton>(R.id.downloads_download_button_type)

View file

@ -31,6 +31,9 @@ interface DownloadDao {
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(item: DownloadItem) : Long suspend fun insert(item: DownloadItem) : Long
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(list: List<DownloadItem>) : List<Long>
@Query("DELETE FROM downloads") @Query("DELETE FROM downloads")
suspend fun deleteAll() suspend fun deleteAll()

View file

@ -22,6 +22,10 @@ class DownloadRepository(private val downloadDao: DownloadDao) {
return downloadDao.insert(item) return downloadDao.insert(item)
} }
suspend fun insertAll(items: List<DownloadItem>) : List<Long> {
return downloadDao.insertAll(items)
}
suspend fun delete(item: DownloadItem){ suspend fun delete(item: DownloadItem){
downloadDao.delete(item.id) downloadDao.delete(item.id)
} }

View file

@ -3,6 +3,7 @@ package com.deniscerri.ytdlnis.database.viewmodel
import android.app.Activity import android.app.Activity
import android.app.Application import android.app.Application
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@ -256,16 +257,13 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application
return Gson().fromJson(string, DownloadItem::class.java) return Gson().fromJson(string, DownloadItem::class.java)
} }
fun queueDownloads(items: List<DownloadItem>)= viewModelScope.launch(Dispatchers.IO) { suspend fun queueDownloads(items: List<DownloadItem>) {
val context = getApplication<App>().applicationContext val context = getApplication<App>().applicationContext
items.forEach { items.forEach { it.status = DownloadRepository.Status.Queued.toString() }
it.status = DownloadRepository.Status.Queued.toString() val ids = repository.insertAll(items)
it.id = repository.checkIfReDownloadingErroredOrCancelled(it) for (i in ids.indices){
if (it.id == 0L){ val it = items[i]
val id = repository.insert(it) it.id = ids[i]
it.id = id
}else repository.update(it)
val currentTime = System.currentTimeMillis() val currentTime = System.currentTimeMillis()
var delay = if (it.downloadStartTime != 0L){ var delay = if (it.downloadStartTime != 0L){
it.downloadStartTime - currentTime it.downloadStartTime - currentTime
@ -284,6 +282,12 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application
workRequest workRequest
).enqueue() ).enqueue()
} }
items.forEach {
it.id = repository.checkIfReDownloadingErroredOrCancelled(it)
if (it.id != 0L){
repository.delete(it)
}
}
} }
} }

View file

@ -40,6 +40,7 @@ import com.google.android.material.button.MaterialButton
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.search.SearchBar import com.google.android.material.search.SearchBar
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.util.* import java.util.*
@ -370,7 +371,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList())
bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
} else { } else {
downloadViewModel.queueDownloads(downloadList) lifecycleScope.launch {
downloadViewModel.queueDownloads(downloadList)
}
} }
} }
if (viewIdName == "downloadAll") { if (viewIdName == "downloadAll") {
@ -379,7 +382,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList())
bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
} else { } else {
downloadViewModel.queueDownloads(downloadList) lifecycleScope.launch {
downloadViewModel.queueDownloads(downloadList)
}
} }
} }
} }

View file

@ -35,6 +35,7 @@ import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat import com.google.android.material.timepicker.TimeFormat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.util.* import java.util.*
@ -147,7 +148,9 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val
uiUtil.showDatePicker(fragmentManager) { uiUtil.showDatePicker(fragmentManager) {
val item: DownloadItem = getDownloadItem(); val item: DownloadItem = getDownloadItem();
item.downloadStartTime = it.timeInMillis item.downloadStartTime = it.timeInMillis
downloadViewModel.queueDownloads(listOf(item)) runBlocking {
downloadViewModel.queueDownloads(listOf(item))
}
dismiss() dismiss()
} }
} }
@ -155,7 +158,9 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val
val download = view.findViewById<Button>(R.id.bottomsheet_download_button) val download = view.findViewById<Button>(R.id.bottomsheet_download_button)
download!!.setOnClickListener { download!!.setOnClickListener {
val item: DownloadItem = getDownloadItem(); val item: DownloadItem = getDownloadItem();
downloadViewModel.queueDownloads(listOf(item)) runBlocking {
downloadViewModel.queueDownloads(listOf(item))
}
dismiss() dismiss()
} }
} }

View file

@ -38,6 +38,7 @@ import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat import com.google.android.material.timepicker.TimeFormat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.util.* import java.util.*
@ -98,14 +99,18 @@ class DownloadMultipleBottomSheetDialog(private var items: MutableList<DownloadI
items.forEach { item -> items.forEach { item ->
item.downloadStartTime = it.timeInMillis item.downloadStartTime = it.timeInMillis
} }
downloadViewModel.queueDownloads(items) runBlocking {
downloadViewModel.queueDownloads(items)
}
dismiss() dismiss()
} }
} }
val download = view.findViewById<Button>(R.id.bottomsheet_download_button) val download = view.findViewById<Button>(R.id.bottomsheet_download_button)
download!!.setOnClickListener { download!!.setOnClickListener {
downloadViewModel.queueDownloads(items) runBlocking {
downloadViewModel.queueDownloads(items)
}
dismiss() dismiss()
} }

View file

@ -85,8 +85,8 @@ class ActiveDownloadsFragment() : Fragment(), ActiveDownloadAdapter.OnItemClickL
val outputText = view.findViewWithTag<TextView>("$id##output") val outputText = view.findViewWithTag<TextView>("$id##output")
requireActivity().runOnUiThread { requireActivity().runOnUiThread {
progressBar.setProgressCompat(progress, true) progressBar?.setProgressCompat(progress, true)
outputText.text = output outputText?.text = output
} }
} }
} }

View file

@ -15,6 +15,7 @@ import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -29,6 +30,8 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
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.chip.Chip
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickListener { class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickListener {
@ -85,7 +88,9 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic
override fun onActionButtonClick(itemID: Long) { override fun onActionButtonClick(itemID: Long) {
val item = items.find { it.id == itemID } val item = items.find { it.id == itemID }
if (item != null){ if (item != null){
downloadViewModel.queueDownloads(listOf(item)) runBlocking {
downloadViewModel.queueDownloads(listOf(item))
}
}else{ }else{
Toast.makeText(requireContext(), getString(R.string.error_restarting_download), Toast.LENGTH_LONG).show() Toast.makeText(requireContext(), getString(R.string.error_restarting_download), Toast.LENGTH_LONG).show()
} }
@ -166,7 +171,9 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic
val redownload = bottomSheet.findViewById<Button>(R.id.bottomsheet_redownload_button) val redownload = bottomSheet.findViewById<Button>(R.id.bottomsheet_redownload_button)
redownload!!.tag = itemID redownload!!.tag = itemID
redownload.setOnClickListener{ redownload.setOnClickListener{
downloadViewModel.queueDownloads(listOf(item)) runBlocking {
downloadViewModel.queueDownloads(listOf(item))
}
bottomSheet.cancel() bottomSheet.cancel()
} }

View file

@ -17,6 +17,7 @@ import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -32,6 +33,8 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
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.chip.Chip
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.io.File import java.io.File
@ -168,7 +171,9 @@ class ErroredDownloadsFragment() : Fragment(), GenericDownloadAdapter.OnItemClic
val redownload = bottomSheet.findViewById<Button>(R.id.bottomsheet_redownload_button) val redownload = bottomSheet.findViewById<Button>(R.id.bottomsheet_redownload_button)
redownload!!.tag = itemID redownload!!.tag = itemID
redownload.setOnClickListener{ redownload.setOnClickListener{
downloadViewModel.queueDownloads(listOf(item)) runBlocking{
downloadViewModel.queueDownloads(listOf(item))
}
bottomSheet.cancel() bottomSheet.cancel()
} }

View file

@ -17,6 +17,7 @@ import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -40,6 +41,8 @@ import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.io.File import java.io.File
import java.text.DateFormat import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -473,7 +476,9 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
redownload!!.tag = itemID redownload!!.tag = itemID
redownload.setOnClickListener{ redownload.setOnClickListener{
val downloadItem = downloadViewModel.createDownloadItemFromHistory(item) val downloadItem = downloadViewModel.createDownloadItemFromHistory(item)
downloadViewModel.queueDownloads(listOf(downloadItem)) runBlocking{
downloadViewModel.queueDownloads(listOf(downloadItem))
}
historyViewModel.delete(item, false) historyViewModel.delete(item, false)
bottomSheet!!.cancel() bottomSheet!!.cancel()
} }

View file

@ -35,6 +35,7 @@ import com.google.android.material.chip.Chip
import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDL
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.w3c.dom.Text import org.w3c.dom.Text
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -144,7 +145,9 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi
downloadViewModel.deleteDownload(item) downloadViewModel.deleteDownload(item)
item.downloadStartTime = it.timeInMillis item.downloadStartTime = it.timeInMillis
WorkManager.getInstance(requireContext()).cancelUniqueWork(item.id.toString()) WorkManager.getInstance(requireContext()).cancelUniqueWork(item.id.toString())
downloadViewModel.queueDownloads(listOf(item)) runBlocking {
downloadViewModel.queueDownloads(listOf(item))
}
} }
} }
} }

View file

@ -80,6 +80,7 @@
android:ellipsize="end" android:ellipsize="end"
android:gravity="bottom" android:gravity="bottom"
android:maxLines="1" android:maxLines="1"
android:layout_marginTop="5dp"
android:paddingStart="10dp" android:paddingStart="10dp"
android:scrollbars="none" android:scrollbars="none"
android:paddingEnd="10dp" android:paddingEnd="10dp"