Re-add playback nav

Re-add the ability to navigate back to the currently playing song. Now with a scroll!
This commit is contained in:
OxygenCobalt 2020-11-23 18:34:38 -07:00
parent 0627677569
commit d46b99400f
8 changed files with 64 additions and 20 deletions

View file

@ -4,7 +4,6 @@ import android.content.res.ColorStateList
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
@ -15,7 +14,9 @@ import androidx.navigation.NavOptions
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import org.oxycblt.auxio.databinding.FragmentMainBinding
import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.ui.accent
@ -26,6 +27,7 @@ import java.lang.IllegalArgumentException
class MainFragment : Fragment() {
private val playbackModel: PlaybackViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
@ -70,10 +72,8 @@ class MainFragment : Fragment() {
binding.navBar.itemIconTintList = navTints
binding.navBar.itemTextColor = navTints
navController?.let {
binding.navBar.setOnNavigationItemSelectedListener { item ->
navigateWithItem(item, it)
}
navController?.let { controller ->
binding.navBar.setupWithNavController(controller)
}
// --- VIEWMODEL SETUP ---
@ -93,6 +93,19 @@ class MainFragment : Fragment() {
}
}
playbackModel.navToSong.observe(viewLifecycleOwner) {
if (it) {
if (binding.navBar.selectedItemId != R.id.library_fragment ||
navController!!.currentDestination?.id == R.id.artist_detail_fragment ||
navController.currentDestination?.id == R.id.genre_detail_fragment ||
detailModel.currentAlbum.value == null ||
detailModel.currentAlbum.value?.id != playbackModel.song.value!!.album.id
) {
binding.navBar.selectedItemId = R.id.library_fragment
}
}
}
playbackModel.restorePlaybackIfNeeded(requireContext())
Log.d(this::class.simpleName, "Fragment Created.")
@ -107,16 +120,11 @@ class MainFragment : Fragment() {
if (item.itemId != navController.currentDestination!!.id) {
val builder = NavOptions.Builder().setLaunchSingleTop(true)
builder.setEnterAnim(R.anim.nav_default_enter_anim)
val options = builder.setEnterAnim(R.anim.nav_default_enter_anim)
.setExitAnim(R.anim.nav_default_exit_anim)
.setPopEnterAnim(R.anim.nav_default_enter_anim)
.setPopExitAnim(R.anim.nav_default_exit_anim)
if ((item.order and Menu.CATEGORY_SECONDARY) == 0) {
builder.setPopUpTo(navController.graph.startDestination, false)
}
val options = builder.build()
.build()
return try {
navController.navigate(item.itemId, null, options)

View file

@ -122,6 +122,25 @@ class AlbumDetailFragment : DetailFragment() {
}
}
playbackModel.navToSong.observe(viewLifecycleOwner) {
if (it) {
val pos = detailModel.currentAlbum.value!!.songs.indexOf(playbackModel.song.value)
if (pos != -1) {
binding.albumSongRecycler.post {
val y = binding.albumSongRecycler.y +
binding.albumSongRecycler.getChildAt(pos).y
binding.nestedScroll.smoothScrollBy(0, y.toInt())
}
playbackModel.doneWithNavToPlayingSong()
} else {
findNavController().navigateUp()
}
}
}
Log.d(this::class.simpleName, "Fragment created.")
return binding.root

View file

@ -14,7 +14,6 @@ import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding
import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.ui.disable
import org.oxycblt.auxio.ui.setupAlbumActions

View file

@ -32,7 +32,6 @@ abstract class DetailFragment : Fragment() {
super.onPause()
callback.isEnabled = false
}
private val callback = object : OnBackPressedCallback(false) {
override fun handleOnBackPressed() {

View file

@ -151,6 +151,14 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
}
}
playbackModel.navToSong.observe(viewLifecycleOwner) {
if (it) {
libraryModel.updateNavigationStatus(false)
navToItem(playbackModel.song.value!!.album)
}
}
Log.d(this::class.simpleName, "Fragment created.")
return binding.root

View file

@ -14,7 +14,6 @@ import org.oxycblt.auxio.MainFragmentDirections
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentCompactPlaybackBinding
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.ui.createToast
/**
* A [Fragment] that displays the currently played song at a glance, with some basic controls.
@ -57,8 +56,10 @@ class CompactPlaybackFragment : Fragment() {
}
binding.root.setOnLongClickListener {
playbackModel.navToPlayingSong()
/*
playbackModel.save(requireContext())
getString(R.string.debug_state_saved).createToast(requireContext())
getString(R.string.debug_state_saved).createToast(requireContext()) */
true
}

View file

@ -58,13 +58,16 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
private val mLoopMode = MutableLiveData(LoopMode.NONE)
val loopMode: LiveData<LoopMode> get() = mLoopMode
private var mCanAnimate = false
val canAnimate: Boolean get() = mCanAnimate
// Other
private val mIsSeeking = MutableLiveData(false)
val isSeeking: LiveData<Boolean> get() = mIsSeeking
private val mNavToSong = MutableLiveData(false)
val navToSong: LiveData<Boolean> get() = mNavToSong
private var mCanAnimate = false
val canAnimate: Boolean get() = mCanAnimate
val formattedPosition = Transformations.map(mPosition) {
it.toDuration()
}
@ -279,6 +282,14 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
}
}
fun navToPlayingSong() {
mNavToSong.value = true
}
fun doneWithNavToPlayingSong() {
mNavToSong.value = false
}
fun resetCanAnimate() {
mCanAnimate = false
}

View file

@ -10,7 +10,6 @@ import android.widget.Toast
import androidx.annotation.ColorInt
import androidx.annotation.MenuRes
import androidx.appcompat.widget.PopupMenu
import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.R
import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.music.Album