diff --git a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt index 2920388..8d72799 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt @@ -382,7 +382,7 @@ class MainActivity : AppCompatActivity() { is Command.RefreshTrack -> refreshCurrentTrack(command.track) is Command.AddToPlaylist -> if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { - AddToPlaylistDialog.show(this@MainActivity, lifecycleScope, command.track) + AddToPlaylistDialog.show(this@MainActivity, lifecycleScope, command.tracks) } } } diff --git a/app/src/main/java/com/github/apognu/otter/activities/SearchActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/SearchActivity.kt index d2aa09b..c93d7c8 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/SearchActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/SearchActivity.kt @@ -53,7 +53,7 @@ class SearchActivity : AppCompatActivity() { CommandBus.get().collect { command -> when (command) { is Command.AddToPlaylist -> if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { - AddToPlaylistDialog.show(this@SearchActivity, lifecycleScope, command.track) + AddToPlaylistDialog.show(this@SearchActivity, lifecycleScope, command.tracks) } } } diff --git a/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt index d81c5fe..5ead7a2 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt @@ -215,7 +215,7 @@ class SearchAdapter(private val context: Context?, private val listener: OnSearc R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track))) R.id.track_play_next -> CommandBus.send(Command.PlayNext(track)) R.id.track_pin -> CommandBus.send(Command.PinTrack(track)) - R.id.track_add_to_playlist -> CommandBus.send(Command.AddToPlaylist(track)) + R.id.track_add_to_playlist -> CommandBus.send(Command.AddToPlaylist(listOf(track))) R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track)) } diff --git a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt index ef09aa4..6e2e041 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt @@ -115,7 +115,7 @@ class TracksAdapter(private val context: Context?, private val favoriteListener: R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track))) R.id.track_play_next -> CommandBus.send(Command.PlayNext(track)) R.id.track_pin -> CommandBus.send(Command.PinTrack(track)) - R.id.track_add_to_playlist -> CommandBus.send(Command.AddToPlaylist(track)) + R.id.track_add_to_playlist -> CommandBus.send(Command.AddToPlaylist(listOf(track))) R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track)) } diff --git a/app/src/main/java/com/github/apognu/otter/fragments/AddToPlaylistDialog.kt b/app/src/main/java/com/github/apognu/otter/fragments/AddToPlaylistDialog.kt index 3bd43e8..8f90041 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/AddToPlaylistDialog.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/AddToPlaylistDialog.kt @@ -19,7 +19,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext object AddToPlaylistDialog { - fun show(activity: Activity, lifecycleScope: CoroutineScope, track: Track) { + fun show(activity: Activity, lifecycleScope: CoroutineScope, tracks: List) { val dialog = AlertDialog.Builder(activity).run { setTitle(activity.getString(R.string.playlist_add_to)) setView(activity.layoutInflater.inflate(R.layout.dialog_add_to_playlist, null)) @@ -42,7 +42,7 @@ object AddToPlaylistDialog { lifecycleScope.launch(IO) { repository.new(name)?.let { id -> - repository.add(id, track) + repository.add(id, tracks) withContext(Main) { Toast.makeText(activity, activity.getString(R.string.playlist_added_to, name), Toast.LENGTH_SHORT).show() @@ -55,7 +55,7 @@ object AddToPlaylistDialog { val adapter = PlaylistsAdapter(activity, object : PlaylistsAdapter.OnPlaylistClickListener { override fun onClick(holder: View?, playlist: Playlist) { - repository.add(playlist.id, track) + repository.add(playlist.id, tracks) Toast.makeText(activity, activity.getString(R.string.playlist_added_to, playlist.name), Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/github/apognu/otter/fragments/LandscapeQueueFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/LandscapeQueueFragment.kt index 480d4c8..b375ff6 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/LandscapeQueueFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/LandscapeQueueFragment.kt @@ -44,6 +44,12 @@ class LandscapeQueueFragment : Fragment() { CommandBus.send(Command.ShuffleQueue) } + queue_save.setOnClickListener { + adapter?.data?.let { + CommandBus.send(Command.AddToPlaylist(it)) + } + } + queue_clear.setOnClickListener { CommandBus.send(Command.ClearQueue) } diff --git a/app/src/main/java/com/github/apognu/otter/fragments/QueueFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/QueueFragment.kt index b401a39..585ffb8 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/QueueFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/QueueFragment.kt @@ -66,6 +66,12 @@ class QueueFragment : BottomSheetDialogFragment() { CommandBus.send(Command.ShuffleQueue) } + queue_save.setOnClickListener { + adapter?.data?.let { + CommandBus.send(Command.AddToPlaylist(it)) + } + } + queue_clear.setOnClickListener { CommandBus.send(Command.ClearQueue) } diff --git a/app/src/main/java/com/github/apognu/otter/repositories/PlaylistsRepository.kt b/app/src/main/java/com/github/apognu/otter/repositories/PlaylistsRepository.kt index 61ec5f1..7837eac 100644 --- a/app/src/main/java/com/github/apognu/otter/repositories/PlaylistsRepository.kt +++ b/app/src/main/java/com/github/apognu/otter/repositories/PlaylistsRepository.kt @@ -48,8 +48,8 @@ class ManagementPlaylistsRepository(override val context: Context?) : Repository return result.get().id } - fun add(id: Int, track: Track) { - val body = PlaylistAdd(listOf(track.id), false) + fun add(id: Int, tracks: List) { + val body = PlaylistAdd(tracks.map { it.id }, false) val request = Fuel.post(mustNormalizeUrl("/api/v1/playlists/${id}/add/")).apply { if (!Settings.isAnonymous()) { diff --git a/app/src/main/java/com/github/apognu/otter/utils/Bus.kt b/app/src/main/java/com/github/apognu/otter/utils/Bus.kt index 9b12d1a..b88728b 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Bus.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Bus.kt @@ -22,7 +22,7 @@ sealed class Command { class Seek(val progress: Int) : Command() class AddToQueue(val tracks: List) : Command() - class AddToPlaylist(val track: Track) : Command() + class AddToPlaylist(val tracks: List) : Command() class PlayNext(val track: Track) : Command() class ReplaceQueue(val queue: List, val fromRadio: Boolean = false) : Command() class RemoveFromQueue(val track: Track) : Command() diff --git a/app/src/main/res/drawable/playlist.xml b/app/src/main/res/drawable/playlist.xml new file mode 100644 index 0000000..d663aeb --- /dev/null +++ b/app/src/main/res/drawable/playlist.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/partial_now_playing.xml b/app/src/main/res/layout/partial_now_playing.xml index 6291df9..f99d75f 100644 --- a/app/src/main/res/layout/partial_now_playing.xml +++ b/app/src/main/res/layout/partial_now_playing.xml @@ -222,8 +222,8 @@ @@ -240,8 +240,8 @@ diff --git a/app/src/main/res/layout/partial_queue.xml b/app/src/main/res/layout/partial_queue.xml index cc3f6a7..9d04043 100644 --- a/app/src/main/res/layout/partial_queue.xml +++ b/app/src/main/res/layout/partial_queue.xml @@ -13,32 +13,45 @@ android:paddingHorizontal="8dp" android:paddingVertical="4dp"> +