From 07b28729a63a6373e0c060d1394d635afe383c08 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 16 Apr 2023 00:05:06 +0200 Subject: [PATCH] updated active download card design --- .../ytdlnis/adapter/ActiveDownloadAdapter.kt | 40 +++- .../ytdlnis/adapter/HistoryAdapter.kt | 2 +- .../deniscerri/ytdlnis/adapter/HomeAdapter.kt | 4 +- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 13 +- .../ui/more/settings/SettingsFragment.kt | 21 ++- .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 23 ++- .../deniscerri/ytdlnis/work/DownloadWorker.kt | 4 +- .../drawable/baseline_manage_search_24.xml | 5 + .../main/res/layout/active_download_card.xml | 177 ++++++++++-------- .../res/layout/activity_download_queue.xml | 1 + app/src/main/res/layout/fragment_home.xml | 1 + app/src/main/res/layout/history_card.xml | 4 +- app/src/main/res/layout/result_card.xml | 6 +- .../main/res/layout/result_card_shimmer.xml | 2 +- app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values/arrays.xml | 28 +++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 22 +++ app/src/main/res/xml/root_preferences.xml | 37 ++-- 19 files changed, 266 insertions(+), 126 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_manage_search_24.xml diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt index b854f6ce..f263cf1d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt @@ -15,10 +15,15 @@ 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.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.util.FileUtil import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView +import com.google.android.material.chip.Chip import com.google.android.material.progressindicator.LinearProgressIndicator +import com.google.android.material.shape.CornerFamily +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel import com.squareup.picasso.Picasso class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { @@ -58,7 +63,7 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: } else { uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } } - thumbnail.setColorFilter(Color.argb(95, 0, 0, 0)) + thumbnail.setColorFilter(Color.argb(20, 0, 0, 0)) // PROGRESS BAR ---------------------------------------------------- val progressBar = card.findViewById(R.id.progress) @@ -83,12 +88,17 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: } author.text = info - val type = card.findViewById(R.id.type) - type.text = item.type.toString().uppercase() + val type = card.findViewById(R.id.download_type) + when(item.type){ + DownloadViewModel.Type.audio -> type.setIconResource(R.drawable.ic_music) + DownloadViewModel.Type.video -> type.setIconResource(R.drawable.ic_video) + DownloadViewModel.Type.command -> type.setIconResource(R.drawable.ic_terminal) + } - val formatNote = card.findViewById(R.id.format_note) + val formatNote = card.findViewById(R.id.format_note) formatNote.text = item.format.format_note - val codec = card.findViewById(R.id.codec) + + val codec = card.findViewById(R.id.codec) val codecText = if (item.format.encoding != "") { item.format.encoding.uppercase() @@ -104,10 +114,28 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: codec.text = codecText } - val fileSize = card.findViewById(R.id.file_size) + val fileSize = card.findViewById(R.id.file_size) fileSize.text = fileUtil.convertFileSize(item.format.filesize) if (fileSize.text == "?") fileSize.visibility = View.GONE + if (fileSize.visibility == View.VISIBLE && codec.visibility == View.GONE){ + fileSize.shapeAppearanceModel = ShapeAppearanceModel.builder() + .setTopRightCorner(CornerFamily.ROUNDED, 40F) + .setBottomRightCorner(CornerFamily.ROUNDED, 40F) + .setTopLeftCorner(CornerFamily.ROUNDED, 0F) + .setBottomLeftCorner(CornerFamily.ROUNDED, 0F) + .build() + } + + if (fileSize.visibility == View.GONE && codec.visibility == View.GONE){ + formatNote.shapeAppearanceModel = ShapeAppearanceModel.builder() + .setTopLeftCorner(CornerFamily.ROUNDED, 40F) + .setBottomLeftCorner(CornerFamily.ROUNDED, 40F) + .setTopRightCorner(CornerFamily.ROUNDED, 40F) + .setBottomRightCorner(CornerFamily.ROUNDED, 40F) + .build() + } + //OUTPUT val output = card.findViewById(R.id.output) output.tag = "${item.id}##output" 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 5afa0e34..1385ae62 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt @@ -65,7 +65,7 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit } else { uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } } - thumbnail.setColorFilter(Color.argb(95, 0, 0, 0)) + thumbnail.setColorFilter(Color.argb(20, 0, 0, 0)) // TITLE ---------------------------------- val itemTitle = card.findViewById(R.id.downloads_title) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt index 2061e678..105c4e8a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt @@ -56,11 +56,11 @@ class HomeAdapter(onItemClickListener: OnItemClickListener, activity: Activity) if (imageURL.isNotEmpty()) { val uiHandler = Handler(Looper.getMainLooper()) uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) } - thumbnail.setColorFilter(Color.argb(70, 0, 0, 0)) + thumbnail.setColorFilter(Color.argb(20, 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)) + thumbnail.setColorFilter(Color.argb(20, 0, 0, 0)) } // TITLE ---------------------------------- 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 aa7ba846..044d62f1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -7,6 +7,9 @@ import android.content.Context.CLIPBOARD_SERVICE import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.RippleDrawable import android.os.Bundle import android.os.Handler import android.os.Looper @@ -16,6 +19,7 @@ import android.view.View.* import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode +import androidx.appcompat.view.StandaloneActionMode import androidx.constraintlayout.widget.ConstraintLayout import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.children @@ -27,6 +31,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.deniscerri.ytdlnis.App import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.HomeAdapter @@ -497,7 +502,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi selectedObjects!!.add(item!!) if (actionMode == null){ actionMode = (getActivity() as AppCompatActivity?)!!.startSupportActionMode(contextualActionBar) - }else{ actionMode!!.title = "${selectedObjects!!.size} ${getString(R.string.selected)}" } @@ -537,9 +541,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { mode!!.menuInflater.inflate(R.menu.main_menu_context, menu) mode.title = "${selectedObjects!!.size} ${getString(R.string.selected)}" - (activity as MainActivity).disableBottomNavigation() - searchBar?.isEnabled = false + searchBar!!.isEnabled = false searchBar!!.menu.forEach { it.isEnabled = false } + (activity as MainActivity).disableBottomNavigation() return true } @@ -614,8 +618,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi actionMode = null (activity as MainActivity).enableBottomNavigation() clearCheckedItems() - searchBar?.isEnabled = true + searchBar!!.isEnabled = true searchBar!!.menu.forEach { it.isEnabled = true } + searchBar?.expand(searchBar!!.parent as AppBarLayout) } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt index cdeebb22..8d9cbe14 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt @@ -5,6 +5,7 @@ import android.content.Context.POWER_SERVICE import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Build.VERSION_CODES import android.os.Bundle import android.os.Environment import android.os.PowerManager @@ -64,6 +65,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private var updateYTDL: Preference? = null private var updateNightlyYTDL: SwitchPreferenceCompat? = null private var updateFormats: SwitchPreferenceCompat? = null + private var formatSource: ListPreference? = null private var updateApp: SwitchPreferenceCompat? = null private var exportPreferences : Preference? = null private var importPreferences : Preference? = null @@ -129,6 +131,7 @@ class SettingsFragment : PreferenceFragmentCompat() { updateYTDL = findPreference("update_ytdl") updateNightlyYTDL = findPreference("nightly_ytdl") updateFormats = findPreference("update_formats") + formatSource = findPreference("formats_source") updateApp = findPreference("update_app") exportPreferences = findPreference("export_preferences") importPreferences = findPreference("import_preferences") @@ -192,6 +195,7 @@ class SettingsFragment : PreferenceFragmentCompat() { editor.putString("video_quality", videoQuality!!.value) editor.putBoolean("nightly_ytdl", updateNightlyYTDL!!.isChecked) editor.putBoolean("update_formats", updateFormats!!.isChecked) + editor.putString("formats_source", formatSource!!.value) editor.putBoolean("update_app", updateApp!!.isChecked) editor.apply() } @@ -208,6 +212,7 @@ class SettingsFragment : PreferenceFragmentCompat() { language!!.summary = Locale(newValue.toString()).getDisplayLanguage(Locale(newValue.toString())) editor.apply() AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue.toString())) + if (Build.VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) requireActivity().recreate() true } @@ -420,19 +425,19 @@ class SettingsFragment : PreferenceFragmentCompat() { editor.apply() true } - audioFormat!!.summary = preferences.getString("audio_format", "") + audioFormat!!.summary = preferences.getString("audio_format", "")!!.replace("Default", getString(R.string.defaultValue)) audioFormat!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> editor.putString("audio_format", newValue.toString()) - audioFormat!!.summary = newValue.toString() + audioFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) editor.apply() true } - videoFormat!!.summary = preferences.getString("video_format", "") + videoFormat!!.summary = preferences.getString("video_format", "")!!.replace("Default", getString(R.string.defaultValue)) videoFormat!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> editor.putString("video_format", newValue.toString()) - videoFormat!!.summary = newValue.toString() + videoFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) editor.apply() true } @@ -483,6 +488,14 @@ class SettingsFragment : PreferenceFragmentCompat() { editor.apply() true } + formatSource!!.summary = preferences.getString("formats_source", "")!!.replace("Default", getString(R.string.defaultValue)) + formatSource!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> + editor.putString("formats_source", newValue.toString()) + formatSource!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) + editor.apply() + true + } updateNightlyYTDL!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> val enable = newValue as Boolean diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt index 8b230f0b..195dc306 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt @@ -2,6 +2,7 @@ package com.deniscerri.ytdlnis.util import android.app.Activity import android.content.Context +import android.content.SharedPreferences import android.os.Looper import android.util.Log import android.widget.Toast @@ -24,12 +25,13 @@ import java.util.regex.Pattern class InfoUtil(private val context: Context) { private var items: ArrayList + private lateinit var sharedPreferences: SharedPreferences private var key: String? = null private var useInvidous = false init { try { - val sharedPreferences = + sharedPreferences = context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) key = sharedPreferences.getString("api_key", "") } catch (e: Exception) { @@ -483,11 +485,10 @@ class InfoUtil(private val context: Context) { init() val p = Pattern.compile("^(https?)://(www.)?youtu(.be)?") val m = p.matcher(url) - return if(m.find() && useInvidous){ + val formatSource = sharedPreferences.getString("formats_source", context.getString(R.string.defaultValue))!! + return if(m.find() && useInvidous && formatSource == "Default"){ val id = getIDFromYoutubeURL(url) - Log.e("Aa", id) val res = genericRequest(invidousURL + "videos/" + id) - Log.e("aa", res.toString()) if (res.length() == 0) getFromYTDL(url)[0]!! else createVideofromInvidiousJSON( res @@ -556,9 +557,17 @@ class InfoUtil(private val context: Context) { val formats : ArrayList = ArrayList() if (formatsInJSON != null) { for (f in 0 until formatsInJSON.length()){ - val format = formatsInJSON.getJSONObject(f).toString() - val formatProper = Gson().fromJson(format, Format::class.java) - if (formatProper.filesize > 0) formats.add(formatProper) + val format = formatsInJSON.getJSONObject(f) + val formatProper = Gson().fromJson(format.toString(), Format::class.java) + if (formatProper.filesize > 0){ + if ( !formatProper.format_note.contains("audio only", true)) { + formatProper.format_note = format.getString("format_note") + }else{ + formatProper.format_note = "${format.getString("format_note")} audio" + } + formatProper.container = format.getString("ext") + formats.add(formatProper) + } } } Log.e("aa", formats.toString()) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt index 19f69225..3a758166 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt @@ -147,7 +147,7 @@ class DownloadWorker( request.addOption("-f", audioQualityId) val ext = downloadItem.format.container - if(ext != context.getString(R.string.defaultValue) && ext != "webm"){ + if(ext != "Default" && ext != "webm"){ val codec = when(downloadItem.format.container){ "aac" -> "aac" "mp3" -> "libmp3lame" @@ -220,7 +220,7 @@ class DownloadWorker( Log.e(TAG, formatArgument) request.addOption("-f", formatArgument) val format = downloadItem.format.container - if(format.isNotEmpty() && format != context.resources.getString(R.string.defaultValue)){ + if(format.isNotEmpty() && format != "Default"){ request.addOption("--merge-output-format", format) if (format != "webm") { val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false) diff --git a/app/src/main/res/drawable/baseline_manage_search_24.xml b/app/src/main/res/drawable/baseline_manage_search_24.xml new file mode 100644 index 00000000..c4e489d3 --- /dev/null +++ b/app/src/main/res/drawable/baseline_manage_search_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/active_download_card.xml b/app/src/main/res/layout/active_download_card.xml index bcd1ffe5..00b4ac28 100644 --- a/app/src/main/res/layout/active_download_card.xml +++ b/app/src/main/res/layout/active_download_card.xml @@ -1,5 +1,6 @@ @@ -46,95 +46,51 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full" /> + app:layout_constraintStart_toEndOf="@+id/download_type"> - - + android:paddingHorizontal="10dp" + app:chipSpacingHorizontal="0dp"> + + + + + + + + + + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/title_author" /> diff --git a/app/src/main/res/layout/activity_download_queue.xml b/app/src/main/res/layout/activity_download_queue.xml index 85349e0f..f1fcde10 100644 --- a/app/src/main/res/layout/activity_download_queue.xml +++ b/app/src/main/res/layout/activity_download_queue.xml @@ -65,6 +65,7 @@ diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index bd133437..13e10347 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -109,6 +109,7 @@ android:layout_height="wrap_content"> @@ -91,7 +91,7 @@ android:shadowDy="4" android:scrollbars="none" android:shadowRadius="1.5" - android:textColor="@color/white" + android:textColor="#FFF" android:textSize="12sp" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/result_card_shimmer.xml b/app/src/main/res/layout/result_card_shimmer.xml index 33786f9f..756a2c8d 100644 --- a/app/src/main/res/layout/result_card_shimmer.xml +++ b/app/src/main/res/layout/result_card_shimmer.xml @@ -13,7 +13,7 @@ android:id="@+id/result_shimmer_card_view" android:layout_width="match_parent" android:layout_height="match_parent" - app:cardCornerRadius="10dp" + app:cardCornerRadius="20dp" app:cardElevation="10dp" app:cardMaxElevation="12dp" app:cardBackgroundColor="@color/grey" diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index d96478cd..638c12c6 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,4 +1,5 @@ @android:color/background_dark + #000000 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 49125cf5..e1a9db2e 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -10,6 +10,17 @@ wav + + Default + mp3 + m4a + aac + alac + flac + opus + wav + + @string/defaultValue mp4 @@ -17,6 +28,13 @@ webm + + Default + mp4 + mkv + webm + + @string/worst_quality 360p @@ -97,4 +115,14 @@ 0.0 100.0 + + + @string/defaultValue + yt-dlp + + + + @string/defaultValue + yt-dlp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index afbb967d..7a49d8b5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,4 +211,5 @@ Save Subtitles Write subtitle file Subtitle languages + Formats Source \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6551f6b9..ac0b69b9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,6 +5,7 @@ ?attr/isLightTheme @android:color/transparent @android:color/transparent + true @style/ThemeOverlay.Material3.MaterialAlertDialog 28dp @@ -52,4 +53,25 @@ 5dp + + + + + + diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index d2db12e8..adf8a54d 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -212,18 +212,18 @@ app:title="@string/save_thumb" /> + + - + + + + + - + + + + +