updated active download card design

This commit is contained in:
deniscerri 2023-04-16 00:05:06 +02:00
parent ad6237d128
commit 07b28729a6
No known key found for this signature in database
GPG key ID: 95C43D517D830350
19 changed files with 266 additions and 126 deletions

View file

@ -15,10 +15,15 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.FileUtil
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView 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.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 import com.squareup.picasso.Picasso
class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter<DownloadItem?, ActiveDownloadAdapter.ViewHolder>(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter<DownloadItem?, ActiveDownloadAdapter.ViewHolder>(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) {
@ -58,7 +63,7 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
} else { } else {
uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } 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 ---------------------------------------------------- // PROGRESS BAR ----------------------------------------------------
val progressBar = card.findViewById<LinearProgressIndicator>(R.id.progress) val progressBar = card.findViewById<LinearProgressIndicator>(R.id.progress)
@ -83,12 +88,17 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
} }
author.text = info author.text = info
val type = card.findViewById<TextView>(R.id.type) val type = card.findViewById<MaterialButton>(R.id.download_type)
type.text = item.type.toString().uppercase() 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<TextView>(R.id.format_note) val formatNote = card.findViewById<Chip>(R.id.format_note)
formatNote.text = item.format.format_note formatNote.text = item.format.format_note
val codec = card.findViewById<TextView>(R.id.codec)
val codec = card.findViewById<Chip>(R.id.codec)
val codecText = val codecText =
if (item.format.encoding != "") { if (item.format.encoding != "") {
item.format.encoding.uppercase() item.format.encoding.uppercase()
@ -104,10 +114,28 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity:
codec.text = codecText codec.text = codecText
} }
val fileSize = card.findViewById<TextView>(R.id.file_size) val fileSize = card.findViewById<Chip>(R.id.file_size)
fileSize.text = fileUtil.convertFileSize(item.format.filesize) fileSize.text = fileUtil.convertFileSize(item.format.filesize)
if (fileSize.text == "?") fileSize.visibility = View.GONE 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 //OUTPUT
val output = card.findViewById<TextView>(R.id.output) val output = card.findViewById<TextView>(R.id.output)
output.tag = "${item.id}##output" output.tag = "${item.id}##output"

View file

@ -65,7 +65,7 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit
} else { } else {
uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } 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 ---------------------------------- // TITLE ----------------------------------
val itemTitle = card.findViewById<TextView>(R.id.downloads_title) val itemTitle = card.findViewById<TextView>(R.id.downloads_title)

View file

@ -56,11 +56,11 @@ class HomeAdapter(onItemClickListener: OnItemClickListener, activity: Activity)
if (imageURL.isNotEmpty()) { if (imageURL.isNotEmpty()) {
val uiHandler = Handler(Looper.getMainLooper()) val uiHandler = Handler(Looper.getMainLooper())
uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) } 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 { } else {
val uiHandler = Handler(Looper.getMainLooper()) val uiHandler = Handler(Looper.getMainLooper())
uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } 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 ---------------------------------- // TITLE ----------------------------------

View file

@ -7,6 +7,9 @@ import android.content.Context.CLIPBOARD_SERVICE
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Color 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.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@ -16,6 +19,7 @@ import android.view.View.*
import android.widget.* import android.widget.*
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.appcompat.view.StandaloneActionMode
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.children import androidx.core.view.children
@ -27,6 +31,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.App
import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.HomeAdapter import com.deniscerri.ytdlnis.adapter.HomeAdapter
@ -497,7 +502,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
selectedObjects!!.add(item!!) selectedObjects!!.add(item!!)
if (actionMode == null){ if (actionMode == null){
actionMode = (getActivity() as AppCompatActivity?)!!.startSupportActionMode(contextualActionBar) actionMode = (getActivity() as AppCompatActivity?)!!.startSupportActionMode(contextualActionBar)
}else{ }else{
actionMode!!.title = "${selectedObjects!!.size} ${getString(R.string.selected)}" 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 { override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
mode!!.menuInflater.inflate(R.menu.main_menu_context, menu) mode!!.menuInflater.inflate(R.menu.main_menu_context, menu)
mode.title = "${selectedObjects!!.size} ${getString(R.string.selected)}" mode.title = "${selectedObjects!!.size} ${getString(R.string.selected)}"
(activity as MainActivity).disableBottomNavigation() searchBar!!.isEnabled = false
searchBar?.isEnabled = false
searchBar!!.menu.forEach { it.isEnabled = false } searchBar!!.menu.forEach { it.isEnabled = false }
(activity as MainActivity).disableBottomNavigation()
return true return true
} }
@ -614,8 +618,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi
actionMode = null actionMode = null
(activity as MainActivity).enableBottomNavigation() (activity as MainActivity).enableBottomNavigation()
clearCheckedItems() clearCheckedItems()
searchBar?.isEnabled = true searchBar!!.isEnabled = true
searchBar!!.menu.forEach { it.isEnabled = true } searchBar!!.menu.forEach { it.isEnabled = true }
searchBar?.expand(searchBar!!.parent as AppBarLayout)
} }
} }

View file

@ -5,6 +5,7 @@ import android.content.Context.POWER_SERVICE
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Build.VERSION_CODES
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.os.PowerManager import android.os.PowerManager
@ -64,6 +65,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
private var updateYTDL: Preference? = null private var updateYTDL: Preference? = null
private var updateNightlyYTDL: SwitchPreferenceCompat? = null private var updateNightlyYTDL: SwitchPreferenceCompat? = null
private var updateFormats: SwitchPreferenceCompat? = null private var updateFormats: SwitchPreferenceCompat? = null
private var formatSource: ListPreference? = null
private var updateApp: SwitchPreferenceCompat? = null private var updateApp: SwitchPreferenceCompat? = null
private var exportPreferences : Preference? = null private var exportPreferences : Preference? = null
private var importPreferences : Preference? = null private var importPreferences : Preference? = null
@ -129,6 +131,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
updateYTDL = findPreference("update_ytdl") updateYTDL = findPreference("update_ytdl")
updateNightlyYTDL = findPreference("nightly_ytdl") updateNightlyYTDL = findPreference("nightly_ytdl")
updateFormats = findPreference("update_formats") updateFormats = findPreference("update_formats")
formatSource = findPreference("formats_source")
updateApp = findPreference("update_app") updateApp = findPreference("update_app")
exportPreferences = findPreference("export_preferences") exportPreferences = findPreference("export_preferences")
importPreferences = findPreference("import_preferences") importPreferences = findPreference("import_preferences")
@ -192,6 +195,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
editor.putString("video_quality", videoQuality!!.value) editor.putString("video_quality", videoQuality!!.value)
editor.putBoolean("nightly_ytdl", updateNightlyYTDL!!.isChecked) editor.putBoolean("nightly_ytdl", updateNightlyYTDL!!.isChecked)
editor.putBoolean("update_formats", updateFormats!!.isChecked) editor.putBoolean("update_formats", updateFormats!!.isChecked)
editor.putString("formats_source", formatSource!!.value)
editor.putBoolean("update_app", updateApp!!.isChecked) editor.putBoolean("update_app", updateApp!!.isChecked)
editor.apply() editor.apply()
} }
@ -208,6 +212,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
language!!.summary = Locale(newValue.toString()).getDisplayLanguage(Locale(newValue.toString())) language!!.summary = Locale(newValue.toString()).getDisplayLanguage(Locale(newValue.toString()))
editor.apply() editor.apply()
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue.toString())) AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue.toString()))
if (Build.VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) requireActivity().recreate()
true true
} }
@ -420,19 +425,19 @@ class SettingsFragment : PreferenceFragmentCompat() {
editor.apply() editor.apply()
true true
} }
audioFormat!!.summary = preferences.getString("audio_format", "") audioFormat!!.summary = preferences.getString("audio_format", "")!!.replace("Default", getString(R.string.defaultValue))
audioFormat!!.onPreferenceChangeListener = audioFormat!!.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
editor.putString("audio_format", newValue.toString()) editor.putString("audio_format", newValue.toString())
audioFormat!!.summary = newValue.toString() audioFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue))
editor.apply() editor.apply()
true true
} }
videoFormat!!.summary = preferences.getString("video_format", "") videoFormat!!.summary = preferences.getString("video_format", "")!!.replace("Default", getString(R.string.defaultValue))
videoFormat!!.onPreferenceChangeListener = videoFormat!!.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
editor.putString("video_format", newValue.toString()) editor.putString("video_format", newValue.toString())
videoFormat!!.summary = newValue.toString() videoFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue))
editor.apply() editor.apply()
true true
} }
@ -483,6 +488,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
editor.apply() editor.apply()
true 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 = updateNightlyYTDL!!.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
val enable = newValue as Boolean val enable = newValue as Boolean

View file

@ -2,6 +2,7 @@ package com.deniscerri.ytdlnis.util
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
@ -24,12 +25,13 @@ import java.util.regex.Pattern
class InfoUtil(private val context: Context) { class InfoUtil(private val context: Context) {
private var items: ArrayList<ResultItem?> private var items: ArrayList<ResultItem?>
private lateinit var sharedPreferences: SharedPreferences
private var key: String? = null private var key: String? = null
private var useInvidous = false private var useInvidous = false
init { init {
try { try {
val sharedPreferences = sharedPreferences =
context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE)
key = sharedPreferences.getString("api_key", "") key = sharedPreferences.getString("api_key", "")
} catch (e: Exception) { } catch (e: Exception) {
@ -483,11 +485,10 @@ class InfoUtil(private val context: Context) {
init() init()
val p = Pattern.compile("^(https?)://(www.)?youtu(.be)?") val p = Pattern.compile("^(https?)://(www.)?youtu(.be)?")
val m = p.matcher(url) 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) val id = getIDFromYoutubeURL(url)
Log.e("Aa", id)
val res = genericRequest(invidousURL + "videos/" + id) val res = genericRequest(invidousURL + "videos/" + id)
Log.e("aa", res.toString())
if (res.length() == 0) getFromYTDL(url)[0]!! if (res.length() == 0) getFromYTDL(url)[0]!!
else createVideofromInvidiousJSON( else createVideofromInvidiousJSON(
res res
@ -556,9 +557,17 @@ class InfoUtil(private val context: Context) {
val formats : ArrayList<Format> = ArrayList() val formats : ArrayList<Format> = ArrayList()
if (formatsInJSON != null) { if (formatsInJSON != null) {
for (f in 0 until formatsInJSON.length()){ for (f in 0 until formatsInJSON.length()){
val format = formatsInJSON.getJSONObject(f).toString() val format = formatsInJSON.getJSONObject(f)
val formatProper = Gson().fromJson(format, Format::class.java) val formatProper = Gson().fromJson(format.toString(), Format::class.java)
if (formatProper.filesize > 0) formats.add(formatProper) 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()) Log.e("aa", formats.toString())

View file

@ -147,7 +147,7 @@ class DownloadWorker(
request.addOption("-f", audioQualityId) request.addOption("-f", audioQualityId)
val ext = downloadItem.format.container 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){ val codec = when(downloadItem.format.container){
"aac" -> "aac" "aac" -> "aac"
"mp3" -> "libmp3lame" "mp3" -> "libmp3lame"
@ -220,7 +220,7 @@ class DownloadWorker(
Log.e(TAG, formatArgument) Log.e(TAG, formatArgument)
request.addOption("-f", formatArgument) request.addOption("-f", formatArgument)
val format = downloadItem.format.container 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) request.addOption("--merge-output-format", format)
if (format != "webm") { if (format != "webm") {
val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false) val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false)

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:colorAccent" android:pathData="M7,9H2V7h5V9zM7,12H2v2h5V12zM20.59,19l-3.83,-3.83C15.96,15.69 15.02,16 14,16c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5c0,1.02 -0.31,1.96 -0.83,2.75L22,17.59L20.59,19zM17,11c0,-1.65 -1.35,-3 -3,-3s-3,1.35 -3,3s1.35,3 3,3S17,12.65 17,11zM2,19h10v-2H2V19z"/>
</vector>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/downloads_card_constraintLayout" android:id="@+id/downloads_card_constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -18,7 +19,7 @@
android:id="@+id/active_download_card_view" android:id="@+id/active_download_card_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:cardCornerRadius="10dp" app:cardCornerRadius="20dp"
app:cardElevation="10dp" app:cardElevation="10dp"
app:cardMaxElevation="12dp" app:cardMaxElevation="12dp"
android:checkable="true" android:checkable="true"
@ -30,7 +31,6 @@
android:id="@+id/image_view" android:id="@+id/image_view"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:foreground="@drawable/image_gradient_shape"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
@ -46,95 +46,51 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <com.google.android.material.button.MaterialButton
android:id="@+id/title_author" android:id="@+id/download_type"
android:layout_width="0dp" style="?attr/materialIconButtonFilledTonalStyle"
android:layout_height="0dp" app:backgroundTint="?attr/colorSurface"
android:orientation="vertical" android:layout_width="32dp"
android:dividerPadding="5dp" android:layout_height="32dp"
app:layout_constraintBottom_toTopOf="@+id/linearlayout2_horizontalscrollview" android:layout_margin="10dp"
app:layout_constraintEnd_toStartOf="@+id/active_download_cancel" android:insetLeft="0dp"
android:insetTop="0dp"
android:insetRight="0dp"
android:insetBottom="0dp"
app:icon="@drawable/ic_music"
app:iconPadding="0dp"
app:iconSize="13dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent"
app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:maxLines="1"
android:ellipsize="end"
android:paddingEnd="10dp"
android:paddingStart="10dp"
android:textSize="17sp"
android:textColor="@color/white"
android:textStyle="bold"
android:shadowRadius="2"
android:shadowDx="4"
android:shadowDy="4"
android:shadowColor="@color/black" />
<TextView
android:id="@+id/author"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:maxLines="1"
android:ellipsize="end"
android:paddingEnd="10dp"
android:paddingBottom="5dp"
android:paddingStart="10dp"
android:textSize="12sp"
android:textColor="@color/white"
android:textStyle="bold"
android:shadowRadius="1.5"
android:shadowDx="4"
android:shadowDy="4"
android:shadowColor="@color/black" />
</LinearLayout>
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier"
app:barrierDirection="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="title_author,active_download_cancel"/>
<HorizontalScrollView <HorizontalScrollView
android:id="@+id/linearlayout2_horizontalscrollview" android:id="@+id/linearlayout2_horizontalscrollview"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_marginStart="10dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="10dp"
android:scrollbars="none" android:scrollbars="none"
app:layout_constraintBottom_toTopOf="@+id/title_author"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@+id/download_type">
app:layout_constraintTop_toBottomOf="@+id/barrier">
<com.google.android.material.chip.ChipGroup <com.google.android.material.chip.ChipGroup
android:id="@+id/linearLayout2" android:id="@+id/linearLayout2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="center_vertical|end"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingHorizontal="10dp"> android:paddingHorizontal="10dp"
app:chipSpacingHorizontal="0dp">
<com.google.android.material.chip.Chip
android:id="@+id/type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
app:chipMinTouchTargetSize="0dp"
app:layout_constraintBottom_toTopOf="@+id/output"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.chip.Chip <com.google.android.material.chip.Chip
android:id="@+id/format_note" android:id="@+id/format_note"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="false" android:clickable="false"
app:chipStrokeWidth="0.5dp"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Chip.RoundedStart"
android:textSize="11sp"
app:chipMinTouchTargetSize="0dp" app:chipMinTouchTargetSize="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -145,7 +101,10 @@
android:id="@+id/codec" android:id="@+id/codec"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Chip.Middle"
android:clickable="false" android:clickable="false"
app:chipStrokeWidth="0.5dp"
android:textSize="11sp"
app:chipMinTouchTargetSize="0dp" app:chipMinTouchTargetSize="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -153,9 +112,12 @@
<com.google.android.material.chip.Chip <com.google.android.material.chip.Chip
android:id="@+id/file_size" android:id="@+id/file_size"
app:chipStrokeWidth="0.5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Chip.RoundedEnd"
android:clickable="false" android:clickable="false"
android:textSize="11sp"
app:chipMinTouchTargetSize="0dp" app:chipMinTouchTargetSize="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -165,32 +127,87 @@
</HorizontalScrollView> </HorizontalScrollView>
<LinearLayout
android:id="@+id/title_author"
android:layout_width="0dp"
android:layout_height="0dp"
android:dividerPadding="5dp"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/output"
app:layout_constraintEnd_toStartOf="@+id/active_download_cancel"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/download_type">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:paddingStart="10dp"
android:paddingTop="10dp"
android:paddingEnd="10dp"
android:shadowColor="#000"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2"
android:textColor="#FFF"
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/author"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="1"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:paddingBottom="5dp"
android:shadowColor="#000"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="1.5"
android:textColor="#FFF"
android:textSize="12sp"
android:textStyle="bold" />
</LinearLayout>
<TextView <TextView
android:id="@+id/output" android:id="@+id/output"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:clickable="true" android:clickable="true"
android:padding="10dp" android:ellipsize="end"
android:textSize="11sp" android:focusable="true"
android:fontFamily="monospace" android:fontFamily="monospace"
android:maxLines="2"
android:padding="10dp"
android:shadowColor="#000"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2"
android:textColor="#FFF"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent" />
android:focusable="true" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/active_download_cancel" android:id="@+id/active_download_cancel"
style="?attr/materialIconButtonFilledTonalStyle" style="?attr/materialIconButtonFilledTonalStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:layout_marginEnd="10dp"
app:iconSize="30dp" android:layout_marginTop="10dp"
app:cornerRadius="10dp" app:cornerRadius="10dp"
app:icon="@drawable/ic_cancel" app:icon="@drawable/ic_cancel"
app:iconSize="30dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="@+id/title_author" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -65,6 +65,7 @@
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/download_viewpager" android:id="@+id/download_viewpager"
android:layout_marginHorizontal="10dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
</LinearLayout> </LinearLayout>

View file

@ -109,6 +109,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/home_toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
app:title="@string/app_name" app:title="@string/app_name"
app:layout_scrollFlags="scroll" app:layout_scrollFlags="scroll"

View file

@ -50,7 +50,7 @@
android:shadowDx="4" android:shadowDx="4"
android:shadowDy="4" android:shadowDy="4"
android:shadowRadius="10" android:shadowRadius="10"
android:textColor="@color/white" android:textColor="#FFF"
android:textSize="15sp" android:textSize="15sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@+id/downloads_download_button_type" app:layout_constraintEnd_toStartOf="@+id/downloads_download_button_type"
@ -71,7 +71,7 @@
android:shadowDx="4" android:shadowDx="4"
android:shadowDy="4" android:shadowDy="4"
android:shadowRadius="10" android:shadowRadius="10"
android:textColor="@color/white" android:textColor="#FFF"
android:textSize="11sp" android:textSize="11sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

View file

@ -19,7 +19,7 @@
android:id="@+id/result_card_view" android:id="@+id/result_card_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:cardCornerRadius="10dp" app:cardCornerRadius="20dp"
app:cardElevation="5dp" app:cardElevation="5dp"
app:cardMaxElevation="12dp" app:cardMaxElevation="12dp"
app:cardPreventCornerOverlap="true" app:cardPreventCornerOverlap="true"
@ -72,7 +72,7 @@
android:shadowDy="4" android:shadowDy="4"
android:scrollbars="none" android:scrollbars="none"
android:shadowRadius="2" android:shadowRadius="2"
android:textColor="@color/white" android:textColor="#FFF"
android:textSize="17sp" android:textSize="17sp"
android:textStyle="bold" /> android:textStyle="bold" />
@ -91,7 +91,7 @@
android:shadowDy="4" android:shadowDy="4"
android:scrollbars="none" android:scrollbars="none"
android:shadowRadius="1.5" android:shadowRadius="1.5"
android:textColor="@color/white" android:textColor="#FFF"
android:textSize="12sp" android:textSize="12sp"
android:textStyle="bold" /> android:textStyle="bold" />

View file

@ -13,7 +13,7 @@
android:id="@+id/result_shimmer_card_view" android:id="@+id/result_shimmer_card_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:cardCornerRadius="10dp" app:cardCornerRadius="20dp"
app:cardElevation="10dp" app:cardElevation="10dp"
app:cardMaxElevation="12dp" app:cardMaxElevation="12dp"
app:cardBackgroundColor="@color/grey" app:cardBackgroundColor="@color/grey"

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="icon_bg">@android:color/background_dark</color> <color name="icon_bg">@android:color/background_dark</color>
<color name="black">#000000</color>
</resources> </resources>

View file

@ -10,6 +10,17 @@
<item>wav</item> <item>wav</item>
</string-array> </string-array>
<string-array name="audio_containers_values">
<item>Default</item>
<item>mp3</item>
<item>m4a</item>
<item>aac</item>
<item>alac</item>
<item>flac</item>
<item>opus</item>
<item>wav</item>
</string-array>
<string-array name="video_containers"> <string-array name="video_containers">
<item>@string/defaultValue</item> <item>@string/defaultValue</item>
<item>mp4</item> <item>mp4</item>
@ -17,6 +28,13 @@
<item>webm</item> <item>webm</item>
</string-array> </string-array>
<string-array name="video_containers_values">
<item>Default</item>
<item>mp4</item>
<item>mkv</item>
<item>webm</item>
</string-array>
<string-array name="video_formats"> <string-array name="video_formats">
<item>@string/worst_quality</item> <item>@string/worst_quality</item>
<item>360p</item> <item>360p</item>
@ -97,4 +115,14 @@
<item>0.0</item> <item>0.0</item>
<item>100.0</item> <item>100.0</item>
</array> </array>
<array name="formats_source">
<item>@string/defaultValue</item>
<item>yt-dlp</item>
</array>
<array name="formats_source_values">
<item>@string/defaultValue</item>
<item>yt-dlp</item>
</array>
</resources> </resources>

View file

@ -211,4 +211,5 @@
<string name="save_subs">Save Subtitles</string> <string name="save_subs">Save Subtitles</string>
<string name="save_subs_desc">Write subtitle file</string> <string name="save_subs_desc">Write subtitle file</string>
<string name="subtitle_languages">Subtitle languages</string> <string name="subtitle_languages">Subtitle languages</string>
<string name="format_source">Formats Source</string>
</resources> </resources>

View file

@ -5,6 +5,7 @@
<item name="android:windowLightStatusBar">?attr/isLightTheme</item> <item name="android:windowLightStatusBar">?attr/isLightTheme</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:color">@android:color/transparent</item> <item name="android:color">@android:color/transparent</item>
<item name="windowActionModeOverlay">true</item>
<item name="alertDialogTheme">@style/ThemeOverlay.Material3.MaterialAlertDialog</item> <item name="alertDialogTheme">@style/ThemeOverlay.Material3.MaterialAlertDialog</item>
<item name="dialogCornerRadius">28dp</item> <item name="dialogCornerRadius">28dp</item>
</style> </style>
@ -52,4 +53,25 @@
<item name="cornerSize">5dp</item> <item name="cornerSize">5dp</item>
</style> </style>
<style name="ShapeAppearanceOverlay.Chip.RoundedStart" parent="ShapeAppearance.MaterialComponents.SmallComponent">
<item name="cornerFamily">rounded</item>
<item name="cornerSizeTopLeft">15dp</item>
<item name="cornerSizeTopRight">0dp</item>
<item name="cornerSizeBottomLeft">15dp</item>
<item name="cornerSizeBottomRight">0dp</item>
</style>
<style name="ShapeAppearanceOverlay.Chip.RoundedEnd" parent="ShapeAppearance.MaterialComponents.SmallComponent">
<item name="cornerFamily">rounded</item>
<item name="cornerSizeTopLeft">0dp</item>
<item name="cornerSizeTopRight">15dp</item>
<item name="cornerSizeBottomLeft">0dp</item>
<item name="cornerSizeBottomRight">15dp</item>
</style>
<style name="ShapeAppearanceOverlay.Chip.Middle" parent="ShapeAppearance.MaterialComponents.SmallComponent">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">0dp</item>
</style>
</resources> </resources>

View file

@ -212,18 +212,18 @@
app:title="@string/save_thumb" /> app:title="@string/save_thumb" />
<ListPreference <ListPreference
android:defaultValue="@string/defaultValue" android:defaultValue="Default"
android:entries="@array/audio_containers" android:entries="@array/audio_containers"
android:entryValues="@array/audio_containers" android:entryValues="@array/audio_containers_values"
android:icon="@drawable/ic_code" android:icon="@drawable/ic_code"
app:key="audio_format" app:key="audio_format"
app:summary="@string/defaultValue" app:summary="@string/defaultValue"
app:title="@string/audio_format" /> app:title="@string/audio_format" />
<ListPreference <ListPreference
android:defaultValue="@string/defaultValue" android:defaultValue="Default"
android:entries="@array/video_containers" android:entries="@array/video_containers"
android:entryValues="@array/video_containers" android:entryValues="@array/video_containers_values"
android:icon="@drawable/ic_code" android:icon="@drawable/ic_code"
app:key="video_format" app:key="video_format"
app:summary="@string/defaultValue" app:summary="@string/defaultValue"
@ -275,6 +275,15 @@
app:summary="@string/update_formats_summary" app:summary="@string/update_formats_summary"
app:title="@string/update_formats" /> app:title="@string/update_formats" />
<ListPreference
android:defaultValue="Default"
android:entries="@array/formats_source"
android:entryValues="@array/formats_source_values"
android:icon="@drawable/baseline_manage_search_24"
app:key="formats_source"
app:summary="@string/defaultValue"
app:title="@string/format_source" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preferece_material_switch" android:widgetLayout="@layout/preferece_material_switch"
app:defaultValue="true" app:defaultValue="true"
@ -287,17 +296,17 @@
<PreferenceCategory android:title="@string/about"> <PreferenceCategory android:title="@string/about">
<Preference <!-- <Preference-->
app:isPreferenceVisible="false" <!-- app:isPreferenceVisible="false"-->
app:icon="@drawable/ic_clipboard" <!-- app:icon="@drawable/ic_clipboard"-->
app:key="export_preferences" <!-- app:key="export_preferences"-->
app:title="@string/export_from_clipboard"/> <!-- app:title="@string/export_from_clipboard"/>-->
<Preference <!-- <Preference-->
app:isPreferenceVisible="false" <!-- app:isPreferenceVisible="false"-->
app:icon="@drawable/ic_copy" <!-- app:icon="@drawable/ic_copy"-->
app:key="import_preferences" <!-- app:key="import_preferences"-->
app:title="@string/import_from_clipboard"/> <!-- app:title="@string/import_from_clipboard"/>-->
<Preference <Preference
app:icon="@drawable/ic_discord" app:icon="@drawable/ic_discord"