From 5fed145313decae5606cbafbc67777a66511e80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C3=87erri?= <64997243+deniscerri@users.noreply.github.com> Date: Sat, 4 Mar 2023 18:13:22 +0100 Subject: [PATCH] fixed bugs with custom command and other small things --- .idea/assetWizardSettings.xml | 4 +- .../adapter/CancelledDownloadAdapter.kt | 144 -------------- ...adAdapter.kt => GenericDownloadAdapter.kt} | 88 ++++----- .../ytdlnis/adapter/HistoryAdapter.kt | 4 +- .../ytdlnis/adapter/QueuedDownloadAdapter.kt | 144 -------------- .../ytdlnis/adapter/TemplatesAdapter.kt | 10 +- .../deniscerri/ytdlnis/ui/HistoryFragment.kt | 56 ++---- .../CancelledDownloadsFragment.kt | 151 ++++++++++++--- .../ui/downloadqueue/DownloadQueueActivity.kt | 23 --- .../downloadqueue/ErroredDownloadsFragment.kt | 144 +++++++++++--- .../downloadqueue/QueuedDownloadsFragment.kt | 127 +++++++++--- .../ytdlnis/ui/more/TerminalActivity.kt | 25 +-- .../more/downloadLogs/DownloadLogActivity.kt | 20 +- .../com/deniscerri/ytdlnis/util/UiUtil.kt | 35 ++++ .../deniscerri/ytdlnis/work/DownloadWorker.kt | 16 +- app/src/main/res/drawable/ic_copy.xml | 5 + .../main/res/layout/activity_download_log.xml | 19 +- app/src/main/res/layout/activity_terminal.xml | 3 +- .../main/res/layout/command_template_item.xml | 40 ++-- .../layout/download_details_bottom_sheet.xml | 183 ++++++++++++++++++ .../res/layout/fragment_download_command.xml | 2 +- ...oad_card.xml => generic_download_card.xml} | 116 +++++------ .../main/res/layout/template_shortcuts.xml | 2 +- app/src/main/res/values/strings.xml | 4 + 24 files changed, 765 insertions(+), 600 deletions(-) delete mode 100644 app/src/main/java/com/deniscerri/ytdlnis/adapter/CancelledDownloadAdapter.kt rename app/src/main/java/com/deniscerri/ytdlnis/adapter/{ErroredDownloadAdapter.kt => GenericDownloadAdapter.kt} (59%) delete mode 100644 app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt create mode 100644 app/src/main/res/drawable/ic_copy.xml create mode 100644 app/src/main/res/layout/download_details_bottom_sheet.xml rename app/src/main/res/layout/{queued_download_card.xml => generic_download_card.xml} (75%) diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index b16f267c..c4888134 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/CancelledDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/CancelledDownloadAdapter.kt deleted file mode 100644 index 810ca3aa..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CancelledDownloadAdapter.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.deniscerri.ytdlnis.adapter - -import android.annotation.SuppressLint -import android.app.Activity -import android.graphics.Color -import android.graphics.ColorMatrix -import android.graphics.ColorMatrixColorFilter -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.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.core.content.ContextCompat -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.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -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 org.w3c.dom.Text -import java.io.File -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.* - -class CancelledDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { - private val onItemClickListener: OnItemClickListener - private val activity: Activity - private var fileUtil: FileUtil - - init { - this.onItemClickListener = onItemClickListener - this.activity = activity - fileUtil = FileUtil() - } - - class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { - val cardView: MaterialCardView - init { - cardView = itemView.findViewById(R.id.queued_download_card_view) - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val cardView = LayoutInflater.from(parent.context) - .inflate(R.layout.queued_download_card, 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.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 - - val formatNote = card.findViewById(R.id.format_note) - formatNote.text = item.format.format_note - 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 - } - - val fileSize = card.findViewById(R.id.file_size) - fileSize.text = fileUtil.convertFileSize(item.format.filesize) - val downloadStartTime = card.findViewById(R.id.time) - val time = item.downloadStartTime - if (time == 0L) { - downloadStartTime.visibility = View.GONE - } else { - downloadStartTime.visibility = View.VISIBLE - val cal = Calendar.getInstance() - val date = Date(time * 1000L) - cal.time = date - val day = cal[Calendar.DAY_OF_MONTH] - val month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()) - val year = cal[Calendar.YEAR] - val formatter: DateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) - val timeString = formatter.format(date) - downloadStartTime.text = "$day $month $year - $timeString" - } - - // CANCEL BUTTON ---------------------------------- - val cancelButton = card.findViewById(R.id.queued_download_cancel) - if (cancelButton.hasOnClickListeners()) cancelButton.setOnClickListener(null) - - cancelButton.setOnClickListener { - onItemClickListener.onQueuedCancelClick(item.id) - } - - } - interface OnItemClickListener { - fun onQueuedCancelClick(itemID: Long) - } - - companion object { - private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean { - val ranged = arrayListOf(oldItem.id, newItem.id) - return ranged[0] == ranged[1] - } - - override fun areContentsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean { - return oldItem.url == newItem.url && oldItem.format.format_id == newItem.format.format_id - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ErroredDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt similarity index 59% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/ErroredDownloadAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt index 66022f3a..920968e2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ErroredDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt @@ -1,39 +1,33 @@ package com.deniscerri.ytdlnis.adapter -import android.annotation.SuppressLint import android.app.Activity import android.graphics.Color -import android.graphics.ColorMatrix -import android.graphics.ColorMatrixColorFilter 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.ImageView -import android.widget.LinearLayout import android.widget.TextView -import androidx.core.content.ContextCompat +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.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem +import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdlnis.ui.downloadcard.DownloadVideoFragment 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 org.w3c.dom.Text -import java.io.File import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* -class ErroredDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private var fileUtil: FileUtil @@ -47,40 +41,43 @@ class ErroredDownloadAdapter(onItemClickListener: OnItemClickListener, activity: class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { val cardView: MaterialCardView init { - cardView = itemView.findViewById(R.id.queued_download_card_view) + cardView = itemView.findViewById(R.id.download_card_view) } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val cardView = LayoutInflater.from(parent.context) - .inflate(R.layout.queued_download_card, parent, false) + .inflate(R.layout.generic_download_card, 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.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 + var title = item!!.title if (title.length > 100) { title = title.substring(0, 40) + "..." } itemTitle.text = title + // TITLE ---------------------------------- + val itemUrl = card.findViewById(R.id.url) + 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 + if (item.type == DownloadViewModel.Type.command){ + formatNote.visibility = View.GONE + }else{ + formatNote.text = item.format.format_note + } + + val codec = card.findViewById(R.id.codec) val codecText = if (item.format.encoding != "") { @@ -98,35 +95,34 @@ class ErroredDownloadAdapter(onItemClickListener: OnItemClickListener, activity: } val fileSize = card.findViewById(R.id.file_size) - fileSize.text = fileUtil.convertFileSize(item.format.filesize) - val downloadStartTime = card.findViewById(R.id.time) - val time = item.downloadStartTime - if (time == 0L) { - downloadStartTime.visibility = View.GONE - } else { - downloadStartTime.visibility = View.VISIBLE - val cal = Calendar.getInstance() - val date = Date(time * 1000L) - cal.time = date - val day = cal[Calendar.DAY_OF_MONTH] - val month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()) - val year = cal[Calendar.YEAR] - val formatter: DateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) - val timeString = formatter.format(date) - downloadStartTime.text = "$day $month $year - $timeString" + val fileSizeReadable = fileUtil.convertFileSize(item.format.filesize) + if (fileSizeReadable == "?") fileSize.visibility = View.GONE + else fileSize.text = fileSizeReadable + + // ACTION BUTTON ---------------------------------- + val actionButton = card.findViewById(R.id.action_button) + if (actionButton.hasOnClickListeners()) actionButton.setOnClickListener(null) + + when(item.status){ + DownloadRepository.Status.Cancelled.toString() -> actionButton.setIconResource(R.drawable.ic_refresh) + DownloadRepository.Status.Queued.toString() -> actionButton.setIconResource(R.drawable.ic_baseline_delete_outline_24) + else -> actionButton.setIconResource(R.drawable.ic_baseline_file_open_24) } - // CANCEL BUTTON ---------------------------------- - val cancelButton = card.findViewById(R.id.queued_download_cancel) - if (cancelButton.hasOnClickListeners()) cancelButton.setOnClickListener(null) - cancelButton.setOnClickListener { - onItemClickListener.onQueuedCancelClick(item.id) + + actionButton.setOnClickListener { + onItemClickListener.onActionButtonClick(item.id) + } + + card.setOnClickListener { + onItemClickListener.onCardClick(item.id) } } interface OnItemClickListener { - fun onQueuedCancelClick(itemID: Long) + fun onActionButtonClick(itemID: Long) + fun onCardClick(itemID: Long) } companion object { 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 f93c9a07..41e57f1b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt @@ -124,8 +124,10 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit } if (item.type == DownloadViewModel.Type.audio) { if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music) - } else { + } else if (item.type == DownloadViewModel.Type.video) { if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) + }else{ + btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_terminal) } if (btn.hasOnClickListeners()) btn.setOnClickListener(null) if (checkedItems.contains(item.id)) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt deleted file mode 100644 index 86d7cc69..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.deniscerri.ytdlnis.adapter - -import android.annotation.SuppressLint -import android.app.Activity -import android.graphics.Color -import android.graphics.ColorMatrix -import android.graphics.ColorMatrixColorFilter -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.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.core.content.ContextCompat -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.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -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 org.w3c.dom.Text -import java.io.File -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.* - -class QueuedDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { - private val onItemClickListener: OnItemClickListener - private val activity: Activity - private var fileUtil: FileUtil - - init { - this.onItemClickListener = onItemClickListener - this.activity = activity - fileUtil = FileUtil() - } - - class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { - val cardView: MaterialCardView - init { - cardView = itemView.findViewById(R.id.queued_download_card_view) - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val cardView = LayoutInflater.from(parent.context) - .inflate(R.layout.queued_download_card, 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.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 - - val formatNote = card.findViewById(R.id.format_note) - formatNote.text = item.format.format_note - 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 - } - - val fileSize = card.findViewById(R.id.file_size) - fileSize.text = fileUtil.convertFileSize(item.format.filesize) - val downloadStartTime = card.findViewById(R.id.time) - val time = item.downloadStartTime - if (time == 0L) { - downloadStartTime.visibility = View.GONE - } else { - downloadStartTime.visibility = View.VISIBLE - val cal = Calendar.getInstance() - val date = Date(time * 1000L) - cal.time = date - val day = cal[Calendar.DAY_OF_MONTH] - val month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()) - val year = cal[Calendar.YEAR] - val formatter: DateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) - val timeString = formatter.format(date) - downloadStartTime.text = "$day $month $year - $timeString" - } - - // CANCEL BUTTON ---------------------------------- - val cancelButton = card.findViewById(R.id.queued_download_cancel) - if (cancelButton.hasOnClickListeners()) cancelButton.setOnClickListener(null) - - cancelButton.setOnClickListener { - onItemClickListener.onQueuedCancelClick(item.id) - } - - } - interface OnItemClickListener { - fun onQueuedCancelClick(itemID: Long) - } - - companion object { - private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean { - val ranged = arrayListOf(oldItem.id, newItem.id) - return ranged[0] == ranged[1] - } - - override fun areContentsTheSame(oldItem: DownloadItem, newItem: DownloadItem): Boolean { - return oldItem.url == newItem.url && oldItem.format.format_id == newItem.format.format_id - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt index 0a38af8a..f569001c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt @@ -47,11 +47,11 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ val content = card.findViewById(R.id.content) content.text = item?.content - val check = card.findViewById