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