From ccc686ed50b3fa2cb7253f61d87cebdeedfbd336 Mon Sep 17 00:00:00 2001 From: Kelvin Date: Wed, 4 Jun 2025 21:26:41 +0200 Subject: [PATCH] Downloads size ordering, Subsgroup removal on unsubscribe, multi-key like querying --- .../mainactivity/main/DownloadsFragment.kt | 6 ++++- .../platformplayer/states/StateHistory.kt | 9 ++++++-- .../states/StateSubscriptions.kt | 15 +++++++++++-- .../stores/db/ManagedDBStore.kt | 22 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/DownloadsFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/DownloadsFragment.kt index 536700d8..0e429430 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/DownloadsFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/DownloadsFragment.kt @@ -150,7 +150,7 @@ class DownloadsFragment : MainFragment() { spinnerSortBy.adapter = ArrayAdapter(context, R.layout.spinner_item_simple, resources.getStringArray(R.array.downloads_sortby_array)).also { it.setDropDownViewResource(R.layout.spinner_dropdownitem_simple); }; - val options = listOf("nameAsc", "nameDesc", "downloadDateAsc", "downloadDateDesc", "releasedAsc", "releasedDesc"); + val options = listOf("nameAsc", "nameDesc", "downloadDateAsc", "downloadDateDesc", "releasedAsc", "releasedDesc", "sizeAsc", "sizeDesc"); spinnerSortBy.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) { when(pos) { @@ -160,6 +160,8 @@ class DownloadsFragment : MainFragment() { 3 -> ordering.setAndSave("downloadDateDesc") 4 -> ordering.setAndSave("releasedAsc") 5 -> ordering.setAndSave("releasedDesc") + 6 -> ordering.setAndSave("sizeAsc") + 7 -> ordering.setAndSave("sizeDesc") else -> ordering.setAndSave("") } updateContentFilters() @@ -257,6 +259,8 @@ class DownloadsFragment : MainFragment() { "nameDesc" -> vidsToReturn.sortedByDescending { it.name.lowercase() } "releasedAsc" -> vidsToReturn.sortedBy { it.datetime ?: OffsetDateTime.MAX } "releasedDesc" -> vidsToReturn.sortedByDescending { it.datetime ?: OffsetDateTime.MIN } + "sizeAsc" -> vidsToReturn.sortedBy { it.videoSource.sumOf { it.fileSize } + it.audioSource.sumOf { it.fileSize } } + "sizeDesc" -> vidsToReturn.sortedByDescending { it.videoSource.sumOf { it.fileSize } + it.audioSource.sumOf { it.fileSize } } else -> vidsToReturn } } diff --git a/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt b/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt index 3047731d..97ab82c1 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt @@ -131,8 +131,13 @@ class StateHistory { fun getHistoryPager(): IPager { return _historyDBStore.getObjectPager(); } - fun getHistorySearchPager(query: String): IPager { - return _historyDBStore.queryLikeObjectPager(DBHistory.Index::name, "%${query}%", 10); + fun getHistorySearchPager(query: String, withAuthor: Boolean = false): IPager { + return if(!withAuthor) + _historyDBStore.queryLikeObjectPager(DBHistory.Index::name, "%${query}%", 10) + else + _historyDBStore.queryLikeObjectPager(DBHistory.Index::name, "%${query}%", 10) + //_historyDBStore.queryLike2ObjectPager(DBHistory.Index::name, DBHistory.Index::auth,"%${query}%", 10) + //TODO: See if we can include author name? } fun getHistoryIndexByUrl(url: String): DBHistory.Index? { return historyIndex[url]; diff --git a/app/src/main/java/com/futo/platformplayer/states/StateSubscriptions.kt b/app/src/main/java/com/futo/platformplayer/states/StateSubscriptions.kt index 1d1acff6..60026ea6 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateSubscriptions.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateSubscriptions.kt @@ -329,8 +329,19 @@ class StateSubscriptions { } } - if(StateSubscriptionGroups.instance.hasSubscriptionGroup(sub.channel.url)) - getSubscriptionOtherOrCreate(sub.channel.url, sub.channel.name, sub.channel.thumbnail); + if(StateSubscriptionGroups.instance.hasSubscriptionGroup(sub.channel.url)) { + val subGroups = StateSubscriptionGroups.instance.getSubscriptionGroups().filter { it.urls.contains(sub.channel.url) }; + for(group in subGroups) { + group.urls.remove(sub.channel.url); + StateSubscriptionGroups.instance.updateSubscriptionGroup(group); + } + /* + getSubscriptionOtherOrCreate( + sub.channel.url, + sub.channel.name, + sub.channel.thumbnail + ); */ + } } return sub; } diff --git a/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt b/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt index 2e493eef..6b9ed65f 100644 --- a/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt +++ b/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt @@ -274,10 +274,17 @@ class ManagedDBStore, T, D: ManagedDBDatabase, DA val queryStr = "SELECT * FROM ${descriptor.table_name} WHERE ${field} LIKE ? ${_orderSQL} LIMIT ? OFFSET ?"; val query = SimpleSQLiteQuery(queryStr, arrayOf(obj, pageSize, page * pageSize)); return deserializeIndexes(dbDaoBase.getMultiple(query)); + }fun queryLike2Page(field: String, field2: String, obj: String, page: Int, pageSize: Int): List { + val queryStr = "SELECT * FROM ${descriptor.table_name} WHERE ${field} LIKE ? OR ${field2} LIKE ? ${_orderSQL} LIMIT ? OFFSET ?"; + val query = SimpleSQLiteQuery(queryStr, arrayOf(obj, obj, pageSize, page * pageSize)); + return deserializeIndexes(dbDaoBase.getMultiple(query)); } fun queryLikeObjectPage(field: String, obj: String, page: Int, pageSize: Int): List { return convertObjects(queryLikePage(field, obj, page, pageSize)); } + fun queryLike2ObjectPage(field: String, field2: String, obj: String, page: Int, pageSize: Int): List { + return convertObjects(queryLike2Page(field, field2, obj, page, pageSize)); + } //Query Page Objects @@ -336,6 +343,13 @@ class ManagedDBStore, T, D: ManagedDBDatabase, DA queryLikePage(field, obj, it - 1, pageSize); }); } + fun queryLike2Pager(field: KProperty<*>, field2: KProperty<*>, obj: String, pageSize: Int): IPager = queryLike2Pager(validateFieldName(field), validateFieldName(field2), obj, pageSize); + fun queryLike2Pager(field: String, field2: String, obj: String, pageSize: Int): IPager { + return AdhocPager({ + Logger.i("ManagedDBStore", "Next Page [query: ${obj}](${it}) ${pageSize}"); + queryLike2Page(field, field2, obj, it - 1, pageSize); + }); + } fun queryLikeObjectPager(field: KProperty<*>, obj: String, pageSize: Int): IPager = queryLikeObjectPager(validateFieldName(field), obj, pageSize); fun queryLikeObjectPager(field: String, obj: String, pageSize: Int): IPager { return AdhocPager({ @@ -344,6 +358,14 @@ class ManagedDBStore, T, D: ManagedDBDatabase, DA }); } + fun queryLike2ObjectPager(field: KProperty<*>, field2: KProperty<*>, obj: String, pageSize: Int): IPager = queryLike2ObjectPager(validateFieldName(field), validateFieldName(field2), obj, pageSize); + fun queryLike2ObjectPager(field: String, field2: String, obj: String, pageSize: Int): IPager { + return AdhocPager({ + Logger.i("ManagedDBStore", "Next Page [query: ${obj}](${it}) ${pageSize}"); + queryLike2ObjectPage(field, field2, obj, it - 1, pageSize); + }); + } + //Query Pager with convert fun queryPager(field: KProperty<*>, obj: Any, pageSize: Int, convert: (I)->X): IPager = queryPager(validateFieldName(field), obj, pageSize, convert); fun queryPager(field: String, obj: Any, pageSize: Int, convert: (I)->X): IPager { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d382860d..9acb16a1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -996,6 +996,8 @@ Download Date (Newest) Release Date (Oldest) Release Date (Newest) + Size (Smallest) + Size (Largest) Name (Ascending)