From d3887dd7d99f52d03e0dbf3f9699677bd3e600d2 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 19 Mar 2023 16:25:37 +0100 Subject: [PATCH] added restrict filenames preference and changed download card design --- .idea/assetWizardSettings.xml | 4 +- app/src/main/AndroidManifest.xml | 4 +- .../ConfigureMultipleDownloadsAdapter.kt | 27 +- .../ytdlnis/adapter/GenericDownloadAdapter.kt | 18 +- .../ytdlnis/adapter/PlaylistAdapter.kt | 4 + .../database/viewmodel/DownloadViewModel.kt | 36 ++- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 32 ++- .../SelectPlaylistItemsBottomSheetDialog.kt | 3 +- .../ui/more/settings/SettingsFragment.kt | 10 + .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 3 + .../deniscerri/ytdlnis/work/DownloadWorker.kt | 10 +- .../main/res/drawable/ic_arrow_outward.xml | 14 + app/src/main/res/drawable/ic_restore.xml | 5 + app/src/main/res/drawable/if_file_rename.xml | 5 + .../main/res/layout/active_download_card.xml | 45 ++-- app/src/main/res/layout/download_card.xml | 253 ++++++++++-------- .../layout/download_multiple_bottom_sheet.xml | 3 +- app/src/main/res/layout/format_item.xml | 6 +- app/src/main/res/layout/playlist_item.xml | 118 ++++++-- .../res/layout/search_suggestion_item.xml | 2 +- .../main/res/layout/select_playlist_items.xml | 22 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles.xml | 5 + app/src/main/res/xml/more_preferences.xml | 2 +- app/src/main/res/xml/root_preferences.xml | 8 + 25 files changed, 399 insertions(+), 242 deletions(-) create mode 100644 app/src/main/res/drawable/ic_arrow_outward.xml create mode 100644 app/src/main/res/drawable/ic_restore.xml create mode 100644 app/src/main/res/drawable/if_file_rename.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index f7074742..d4b9a7f2 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -320,7 +320,7 @@ @@ -330,7 +330,7 @@ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 50fd1f2b..6ea0ccf4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -101,10 +101,10 @@ android:configChanges="layoutDirection|locale" android:theme="@style/AppDefaultTheme" android:parentActivityName=".MainActivity" - android:label="@string/run_command" + android:label="@string/terminal" android:exported="true"> - + 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 6e507a33..cb2f2663 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt @@ -1,12 +1,12 @@ package com.deniscerri.ytdlnis.adapter import android.app.Activity -import android.graphics.Color import android.os.Handler import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat @@ -26,16 +26,16 @@ import java.util.* class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity - private val fileUtil: FileUtil + private var fileUtil: FileUtil init { this.onItemClickListener = onItemClickListener this.activity = activity - this.fileUtil = FileUtil() + fileUtil = FileUtil() } class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { - val cardView: MaterialCardView + val cardView: FrameLayout init { cardView = itemView.findViewById(R.id.download_card_view) @@ -54,16 +54,16 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener // THUMBNAIL ---------------------------------- val thumbnail = card.findViewById(R.id.downloads_image_view) val imageURL = item!!.thumb + val uiHandler = Handler(Looper.getMainLooper()) if (imageURL.isNotEmpty()) { - val uiHandler = Handler(Looper.getMainLooper()) uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) } - thumbnail.setColorFilter(Color.argb(70, 0, 0, 0)) } else { - val uiHandler = Handler(Looper.getMainLooper()) uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } - thumbnail.setColorFilter(Color.argb(70, 0, 0, 0)) } + val duration = card.findViewById(R.id.duration) + duration.text = item.duration + // TITLE ---------------------------------- val itemTitle = card.findViewById(R.id.title) var title = item.title @@ -72,10 +72,6 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener } itemTitle.text = title - // Author ---------------------------------- - val author = card.findViewById(R.id.subtitle) - author.text = item.author - // Format Note ---------------------------------- val formatNote = card.findViewById(R.id.format_note) if (item.format.format_note.isNotEmpty()){ @@ -111,16 +107,17 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener // Type Icon Button val btn = card.findViewById(R.id.action_button) + if (btn.hasOnClickListeners()) btn.setOnClickListener(null) when(item.type) { DownloadViewModel.Type.audio -> { - btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music) + btn.setIconResource(R.drawable.ic_music) } DownloadViewModel.Type.video -> { - btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) + btn.setIconResource(R.drawable.ic_video) } else -> { - btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_terminal) + btn.setIconResource(R.drawable.ic_terminal) } } 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 2e9a69aa..a54f7cf4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt @@ -7,6 +7,7 @@ import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.AsyncDifferConfig @@ -35,7 +36,7 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: } class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { - val cardView: MaterialCardView + val cardView: FrameLayout init { cardView = itemView.findViewById(R.id.download_card_view) } @@ -60,25 +61,24 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: } else { uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } } - thumbnail.setColorFilter(Color.argb(95, 0, 0, 0)) + + val duration = card.findViewById(R.id.duration) + duration.text = item.duration // 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 - val itemUrl = card.findViewById(R.id.subtitle) - itemUrl.text = item.url - - val formatNote = card.findViewById(R.id.format_note) + val formatNote = card.findViewById(R.id.format_note) if (item.format.format_note == "?" || item.format.format_note == "") formatNote!!.visibility = View.GONE else formatNote!!.text = item.format.format_note.uppercase() - val codec = card.findViewById(R.id.codec) + val codec = card.findViewById(R.id.codec) val codecText = if (item.format.encoding != "") { item.format.encoding.uppercase() @@ -94,7 +94,7 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: codec.text = codecText } - val fileSize = card.findViewById(R.id.file_size) + val fileSize = card.findViewById(R.id.file_size) val fileSizeReadable = fileUtil.convertFileSize(item.format.filesize) if (fileSizeReadable == "?") fileSize.visibility = View.GONE else fileSize.text = fileSizeReadable diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt index 55bbdf96..58b4d754 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt @@ -69,6 +69,10 @@ class PlaylistAdapter(onItemClickListener: OnItemClickListener, activity: Activi } itemTitle.text = title + + val duration = card.findViewById(R.id.duration) + duration.text = item.duration + // CHECKBOX ---------------------------------- val check = card.findViewById(R.id.checkBox) check.isChecked = checkedItems.contains(item.url) 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 346eadb1..fee1f914 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 @@ -37,6 +37,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application private var bestVideoFormat : Format private var bestAudioFormat : Format + private var defaultVideoFormats : MutableList enum class Type { audio, video, command } @@ -57,15 +58,22 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application val videoFormat = getApplication().resources.getStringArray(R.array.video_formats) val videoContainer = sharedPreferences.getString("video_format", getApplication().resources.getString(R.string.defaultValue)) - bestVideoFormat = Format( - videoFormat[videoFormat.lastIndex], - videoContainer!!, - "", - "", - "", - 0, - videoFormat[videoFormat.lastIndex] - ) + + defaultVideoFormats = mutableListOf() + videoFormat.forEach { + val tmp = Format( + it, + videoContainer!!, + "", + "", + "", + 0, + it + ) + defaultVideoFormats.add(tmp) + } + + bestVideoFormat = defaultVideoFormats.last() val audioContainer = sharedPreferences.getString("audio_format", "mp3") bestAudioFormat = Format( @@ -172,17 +180,19 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application } Type.video -> { return try { + val theFormats = formats.ifEmpty { defaultVideoFormats } + 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) } + theFormats.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) } + theFormats.last { !it.format_note.contains("audio", ignoreCase = true) } } try{ - formats.last { format -> format.format_note.contains(qualityPreference!!.substring(0, qualityPreference.length -1)) } + theFormats.last { format -> format.format_note.contains(qualityPreference!!.substring(0, qualityPreference.length - 1)) } }catch (e: Exception){ - formats.last { !it.format_note.contains("audio", ignoreCase = true) } + theFormats.last { !it.format_note.contains("audio", ignoreCase = true) } } }catch (e: Exception){ bestVideoFormat 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 05f50667..f3781438 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -266,7 +266,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi .inflate(R.layout.search_suggestion_item, null) val textView = v.findViewById(R.id.suggestion_text) textView.text = suggestions[i] - textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_refresh, 0, 0, 0) + textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_restore, 0, 0, 0) Handler(Looper.getMainLooper()).post { searchHistoryLinearLayout!!.addView( v @@ -291,6 +291,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi val mb = v.findViewById(R.id.set_search_query_button) mb.setOnClickListener { searchView.setText(textView.text) + searchView.editText.setSelection(searchView.editText.length()) } } searchHistoryLinearLayout!!.visibility = VISIBLE @@ -315,6 +316,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi val mb = v.findViewById(R.id.set_search_query_button) mb.setOnClickListener { searchView.setText(textView.text) + searchView.editText.setSelection(searchView.editText.length()) } } searchSuggestionsLinearLayout!!.visibility = VISIBLE @@ -437,23 +439,27 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } catch (e: Exception) {""} if (viewIdName.isNotEmpty()) { if (viewIdName == "downloadSelected") { - val downloadList = downloadViewModel.turnResultItemsToDownloadItems(selectedObjects!!) - if (sharedPreferences!!.getBoolean("download_card", true)) { - val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) - bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") - } else { - lifecycleScope.launch { + lifecycleScope.launch { + val downloadList = withContext(Dispatchers.IO){ + downloadViewModel.turnResultItemsToDownloadItems(selectedObjects!!) + } + 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!!) - if (sharedPreferences!!.getBoolean("download_card", true)) { - val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) - bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") - } else { - lifecycleScope.launch { + lifecycleScope.launch { + val downloadList = withContext(Dispatchers.IO){ + downloadViewModel.turnResultItemsToDownloadItems(resultsList!!) + } + 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/SelectPlaylistItemsBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt index 1b004565..f8566c8a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt @@ -22,6 +22,7 @@ import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.receiver.ShareActivity import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.* @@ -74,7 +75,7 @@ class SelectPlaylistItemsBottomSheetDialog(private val items: List, selectedText = view.findViewById