Minor playback nav improvements

Change the playing nav system to rely off a single value, instead of multiple booleans.
This commit is contained in:
OxygenCobalt 2020-11-25 10:04:14 -07:00
parent 206d8d1c1f
commit 6ac269b1df
8 changed files with 46 additions and 105 deletions

View file

@ -15,7 +15,10 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.databinding.FragmentMainBinding
import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.accent
import org.oxycblt.auxio.ui.getInactiveAlpha import org.oxycblt.auxio.ui.getInactiveAlpha
@ -93,34 +96,21 @@ class MainFragment : Fragment() {
} }
} }
playbackModel.navToPlayingSong.observe(viewLifecycleOwner) { playbackModel.navToItem.observe(viewLifecycleOwner) {
if (it) { if (it != null) {
if (binding.navBar.selectedItemId != R.id.library_fragment || // If the current destination isnt even LibraryFragment, then navigate there first
shouldGoToAlbum(navController!!) if (binding.navBar.selectedItemId != R.id.library_fragment) {
) { binding.navBar.selectedItemId = R.id.library_fragment
} else {
// If the user currently is in library, check if its valid to navigate to the
// item in question.
if ((it is Album || it is Song) && shouldGoToAlbum(navController!!)) {
binding.navBar.selectedItemId = R.id.library_fragment
} else if (it is Artist && shouldGoToArtist(navController!!)) {
binding.navBar.selectedItemId = R.id.library_fragment binding.navBar.selectedItemId = R.id.library_fragment
} }
} }
} }
playbackModel.navToPlayingAlbum.observe(viewLifecycleOwner) {
if (it) {
if (binding.navBar.selectedItemId != R.id.library_fragment ||
shouldGoToAlbum(navController!!)
) {
binding.navBar.selectedItemId = R.id.library_fragment
}
}
}
playbackModel.navToPlayingArtist.observe(viewLifecycleOwner) {
if (it) {
if (binding.navBar.selectedItemId != R.id.library_fragment ||
shouldGoToArtist(navController!!)
) {
binding.navBar.selectedItemId = R.id.library_fragment
}
}
} }
playbackModel.restorePlaybackIfNeeded(requireContext()) playbackModel.restorePlaybackIfNeeded(requireContext())
@ -130,7 +120,6 @@ class MainFragment : Fragment() {
return binding.root return binding.root
} }
// I have no idea what these things even do
private fun shouldGoToAlbum(controller: NavController): Boolean { private fun shouldGoToAlbum(controller: NavController): Boolean {
return ( return (
controller.currentDestination!!.id == R.id.album_detail_fragment && controller.currentDestination!!.id == R.id.album_detail_fragment &&

View file

@ -122,8 +122,9 @@ class AlbumDetailFragment : DetailFragment() {
} }
} }
playbackModel.navToPlayingSong.observe(viewLifecycleOwner) { playbackModel.navToItem.observe(viewLifecycleOwner) {
if (it) { if (it != null) {
/*
// Calculate where the item for the currently played song is, and navigate to there. // Calculate where the item for the currently played song is, and navigate to there.
val pos = detailModel.albumSortMode.value!!.getSortedSongList( val pos = detailModel.albumSortMode.value!!.getSortedSongList(
detailModel.currentAlbum.value!!.songs detailModel.currentAlbum.value!!.songs
@ -135,17 +136,14 @@ class AlbumDetailFragment : DetailFragment() {
val y = binding.albumSongRecycler.y + val y = binding.albumSongRecycler.y +
binding.albumSongRecycler.getChildAt(pos).y binding.albumSongRecycler.getChildAt(pos).y
binding.nestedScroll.smoothScrollTo(0, y.toInt()) binding.nestedScroll.scrollTo(0, y.toInt())
} }
playbackModel.doneWithNavToPlayingSong() playbackModel.doneWithNavToItem()
} }
} TODO: Re-add scroll if you find a way to implement the playing indicators on song items
} */
playbackModel.doneWithNavToItem()
playbackModel.navToPlayingAlbum.observe(viewLifecycleOwner) {
if (it) {
playbackModel.doneWithNavToPlayingAlbum()
} }
} }

View file

@ -12,6 +12,7 @@ import androidx.navigation.fragment.navArgs
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding
import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.ui.disable import org.oxycblt.auxio.ui.disable
@ -108,9 +109,9 @@ class ArtistDetailFragment : DetailFragment() {
) )
} }
playbackModel.navToPlayingArtist.observe(viewLifecycleOwner) { playbackModel.navToItem.observe(viewLifecycleOwner) {
if (it) { if (it != null && it is Artist) {
playbackModel.doneWithNavToPlayingArtist() playbackModel.doneWithNavToItem()
} }
} }

View file

@ -151,28 +151,16 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
} }
} }
playbackModel.navToPlayingSong.observe(viewLifecycleOwner) { playbackModel.navToItem.observe(viewLifecycleOwner) {
if (it) { if (it != null) {
libraryModel.updateNavigationStatus(false) libraryModel.updateNavigationStatus(false)
navToItem(playbackModel.song.value!!.album) if (it is Song) {
navToItem(it.album)
} else {
navToItem(it)
} }
} }
playbackModel.navToPlayingAlbum.observe(viewLifecycleOwner) {
if (it) {
libraryModel.updateNavigationStatus(false)
navToItem(playbackModel.song.value!!.album)
}
}
playbackModel.navToPlayingArtist.observe(viewLifecycleOwner) {
if (it) {
libraryModel.updateNavigationStatus(false)
navToItem(playbackModel.song.value!!.album.artist)
}
} }
Log.d(this::class.simpleName, "Fragment created.") Log.d(this::class.simpleName, "Fragment created.")

View file

@ -51,7 +51,7 @@ class CompactPlaybackFragment : Fragment() {
} }
binding.root.setOnLongClickListener { binding.root.setOnLongClickListener {
playbackModel.navToPlayingSong() playbackModel.navToItem(playbackModel.song.value!!)
true true
} }

View file

@ -187,20 +187,8 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener {
} }
} }
playbackModel.navToPlayingSong.observe(viewLifecycleOwner) { playbackModel.navToItem.observe(viewLifecycleOwner) {
if (it) { if (it != null) {
findNavController().navigateUp()
}
}
playbackModel.navToPlayingAlbum.observe(viewLifecycleOwner) {
if (it) {
findNavController().navigateUp()
}
}
playbackModel.navToPlayingArtist.observe(viewLifecycleOwner) {
if (it) {
findNavController().navigateUp() findNavController().navigateUp()
} }
} }

View file

@ -21,7 +21,6 @@ import org.oxycblt.auxio.playback.state.PlaybackStateManager
/** /**
* The ViewModel that provides a UI-Focused frontend for [PlaybackStateManager]. * The ViewModel that provides a UI-Focused frontend for [PlaybackStateManager].
* TODO: Implement navigation to playing album/artist
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
@ -62,14 +61,8 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
private val mIsSeeking = MutableLiveData(false) private val mIsSeeking = MutableLiveData(false)
val isSeeking: LiveData<Boolean> get() = mIsSeeking val isSeeking: LiveData<Boolean> get() = mIsSeeking
private val mNavToPlayingSong = MutableLiveData(false) private val mNavToItem = MutableLiveData<BaseModel?>()
val navToPlayingSong: LiveData<Boolean> get() = mNavToPlayingSong val navToItem: LiveData<BaseModel?> get() = mNavToItem
private val mNavToPlayingAlbum = MutableLiveData(false)
val navToPlayingAlbum: LiveData<Boolean> get() = mNavToPlayingAlbum
private val mNavToPlayingArtist = MutableLiveData(false)
val navToPlayingArtist: LiveData<Boolean> get() = mNavToPlayingArtist
private var mCanAnimate = false private var mCanAnimate = false
val canAnimate: Boolean get() = mCanAnimate val canAnimate: Boolean get() = mCanAnimate
@ -288,28 +281,12 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
} }
} }
fun navToPlayingSong() { fun navToItem(item: BaseModel) {
mNavToPlayingSong.value = true mNavToItem.value = item
} }
fun doneWithNavToPlayingSong() { fun doneWithNavToItem() {
mNavToPlayingSong.value = false mNavToItem.value = null
}
fun navToPlayingAlbum() {
mNavToPlayingAlbum.value = true
}
fun doneWithNavToPlayingAlbum() {
mNavToPlayingAlbum.value = false
}
fun navToPlayingArtist() {
mNavToPlayingArtist.value = true
}
fun doneWithNavToPlayingArtist() {
mNavToPlayingArtist.value = false
} }
fun enableAnimation() { fun enableAnimation() {

View file

@ -67,7 +67,7 @@
android:layout_marginStart="@dimen/margin_mid_large" android:layout_marginStart="@dimen/margin_mid_large"
android:layout_marginEnd="@dimen/margin_mid_large" android:layout_marginEnd="@dimen/margin_mid_large"
android:text="@{song.name}" android:text="@{song.name}"
android:onClick="@{() -> playbackModel.navToPlayingSong()}" android:onClick="@{() -> playbackModel.navToItem(playbackModel.song)}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6" android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
app:layout_constraintBottom_toTopOf="@+id/playback_artist" app:layout_constraintBottom_toTopOf="@+id/playback_artist"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -84,7 +84,7 @@
android:layout_marginStart="@dimen/margin_mid_large" android:layout_marginStart="@dimen/margin_mid_large"
android:layout_marginEnd="@dimen/margin_mid_large" android:layout_marginEnd="@dimen/margin_mid_large"
android:text="@{song.album.artist.name}" android:text="@{song.album.artist.name}"
android:onClick="@{() -> playbackModel.navToPlayingArtist()}" android:onClick="@{() -> playbackModel.navToItem(playbackModel.song.album.artist)}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toTopOf="@+id/playback_album" app:layout_constraintBottom_toTopOf="@+id/playback_album"
@ -102,7 +102,7 @@
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:text="@{song.album.name}" android:text="@{song.album.name}"
android:onClick="@{() -> playbackModel.navToPlayingAlbum()}" android:onClick="@{() -> playbackModel.navToItem(playbackModel.song.album)}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toTopOf="@+id/playback_seek_bar" app:layout_constraintBottom_toTopOf="@+id/playback_seek_bar"