From 1340de9d4ae971eb4bb69208c855724b8c6cb7c2 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sat, 4 Mar 2023 18:49:17 +0100 Subject: [PATCH] Use MD3 dropdown menus in DownloadFragment --- .../libretube/ui/dialogs/DownloadDialog.kt | 15 +++--- .../github/libretube/ui/views/DropdownMenu.kt | 51 +++++++++++++++++++ app/src/main/res/layout/dialog_download.xml | 16 +++--- app/src/main/res/layout/dropdown_item.xml | 11 ++++ app/src/main/res/layout/dropdown_menu.xml | 25 +++++++++ app/src/main/res/values/attrs.xml | 5 ++ 6 files changed, 109 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/ui/views/DropdownMenu.kt create mode 100644 app/src/main/res/layout/dropdown_item.xml create mode 100644 app/src/main/res/layout/dropdown_menu.xml diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt index 645fff706..3bc682bd9 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt @@ -91,14 +91,16 @@ class DownloadDialog( it.quality.getWhileDigit() } - val subtitles = streams.subtitles.filter { !it.url.isNullOrEmpty() }.sortedBy { it.name } + val subtitles = streams.subtitles + .filter { !it.url.isNullOrEmpty() && !it.name.isNullOrEmpty() } + .sortedBy { it.name } if (subtitles.isEmpty()) binding.subtitleSpinner.visibility = View.GONE // initialize the video sources val videoArrayAdapter = ArrayAdapter( requireContext(), - android.R.layout.simple_spinner_item, + R.layout.dropdown_item, videoStreams.map { "${it.quality} ${it.format}" }.toMutableList().also { it.add(0, getString(R.string.no_video)) } @@ -106,7 +108,7 @@ class DownloadDialog( val audioArrayAdapter = ArrayAdapter( requireContext(), - android.R.layout.simple_spinner_item, + R.layout.dropdown_item, audioStreams.map { "${it.quality} ${it.format}" }.toMutableList().also { it.add(0, getString(R.string.no_audio)) } @@ -114,15 +116,12 @@ class DownloadDialog( val subtitleArrayAdapter = ArrayAdapter( requireContext(), - android.R.layout.simple_spinner_item, - subtitles.map { it.name }.toMutableList().also { + R.layout.dropdown_item, + subtitles.map { it.name.orEmpty() }.toMutableList().also { it.add(0, getString(R.string.no_subtitle)) } ) - listOf(videoArrayAdapter, audioArrayAdapter, subtitleArrayAdapter).forEach { - it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - } binding.videoSpinner.adapter = videoArrayAdapter binding.audioSpinner.adapter = audioArrayAdapter binding.subtitleSpinner.adapter = subtitleArrayAdapter diff --git a/app/src/main/java/com/github/libretube/ui/views/DropdownMenu.kt b/app/src/main/java/com/github/libretube/ui/views/DropdownMenu.kt new file mode 100644 index 000000000..7dd763df6 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/views/DropdownMenu.kt @@ -0,0 +1,51 @@ +package com.github.libretube.ui.views + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ArrayAdapter +import android.widget.FrameLayout +import com.github.libretube.R +import com.github.libretube.databinding.DropdownMenuBinding + +/** + * Exposed Dropdown Menu + */ +class DropdownMenu( + context: Context, + attributeSet: AttributeSet +) : FrameLayout(context, attributeSet) { + var binding: DropdownMenuBinding + + @Suppress("UNCHECKED_CAST") + var adapter: ArrayAdapter + get() = binding.autoCompleteTextView.adapter as ArrayAdapter + set(value) { + binding.autoCompleteTextView.setAdapter(value) + binding.autoCompleteTextView.setText(value.getItem(0), false) + } + + val selectedItemPosition: Int get() = adapter.getPosition( + binding.autoCompleteTextView.text.toString() + ) + + init { + val layoutInflater = LayoutInflater.from(context) + binding = DropdownMenuBinding.inflate(layoutInflater, this, true) + + val ta = getContext().obtainStyledAttributes(attributeSet, R.styleable.DropdownMenu, 0, 0) + + try { + binding.textInputLayout.hint = ta.getString(R.styleable.DropdownMenu_hint) + binding.textInputLayout.startIconDrawable = ta.getDrawable( + R.styleable.DropdownMenu_icon + ) + } finally { + ta.recycle() + } + } + + fun setSelection(index: Int) { + binding.autoCompleteTextView.setText(adapter.getItem(index)) + } +} diff --git a/app/src/main/res/layout/dialog_download.xml b/app/src/main/res/layout/dialog_download.xml index 7867c9b9d..e9ceb286c 100644 --- a/app/src/main/res/layout/dialog_download.xml +++ b/app/src/main/res/layout/dialog_download.xml @@ -2,6 +2,7 @@ @@ -25,23 +26,26 @@ android:inputType="text" /> - + app:hint="@string/video" + app:icon="@drawable/ic_video" /> - + app:hint="@string/audio" + app:icon="@drawable/ic_audio" /> - + app:icon="@drawable/ic_caption" + app:hint="@string/captions" />