diff --git a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt index 9789136..dddd5f6 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt @@ -1,7 +1,9 @@ package com.github.apognu.otter.fragments import android.os.Bundle +import android.view.Gravity import android.view.View +import androidx.appcompat.widget.PopupMenu import androidx.core.os.bundleOf import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R @@ -84,10 +86,28 @@ class PlaylistTracksFragment : FunkwhaleFragment + actions.setOnClickListener { + PopupMenu(context, actions, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply { + inflate(R.menu.album) - context.toast("All tracks were added to your queue") + setOnMenuItemClickListener { + when (it.itemId) { + R.id.add_to_queue -> { + CommandBus.send(Command.AddToQueue(adapter.data.map { it.track })) + + context.toast("All tracks were added to your queue") + } + + R.id.download -> CommandBus.send(Command.PinTracks(adapter.data.map { it.track })) + } + + true + } + + show() + } + } } } diff --git a/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt index 75c1040..4ec930e 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt @@ -1,7 +1,11 @@ package com.github.apognu.otter.fragments import android.os.Bundle +import android.view.Gravity +import android.view.Menu +import android.view.MenuInflater import android.view.View +import androidx.appcompat.widget.PopupMenu import androidx.core.os.bundleOf import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R @@ -89,10 +93,28 @@ class TracksFragment : FunkwhaleFragment() { context.toast("All tracks were added to your queue") } - queue.setOnClickListener { - CommandBus.send(Command.AddToQueue(adapter.data)) + context?.let { context -> + actions.setOnClickListener { + PopupMenu(context, actions, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply { + inflate(R.menu.album) - context.toast("All tracks were added to your queue") + setOnMenuItemClickListener { + when (it.itemId) { + R.id.add_to_queue -> { + CommandBus.send(Command.AddToQueue(adapter.data)) + + context.toast("All tracks were added to your queue") + } + + R.id.download -> CommandBus.send(Command.PinTracks(adapter.data)) + } + + true + } + + show() + } + } } } diff --git a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt index 79eefbd..ab2454c 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt @@ -193,23 +193,8 @@ class PlayerService : Service() { is Command.SetRepeatMode -> player.repeatMode = message.mode - is Command.PinTrack -> { - message.track.bestUpload()?.let { upload -> - val url = mustNormalizeUrl(upload.listen_url) - val data = Gson().toJson( - DownloadInfo( - url, - message.track.title, - message.track.artist.name, - null - ) - ).toByteArray() - - DownloadRequest(url, DownloadRequest.TYPE_PROGRESSIVE, Uri.parse(url), Collections.emptyList(), null, data).also { - sendAddDownload(this@PlayerService, PinService::class.java, it, false) - } - } - } + is Command.PinTrack -> download(message.track) + is Command.PinTracks -> message.tracks.forEach { download(it) } } if (player.playWhenReady) { @@ -355,6 +340,24 @@ class PlayerService : Service() { player.seekTo(duration.toLong()) } + private fun download(track: Track) { + track.bestUpload()?.let { upload -> + val url = mustNormalizeUrl(upload.listen_url) + val data = Gson().toJson( + DownloadInfo( + url, + track.title, + track.artist.name, + null + ) + ).toByteArray() + + DownloadRequest(url, DownloadRequest.TYPE_PROGRESSIVE, Uri.parse(url), Collections.emptyList(), null, data).also { + sendAddDownload(this@PlayerService, PinService::class.java, it, false) + } + } + } + inner class PlayerEventListener : Player.EventListener { override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { super.onPlayerStateChanged(playWhenReady, playbackState) diff --git a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt index bc8aca6..ec33ac2 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt @@ -31,6 +31,7 @@ sealed class Command { class PlayTrack(val index: Int) : Command() class PinTrack(val track: Track) : Command() + class PinTracks(val tracks: List) : Command() } sealed class Event { diff --git a/app/src/main/res/layout-land/fragment_tracks.xml b/app/src/main/res/layout-land/fragment_tracks.xml index 75fab33..6ab0168 100644 --- a/app/src/main/res/layout-land/fragment_tracks.xml +++ b/app/src/main/res/layout-land/fragment_tracks.xml @@ -180,16 +180,14 @@ - + android:contentDescription="@string/alt_more_options" + android:src="@drawable/more" /> diff --git a/app/src/main/res/layout/fragment_tracks.xml b/app/src/main/res/layout/fragment_tracks.xml index 1a6b606..55f98d7 100644 --- a/app/src/main/res/layout/fragment_tracks.xml +++ b/app/src/main/res/layout/fragment_tracks.xml @@ -183,16 +183,14 @@ - + android:contentDescription="@string/alt_more_options" + android:src="@drawable/more" /> diff --git a/app/src/main/res/menu/album.xml b/app/src/main/res/menu/album.xml new file mode 100644 index 0000000..0d8b4c3 --- /dev/null +++ b/app/src/main/res/menu/album.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file