Add nav to playing song's album
Add the ability to navigate from CompactPlaybackFragment to the album where the current song is.
This commit is contained in:
parent
a192fb52c3
commit
b5552411b6
6 changed files with 44 additions and 8 deletions
|
@ -120,6 +120,8 @@ class AlbumDetailFragment : Fragment() {
|
|||
binding.albumArtist.setBackgroundResource(R.drawable.ui_ripple)
|
||||
}
|
||||
|
||||
// TODO: Make DetailFragment scroll to song if navigated from CompactPlaybackFragment
|
||||
|
||||
Log.d(this::class.simpleName, "Fragment created.")
|
||||
|
||||
return binding.root
|
||||
|
|
|
@ -162,6 +162,18 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
|
|||
}
|
||||
}
|
||||
|
||||
playbackModel.navToPlayingSong.observe(viewLifecycleOwner) {
|
||||
if (it) {
|
||||
findNavController().navigate(
|
||||
MainFragmentDirections.actionShowAlbum(
|
||||
playbackModel.song.value!!.album.id, true
|
||||
)
|
||||
)
|
||||
|
||||
playbackModel.doneWithNavToPlayingSong()
|
||||
}
|
||||
}
|
||||
|
||||
Log.d(this::class.simpleName, "Fragment created.")
|
||||
|
||||
return binding.root
|
||||
|
|
|
@ -42,10 +42,17 @@ class CompactPlaybackFragment : Fragment() {
|
|||
binding.song = MusicStore.getInstance().songs[0]
|
||||
binding.playbackModel = playbackModel
|
||||
|
||||
binding.root.setOnClickListener {
|
||||
findNavController().navigate(
|
||||
MainFragmentDirections.actionGoToPlayback()
|
||||
)
|
||||
binding.root.apply {
|
||||
setOnClickListener {
|
||||
findNavController().navigate(
|
||||
MainFragmentDirections.actionGoToPlayback()
|
||||
)
|
||||
}
|
||||
|
||||
setOnLongClickListener {
|
||||
playbackModel.navigateToPlayingSong()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
// --- VIEWMODEL SETUP ---
|
||||
|
|
|
@ -23,7 +23,6 @@ import org.oxycblt.auxio.ui.toColor
|
|||
class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener {
|
||||
private val playbackModel: PlaybackViewModel by activityViewModels()
|
||||
|
||||
// TODO: Implement nav to artists/albums
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
|
@ -78,6 +77,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener {
|
|||
}
|
||||
|
||||
// Make marquee scroll work
|
||||
// TODO: Add nav here as well
|
||||
binding.playbackSong.isSelected = true
|
||||
|
||||
binding.playbackSeekBar.setOnSeekBarChangeListener(this)
|
||||
|
@ -91,7 +91,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener {
|
|||
binding.song = it
|
||||
binding.playbackSeekBar.max = it.seconds.toInt()
|
||||
} else {
|
||||
Log.d(this::class.simpleName, "No song played anymore, leaving.")
|
||||
Log.d(this::class.simpleName, "No song is being played, leaving.")
|
||||
|
||||
findNavController().navigateUp()
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ import org.oxycblt.auxio.playback.state.PlaybackMode
|
|||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||
|
||||
// A ViewModel that acts as an intermediary between the UI and PlaybackStateManager
|
||||
// TODO: Implement User Queue
|
||||
// TODO: Implement Persistence through a Database
|
||||
class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
||||
// Playback
|
||||
|
@ -56,6 +55,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
private val mIsSeeking = MutableLiveData(false)
|
||||
val isSeeking: LiveData<Boolean> get() = mIsSeeking
|
||||
|
||||
private val mNavToPlayingSong = MutableLiveData(false)
|
||||
val navToPlayingSong: LiveData<Boolean> get() = mNavToPlayingSong
|
||||
|
||||
val formattedPosition = Transformations.map(mPosition) {
|
||||
it.toDuration()
|
||||
}
|
||||
|
@ -206,6 +208,14 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
mIsSeeking.value = value
|
||||
}
|
||||
|
||||
fun navigateToPlayingSong() {
|
||||
mNavToPlayingSong.value = true
|
||||
}
|
||||
|
||||
fun doneWithNavToPlayingSong() {
|
||||
mNavToPlayingSong.value = false
|
||||
}
|
||||
|
||||
// --- OVERRIDES ---
|
||||
|
||||
override fun onCleared() {
|
||||
|
|
|
@ -75,6 +75,7 @@ class PlaybackStateManager private constructor() {
|
|||
field = value
|
||||
callbacks.forEach { it.onLoopUpdate(value) }
|
||||
}
|
||||
private var mIsInUserQueue = false
|
||||
|
||||
val song: Song? get() = mSong
|
||||
val parent: BaseModel? get() = mParent
|
||||
|
@ -194,6 +195,8 @@ class PlaybackStateManager private constructor() {
|
|||
if (!mIsPlaying) {
|
||||
mIsPlaying = true
|
||||
}
|
||||
|
||||
mIsInUserQueue = false
|
||||
}
|
||||
|
||||
fun setPosition(position: Long) {
|
||||
|
@ -220,6 +223,8 @@ class PlaybackStateManager private constructor() {
|
|||
updatePlayback(mUserQueue[0])
|
||||
mUserQueue.removeAt(0)
|
||||
|
||||
mIsInUserQueue = true
|
||||
|
||||
forceUserQueueUpdate()
|
||||
} else {
|
||||
if (mIndex < mQueue.lastIndex) {
|
||||
|
@ -239,7 +244,7 @@ class PlaybackStateManager private constructor() {
|
|||
}
|
||||
|
||||
fun prev() {
|
||||
if (mIndex > 0) {
|
||||
if (mIndex > 0 && !mIsInUserQueue) {
|
||||
mIndex = mIndex.dec()
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue