diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index baae0a8c0..bc52f7231 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -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) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index f2a8efdc5..3cde2d3ab 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -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 diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index 6cbecdbff..c8428494f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -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 diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt index de8694ee5..eba09351b 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt @@ -32,7 +32,6 @@ abstract class DetailFragment : Fragment() { super.onPause() callback.isEnabled = false } - private val callback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 3b1fd9ee1..0ed6609ea 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -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 diff --git a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt index 0eaea0dd4..c537da8bb 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -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 } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 5d81aa01f..bfcc4bdca 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -58,13 +58,16 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { private val mLoopMode = MutableLiveData(LoopMode.NONE) val loopMode: LiveData get() = mLoopMode - private var mCanAnimate = false - val canAnimate: Boolean get() = mCanAnimate - // Other private val mIsSeeking = MutableLiveData(false) val isSeeking: LiveData get() = mIsSeeking + private val mNavToSong = MutableLiveData(false) + val navToSong: LiveData 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 } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt index 7c1c87cf5..bd40029a1 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt @@ -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