From 7783b2846db4cae6ac61b0ba1f9c1da2876a7def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C3=87erri?= <64997243+deniscerri@users.noreply.github.com> Date: Sat, 18 Feb 2023 15:35:36 +0100 Subject: [PATCH] added more sorting options to history --- .../ytdlnis/database/dao/HistoryDao.kt | 15 ++++++- .../database/repository/HistoryRepository.kt | 12 +++++- .../database/viewmodel/DownloadViewModel.kt | 8 +++- .../database/viewmodel/HistoryViewModel.kt | 27 ++++++++---- .../deniscerri/ytdlnis/ui/HistoryFragment.kt | 43 +++++++++++++------ .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 2 + .../com/deniscerri/ytdlnis/util/FileUtil.kt | 4 +- .../main/res/layout/history_sort_sheet.xml | 21 +++++---- 8 files changed, 94 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt index a42649fb..b3b6b81e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt @@ -11,7 +11,20 @@ interface HistoryDao { "CASE WHEN :sort = 'ASC' THEN id END ASC," + "CASE WHEN :sort = 'DESC' THEN id END DESC," + "CASE WHEN :sort = '' THEN id END DESC ") - fun getHistory(query : String, format : String, site : String, sort : String) : List + fun getHistorySortedByID(query : String, format : String, site : String, sort : String) : List + + @Query("SELECT * FROM history WHERE title LIKE '%'||:query||'%' AND type LIKE '%'||:format||'%' AND website LIKE '%'||:site||'%' ORDER BY " + + "CASE WHEN :sort = 'ASC' THEN title END ASC," + + "CASE WHEN :sort = 'DESC' THEN title END DESC," + + "CASE WHEN :sort = '' THEN title END DESC ") + fun getHistorySortedByTitle(query : String, format : String, site : String, sort : String) : List + + @Query("SELECT * FROM history WHERE title LIKE '%'||:query||'%' AND type LIKE '%'||:format||'%' AND website LIKE '%'||:site||'%' ORDER BY " + + "CASE WHEN :sort = 'ASC' THEN author END ASC," + + "CASE WHEN :sort = 'DESC' THEN author END DESC," + + "CASE WHEN :sort = '' THEN author END DESC ") + fun getHistorySortedByAuthor(query : String, format : String, site : String, sort : String) : List + @Query("SELECT * FROM history") fun getAllHistory() : LiveData> diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt index a5a43fc4..cfa91390 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt @@ -17,12 +17,20 @@ class HistoryRepository(private val historyDao: HistoryDao) { DESC, ASC } + enum class HistorySortType { + DATE, TITLE, AUTHOR + } + suspend fun getItem(id: Int) : HistoryItem { return historyDao.getHistoryItem(id) } - fun getFiltered(query : String, format : String, site : String, sort: HistorySort) : List { - return historyDao.getHistory(query, format, site, sort.toString()) + fun getFiltered(query : String, format : String, site : String, sortType: HistorySortType, sort: HistorySort) : List { + return when(sortType){ + HistorySortType.DATE -> historyDao.getHistorySortedByID(query, format, site, sort.toString()) + HistorySortType.TITLE -> historyDao.getHistorySortedByTitle(query, format, site, sort.toString()) + HistorySortType.AUTHOR -> historyDao.getHistorySortedByAuthor(query, format, site, sort.toString()) + } } suspend fun insert(item: HistoryItem){ 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 9183b6b1..8b318398 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 @@ -89,6 +89,12 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false) val customFileNameTemplate = sharedPreferences.getString("file_name_template", "%(uploader)s - %(title)s") + val downloadPath = when(type){ + Type.audio -> sharedPreferences.getString("music_path", getApplication().resources.getString(R.string.music_path)) + Type.video -> sharedPreferences.getString("video_path", getApplication().resources.getString(R.string.video_path)) + Type.command -> sharedPreferences.getString("command_path", getApplication().resources.getString(R.string.command_path)) + } + val audioPreferences = AudioPreferences(embedThumb) val videoPreferences = VideoPreferences(embedSubs, addChapters) @@ -100,7 +106,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application resultItem.duration, type, getFormat(resultItem, type), - "", resultItem.website, "", resultItem.playlistTitle, audioPreferences, videoPreferences,customFileNameTemplate!!, saveThumb, DownloadRepository.Status.Processing.toString(), 0 + downloadPath!!, resultItem.website, "", resultItem.playlistTitle, audioPreferences, videoPreferences,customFileNameTemplate!!, saveThumb, DownloadRepository.Status.Processing.toString(), 0 ) } 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 dbe78d47..5145b12a 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 @@ -6,13 +6,15 @@ import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.repository.HistoryRepository import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySort +import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySortType import com.deniscerri.ytdlnis.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class HistoryViewModel(application: Application) : AndroidViewModel(application) { private val repository : HistoryRepository - private val sortType = MutableLiveData(HistorySort.DESC) + val sortOrder = MutableLiveData(HistorySort.DESC) + private val sortType = MutableLiveData(HistorySortType.DATE) private val websiteFilter = MutableLiveData("") private val queryFilter = MutableLiveData("") private val formatFilter = MutableLiveData("") @@ -25,19 +27,19 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) allItems = repository.items _items.addSource(allItems){ - filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) + filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!, sortOrder.value!!) } _items.addSource(formatFilter){ - filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) + filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!, sortOrder.value!!) } _items.addSource(sortType){ - filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) + filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!, sortOrder.value!!) } _items.addSource(websiteFilter){ - filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) + filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!, sortOrder.value!!) } _items.addSource(queryFilter){ - filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!) + filter(queryFilter.value!!, formatFilter.value!!, websiteFilter.value!!, sortType.value!!, sortOrder.value!!) } } @@ -46,7 +48,14 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) return _items } - fun setSorting(sort: HistorySort){ + fun setSorting(sort: HistorySortType){ + if (sortType.value != sort){ + sortOrder.value = HistorySort.DESC + }else{ + sortOrder.value = if (sortOrder.value == HistorySort.DESC) { + HistorySort.ASC + } else HistorySort.DESC + } sortType.value = sort } @@ -62,8 +71,8 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) formatFilter.value = filter } - private fun filter(query : String, format : String, site : String, sort: HistorySort) = viewModelScope.launch(Dispatchers.IO){ - _items.postValue(repository.getFiltered(query, format, site, sort)) + private fun filter(query : String, format : String, site : String, sortType: HistorySortType, sort: HistorySort) = viewModelScope.launch(Dispatchers.IO){ + _items.postValue(repository.getFiltered(query, format, site, sortType, sort)) } fun insert(item: HistoryItem) = viewModelScope.launch(Dispatchers.IO){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HistoryFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HistoryFragment.kt index 3b78b9b6..40bf1721 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HistoryFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HistoryFragment.kt @@ -21,6 +21,7 @@ import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.HistoryAdapter import com.deniscerri.ytdlnis.database.models.HistoryItem +import com.deniscerri.ytdlnis.database.repository.HistoryRepository import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySort import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel import com.deniscerri.ytdlnis.databinding.FragmentHistoryBinding @@ -228,6 +229,14 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ } } + private fun changeSortIcon(item: LinearLayout, order: HistorySort){ + when(order){ + HistorySort.DESC -> (item.getChildAt(0) as ImageView).setImageResource(R.drawable.ic_up) + HistorySort.ASC -> (item.getChildAt(0) as ImageView).setImageResource(R.drawable.ic_down) + } + item.getChildAt(0).visibility = VISIBLE + } + private fun initChips() { val sortChip = fragmentView!!.findViewById(R.id.sortChip) @@ -235,23 +244,29 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ sortSheet = BottomSheetDialog(requireContext()) sortSheet!!.requestWindowFeature(Window.FEATURE_NO_TITLE) sortSheet!!.setContentView(R.layout.history_sort_sheet) - val newest = sortSheet!!.findViewById(R.id.date) - val oldest = sortSheet!!.findViewById(R.id.title) - newest!!.setOnClickListener { - historyViewModel.setSorting(HistorySort.DESC) - sortSheet!!.cancel() + + val date = sortSheet!!.findViewById(R.id.date) + val title = sortSheet!!.findViewById(R.id.title) + val author = sortSheet!!.findViewById(R.id.author) + + val sortOptions = listOf(date!!, title!!, author!!) + + date.getChildAt(1).setOnClickListener { + sortOptions.forEach { it.getChildAt(0).visibility = INVISIBLE } + historyViewModel.setSorting(HistoryRepository.HistorySortType.DATE) + changeSortIcon(date, historyViewModel.sortOrder.value!!) } - oldest!!.setOnClickListener { - historyViewModel.setSorting(HistorySort.ASC) - sortSheet!!.cancel() + title.getChildAt(1).setOnClickListener { + sortOptions.forEach { it.getChildAt(0).visibility = INVISIBLE } + historyViewModel.setSorting(HistoryRepository.HistorySortType.TITLE) + changeSortIcon(title, historyViewModel.sortOrder.value!!) + } + author.getChildAt(1).setOnClickListener { + sortOptions.forEach { it.getChildAt(0).visibility = INVISIBLE } + historyViewModel.setSorting(HistoryRepository.HistorySortType.AUTHOR) + changeSortIcon(author, historyViewModel.sortOrder.value!!) } - val cancel = sortSheet!!.findViewById(R.id.author) - cancel!!.setOnClickListener { sortSheet!!.cancel() } sortSheet!!.show() - sortSheet!!.window!!.setLayout( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - ) } //format 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 e655a166..8c9034ba 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -345,6 +345,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi //showConfigureSingleDownloadCard(createDownloadItem(item!!, type), item) showSingleDownloadSheet(item!!, type!!) } else { + val downloadItem = downloadViewModel.createDownloadItemFromResult(item!!, type!!) + downloadViewModel.queueDownloads(listOf(downloadItem)) // downloadQueue!!.add(vid) // updateDownloadingStatusOnResult(vid, type, true) // if (isStoragePermissionGranted) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt index 36e02d80..d04c3d12 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt @@ -45,8 +45,8 @@ class FileUtil() { } catch (ignored: Exception) { } val pieces = dataValue.split("/").toTypedArray() - var formattedPath = StringBuilder("/storage/") - if (pieces[0].equals("primary")){ + val formattedPath = StringBuilder("/storage/") + if (pieces[0] == "primary"){ formattedPath.append("emulated/0/") }else{ formattedPath.append(pieces[0]).append("/") diff --git a/app/src/main/res/layout/history_sort_sheet.xml b/app/src/main/res/layout/history_sort_sheet.xml index b09f3cff..39b1e2c4 100644 --- a/app/src/main/res/layout/history_sort_sheet.xml +++ b/app/src/main/res/layout/history_sort_sheet.xml @@ -16,64 +16,67 @@ android:orientation="vertical">