From cc8614d1758933150e91492cd9721afa8c64dfbf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Denis=20=C3=87erri?=
<64997243+deniscerri@users.noreply.github.com>
Date: Sun, 5 Mar 2023 18:16:28 +0100
Subject: [PATCH] implemented processing multiple items from a playlist
---
.idea/assetWizardSettings.xml | 4 +-
.../ConfigureMultipleDownloadsAdapter.kt | 54 ++++--
.../ytdlnis/adapter/GenericDownloadAdapter.kt | 21 ++-
.../ytdlnis/adapter/PlaylistAdapter.kt | 136 +++++++++++++++
.../ytdlnis/database/dao/ResultDao.kt | 3 +
.../database/repository/ResultRepository.kt | 2 +-
.../database/viewmodel/DownloadViewModel.kt | 5 +
.../ytdlnis/receiver/ShareActivity.kt | 35 +++-
.../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 33 ++--
.../ConfigureDownloadBottomSheetDialog.kt | 39 +++--
.../ui/downloadcard/DownloadAudioFragment.kt | 39 ++---
.../downloadcard/DownloadBottomSheetDialog.kt | 4 +-
.../downloadcard/DownloadCommandFragment.kt | 19 ++-
.../DownloadMultipleBottomSheetDialog.kt | 159 ++++++++++++------
.../ui/downloadcard/DownloadVideoFragment.kt | 23 +--
.../SelectPlaylistItemsBottomSheetDialog.kt | 141 ++++++++++++++++
.../com/deniscerri/ytdlnis/util/FileUtil.kt | 115 +++++--------
app/src/main/res/drawable/ic_edit.xml | 4 +-
.../main/res/drawable/ic_edit_multiple.xml | 5 +
app/src/main/res/drawable/ic_folders.xml | 6 +
app/src/main/res/drawable/ic_select_all.xml | 5 +
.../configure_download_bottom_sheet.xml | 133 ++++++++-------
app/src/main/res/layout/download_card.xml | 151 +++++++++--------
.../layout/download_multiple_bottom_sheet.xml | 157 ++++++++---------
app/src/main/res/layout/playlist_item.xml | 40 +++++
.../main/res/layout/select_playlist_items.xml | 111 ++++++++++++
.../main/res/menu/download_multiple_menu.xml | 19 +++
app/src/main/res/values/strings.xml | 3 +
28 files changed, 999 insertions(+), 467 deletions(-)
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt
create mode 100644 app/src/main/res/drawable/ic_edit_multiple.xml
create mode 100644 app/src/main/res/drawable/ic_folders.xml
create mode 100644 app/src/main/res/drawable/ic_select_all.xml
create mode 100644 app/src/main/res/layout/playlist_item.xml
create mode 100644 app/src/main/res/layout/select_playlist_items.xml
create mode 100644 app/src/main/res/menu/download_multiple_menu.xml
diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
index c4888134..2bf15814 100644
--- a/.idea/assetWizardSettings.xml
+++ b/.idea/assetWizardSettings.xml
@@ -320,7 +320,7 @@
@@ -330,7 +330,7 @@
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt
index 7aba6433..700270e4 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt
@@ -25,6 +25,7 @@ import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.google.android.material.progressindicator.LinearProgressIndicator
import com.squareup.picasso.Picasso
+import okhttp3.internal.format
import java.util.*
class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) {
@@ -77,24 +78,45 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener
itemTitle.text = title
// Author ----------------------------------
- val author = card.findViewById(R.id.author)
+ val author = card.findViewById(R.id.subtitle)
author.text = item.author
- // Container ----------------------------------
- val container = card.findViewById(R.id.container)
- container.text = item.format.container.uppercase(Locale.getDefault())
+ // Format Note ----------------------------------
+ val formatNote = card.findViewById(R.id.format_note)
+ if (item.format.format_note.isNotEmpty()){
+ formatNote.text = item.format.format_note.uppercase(Locale.getDefault())
+ }else{
+ formatNote.visibility = View.GONE
+ }
- // File Size
- val fileSize = card.findViewById(R.id.filesize)
- val formattedSize = fileUtil.convertFileSize(item.format.filesize)
- fileSize.text = if (formattedSize == "?") "" else formattedSize.uppercase(Locale.getDefault())
+ val codec = card.findViewById(R.id.codec)
+ val codecText =
+ if (item.format.encoding != "") {
+ item.format.encoding.uppercase()
+ }else if (item.format.vcodec != "none" && item.format.vcodec != ""){
+ item.format.vcodec.uppercase()
+ } else {
+ item.format.acodec.uppercase()
+ }
+ if (codecText == "" || codecText == "none"){
+ codec.visibility = View.GONE
+ }else{
+ codec.visibility = View.VISIBLE
+ codec.text = codecText
+ }
- // Quality
- val quality = card.findViewById(R.id.quality)
- quality.text = item.format.format_note
+ val fileSize = card.findViewById(R.id.file_size)
+ Log.e("aa", item.format.filesize.toString())
+ val fileSizeReadable = fileUtil.convertFileSize(item.format.filesize)
+ Log.e("aa", fileSizeReadable)
+ if (fileSizeReadable == "?") fileSize.visibility = View.GONE
+ else {
+ fileSize.text = fileSizeReadable
+ fileSize.visibility = View.VISIBLE
+ }
// Type Icon Button
- val btn = card.findViewById(R.id.downloads_download_button_type)
+ val btn = card.findViewById(R.id.action_button)
when(item.type) {
DownloadViewModel.Type.audio -> {
@@ -109,23 +131,23 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener
}
card.setOnClickListener {
- onItemClickListener.onCardClick(item.id)
+ onItemClickListener.onCardClick(item.url)
}
}
interface OnItemClickListener {
fun onButtonClick(videoURL: String, type: String?)
- fun onCardClick(itemID: Long)
+ fun onCardClick(itemURL: String)
}
companion object {
private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean {
- return oldItem.id === newItem.id
+ return oldItem.url == newItem.url
}
override fun areContentsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean {
- return oldItem.url == newItem.url && oldItem.title == newItem.title && oldItem.author == newItem.author && oldItem.type == newItem.type && oldItem.format == newItem.format
+ return oldItem.title == newItem.title && oldItem.author == newItem.author && oldItem.type == newItem.type && oldItem.format == newItem.format
}
}
}
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt
index da27af79..19dc6035 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt
@@ -23,6 +23,7 @@ import com.deniscerri.ytdlnis.util.FileUtil
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.squareup.picasso.Picasso
+import okhttp3.internal.format
import java.io.File
import java.text.DateFormat
import java.text.SimpleDateFormat
@@ -48,7 +49,7 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val cardView = LayoutInflater.from(parent.context)
- .inflate(R.layout.generic_download_card, parent, false)
+ .inflate(R.layout.download_card, parent, false)
return ViewHolder(cardView, onItemClickListener)
}
@@ -56,6 +57,17 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
val item = getItem(position)
val card = holder.cardView
+ // THUMBNAIL ----------------------------------
+ val thumbnail = card.findViewById(R.id.downloads_image_view)
+ val imageURL = item!!.thumb
+ val uiHandler = Handler(Looper.getMainLooper())
+ if (imageURL.isNotEmpty()) {
+ uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) }
+ } else {
+ uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) }
+ }
+ thumbnail.setColorFilter(Color.argb(95, 0, 0, 0))
+
// TITLE ----------------------------------
val itemTitle = card.findViewById(R.id.title)
var title = item!!.title
@@ -64,12 +76,11 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
}
itemTitle.text = title
- // TITLE ----------------------------------
- val itemUrl = card.findViewById(R.id.url)
+ val itemUrl = card.findViewById(R.id.subtitle)
itemUrl.text = item.url
- val type = card.findViewById(R.id.type)
- type!!.text = item.type.toString().uppercase()
+ val formatNote = card.findViewById(R.id.format_note)
+ formatNote!!.text = item.format.format_note.uppercase()
val codec = card.findViewById(R.id.codec)
val codecText =
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt
new file mode 100644
index 00000000..84cd7657
--- /dev/null
+++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt
@@ -0,0 +1,136 @@
+package com.deniscerri.ytdlnis.adapter
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.graphics.Color
+import android.os.Handler
+import android.os.Looper
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.CheckBox
+import android.widget.CompoundButton
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.recyclerview.widget.AsyncDifferConfig
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.deniscerri.ytdlnis.R
+import com.deniscerri.ytdlnis.database.models.ResultItem
+import com.squareup.picasso.Picasso
+import java.util.*
+
+
+class PlaylistAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) {
+ private val checkedItems: ArrayList
+ private val onItemClickListener: OnItemClickListener
+ private val activity: Activity
+
+ init {
+ checkedItems = ArrayList()
+ this.onItemClickListener = onItemClickListener
+ this.activity = activity
+ }
+
+ class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) {
+ val cardView: ConstraintLayout
+
+ init {
+ cardView = itemView.findViewById(R.id.playlist_card_constraintLayout)
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val cardView = LayoutInflater.from(parent.context)
+ .inflate(R.layout.playlist_item, parent, false)
+ return ViewHolder(cardView, onItemClickListener)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val item = getItem(position)
+ val card = holder.cardView
+ // THUMBNAIL ----------------------------------
+ val thumbnail = card.findViewById(R.id.downloads_image_view)
+ val imageURL = item!!.thumb
+ val uiHandler = Handler(Looper.getMainLooper())
+ if (imageURL.isNotEmpty()) {
+ uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) }
+ } else {
+ uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) }
+ }
+ thumbnail.setColorFilter(Color.argb(95, 0, 0, 0))
+
+ // TITLE ----------------------------------
+ val itemTitle = card.findViewById(R.id.title)
+ var title = item.title
+ if (title.length > 100) {
+ title = title.substring(0, 40) + "..."
+ }
+ itemTitle.text = title
+
+ // CHECKBOX ----------------------------------
+ val check = card.findViewById(R.id.checkBox)
+ check.isChecked = checkedItems.contains(item.id)
+ check.setOnCheckedChangeListener { buttonView, isChecked ->
+ checkCard(isChecked, item.id)
+ }
+
+ card.setOnClickListener {
+ check.isChecked = !check.isChecked
+ }
+ }
+
+ private fun checkCard(isChecked: Boolean, itemID: Long) {
+ if (isChecked) {
+ checkedItems.add(itemID)
+ } else {
+ checkedItems.remove(itemID)
+ }
+ onItemClickListener.onCardSelect(itemID, isChecked, checkedItems)
+ }
+
+ interface OnItemClickListener {
+ fun onCardSelect(itemID: Long, isChecked: Boolean, checkedItems: List)
+ }
+
+ @SuppressLint("NotifyDataSetChanged")
+ fun clearCheckeditems() {
+ for (i in 0 until itemCount){
+ val item = getItem(i)
+ if (checkedItems.find { it == item?.id } != null){
+ checkedItems.remove(item?.id)
+ notifyItemChanged(i)
+ }
+ }
+ checkedItems.clear()
+ }
+
+ fun checkAll(){
+ checkedItems.clear()
+ for (i in 0 until itemCount){
+ val item = getItem(i)
+ checkedItems.add(item!!.id)
+ notifyItemChanged(i)
+ }
+ }
+
+ fun getCheckedItems() : List{
+ return checkedItems
+ }
+
+ companion object {
+ private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: ResultItem, newItem: ResultItem): Boolean {
+ val ranged = arrayListOf(oldItem.id, newItem.id)
+ return ranged[0] == ranged[1]
+ }
+
+ override fun areContentsTheSame(oldItem: ResultItem, newItem: ResultItem): Boolean {
+ return oldItem.id == newItem.id
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
index e72104c8..414ac66e 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
@@ -9,6 +9,9 @@ interface ResultDao {
@Query("SELECT * FROM results")
fun getResults() : LiveData>
+ @Query("SELECT COUNT(id) FROM results")
+ fun getCount() : LiveData
+
@Query("SELECT * FROM results LIMIT 1")
fun getFirstResult() : ResultItem
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt
index 98b65f0d..4953040c 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt
@@ -14,7 +14,7 @@ import com.deniscerri.ytdlnis.util.InfoUtil
class ResultRepository(private val resultDao: ResultDao, private val commandTemplateDao: CommandTemplateDao, private val context: Context) {
private val tag: String = "ResultRepository"
val allResults : LiveData> = resultDao.getResults()
- var itemCount = MutableLiveData(0)
+ var itemCount = MutableLiveData(-1)
suspend fun insert(it: ResultItem){
resultDao.insert(it)
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt
index b3cad490..5c8e15b6 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt
@@ -144,6 +144,11 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application
}
}
+ fun getLatestCommandTemplateAsFormat() : Format {
+ val t = commandTemplateDao.getFirst()
+ return Format(t.title, "", "", "", "", 0, t.content)
+ }
+
fun turnResultItemsToDownloadItems(items: List) : List {
val list : MutableList = mutableListOf()
items.forEach {
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt
index 606aba8c..9506b14a 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt
@@ -14,22 +14,29 @@ import android.os.Build
import android.os.Build.VERSION_CODES
import android.os.Bundle
import android.provider.Settings
+import android.view.View
+import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
+import android.widget.Button
import android.widget.TextView
-import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R
+import com.deniscerri.ytdlnis.adapter.PlaylistAdapter
+import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.models.ResultItem
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel
import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog
-import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.deniscerri.ytdlnis.ui.downloadcard.SelectPlaylistItemsBottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.CoroutineScope
@@ -111,7 +118,11 @@ class ShareActivity : AppCompatActivity() {
if (it.isNotEmpty() && supportFragmentManager.findFragmentByTag("downloadSingleSheet") == null){
if(resultViewModel.itemCount.value!! == it.size){
loadingBottomSheet.cancel()
- showDownloadSheet(it[0])
+ if (it.size == 1){
+ showDownloadSheet(it[0])
+ }else{
+ showSelectPlaylistItems(it)
+ }
}
}
}
@@ -130,6 +141,24 @@ class ShareActivity : AppCompatActivity() {
}
}
+ private fun showSelectPlaylistItems(it: List){
+ if (sharedPreferences.getBoolean("download_card", true)){
+ val bottomSheet = SelectPlaylistItemsBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!))
+ bottomSheet.show(supportFragmentManager, "downloadPlaylistSheet")
+ }else{
+ lifecycleScope.launch(Dispatchers.IO){
+ val downloadItems = mutableListOf()
+ it.forEach { res ->
+ val i = downloadViewModel.createDownloadItemFromResult(res, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!))
+ i.format = downloadViewModel.getLatestCommandTemplateAsFormat()
+ downloadItems.add(i)
+ }
+ downloadViewModel.queueDownloads(downloadItems)
+ }
+ this.finish()
+ }
+ }
+
private fun askPermissions() {
if (Build.VERSION.SDK_INT < VERSION_CODES.TIRAMISU && !checkFilePermission()) {
ActivityCompat.requestPermissions(
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt
index e4c44d3c..378d6e45 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt
@@ -134,8 +134,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
resultViewModel.items.observe(viewLifecycleOwner) {
homeAdapter!!.submitList(it)
resultsList = it
- Log.e(TAG, resultViewModel.itemCount.toString())
- if(resultViewModel.itemCount.value!! > 1){
+ if(resultViewModel.itemCount.value!! > 1 || resultViewModel.itemCount.value!! == -1){
if (it[0].playlistTitle.isNotEmpty() && it[0].playlistTitle != getString(R.string.trendingPlaylist)){
downloadAllFabCoordinator!!.visibility = VISIBLE
}else{
@@ -388,30 +387,20 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
if (viewIdName.isNotEmpty()) {
if (viewIdName == "downloadSelected") {
val downloadList = downloadViewModel.turnResultItemsToDownloadItems(selectedObjects!!)
- downloadViewModel.putDownloadsForProcessing(selectedObjects!!, downloadList).observe(viewLifecycleOwner) {
- it.forEachIndexed { i, itemID ->
- downloadList[i].id = itemID
- }
- if (sharedPreferences!!.getBoolean("download_card", true)) {
- val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList)
- bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
- } else {
- downloadViewModel.queueDownloads(downloadList)
- }
+ if (sharedPreferences!!.getBoolean("download_card", true)) {
+ val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList())
+ bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
+ } else {
+ downloadViewModel.queueDownloads(downloadList)
}
}
if (viewIdName == "downloadAll") {
val downloadList = downloadViewModel.turnResultItemsToDownloadItems(resultsList!!)
- downloadViewModel.putDownloadsForProcessing(resultsList!!, downloadList).observe(viewLifecycleOwner) {
- it.forEachIndexed { i, itemID ->
- downloadList[i].id = itemID
- }
- if (sharedPreferences!!.getBoolean("download_card", true)) {
- val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList)
- bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
- } else {
- downloadViewModel.queueDownloads(downloadList)
- }
+ if (sharedPreferences!!.getBoolean("download_card", true)) {
+ val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList())
+ bottomSheet.show(parentFragmentManager, "downloadMultipleSheet")
+ } else {
+ downloadViewModel.queueDownloads(downloadList)
}
}
}
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt
index a9248a27..aa0d26dd 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt
@@ -9,7 +9,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
-import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
@@ -20,31 +19,33 @@ import com.deniscerri.ytdlnis.database.dao.CommandTemplateDao
import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.models.ResultItem
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
+import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type
import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel
+import com.google.android.exoplayer2.Player
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import com.google.android.material.button.MaterialButton
import com.google.android.material.tabs.TabLayout
-import com.google.gson.Gson
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
-import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type
import kotlinx.coroutines.withContext
-class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, private val type: Type) : BottomSheetDialogFragment() {
+
+class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, private val downloadItem: DownloadItem, private val listener: OnDownloadItemUpdateListener) : BottomSheetDialogFragment() {
private lateinit var tabLayout: TabLayout
private lateinit var viewPager2: ViewPager2
private lateinit var fragmentAdapter : DownloadFragmentAdapter
private lateinit var downloadViewModel: DownloadViewModel
private lateinit var resultViewModel: ResultViewModel
private lateinit var commandTemplateDao: CommandTemplateDao
+ private lateinit var onDownloadItemUpdateListener: OnDownloadItemUpdateListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java]
resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java]
commandTemplateDao = DBManager.getInstance(requireContext()).commandTemplateDao
+ onDownloadItemUpdateListener = listener
+
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -63,13 +64,13 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri
tabLayout = view.findViewById(R.id.download_tablayout)
viewPager2 = view.findViewById(R.id.download_viewpager)
- val fragments = mutableListOf(DownloadAudioFragment(resultItem), DownloadVideoFragment(resultItem))
+ val fragments = mutableListOf(DownloadAudioFragment(resultItem, downloadItem), DownloadVideoFragment(resultItem, downloadItem))
lifecycleScope.launch{
withContext(Dispatchers.IO){
val nr = commandTemplateDao.getTotalNumber()
if(nr > 0){
- fragments.add(DownloadCommandFragment(resultItem))
+ fragments.add(DownloadCommandFragment(resultItem, downloadItem))
}else{
(tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isEnabled = false
}
@@ -77,7 +78,6 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri
}
-
val fragmentManager = parentFragmentManager
fragmentAdapter = DownloadFragmentAdapter(
resultItem,
@@ -88,7 +88,7 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri
viewPager2.adapter = fragmentAdapter
viewPager2.isSaveFromParentEnabled = false
- when(type) {
+ when(downloadItem.type) {
Type.audio -> {
tabLayout.selectTab(tabLayout.getTabAt(0))
viewPager2.setCurrentItem(0, false)
@@ -99,7 +99,9 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri
}
else -> {
tabLayout.selectTab(tabLayout.getTabAt(2))
- viewPager2.setCurrentItem(2, false)
+ viewPager2.postDelayed( {
+ viewPager2.setCurrentItem(2, false)
+ }, 200)
}
}
@@ -121,11 +123,7 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri
}
})
-
- val cancelBtn = view.findViewById(R.id.bottomsheet_cancel_button)
- cancelBtn.setOnClickListener{
- dismiss()
- }
+ viewPager2.setPageTransformer(BackgroundToForegroundPageTransformer())
val ok = view.findViewById