#15: implemented removing track from playlist.
This commit is contained in:
parent
d796fca26b
commit
049822005e
|
@ -3,9 +3,7 @@ package com.github.apognu.otter.adapters
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.Typeface
|
|
||||||
import android.graphics.drawable.ColorDrawable
|
import android.graphics.drawable.ColorDrawable
|
||||||
import android.os.Build
|
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
|
@ -18,11 +16,15 @@ import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
|
||||||
import kotlinx.android.synthetic.main.row_track.view.*
|
import kotlinx.android.synthetic.main.row_track.view.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class PlaylistTracksAdapter(private val context: Context?, private val favoriteListener: OnFavoriteListener? = null, val fromQueue: Boolean = false) : OtterAdapter<PlaylistTrack, PlaylistTracksAdapter.ViewHolder>() {
|
class PlaylistTracksAdapter(private val context: Context?, private val favoriteListener: OnFavoriteListener? = null, private val playlistListener: OnPlaylistListener? = null, val fromQueue: Boolean = false) : OtterAdapter<PlaylistTrack, PlaylistTracksAdapter.ViewHolder>() {
|
||||||
interface OnFavoriteListener {
|
interface OnFavoriteListener {
|
||||||
fun onToggleFavorite(id: Int, state: Boolean)
|
fun onToggleFavorite(id: Int, state: Boolean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface OnPlaylistListener {
|
||||||
|
fun onRemoveTrackFromPlaylist(track: Track, index: Int)
|
||||||
|
}
|
||||||
|
|
||||||
private lateinit var touchHelper: ItemTouchHelper
|
private lateinit var touchHelper: ItemTouchHelper
|
||||||
|
|
||||||
var currentTrack: Track? = null
|
var currentTrack: Track? = null
|
||||||
|
@ -96,11 +98,14 @@ class PlaylistTracksAdapter(private val context: Context?, private val favoriteL
|
||||||
PopupMenu(context, holder.actions, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply {
|
PopupMenu(context, holder.actions, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply {
|
||||||
inflate(if (fromQueue) R.menu.row_queue else R.menu.row_track)
|
inflate(if (fromQueue) R.menu.row_queue else R.menu.row_track)
|
||||||
|
|
||||||
|
menu.findItem(R.id.track_remove_from_playlist).isVisible = true
|
||||||
|
|
||||||
setOnMenuItemClickListener {
|
setOnMenuItemClickListener {
|
||||||
when (it.itemId) {
|
when (it.itemId) {
|
||||||
R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track.track)))
|
R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track.track)))
|
||||||
R.id.track_play_next -> CommandBus.send(Command.PlayNext(track.track))
|
R.id.track_play_next -> CommandBus.send(Command.PlayNext(track.track))
|
||||||
R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track.track))
|
R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track.track))
|
||||||
|
R.id.track_remove_from_playlist -> playlistListener?.onRemoveTrackFromPlaylist(track.track, position)
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
|
|
|
@ -100,6 +100,11 @@ abstract class OtterFragment<D : Any, A : OtterAdapter<D, *>> : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun update() {
|
||||||
|
swiper?.isRefreshing = true
|
||||||
|
fetch(Repository.Origin.Network.origin)
|
||||||
|
}
|
||||||
|
|
||||||
open fun onDataFetched(data: List<D>) {}
|
open fun onDataFetched(data: List<D>) {}
|
||||||
|
|
||||||
private fun fetch(upstreams: Int = Repository.Origin.Network.origin, size: Int = 0) {
|
private fun fetch(upstreams: Int = Repository.Origin.Network.origin, size: Int = 0) {
|
||||||
|
|
|
@ -10,7 +10,9 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.github.apognu.otter.R
|
import com.github.apognu.otter.R
|
||||||
import com.github.apognu.otter.adapters.PlaylistTracksAdapter
|
import com.github.apognu.otter.adapters.PlaylistTracksAdapter
|
||||||
import com.github.apognu.otter.repositories.FavoritesRepository
|
import com.github.apognu.otter.repositories.FavoritesRepository
|
||||||
|
import com.github.apognu.otter.repositories.ManagementPlaylistsRepository
|
||||||
import com.github.apognu.otter.repositories.PlaylistTracksRepository
|
import com.github.apognu.otter.repositories.PlaylistTracksRepository
|
||||||
|
import com.github.apognu.otter.repositories.Repository
|
||||||
import com.github.apognu.otter.utils.*
|
import com.github.apognu.otter.utils.*
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
|
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
|
||||||
|
@ -24,6 +26,7 @@ class PlaylistTracksFragment : OtterFragment<PlaylistTrack, PlaylistTracksAdapte
|
||||||
override val recycler: RecyclerView get() = tracks
|
override val recycler: RecyclerView get() = tracks
|
||||||
|
|
||||||
lateinit var favoritesRepository: FavoritesRepository
|
lateinit var favoritesRepository: FavoritesRepository
|
||||||
|
lateinit var playlistsRepository: ManagementPlaylistsRepository
|
||||||
|
|
||||||
var albumId = 0
|
var albumId = 0
|
||||||
var albumArtist = ""
|
var albumArtist = ""
|
||||||
|
@ -53,9 +56,10 @@ class PlaylistTracksFragment : OtterFragment<PlaylistTrack, PlaylistTracksAdapte
|
||||||
albumCover = getString("albumCover") ?: ""
|
albumCover = getString("albumCover") ?: ""
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter = PlaylistTracksAdapter(context, FavoriteListener())
|
adapter = PlaylistTracksAdapter(context, FavoriteListener(), PlaylistListener())
|
||||||
repository = PlaylistTracksRepository(context, albumId)
|
repository = PlaylistTracksRepository(context, albumId)
|
||||||
favoritesRepository = FavoritesRepository(context)
|
favoritesRepository = FavoritesRepository(context)
|
||||||
|
playlistsRepository = ManagementPlaylistsRepository(context)
|
||||||
|
|
||||||
watchEventBus()
|
watchEventBus()
|
||||||
}
|
}
|
||||||
|
@ -181,4 +185,13 @@ class PlaylistTracksFragment : OtterFragment<PlaylistTrack, PlaylistTracksAdapte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inner class PlaylistListener : PlaylistTracksAdapter.OnPlaylistListener {
|
||||||
|
override fun onRemoveTrackFromPlaylist(track: Track, index: Int) {
|
||||||
|
lifecycleScope.launch(Main) {
|
||||||
|
playlistsRepository.remove(albumId, track, index)
|
||||||
|
update()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -24,7 +24,7 @@ class PlaylistsRepository(override val context: Context?) : Repository<Playlist,
|
||||||
|
|
||||||
class ManagementPlaylistsRepository(override val context: Context?) : Repository<Playlist, PlaylistsCache>() {
|
class ManagementPlaylistsRepository(override val context: Context?) : Repository<Playlist, PlaylistsCache>() {
|
||||||
override val cacheId = "tracks-playlists-management"
|
override val cacheId = "tracks-playlists-management"
|
||||||
override val upstream = HttpUpstream<Playlist, OtterResponse<Playlist>>(HttpUpstream.Behavior.AtOnce, "/api/v1/playlists/?ordering=name", object : TypeToken<PlaylistsResponse>() {}.type)
|
override val upstream = HttpUpstream<Playlist, OtterResponse<Playlist>>(HttpUpstream.Behavior.AtOnce, "/api/v1/playlists/?scope=me&ordering=name", object : TypeToken<PlaylistsResponse>() {}.type)
|
||||||
|
|
||||||
override fun cache(data: List<Playlist>) = PlaylistsCache(data)
|
override fun cache(data: List<Playlist>) = PlaylistsCache(data)
|
||||||
override fun uncache(reader: BufferedReader) = gsonDeserializerOf(PlaylistsCache::class.java).deserialize(reader)
|
override fun uncache(reader: BufferedReader) = gsonDeserializerOf(PlaylistsCache::class.java).deserialize(reader)
|
||||||
|
@ -64,4 +64,19 @@ class ManagementPlaylistsRepository(override val context: Context?) : Repository
|
||||||
.awaitByteArrayResponseResult()
|
.awaitByteArrayResponseResult()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun remove(id: Int, track: Track, index: Int) {
|
||||||
|
val body = mapOf("index" to index)
|
||||||
|
|
||||||
|
val request = Fuel.post(mustNormalizeUrl("/api/v1/playlists/${id}/remove/")).apply {
|
||||||
|
if (!Settings.isAnonymous()) {
|
||||||
|
header("Authorization", "Bearer ${Settings.getAccessToken()}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.body(Gson().toJson(body))
|
||||||
|
.awaitByteArrayResponseResult()
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -17,4 +17,9 @@
|
||||||
android:id="@+id/track_pin"
|
android:id="@+id/track_pin"
|
||||||
android:title="@string/playback_queue_download" />
|
android:title="@string/playback_queue_download" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/track_remove_from_playlist"
|
||||||
|
android:visible="false"
|
||||||
|
android:title="@string/playback_queue_remove_item" />
|
||||||
|
|
||||||
</menu>
|
</menu>
|
Loading…
Reference in New Issue