From 92d6b2f197964de774de2e149cb1db078d141571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C3=87erri?= <64997243+deniscerri@users.noreply.github.com> Date: Mon, 23 Jan 2023 23:42:33 +0100 Subject: [PATCH] added stuff added file picker for the sheet cancel title and author name sync between types sheet showing when there is one result trending not refreshing every time app shows --- .idea/misc.xml | 2 +- app/build.gradle | 1 + .../1.json | 12 +- .../deniscerri/ytdlnis/database/DBManager.kt | 1 - .../ytdlnis/database/dao/DownloadDao.kt | 2 +- .../ytdlnis/database/models/DownloadItem.kt | 2 +- .../ytdlnis/database/models/ResultItem.kt | 4 +- .../database/repository/DownloadRepository.kt | 4 +- .../database/viewmodel/DownloadViewModel.kt | 4 +- .../database/viewmodel/HistoryViewModel.kt | 5 - .../database/viewmodel/ResultViewModel.kt | 15 +- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 36 +-- .../ui/downloadcard/DownloadAudioFragment.kt | 281 ++++++++++++------ .../downloadcard/DownloadBottomSheetDialog.kt | 15 +- .../downloadcard/DownloadFragmentAdapter.kt | 13 +- .../ui/downloadcard/DownloadVideoFragment.kt | 256 ++++++++++------ .../ytdlnis/ui/settings/SettingsFragment.kt | 3 +- .../com/deniscerri/ytdlnis/util/FileUtil.kt | 3 +- .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 5 +- .../main/res/layout/download_bottom_sheet.xml | 13 +- .../res/layout/fragment_download_audio.xml | 2 +- .../res/layout/fragment_download_command.xml | 3 +- .../res/layout/fragment_download_video.xml | 2 +- .../res/layout/home_download_settings.xml | 1 - .../home_download_settings_components.xml | 153 ---------- .../home_download_single_bottom_sheet.xml | 85 ------ app/src/main/res/values/strings.xml | 7 +- 27 files changed, 420 insertions(+), 510 deletions(-) delete mode 100644 app/src/main/res/layout/home_download_settings_components.xml delete mode 100644 app/src/main/res/layout/home_download_single_bottom_sheet.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index ea595dfd..b1ebb825 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -167,7 +167,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index e61f6399..fe64c934 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -103,6 +103,7 @@ dependencies { implementation 'androidx.navigation:navigation-fragment:2.5.3' implementation 'androidx.navigation:navigation-ui:2.5.3' implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.core:core-ktx:+' testImplementation "junit:junit:$junitVer" androidTestImplementation "androidx.test.ext:junit:$androidJunitVer" androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVer" diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json index 1425f80c..cb7d9710 100644 --- a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json +++ b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "94d37ae85390ef5198651df2480a02bf", + "identityHash": "2c0fdec170ca54d97ef928dfe28a6992", "entities": [ { "tableName": "results", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `website` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `website` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `creationTime` INTEGER NOT NULL)", "fields": [ { "fieldPath": "id", @@ -55,6 +55,12 @@ "columnName": "playlistTitle", "affinity": "TEXT", "notNull": true + }, + { + "fieldPath": "creationTime", + "columnName": "creationTime", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -386,7 +392,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '94d37ae85390ef5198651df2480a02bf')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '2c0fdec170ca54d97ef928dfe28a6992')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt index a3fa8979..bbbefe06 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt @@ -31,7 +31,6 @@ abstract class DBManager : RoomDatabase(){ DBManager::class.java, "YTDLnisDatabase" ) - .allowMainThreadQueries() .build() instance = dbInstance dbInstance diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt index 51783f3f..b62d5ab0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt @@ -22,7 +22,7 @@ interface DownloadDao { fun getDownloadByWorkId(workID: Int) : DownloadItem @Query("SELECT * FROM downloads WHERE id=:id LIMIT 1") - fun getDownloadById(id: Int) : DownloadItem + fun getDownloadById(id: Long) : DownloadItem @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(item: DownloadItem) : Long diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt index 874b80b0..7116e1aa 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt @@ -20,7 +20,7 @@ data class DownloadItem( var formatDesc: String, @ColumnInfo(defaultValue = "0") val removeAudio: Boolean, - val downloadPath: String, + var downloadPath: String, val website: String, val downloadSize: String, val playlistTitle: String, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt index f221eee8..f720dc25 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt @@ -2,6 +2,7 @@ package com.deniscerri.ytdlnis.database.models import androidx.room.Entity import androidx.room.PrimaryKey +import java.util.* @Entity(tableName = "results") data class ResultItem( @@ -13,5 +14,6 @@ data class ResultItem( val duration: String, val thumb: String, val website: String, - var playlistTitle: String + var playlistTitle: String, + var creationTime: Long = System.currentTimeMillis() / 1000, ) \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt index 4cba9a35..aa0e6932 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt @@ -38,8 +38,8 @@ class DownloadRepository(private val downloadDao: DownloadDao) { update(item); } - fun getLatest() : DownloadItem { - return downloadDao.getLatest() + fun getItemByID(id: Long) : DownloadItem { + return downloadDao.getDownloadById(id) } } \ No newline at end of file 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 24508c71..98ef2526 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 @@ -45,7 +45,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application repository.update(item); } - fun getLatest() : DownloadItem { - return repository.getLatest() + fun getItemByID(id: Long) : DownloadItem { + return repository.getItemByID(id) } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt index 77698401..08a3c8c2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt @@ -34,15 +34,12 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) }) _items.addSource(formatFilter, Observer { - Log.e("aa", "audio"); filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) }) _items.addSource(sortType, Observer { - Log.e("aa", "asssssssssssss"); filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) }) _items.addSource(websiteFilter, Observer { - Log.e("Aa", "website") filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) }) _items.addSource(queryFilter, Observer { @@ -56,7 +53,6 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) } fun setSorting(sort: HistorySort){ - Log.e("aa", "asssssssssssss"); sortType.value = sort } @@ -69,7 +65,6 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) } fun setFormatFilter(filter: String){ - Log.e("aa", "audio"); formatFilter.value = filter } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt index ba3a75a0..7f9d577b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt @@ -34,7 +34,12 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) fun checkTrending() = viewModelScope.launch(Dispatchers.IO){ try { val item = repository.getFirstResult() - if (item.playlistTitle == "ytdlnis-TRENDING") getTrending() + if ( + item.playlistTitle == getApplication().getString(R.string.trendingPlaylist) + && item.creationTime < (System.currentTimeMillis() / 1000) - 86400 + ){ + getTrending() + } }catch (e : Exception){ getTrending() } @@ -58,7 +63,6 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) } else if (inputQuery!!.contains("http")) { type = "Default" } - Log.e(tag, "$inputQuery $type") try { when (type) { "Search" -> { @@ -102,12 +106,7 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) when(type){ "audio" -> { - list = list.filter { it.format_note.contains("audio", ignoreCase = true) } - if (list.isEmpty()) { - audioFormats.forEach { formats.add(Format(0, item.id, it, "", 0, it, "")) } - return formats - } - return list + return list.filter { it.format_note.contains("audio", ignoreCase = true) } } "video" -> { list = list.filter { !it.format_note.contains("audio", ignoreCase = true) } 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 cb95235f..609cd63f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -37,6 +37,7 @@ import com.deniscerri.ytdlnis.util.InfoUtil import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.button.MaterialButton import com.google.android.material.chip.ChipGroup @@ -86,6 +87,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi private var selectedObjects: ArrayList? = null private var deleteFab: ExtendedFloatingActionButton? = null private var fileUtil: FileUtil? = null + private var firstBoot = true private var _binding : FragmentHomeBinding? = null @@ -144,10 +146,15 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi homeAdapter!!.submitList(it) resultsList = it if(it.size > 1){ - if (it[0].playlistTitle.isNotEmpty() || it[0].playlistTitle != getString(R.string.trendingPlaylist)){ + if (it[0].playlistTitle.isNotEmpty() && it[0].playlistTitle != getString(R.string.trendingPlaylist)){ downloadAllFabCoordinator!!.visibility = VISIBLE + }else{ + downloadAllFabCoordinator!!.visibility = GONE } + }else if(it.size == 1 && !firstBoot && parentFragmentManager.findFragmentByTag("bottomSheet") == null){ + showSingleDownloadSheet(it[0], "audio") } + firstBoot = false } resultViewModel.loadingItems.observe(viewLifecycleOwner){ @@ -349,9 +356,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi // selectedObjects!!.clear() // selectedObjects!!.add(item!!) //showConfigureSingleDownloadCard(createDownloadItem(item!!, type), item) - createDownloadItem(item!!, type){ - showSingleDownloadSheet(it) - } + showSingleDownloadSheet(item!!, type) } else { // downloadQueue!!.add(vid) // updateDownloadingStatusOnResult(vid, type, true) @@ -362,12 +367,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } } - private fun showSingleDownloadSheet(item : DownloadItem){ - val bottomSheet = DownloadBottomSheetDialog(item) - bottomSheet.show(parentFragmentManager, null) - } - - private fun createDownloadItem(item: ResultItem, type: String, itemCreated: (DownloadItem) -> Unit) : DownloadItem { + private fun showSingleDownloadSheet(resultItem : ResultItem, type: String){ val sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) val embedSubs = sharedPreferences.getBoolean("embed_subtitles", false) @@ -376,22 +376,22 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi val downloadItem = DownloadItem(0, - item.url, - item.title, - item.author, - item.thumb, - item.duration, + resultItem.url, + resultItem.title, + resultItem.author, + resultItem.thumb, + resultItem.duration, type, "", "", 0, "", false, - "", item.website, "", item.playlistTitle, embedSubs, addChapters, saveThumb, "", + "", resultItem.website, "", resultItem.playlistTitle, embedSubs, addChapters, saveThumb, "", "", DownloadRepository.status.Processing.toString(), 0 ) downloadViewModel.insertDownload(downloadItem).observe(viewLifecycleOwner) { downloadItem.id = it - itemCreated(downloadItem) + val bottomSheet = DownloadBottomSheetDialog(downloadItem) + bottomSheet.show(parentFragmentManager, "bottomSheet") } - return downloadItem } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt index 47212ac8..207d7480 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt @@ -1,6 +1,7 @@ package com.deniscerri.ytdlnis.ui.downloadcard import android.app.Activity +import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -8,33 +9,56 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.Window -import android.widget.AdapterView -import android.widget.ArrayAdapter -import android.widget.AutoCompleteTextView -import android.widget.Toast +import android.widget.* +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem +import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding -import com.deniscerri.ytdlnis.ui.HomeFragment import com.deniscerri.ytdlnis.util.FileUtil -import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.button.MaterialButton import com.google.android.material.textfield.TextInputLayout +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext -class DownloadAudioFragment(item: DownloadItem) : Fragment() { +class DownloadAudioFragment(private val downloadItem: DownloadItem) : Fragment() { private var _binding : FragmentHomeBinding? = null private var fragmentView: View? = null private var activity: Activity? = null private var mainActivity: MainActivity? = null private lateinit var resultViewModel : ResultViewModel + private lateinit var downloadViewModel : DownloadViewModel private lateinit var fileUtil : FileUtil - private val downloadItem = item + private lateinit var title : TextInputLayout + private lateinit var author : TextInputLayout + private lateinit var saveDir : TextInputLayout + + override fun onResume() { + super.onResume() + lifecycleScope.launch{ + val item = withContext(Dispatchers.IO){ + downloadViewModel.getItemByID(downloadItem.id) + } + if (::title.isInitialized){ + title.editText!!.setText(item.title) + downloadItem.title = item.title + } + if(::author.isInitialized){ + author.editText!!.setText(item.author) + downloadItem.author = item.author + } + } + downloadViewModel.updateDownload(downloadItem) + } override fun onCreateView( inflater: LayoutInflater, @@ -46,109 +70,176 @@ class DownloadAudioFragment(item: DownloadItem) : Fragment() { activity = getActivity() mainActivity = activity as MainActivity? resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] + downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] fileUtil = FileUtil() return fragmentView } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - - val resultItem = resultViewModel.getItemByURL(downloadItem.url) - val type = downloadItem.type + lifecycleScope.launch { + val resultItem = withContext(Dispatchers.IO){ + resultViewModel.getItemByURL(downloadItem.url) + } + val type = downloadItem.type - val sharedPreferences = - requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val sharedPreferences = + requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) - try { - val title = view.findViewById(R.id.title_textinput) - title!!.editText!!.setText(downloadItem.title) - title.editText!!.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} - override fun afterTextChanged(p0: Editable?) { - downloadItem.title = p0.toString() - resultItem.title = p0.toString() - resultViewModel.update(resultItem) - } - }) + try { + title = view.findViewById(R.id.title_textinput) + title.editText!!.setText(downloadItem.title) + title.editText!!.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun afterTextChanged(p0: Editable?) { + downloadItem.title = p0.toString() + resultItem.title = p0.toString() + resultViewModel.update(resultItem) + downloadViewModel.updateDownload(downloadItem) + } + }) - val author = view.findViewById(R.id.author_textinput) - author!!.editText!!.setText(downloadItem.author) - author.editText!!.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} - override fun afterTextChanged(p0: Editable?) { - downloadItem.author = p0.toString() - resultItem.author = p0.toString() - resultViewModel.update(resultItem) - } - }) - - val saveDir = view.findViewById(R.id.outputPath) - saveDir!!.editText!!.setText( - sharedPreferences.getString( + author = view.findViewById(R.id.author_textinput) + author.editText!!.setText(downloadItem.author) + author.editText!!.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun afterTextChanged(p0: Editable?) { + downloadItem.author = p0.toString() + resultItem.author = p0.toString() + resultViewModel.update(resultItem) + downloadViewModel.updateDownload(downloadItem) + } + }) + saveDir = view.findViewById(R.id.outputPath) + val downloadPath = sharedPreferences.getString( "music_path", getString(R.string.music_path) ) - ) - saveDir.editText!!.isFocusable = false; - saveDir.editText!!.isClickable = true; - saveDir.editText!!.setOnClickListener { - Toast.makeText(context, "TEST", Toast.LENGTH_SHORT).show() - } - - val formats = resultViewModel.getFormats(resultItem, type) - - val formatTitles = formats.map { - if (it.format_note.contains("AUDIO_QUALITY_")) - it.format_note.replace("AUDIO_QUALITY_", "") + - if (it.filesize == 0L) "" else " / " + fileUtil.convertFileSize(it.filesize) - else it.format_note + - if (it.filesize == 0L) "" else " / " + fileUtil.convertFileSize(it.filesize) - } - - val format = view.findViewById(R.id.format) - val autoCompleteTextView = - view.findViewById(R.id.format_textview) - autoCompleteTextView?.setAdapter( - ArrayAdapter( - requireContext(), - android.R.layout.simple_dropdown_item_1line, - formatTitles + downloadItem.downloadPath = downloadPath!! + downloadViewModel.updateDownload(downloadItem) + saveDir.editText!!.setText( + fileUtil.formatPath(downloadPath) ) - ) - if (formatTitles.isNotEmpty()){ - autoCompleteTextView!!.setText(formatTitles[formats.lastIndex], false) - } - (format!!.editText as AutoCompleteTextView?)!!.onItemClickListener = - AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, index: Int, _: Long -> - downloadItem.formatDesc = formats[index].format_note - downloadItem.audioFormatId = formats[index].format_id + saveDir.editText!!.isFocusable = false; + saveDir.editText!!.isClickable = true; + saveDir.editText!!.setOnClickListener { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) + audioPathResultLauncher.launch(intent) } - val containers = requireContext().resources.getStringArray(R.array.audio_containers) - val container = view.findViewById(R.id.downloadContainer) - val containerAutoCompleteTextView = - view.findViewById(R.id.container_textview) + val formats = withContext(Dispatchers.IO){ + resultViewModel.getFormats(resultItem, type) + } + val format = view.findViewById(R.id.format) + if (formats.isEmpty()) { + format.visibility = View.GONE + } else { + val formatTitles = formats.map { + if (it.format_note.contains("AUDIO_QUALITY_")) { + it.format_note.replace( + "AUDIO_QUALITY_", + "" + ) + if (it.filesize == 0L) "" else " / " + fileUtil.convertFileSize(it.filesize) + } else { + it.format_note + if (it.filesize == 0L) "" else " / " + fileUtil.convertFileSize( + it.filesize + ) + } + } - container?.isEnabled = true - containerAutoCompleteTextView?.setAdapter( - ArrayAdapter( - requireContext(), - android.R.layout.simple_dropdown_item_1line, - containers - ) - ) - val selectedContainer: String = formats.find { downloadItem.formatDesc == it.format_note }?.container - ?: sharedPreferences.getString("audio_format", "mp3")!! - containerAutoCompleteTextView!!.setText(selectedContainer, false) - (container!!.editText as AutoCompleteTextView?)!!.onItemClickListener = - AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, index: Int, _: Long -> - downloadItem.ext = containers[index] + val autoCompleteTextView = + view.findViewById(R.id.format_textview) + autoCompleteTextView?.setAdapter( + ArrayAdapter( + requireContext(), + android.R.layout.simple_dropdown_item_1line, + formatTitles + ) + ) + if (formatTitles.isNotEmpty()) { + autoCompleteTextView!!.setText(formatTitles[formats.lastIndex], false) + } + (format!!.editText as AutoCompleteTextView?)!!.onItemClickListener = + AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, index: Int, _: Long -> + downloadItem.formatDesc = formats[index].format_note + downloadItem.audioFormatId = formats[index].format_id + } } - }catch (e : Exception){ - e.printStackTrace() + val containers = requireContext().resources.getStringArray(R.array.audio_containers) + val container = view.findViewById(R.id.downloadContainer) + val containerAutoCompleteTextView = + view.findViewById(R.id.container_textview) + + container?.isEnabled = true + containerAutoCompleteTextView?.setAdapter( + ArrayAdapter( + requireContext(), + android.R.layout.simple_dropdown_item_1line, + containers + ) + ) + val selectedContainer: String = formats.find { downloadItem.formatDesc == it.format_note }?.container + ?: sharedPreferences.getString("audio_format", "mp3")!! + containerAutoCompleteTextView!!.setText(selectedContainer, false) + (container!!.editText as AutoCompleteTextView?)!!.onItemClickListener = + AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, index: Int, _: Long -> + downloadItem.ext = containers[index] + } + + + val cancelBtn = view.findViewById(R.id.bottomsheet_cancel_button) + cancelBtn.setOnClickListener{ + (parentFragmentManager.findFragmentByTag("bottomSheet") as DownloadBottomSheetDialog).dismissSelf() + } + + val download = view.findViewById