From 25f5391ff0223f0703799242bf5d5834e391a4df Mon Sep 17 00:00:00 2001 From: daniloti1 Date: Sat, 23 Aug 2025 16:43:31 -0500 Subject: [PATCH 1/2] sort for playlist videos --- .../models/video/SerializedPlatformVideo.kt | 2 + .../mainactivity/main/PlaylistFragment.kt | 67 +++++++++++++++++++ .../mainactivity/main/VideoListEditorView.kt | 19 ++++++ .../platformplayer/states/StatePlaylists.kt | 4 +- app/src/main/res/drawable/ic_sort.xml | 9 +++ .../res/layout/fragment_video_list_editor.xml | 17 +++++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_sort.xml diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/video/SerializedPlatformVideo.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/video/SerializedPlatformVideo.kt index 7388dfa89..6ecbbb1cd 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/video/SerializedPlatformVideo.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/video/SerializedPlatformVideo.kt @@ -35,6 +35,8 @@ open class SerializedPlatformVideo( override var playbackTime: Long = -1; @kotlinx.serialization.Serializable(with = OffsetDateTimeNullableSerializer::class) override var playbackDate: OffsetDateTime? = null; + @kotlinx.serialization.Serializable(with = OffsetDateTimeNullableSerializer::class) + var addedToPlaylistDateTime: OffsetDateTime? = OffsetDateTime.now(); override fun toJson() : String { return Json.encodeToString(this); diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt index 1e90e36ec..afa3ef0f6 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt @@ -145,6 +145,73 @@ class PlaylistFragment : MainFragment() { ); }; + setOnSort { + val playlist = _playlist ?: return@setOnSort; + + UISlideOverlays.showOverlay(overlayContainer, "Sort " + context.getString(R.string.playlist) + " [${playlist.name}] by:", null, {}, + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Name (Ascending)", + "", + tag = 1, + call = { + playlist.videos.sortBy { it.name } + onShown(playlist) + }), + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Name (Descending)", + "", + tag = 2, + call = { + playlist.videos.sortByDescending { it.name } + onShown(playlist) + }), + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Added Date (Oldest)", + "", + tag = 3, + call = { + playlist.videos.sortBy { it.addedToPlaylistDateTime } + onShown(playlist) + }), + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Added Date (Newest)", + "", + tag = 4, + call = { + playlist.videos.sortByDescending { it.addedToPlaylistDateTime } + onShown(playlist) + }), + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Release Date (Oldest)", + "", + tag = 5, + call = { + playlist.videos.sortBy { it.datetime } + onShown(playlist) + }), + SlideUpMenuItem( + context, + R.drawable.ic_sort, + "Release Date (Newest)", + "", + tag = 6, + call = { + playlist.videos.sortByDescending { it.datetime } + onShown(playlist) + }) + ); + }; + _taskLoadPlaylist = TaskHandler( StateApp.instance.scopeGetter, { diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoListEditorView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoListEditorView.kt index 10deee40a..038745157 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoListEditorView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoListEditorView.kt @@ -41,11 +41,13 @@ abstract class VideoListEditorView : LinearLayout { protected var _buttonExport: ImageButton; private var _buttonShare: ImageButton; private var _buttonEdit: ImageButton; + private var _buttonSort: ImageButton; private var _buttonSearch: ImageButton; private var _search: SearchView; private var _onShare: (()->Unit)? = null; + private var _onSort: (()->Unit)? = null; private var _loadedVideos: List? = null; private var _loadedVideosCanEdit: Boolean = false; @@ -107,6 +109,14 @@ abstract class VideoListEditorView : LinearLayout { buttonShuffle.setOnClickListener { hideSearchKeyboard();onShuffleClick(); hideSearchKeyboard(); }; _buttonEdit.setOnClickListener { hideSearchKeyboard(); onEditClick(); }; + _buttonSort = findViewById(R.id.button_sort); + val onSort = _onSort; + if(onSort != null) { + _buttonSort.setOnClickListener { hideSearchKeyboard(); onSort.invoke() }; + _buttonSort.visibility = View.VISIBLE; + } + else + _buttonSort.visibility = View.GONE; setButtonExportVisible(false); setButtonDownloadVisible(canEdit()); @@ -127,6 +137,15 @@ abstract class VideoListEditorView : LinearLayout { _buttonShare.visibility = View.VISIBLE; } + fun setOnSort(onSort: (()-> Unit)? = null) { + _onSort = onSort; + _buttonSort.setOnClickListener { + hideSearchKeyboard(); + onSort?.invoke(); + }; + _buttonSort.visibility = View.VISIBLE; + } + open fun canEdit(): Boolean { return false; } open fun onPlayAllClick() { } open fun onShuffleClick() { } diff --git a/app/src/main/java/com/futo/platformplayer/states/StatePlaylists.kt b/app/src/main/java/com/futo/platformplayer/states/StatePlaylists.kt index cbe1c5186..dd724a9b2 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StatePlaylists.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StatePlaylists.kt @@ -315,8 +315,10 @@ class StatePlaylists { if(!Settings.instance.other.playlistAllowDups && playlist.videos.any { it.url == video.url }) return false; + val serializedVideo = SerializedPlatformVideo.fromVideo(video); + serializedVideo.addedToPlaylistDateTime = OffsetDateTime.now(); - playlist.videos.add(SerializedPlatformVideo.fromVideo(video)); + playlist.videos.add(serializedVideo); playlist.dateUpdate = OffsetDateTime.now(); playlistStore.saveAsync(playlist, true); diff --git a/app/src/main/res/drawable/ic_sort.xml b/app/src/main/res/drawable/ic_sort.xml new file mode 100644 index 000000000..c67efda76 --- /dev/null +++ b/app/src/main/res/drawable/ic_sort.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_video_list_editor.xml b/app/src/main/res/layout/fragment_video_list_editor.xml index f86b69e4c..81c2f9211 100644 --- a/app/src/main/res/layout/fragment_video_list_editor.xml +++ b/app/src/main/res/layout/fragment_video_list_editor.xml @@ -53,6 +53,23 @@ android:scaleType="fitXY" /> + + Settings Group image Edit + Sort Download Close Pause From b2c4de4f7e4acda3dd4fc7296078681bb7a9419b Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 27 Oct 2025 14:35:07 -0500 Subject: [PATCH 2/2] updating playlist for the change to persist after closing app --- .../fragment/mainactivity/main/PlaylistFragment.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt index afa3ef0f6..7e548fb41 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistFragment.kt @@ -157,6 +157,7 @@ class PlaylistFragment : MainFragment() { tag = 1, call = { playlist.videos.sortBy { it.name } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }), SlideUpMenuItem( @@ -167,6 +168,7 @@ class PlaylistFragment : MainFragment() { tag = 2, call = { playlist.videos.sortByDescending { it.name } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }), SlideUpMenuItem( @@ -177,6 +179,7 @@ class PlaylistFragment : MainFragment() { tag = 3, call = { playlist.videos.sortBy { it.addedToPlaylistDateTime } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }), SlideUpMenuItem( @@ -187,6 +190,7 @@ class PlaylistFragment : MainFragment() { tag = 4, call = { playlist.videos.sortByDescending { it.addedToPlaylistDateTime } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }), SlideUpMenuItem( @@ -197,6 +201,7 @@ class PlaylistFragment : MainFragment() { tag = 5, call = { playlist.videos.sortBy { it.datetime } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }), SlideUpMenuItem( @@ -207,6 +212,7 @@ class PlaylistFragment : MainFragment() { tag = 6, call = { playlist.videos.sortByDescending { it.datetime } + StatePlaylists.instance.createOrUpdatePlaylist(playlist); onShown(playlist) }) );