From 33c081d1321b99bf2fa97a0a2e88cbcccf8b5050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C3=87erri?= <64997243+deniscerri@users.noreply.github.com> Date: Sat, 11 Mar 2023 15:07:06 +0100 Subject: [PATCH] added download type toggle in download multiple card --- .idea/assetWizardSettings.xml | 4 +- .../1.json | 12 +- .../ConfigureMultipleDownloadsAdapter.kt | 3 +- .../ytdlnis/adapter/HistoryAdapter.kt | 3 +- .../ytdlnis/database/models/DownloadItem.kt | 1 + .../repository/CommandTemplateRepository.kt | 4 + .../viewmodel/CommandTemplateViewModel.kt | 4 + .../database/viewmodel/DownloadViewModel.kt | 44 +++++- .../ytdlnis/receiver/ShareActivity.kt | 18 ++- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 6 +- .../ui/downloadcard/DownloadAudioFragment.kt | 18 ++- .../downloadcard/DownloadCommandFragment.kt | 41 ++--- .../DownloadMultipleBottomSheetDialog.kt | 85 ++++++++++- .../ui/downloadcard/DownloadVideoFragment.kt | 15 +- .../deniscerri/ytdlnis/work/DownloadWorker.kt | 4 +- .../res/drawable/baseline_audio_file_24.xml | 5 + .../baseline_insert_drive_file_24.xml | 5 + .../res/drawable/baseline_video_file_24.xml | 5 + app/src/main/res/layout/download_card.xml | 2 + .../main/res/layout/download_type_sheet.xml | 92 +++++++++++ app/src/main/res/layout/history_card.xml | 143 +++++++++--------- .../history_item_details_bottom_sheet.xml | 13 +- .../main/res/menu/download_multiple_menu.xml | 6 +- app/src/main/res/values/arrays.xml | 6 +- 24 files changed, 384 insertions(+), 155 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_audio_file_24.xml create mode 100644 app/src/main/res/drawable/baseline_insert_drive_file_24.xml create mode 100644 app/src/main/res/drawable/baseline_video_file_24.xml create mode 100644 app/src/main/res/layout/download_type_sheet.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index cce47b52..86615f01 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -320,7 +320,7 @@ @@ -330,7 +330,7 @@ diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json index 86981c48..4802bbce 100644 --- a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json +++ b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "6d6dea309a9207aaaedcc2a745ae2a2a", + "identityHash": "f602a089dee877374642352ffd4fa6bb", "entities": [ { "tableName": "results", @@ -160,7 +160,7 @@ }, { "tableName": "downloads", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `thumb` TEXT NOT NULL, `duration` TEXT NOT NULL, `type` TEXT NOT NULL, `format` TEXT NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `downloadSize` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `audioPreferences` TEXT NOT NULL, `videoPreferences` TEXT NOT NULL, `customFileNameTemplate` TEXT NOT NULL, `SaveThumb` INTEGER NOT NULL, `status` TEXT NOT NULL DEFAULT 'Queued', `downloadStartTime` INTEGER NOT NULL DEFAULT 0)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `thumb` TEXT NOT NULL, `duration` TEXT NOT NULL, `type` TEXT NOT NULL, `format` TEXT NOT NULL, `allFormats` TEXT NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `downloadSize` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `audioPreferences` TEXT NOT NULL, `videoPreferences` TEXT NOT NULL, `customFileNameTemplate` TEXT NOT NULL, `SaveThumb` INTEGER NOT NULL, `status` TEXT NOT NULL DEFAULT 'Queued', `downloadStartTime` INTEGER NOT NULL DEFAULT 0)", "fields": [ { "fieldPath": "id", @@ -210,6 +210,12 @@ "affinity": "TEXT", "notNull": true }, + { + "fieldPath": "allFormats", + "columnName": "allFormats", + "affinity": "TEXT", + "notNull": true + }, { "fieldPath": "downloadPath", "columnName": "downloadPath", @@ -370,7 +376,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6d6dea309a9207aaaedcc2a745ae2a2a')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f602a089dee877374642352ffd4fa6bb')" ] } } \ No newline at end of file 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 70c81d6c..6e507a33 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt @@ -80,6 +80,7 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener val formatNote = card.findViewById(R.id.format_note) if (item.format.format_note.isNotEmpty()){ formatNote.text = item.format.format_note.uppercase(Locale.getDefault()) + formatNote.visibility = View.VISIBLE }else{ formatNote.visibility = View.GONE } @@ -119,7 +120,7 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) } else -> { - btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_baseline_keyboard_arrow_right_24) + btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_terminal) } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt index 58a3bef7..3c141bfb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt @@ -112,8 +112,7 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit datetime.text = relativeTime // BUTTON ---------------------------------- - val buttonLayout = card.findViewById(R.id.downloads_download_button_layout) - val btn = buttonLayout.findViewById(R.id.downloads_download_button_type) + val btn = card.findViewById(R.id.downloads_download_button_type) var filePresent = true //IS IN THE FILE SYSTEM? diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt index bf2416a2..d8e4d3fb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt @@ -16,6 +16,7 @@ data class DownloadItem( val duration: String, var type: DownloadViewModel.Type, var format: Format, + val allFormats: ArrayList, var downloadPath: String, val website: String, val downloadSize: String, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt index d873c68f..e53bfbd3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt @@ -13,6 +13,10 @@ class CommandTemplateRepository(private val commandDao: CommandTemplateDao) { return commandDao.getAllTemplates(); } + fun getTotalNumber() : Int { + return commandDao.getTotalNumber() + } + fun getItem(id: Long) : CommandTemplate { return commandDao.getTemplate(id) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt index 325a7c95..e2176126 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt @@ -38,6 +38,10 @@ class CommandTemplateViewModel(private val application: Application) : AndroidVi return repository.getAll() } + fun getTotalNumber(): Int { + return repository.getTotalNumber() + } + fun insert(item: CommandTemplate) = viewModelScope.launch(Dispatchers.IO) { repository.insert(item) } 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 dfe61888..0450839a 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 @@ -21,6 +21,7 @@ import com.deniscerri.ytdlnis.work.DownloadWorker import com.google.gson.Gson import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.util.concurrent.TimeUnit class DownloadViewModel(application: Application) : AndroidViewModel(application) { @@ -55,7 +56,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application erroredDownloads = repository.erroredDownloads val videoFormat = getApplication().resources.getStringArray(R.array.video_formats) - val videoContainer = sharedPreferences.getString("video_format", "Default") + val videoContainer = sharedPreferences.getString("video_format", getApplication().resources.getString(R.string.defaultValue)) bestVideoFormat = Format( videoFormat[videoFormat.lastIndex], videoContainer!!, @@ -113,12 +114,22 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application resultItem.thumb, resultItem.duration, type, - getFormat(resultItem, type), + getFormat(resultItem.formats, type), + resultItem.formats, downloadPath!!, resultItem.website, "", resultItem.playlistTitle, audioPreferences, videoPreferences,customFileNameTemplate!!, saveThumb, DownloadRepository.Status.Processing.toString(), 0 ) } + fun switchDownloadType(list: List, type: Type) : List{ + list.forEach { + val format = getFormat(it.allFormats, type) + it.format = format + it.type = type + } + return list + } + fun createDownloadItemFromHistory(historyItem: HistoryItem) : DownloadItem { val embedSubs = sharedPreferences.getBoolean("embed_subtitles", false) val addChapters = sharedPreferences.getBoolean("add_chapters", false) @@ -143,30 +154,51 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application historyItem.duration, historyItem.type, historyItem.format, + ArrayList(), downloadPath!!, historyItem.website, "", "", audioPreferences, videoPreferences,customFileNameTemplate!!, saveThumb, DownloadRepository.Status.Processing.toString(), 0 ) } - private fun getFormat(resultItem: ResultItem?, type: Type) : Format { + private fun getFormat(formats: List, type: Type) : Format { when(type) { Type.audio -> { return try { - resultItem!!.formats.last { it.format_note.contains("audio", ignoreCase = true) } + formats.last { it.format_note.contains("audio", ignoreCase = true) } }catch (e: Exception){ bestAudioFormat } } Type.video -> { return try { - resultItem!!.formats.last { !it.format_note.contains("audio", ignoreCase = true) } + val qualityPreference = sharedPreferences.getString("video_quality", getApplication().resources.getString(R.string.best_quality)) + if (qualityPreference == getApplication().resources.getString(R.string.worst_quality)){ + formats.first { !it.format_note.contains("audio", ignoreCase = true) } + } + if (qualityPreference == getApplication().resources.getString(R.string.best_quality)){ + formats.last { !it.format_note.contains("audio", ignoreCase = true) } + } + try{ + formats.last { format -> format.format_note.contains(qualityPreference!!.substring(0, qualityPreference.length -1)) } + }catch (e: Exception){ + formats.last { !it.format_note.contains("audio", ignoreCase = true) } + } }catch (e: Exception){ bestVideoFormat } } else -> { - return Format() + val c = commandTemplateDao.getFirst() + return Format( + c.title, + "", + "", + "", + "", + 0, + c.content + ) } } } 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 2b5358be..7227292e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -132,8 +132,10 @@ class ShareActivity : AppCompatActivity() { val bottomSheet = DownloadBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!)) bottomSheet.show(supportFragmentManager, "downloadSingleSheet") }else{ - val downloadItem = downloadViewModel.createDownloadItemFromResult(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!)) - downloadViewModel.queueDownloads(listOf(downloadItem)) + lifecycleScope.launch(Dispatchers.IO){ + val downloadItem = downloadViewModel.createDownloadItemFromResult(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!)) + downloadViewModel.queueDownloads(listOf(downloadItem)) + } this.finish() } } @@ -145,12 +147,14 @@ class ShareActivity : AppCompatActivity() { }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) + lifecycleScope.launch(Dispatchers.IO){ + 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) } - downloadViewModel.queueDownloads(downloadItems) } this.finish() } 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 35a4427c..9a356030 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -328,8 +328,10 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi if (sharedPreferences!!.getBoolean("download_card", true)) { showSingleDownloadSheet(item!!, type!!) } else { - val downloadItem = downloadViewModel.createDownloadItemFromResult(item!!, type!!) - downloadViewModel.queueDownloads(listOf(downloadItem)) + lifecycleScope.launch(Dispatchers.IO){ + val downloadItem = downloadViewModel.createDownloadItemFromResult(item!!, type!!) + downloadViewModel.queueDownloads(listOf(downloadItem)) + } } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt index a14f4dc0..6078fc88 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt @@ -32,7 +32,9 @@ import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.chip.Chip import com.google.android.material.textfield.TextInputLayout import com.google.gson.Gson +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class DownloadAudioFragment(private var resultItem: ResultItem, private var currentDownloadItem: DownloadItem?) : Fragment() { @@ -57,14 +59,6 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr fragmentView = inflater.inflate(R.layout.fragment_download_audio, container, false) activity = getActivity() downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] - - downloadItem = if (currentDownloadItem != null && currentDownloadItem!!.type == Type.audio){ - val string = Gson().toJson(currentDownloadItem, DownloadItem::class.java) - Gson().fromJson(string, DownloadItem::class.java) - }else{ - downloadViewModel.createDownloadItemFromResult(resultItem, Type.audio) - } - fileUtil = FileUtil() uiUtil = UiUtil(fileUtil) return fragmentView @@ -73,6 +67,14 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launch { + downloadItem = withContext(Dispatchers.IO) { + if (currentDownloadItem != null && currentDownloadItem!!.type == Type.audio){ + val string = Gson().toJson(currentDownloadItem, DownloadItem::class.java) + Gson().fromJson(string, DownloadItem::class.java) + }else{ + downloadViewModel.createDownloadItemFromResult(resultItem, Type.audio) + } + } val sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt index 8b3deb8f..b02cd4e5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt @@ -58,14 +58,6 @@ class DownloadCommandFragment(private val resultItem: ResultItem, private var cu activity = getActivity() downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] - - downloadItem = if (currentDownloadItem != null && currentDownloadItem!!.type == DownloadViewModel.Type.command){ - val string = Gson().toJson(currentDownloadItem, DownloadItem::class.java) - Gson().fromJson(string, DownloadItem::class.java) - }else{ - downloadViewModel.createDownloadItemFromResult(resultItem, DownloadViewModel.Type.command) - } - fileUtil = FileUtil() uiUtil = UiUtil(fileUtil) return fragmentView @@ -75,25 +67,34 @@ class DownloadCommandFragment(private val resultItem: ResultItem, private var cu override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launch { + downloadItem = withContext(Dispatchers.IO){ + if (currentDownloadItem != null && currentDownloadItem!!.type == DownloadViewModel.Type.command){ + val string = Gson().toJson(currentDownloadItem, DownloadItem::class.java) + Gson().fromJson(string, DownloadItem::class.java) + }else{ + downloadViewModel.createDownloadItemFromResult(resultItem, DownloadViewModel.Type.command) + } + } + val sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) try { val templates : MutableList = withContext(Dispatchers.IO){ commandTemplateViewModel.getAll().toMutableList() } - val id = sharedPreferences.getLong("commandTemplate", templates[0].id) - val chosenCommand = templates.find { it.id == id } - downloadItem.format = Format( - chosenCommand!!.title, - "", - "", - "", - "", - 0, - chosenCommand.content - ) +// val id = sharedPreferences.getLong("commandTemplate", templates[0].id) +// val chosenCommand = templates.find { it.id == id } +// downloadItem.format = Format( +// chosenCommand!!.title, +// "", +// "", +// "", +// "", +// 0, +// chosenCommand.content +// ) val chosenCommandView = view.findViewById(R.id.content) - chosenCommandView.editText!!.setText(chosenCommand.content) + chosenCommandView.editText!!.setText(downloadItem.format.format_note) chosenCommandView.endIconDrawable = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_delete_all) chosenCommandView.editText!!.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt index 57bb1463..76606695 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt @@ -8,25 +8,29 @@ import android.content.Intent import android.os.Bundle import android.util.DisplayMetrics import android.util.Log -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View +import android.view.* import android.widget.Button +import android.widget.LinearLayout +import android.widget.TextView import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.ConfigureMultipleDownloadsAdapter +import com.deniscerri.ytdlnis.database.models.CommandTemplate import com.deniscerri.ytdlnis.database.models.DownloadItem +import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.receiver.ShareActivity import com.deniscerri.ytdlnis.util.FileUtil import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton import com.google.android.material.datepicker.CalendarConstraints @@ -39,9 +43,10 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* -class DownloadMultipleBottomSheetDialog(private val items: MutableList) : BottomSheetDialogFragment(), ConfigureMultipleDownloadsAdapter.OnItemClickListener, View.OnClickListener, +class DownloadMultipleBottomSheetDialog(private var items: MutableList) : BottomSheetDialogFragment(), ConfigureMultipleDownloadsAdapter.OnItemClickListener, View.OnClickListener, ConfigureDownloadBottomSheetDialog.OnDownloadItemUpdateListener { private lateinit var downloadViewModel: DownloadViewModel + private lateinit var commandTemplateViewModel: CommandTemplateViewModel private lateinit var resultViewModel: ResultViewModel private lateinit var listAdapter : ConfigureMultipleDownloadsAdapter private lateinit var recyclerView: RecyclerView @@ -53,6 +58,7 @@ class DownloadMultipleBottomSheetDialog(private val items: MutableList(R.id.bottomAppBar) + val preferredDownloadType = bottomAppBar.menu.findItem(R.id.preferred_download_type) + when(items.first().type){ + DownloadViewModel.Type.audio -> { + preferredDownloadType.setIcon(R.drawable.baseline_audio_file_24) + } + DownloadViewModel.Type.video -> { + preferredDownloadType.setIcon(R.drawable.baseline_video_file_24) + + } + DownloadViewModel.Type.command -> { + preferredDownloadType.setIcon(R.drawable.baseline_insert_drive_file_24) + } + } + bottomAppBar!!.setOnMenuItemClickListener { m: MenuItem -> val itemId = m.itemId if (itemId == R.id.folder) { @@ -144,7 +164,61 @@ class DownloadMultipleBottomSheetDialog(private val items: MutableList(R.id.audio) + val video = bottomSheet.findViewById(R.id.video) + val command = bottomSheet.findViewById(R.id.command) + + + withContext(Dispatchers.IO){ + val nr = commandTemplateViewModel.getTotalNumber() + if(nr == 0){ + command!!.visibility = View.GONE + }else{ + command!!.visibility = View.VISIBLE + } + } + + audio!!.setOnClickListener { + items = downloadViewModel.switchDownloadType(items, DownloadViewModel.Type.audio).toMutableList() + listAdapter.submitList(items.toList()) + listAdapter.notifyDataSetChanged() + preferredDownloadType.setIcon(R.drawable.baseline_audio_file_24) + bottomSheet.cancel() + } + + video!!.setOnClickListener { + items = downloadViewModel.switchDownloadType(items, DownloadViewModel.Type.video).toMutableList() + listAdapter.submitList(items.toList()) + listAdapter.notifyDataSetChanged() + preferredDownloadType.setIcon(R.drawable.baseline_video_file_24) + bottomSheet.cancel() + } + + command!!.setOnClickListener { + lifecycleScope.launch { + items = withContext(Dispatchers.IO){ + downloadViewModel.switchDownloadType(items, DownloadViewModel.Type.command).toMutableList() + } + listAdapter.submitList(items.toList()) + listAdapter.notifyDataSetChanged() + preferredDownloadType.setIcon(R.drawable.baseline_insert_drive_file_24) + bottomSheet.cancel() + } + } + + bottomSheet.show() + bottomSheet.window!!.setLayout( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } } true @@ -197,7 +271,6 @@ class DownloadMultipleBottomSheetDialog(private val items: MutableList + + diff --git a/app/src/main/res/drawable/baseline_insert_drive_file_24.xml b/app/src/main/res/drawable/baseline_insert_drive_file_24.xml new file mode 100644 index 00000000..7b6a50fc --- /dev/null +++ b/app/src/main/res/drawable/baseline_insert_drive_file_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/baseline_video_file_24.xml b/app/src/main/res/drawable/baseline_video_file_24.xml new file mode 100644 index 00000000..2904fb5a --- /dev/null +++ b/app/src/main/res/drawable/baseline_video_file_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/download_card.xml b/app/src/main/res/layout/download_card.xml index 67d7380f..4458c202 100644 --- a/app/src/main/res/layout/download_card.xml +++ b/app/src/main/res/layout/download_card.xml @@ -48,6 +48,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="2" + android:scrollbars="none" android:paddingTop="10dp" android:paddingEnd="10dp" android:shadowColor="@color/black" @@ -65,6 +66,7 @@ android:ellipsize="end" android:gravity="bottom" android:maxLines="1" + android:scrollbars="none" android:paddingEnd="10dp" android:paddingBottom="5dp" android:shadowColor="@color/black" diff --git a/app/src/main/res/layout/download_type_sheet.xml b/app/src/main/res/layout/download_type_sheet.xml new file mode 100644 index 00000000..aec21095 --- /dev/null +++ b/app/src/main/res/layout/download_type_sheet.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/history_card.xml b/app/src/main/res/layout/history_card.xml index 0547d5b4..fe32e84c 100644 --- a/app/src/main/res/layout/history_card.xml +++ b/app/src/main/res/layout/history_card.xml @@ -1,5 +1,5 @@ - + app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="match_parent"> - + - - + - + + app:cornerRadius="10dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.2" /> + + - diff --git a/app/src/main/res/layout/history_item_details_bottom_sheet.xml b/app/src/main/res/layout/history_item_details_bottom_sheet.xml index 88d4ae0a..048cb6aa 100644 --- a/app/src/main/res/layout/history_item_details_bottom_sheet.xml +++ b/app/src/main/res/layout/history_item_details_bottom_sheet.xml @@ -75,7 +75,7 @@ android:layout_marginStart="20dp" android:layout_height="wrap_content"> - - + diff --git a/app/src/main/res/menu/download_multiple_menu.xml b/app/src/main/res/menu/download_multiple_menu.xml index e51d5ef7..f7f5993b 100644 --- a/app/src/main/res/menu/download_multiple_menu.xml +++ b/app/src/main/res/menu/download_multiple_menu.xml @@ -10,9 +10,9 @@ app:showAsAction="collapseActionView|ifRoom"/> diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 4903f8be..87d4dd74 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -18,14 +18,14 @@ - Worst Quality + @string/worst_quality 360p 480p 720p 1080p 1440p 2160p - Best Quality + @string/best_quality @@ -88,4 +88,6 @@ video command + Worst Quality + Best Quality \ No newline at end of file