From eb0fa67431ab96b6a448f0be4d1d8a03dbf4eb62 Mon Sep 17 00:00:00 2001 From: Cem Eren <2852343+omgcem@users.noreply.github.com> Date: Sat, 5 Mar 2022 00:10:20 +0100 Subject: [PATCH 1/6] Updated references to context_menu_track to correctly identify events Additionally updated event handler to correctly play, queue, pin and download songs now that events are triggering correctly. --- .../fragment/TrackCollectionFragment.kt | 99 +++++++++++++------ 1 file changed, 67 insertions(+), 32 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index 50e3d6e7..dc40a8ea 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -46,6 +46,7 @@ import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.EntryByDiscAndTrackComparator import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Util +import org.moire.ultrasonic.util.Util.toast /** * Displays a group of tracks, eg. the songs of an album, of a playlist etc. @@ -619,56 +620,80 @@ open class TrackCollectionFragment : MultiListFragment() { menuItem: MenuItem, item: MusicDirectory.Child ): Boolean { - val entryId = item.id + val songs = getClickedSong(item) when (menuItem.itemId) { - R.id.menu_play_now -> { - downloadHandler.downloadRecursively( - this, entryId, save = false, append = false, - autoPlay = true, shuffle = false, background = false, - playNext = false, unpin = false, isArtist = false + R.id.song_menu_play_now -> { + downloadHandler.download( + fragment = this, + append = false, + save = false, + autoPlay = true, + playNext = false, + shuffle = false, + songs = songs ) } - R.id.menu_play_next -> { - downloadHandler.downloadRecursively( - this, entryId, save = false, append = false, - autoPlay = false, shuffle = false, background = false, - playNext = true, unpin = false, isArtist = false + R.id.song_menu_play_next -> { + downloadHandler.download( + fragment = this, + append = true, + save = false, + autoPlay = false, + playNext = true, + shuffle = false, + songs = songs ) } - R.id.menu_play_last -> { - downloadHandler.downloadRecursively( - this, entryId, save = false, append = true, - autoPlay = false, shuffle = false, background = false, - playNext = false, unpin = false, isArtist = false + R.id.song_menu_play_last -> { + downloadHandler.download( + fragment = this, + append = true, + save = false, + autoPlay = false, + playNext = false, + shuffle = false, + songs = songs ) } - R.id.menu_pin -> { - downloadHandler.downloadRecursively( - this, entryId, save = true, append = true, - autoPlay = false, shuffle = false, background = false, - playNext = false, unpin = false, isArtist = false + R.id.song_menu_pin -> { + toast( + context, + resources.getQuantityString( + R.plurals.select_album_n_songs_pinned, + songs.size, + songs.size + ) ) + downloadBackground(true, songs) } - R.id.menu_unpin -> { - downloadHandler.downloadRecursively( - this, entryId, save = false, append = false, - autoPlay = false, shuffle = false, background = false, - playNext = false, unpin = true, isArtist = false + R.id.song_menu_unpin -> { + toast( + context, + resources.getQuantityString( + R.plurals.select_album_n_songs_unpinned, + songs.size, + songs.size + ) ) + mediaPlayerController.unpin(songs) } - R.id.menu_download -> { - downloadHandler.downloadRecursively( - this, entryId, save = false, append = false, - autoPlay = false, shuffle = false, background = true, - playNext = false, unpin = false, isArtist = false + R.id.song_menu_download -> { + toast( + context, + resources.getQuantityString( + R.plurals.select_album_n_songs_downloaded, + songs.size, + songs.size + ) ) + downloadBackground(false, songs) } R.id.select_album_play_all -> { // TODO: Why is this being handled here?! playAll() } - R.id.menu_item_share -> { + R.id.song_menu_share -> { if (item is MusicDirectory.Entry) { shareHandler.createShare( this, listOf(item), refreshListView, @@ -683,6 +708,16 @@ open class TrackCollectionFragment : MultiListFragment() { return true } + internal fun getClickedSong(item: MusicDirectory.Child): List { + //This can probably be done better + return viewAdapter.getCurrentList().mapNotNull { + if (it is MusicDirectory.Entry && (it.id == item.id)) + it + else + null + } + } + override fun onItemClick(item: MusicDirectory.Child) { when { item.isDirectory -> { From 0961f56a7d24a8f1903200700abc4e6147a2fc5c Mon Sep 17 00:00:00 2001 From: Cem Eren <2852343+omgcem@users.noreply.github.com> Date: Sun, 6 Mar 2022 00:19:25 +0100 Subject: [PATCH 2/6] Corrected style violation --- .../org/moire/ultrasonic/fragment/TrackCollectionFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index dc40a8ea..b8fa5b72 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -709,7 +709,7 @@ open class TrackCollectionFragment : MultiListFragment() { } internal fun getClickedSong(item: MusicDirectory.Child): List { - //This can probably be done better + // This can probably be done better return viewAdapter.getCurrentList().mapNotNull { if (it is MusicDirectory.Entry && (it.id == item.id)) it From 273ac8f9b8a82acdeb0a6b55eeba0a9adc9ed630 Mon Sep 17 00:00:00 2001 From: Cem Eren <2852343+omgcem@users.noreply.github.com> Date: Fri, 11 Mar 2022 19:35:18 +0100 Subject: [PATCH 3/6] Reused existing functions for track actions Updated existing functions with additional parameter so they can be used by context menu but added default value function so that existing calls on buttons can remain without parameters being passed in. --- .../fragment/TrackCollectionFragment.kt | 67 ++++--------------- 1 file changed, 14 insertions(+), 53 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index b8fa5b72..bbc9a963 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -247,9 +247,10 @@ open class TrackCollectionFragment : MultiListFragment() { super.onDestroyView() } - private fun playNow(append: Boolean) { - val selectedSongs = getSelectedSongs() - + private fun playNow( + append: Boolean, + selectedSongs: List = getSelectedSongs() + ) { if (selectedSongs.isNotEmpty()) { downloadHandler.download( this, append, false, !append, playNext = false, @@ -375,7 +376,10 @@ open class TrackCollectionFragment : MultiListFragment() { downloadBackground(save, songs) } - private fun downloadBackground(save: Boolean, songs: List) { + private fun downloadBackground( + save: Boolean, + songs: List + ) { val onValid = Runnable { networkAndStorageChecker.warnIfNetworkOrStorageUnavailable() mediaPlayerController.downloadBackground(songs, save) @@ -399,9 +403,7 @@ open class TrackCollectionFragment : MultiListFragment() { onValid.run() } - internal fun delete() { - val songs = getSelectedSongs() - + internal fun delete(songs: List = getSelectedSongs()) { Util.toast( context, resources.getQuantityString( @@ -412,8 +414,7 @@ open class TrackCollectionFragment : MultiListFragment() { mediaPlayerController.delete(songs) } - internal fun unpin() { - val songs = getSelectedSongs() + internal fun unpin(songs: List = getSelectedSongs()) { Util.toast( context, resources.getQuantityString( @@ -624,19 +625,11 @@ open class TrackCollectionFragment : MultiListFragment() { when (menuItem.itemId) { R.id.song_menu_play_now -> { - downloadHandler.download( - fragment = this, - append = false, - save = false, - autoPlay = true, - playNext = false, - shuffle = false, - songs = songs - ) + playNow(false, songs) } R.id.song_menu_play_next -> { downloadHandler.download( - fragment = this, + fragment = this@TrackCollectionFragment, append = true, save = false, autoPlay = false, @@ -646,47 +639,15 @@ open class TrackCollectionFragment : MultiListFragment() { ) } R.id.song_menu_play_last -> { - downloadHandler.download( - fragment = this, - append = true, - save = false, - autoPlay = false, - playNext = false, - shuffle = false, - songs = songs - ) + playNow(true, songs) } R.id.song_menu_pin -> { - toast( - context, - resources.getQuantityString( - R.plurals.select_album_n_songs_pinned, - songs.size, - songs.size - ) - ) downloadBackground(true, songs) } R.id.song_menu_unpin -> { - toast( - context, - resources.getQuantityString( - R.plurals.select_album_n_songs_unpinned, - songs.size, - songs.size - ) - ) - mediaPlayerController.unpin(songs) + unpin(songs) } R.id.song_menu_download -> { - toast( - context, - resources.getQuantityString( - R.plurals.select_album_n_songs_downloaded, - songs.size, - songs.size - ) - ) downloadBackground(false, songs) } R.id.select_album_play_all -> { From cf52d76698003764e2d056ea9203897ff820c3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Mu=CC=88ller?= Date: Sat, 12 Mar 2022 15:35:45 +0100 Subject: [PATCH 4/6] updated english language --- ultrasonic/src/main/res/values/strings.xml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 3b40cdfc..3e08db52 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -217,8 +217,8 @@ Sort song list by disc number and track number Display Bitrate and File Suffix Append artist name with bitrate and file suffix - Show Downloads on Play - Transition to download activity when starting playback + Stay in Downloads on Play + Stay in media view when starting playback (do not switch to player view) Gapless Playback Enable gapless playback Hide music files from other apps. @@ -285,12 +285,12 @@ 75 Search history cleared Search Settings + Send playback notifications via Bluetooth + Send Bluetooth Notification Send album art over Bluetooth (May cause Bluetooth notifications to fail) Album Art Over Bluetooth Now Playing List won\'t be sent to connected devices. This may restore compatibility with AVRCP 1.3 devices, when current track display is not updated Disable sending of Now Playing List - Send playback notifications via Bluetooth - Send Bluetooth Notification Manage Servers Server Address Name @@ -320,8 +320,7 @@ Theme Allow self-signed HTTPS certificate Force plain password authentication - This forces the app to always send the password unencrypted. - Useful if the Subsonic server does not support the new authentication API for the users. + This forces the app to always send the password unencrypted. Useful if the Subsonic server does not support the new authentication API for the users. Use Folders For Artist Name Assume top-level folder is the name of the album artist Browse Using ID3 Tags @@ -389,7 +388,7 @@ All Bluetooth devices Only audio (A2DP) devices Disabled - Bluetooth device with only a single Play/Pause button + Bluetooth device with a single Play/Pause button Enabling this may help with older Bluetooth devices when Play/Pause doesn\'t work correctly Debug options Write debug log to file @@ -469,8 +468,7 @@ Features Use five star rating for songs - Use five star rating system for songs - instead of simply starring/unstarring items. + Use five star rating system for songs instead of simply starring/unstarring items. From 6bfd06c6a012ebd776c5ed588b9247ad8ff14a35 Mon Sep 17 00:00:00 2001 From: Nite Date: Tue, 15 Mar 2022 10:31:38 +0100 Subject: [PATCH 5/6] Updated Search2 Artist result to use Index instead of Artist (As needed for listing the Artist's albums afterwards) --- .../kotlin/org/moire/ultrasonic/domain/APISearchConverter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APISearchConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APISearchConverter.kt index a8833bbe..ff9ffd74 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APISearchConverter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APISearchConverter.kt @@ -13,7 +13,7 @@ fun APISearchResult.toDomainEntity(): SearchResult = SearchResult( ) fun SearchTwoResult.toDomainEntity(): SearchResult = SearchResult( - this.artistList.map { it.toDomainEntity() }, + this.artistList.map { it.toIndexEntity() }, this.albumList.map { it.toDomainEntity() }, this.songList.map { it.toTrackEntity() } ) From ebfc06c423044267808720089cf3d978bd65b103 Mon Sep 17 00:00:00 2001 From: Nite Date: Tue, 15 Mar 2022 10:52:22 +0100 Subject: [PATCH 6/6] Fixed tests --- .../org/moire/ultrasonic/domain/APISearchConverterTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt index d54a3a76..dd2e7d84 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt @@ -50,7 +50,7 @@ class APISearchConverterTest { with(convertedEntity) { artists.size `should be equal to` entity.artistList.size - artists[0] `should be equal to` entity.artistList[0].toDomainEntity() + artists[0] `should be equal to` entity.artistList[0].toIndexEntity() albums.size `should be equal to` entity.albumList.size albums[0] `should be equal to` entity.albumList[0].toDomainEntity() songs.size `should be equal to` entity.songList.size