diff --git a/AuxioTODO b/AuxioTODO index 00c8e55e5..bbc2d283d 100644 --- a/AuxioTODO +++ b/AuxioTODO @@ -31,6 +31,9 @@ TODOs surrounded with !s are things I tried to do, but failed for reasons includ - ? Move into ViewPager ? - ! Move Adapter functionality to ListAdapter [RecyclerView scrolls to middle/bottom when data is re-sorted] ! +/bugs/ +- Fix issue where fast navigations will cause the app to not display anything + To be added: /prefs/ /playback/ \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c9262ea8..203f183e5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Base"> - 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 923603d96..970cc9ba0 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -46,9 +46,13 @@ class ArtistDetailFragment : Fragment() { val albumAdapter = DetailAlbumAdapter( ClickListener { - findNavController().navigate( - ArtistDetailFragmentDirections.actionShowAlbum(it.id, false) - ) + if (!detailModel.isNavigating) { + detailModel.updateNavigationStatus(true) + + findNavController().navigate( + ArtistDetailFragmentDirections.actionShowAlbum(it.id, false) + ) + } } ) @@ -91,4 +95,10 @@ class ArtistDetailFragment : Fragment() { return binding.root } + + override fun onResume() { + super.onResume() + + detailModel.updateNavigationStatus(false) + } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index 4777ad9e4..26aca157c 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -9,6 +9,9 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.recycler.SortMode class DetailViewModel : ViewModel() { + private var mIsNavigating = false + val isNavigating: Boolean get() = mIsNavigating + private val mGenreSortMode = MutableLiveData(SortMode.ALPHA_DOWN) val genreSortMode: LiveData get() = mGenreSortMode @@ -79,4 +82,8 @@ class DetailViewModel : ViewModel() { else -> SortMode.NUMERIC_DOWN } } + + fun updateNavigationStatus(value: Boolean) { + mIsNavigating = value + } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt index ca0ae60ff..e2f63bcfe 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -44,11 +44,15 @@ class GenreDetailFragment : Fragment() { ) } - val albumAdapter = DetailArtistAdapter( + val artistAdapter = DetailArtistAdapter( ClickListener { - findNavController().navigate( - GenreDetailFragmentDirections.actionShowArtist(it.id) - ) + if (!detailModel.isNavigating) { + detailModel.updateNavigationStatus(true) + + findNavController().navigate( + GenreDetailFragmentDirections.actionShowArtist(it.id) + ) + } } ) @@ -56,7 +60,7 @@ class GenreDetailFragment : Fragment() { binding.detailModel = detailModel binding.genre = detailModel.currentGenre.value - binding.genreArtistRecycler.adapter = albumAdapter + binding.genreArtistRecycler.adapter = artistAdapter binding.genreArtistRecycler.applyDivider() binding.genreArtistRecycler.setHasFixedSize(true) @@ -71,7 +75,7 @@ class GenreDetailFragment : Fragment() { binding.genreSortButton.setImageResource(mode.iconRes) // Then update the sort mode of the artist adapter. - albumAdapter.submitList( + artistAdapter.submitList( mode.getSortedArtistList(detailModel.currentGenre.value!!.artists) ) } @@ -89,4 +93,10 @@ class GenreDetailFragment : Fragment() { return binding.root } + + override fun onResume() { + super.onResume() + + detailModel.updateNavigationStatus(false) + } } diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt index f2932f9c4..588463332 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt @@ -19,7 +19,7 @@ import org.oxycblt.auxio.theme.SHOW_GENRES // A Great Value androidx ListAdapter that can display three types of ViewHolders. class LibraryAdapter( private val showMode: Int, - private val listener: ClickListener + val listener: ClickListener ) : RecyclerView.Adapter() { var data: List 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 c393a9c23..479e9d41a 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -34,6 +34,8 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { private val musicModel: MusicViewModel by activityViewModels() private val libraryModel: LibraryViewModel by activityViewModels() + private lateinit var libraryAdapter: LibraryAdapter + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -80,7 +82,7 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { true } - val libraryAdapter = LibraryAdapter( + libraryAdapter = LibraryAdapter( libraryModel.showMode.value!!, ClickListener { navToItem(it) } ) @@ -132,6 +134,12 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { return binding.root } + override fun onResume() { + super.onResume() + + libraryModel.updateNavigationStatus(false) + } + override fun onQueryTextSubmit(query: String): Boolean = false override fun onQueryTextChange(query: String): Boolean { @@ -143,14 +151,18 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { private fun navToItem(baseModel: BaseModel) { Log.d(this::class.simpleName, "Navigating to the detail fragment for ${baseModel.name}") - findNavController().navigate( - when (baseModel) { - is Genre -> MainFragmentDirections.actionShowGenre(baseModel.id) - is Artist -> MainFragmentDirections.actionShowArtist(baseModel.id) - is Album -> MainFragmentDirections.actionShowAlbum(baseModel.id, true) + if (!libraryModel.isNavigating) { + libraryModel.updateNavigationStatus(true) - else -> return - } - ) + findNavController().navigate( + when (baseModel) { + is Genre -> MainFragmentDirections.actionShowGenre(baseModel.id) + is Artist -> MainFragmentDirections.actionShowArtist(baseModel.id) + is Album -> MainFragmentDirections.actionShowAlbum(baseModel.id, true) + + else -> return + } + ) + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt index b4201b3d7..f21ceeafd 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt @@ -8,7 +8,10 @@ import org.oxycblt.auxio.R import org.oxycblt.auxio.recycler.SortMode import org.oxycblt.auxio.theme.SHOW_ARTISTS -class LibraryViewModel() : ViewModel() { +class LibraryViewModel : ViewModel() { + private var mIsNavigating = false + val isNavigating: Boolean get() = mIsNavigating + // TODO: Move these to prefs when they're added private val mShowMode = MutableLiveData(SHOW_ARTISTS) val showMode: LiveData get() = mShowMode @@ -36,4 +39,8 @@ class LibraryViewModel() : ViewModel() { fun updateSearchQuery(query: String) { mSearchQuery.value = query } + + fun updateNavigationStatus(value: Boolean) { + mIsNavigating = value + } } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/BaseViewHolder.kt b/app/src/main/java/org/oxycblt/auxio/recycler/BaseViewHolder.kt index 7b9bbeb6a..d84d74ae5 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/BaseViewHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/BaseViewHolder.kt @@ -16,7 +16,9 @@ abstract class BaseViewHolder( } fun bind(model: T) { - baseBinding.root.setOnClickListener { listener.onClick(model) } + baseBinding.root.setOnClickListener { + listener.onClick(model) + } onBind(model) diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt index 9deeb638b..27f73b925 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt @@ -5,17 +5,7 @@ import org.oxycblt.auxio.music.BaseModel // A RecyclerView click listener that can only be called once. // Primarily used for navigation to prevent bugs when multiple items are selected. -class ClickListener(private val clickAction: (T) -> Unit) { - private var hasClicked = false - - fun onClick(item: T) { - if (!hasClicked) { - hasClicked = true - - clickAction(item) - } - } -} +class ClickListener(val onClick: (T) -> Unit) // Base Diff callback class DiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/res/drawable/cursor.xml b/app/src/main/res/drawable/cursor.xml index 0af5ef6c8..b6adfefdd 100644 --- a/app/src/main/res/drawable/cursor.xml +++ b/app/src/main/res/drawable/cursor.xml @@ -1,10 +1,9 @@ - - + android:shape="rectangle"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml index 55dcccbc7..2b1a6a6b8 100644 --- a/app/src/main/res/drawable/ic_search.xml +++ b/app/src/main/res/drawable/ic_search.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorControlNormal"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index cf9541635..1c605d70b 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -19,7 +19,7 @@ app:popupTheme="@style/AppThemeOverlay.Popup" app:menu="@menu/menu_library" app:titleTextAppearance="@style/TextAppearance.Toolbar.Header" - app:title="@string/title_library_fragment"/> + app:title="@string/title_library_fragment" /> + app:destination="@id/artist_detail_fragment" />