diff --git a/AuxioTODO b/AuxioTODO index 8de2461d2..d1b4d5d43 100644 --- a/AuxioTODO +++ b/AuxioTODO @@ -23,8 +23,6 @@ TODO: /library/ -- Re-add albums/genres into a single adapter -- Add highlighting to the current sortmode - Search - Exit functionality - ? Show Artists, Albums, and Songs in search ? diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt new file mode 100644 index 000000000..01be48292 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryAdapter.kt @@ -0,0 +1,110 @@ +package org.oxycblt.auxio.library + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.databinding.ItemAlbumBinding +import org.oxycblt.auxio.databinding.ItemArtistBinding +import org.oxycblt.auxio.databinding.ItemGenreBinding +import org.oxycblt.auxio.music.Album +import org.oxycblt.auxio.music.Artist +import org.oxycblt.auxio.music.BaseModel +import org.oxycblt.auxio.music.Genre +import org.oxycblt.auxio.recycler.BaseViewHolder +import org.oxycblt.auxio.recycler.ClickListener +import org.oxycblt.auxio.theme.SHOW_ALBUMS +import org.oxycblt.auxio.theme.SHOW_ARTISTS +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 +) : RecyclerView.Adapter() { + + private var data: List + + init { + // Assign the data on startup depending on the type + data = when (showMode) { + SHOW_GENRES -> listOf() + SHOW_ALBUMS -> listOf() + SHOW_ARTISTS -> listOf() + + else -> listOf() + } + } + + override fun getItemCount(): Int = data.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + // Return a different View Holder depending on the show type + return when (showMode) { + SHOW_GENRES -> GenreViewHolder( + ItemGenreBinding.inflate(LayoutInflater.from(parent.context)) + ) + + SHOW_ARTISTS -> ArtistViewHolder( + ItemArtistBinding.inflate(LayoutInflater.from(parent.context)) + ) + + SHOW_ALBUMS -> AlbumViewHolder( + ItemAlbumBinding.inflate(LayoutInflater.from(parent.context)) + ) + + else -> ArtistViewHolder( + ItemArtistBinding.inflate(LayoutInflater.from(parent.context)) + ) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (showMode) { + SHOW_GENRES -> holder as GenreViewHolder + SHOW_ARTISTS -> holder as ArtistViewHolder + SHOW_ALBUMS -> holder as AlbumViewHolder + + else -> return + }.bind(data[position]) + } + + // Update the data, as its an internal value. + // TODO: Call this from a coroutine. + fun updateData(newData: List) { + data = newData + + notifyDataSetChanged() + } + + // --- VIEWHOLDERS --- + + inner class GenreViewHolder( + private val binding: ItemGenreBinding + ) : BaseViewHolder(binding, listener) { + + override fun onBind(model: BaseModel) { + binding.genre = model as Genre + binding.genreName.requestLayout() + } + } + + inner class ArtistViewHolder( + private val binding: ItemArtistBinding + ) : BaseViewHolder(binding, listener) { + + override fun onBind(model: BaseModel) { + binding.artist = model as Artist + binding.artistName.requestLayout() + } + } + + inner class AlbumViewHolder( + private val binding: ItemAlbumBinding + ) : BaseViewHolder(binding, listener) { + + override fun onBind(model: BaseModel) { + binding.album = model as Album + binding.albumName.requestLayout() + } + } +} 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 9bdae8f4b..d1052eaf4 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -13,13 +13,15 @@ import androidx.navigation.fragment.findNavController import org.oxycblt.auxio.MainFragmentDirections import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentLibraryBinding -import org.oxycblt.auxio.library.adapters.ArtistAdapter import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.recycler.ClickListener +import org.oxycblt.auxio.theme.SHOW_ALBUMS +import org.oxycblt.auxio.theme.SHOW_ARTISTS +import org.oxycblt.auxio.theme.SHOW_GENRES import org.oxycblt.auxio.theme.applyColor import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.resolveAttr @@ -36,7 +38,8 @@ class LibraryFragment : Fragment() { ): View? { val binding = FragmentLibraryBinding.inflate(inflater) - val artistAdapter = ArtistAdapter( + val artistAdapter = LibraryAdapter( + libraryModel.showMode.value!!, ClickListener { navToItem(it) } ) @@ -49,9 +52,13 @@ class LibraryFragment : Fragment() { // Update the adapter with the new data artistAdapter.updateData( - mode.getSortedArtistList( - musicModel.artists.value!! - ) + when (libraryModel.showMode.value) { + SHOW_GENRES -> mode.getSortedGenreList(musicModel.genres.value!!) + SHOW_ARTISTS -> mode.getSortedArtistList(musicModel.artists.value!!) + SHOW_ALBUMS -> mode.getSortedAlbumList(musicModel.albums.value!!) + + else -> mode.getSortedArtistList(musicModel.artists.value!!) + } ) // Then update the shown icon & the currently highlighted sort icon to reflect @@ -75,8 +82,6 @@ class LibraryFragment : Fragment() { true } - binding.libraryToolbar.inflateMenu(R.menu.menu_library) - Log.d(this::class.simpleName, "Fragment created.") return binding.root @@ -93,6 +98,8 @@ class LibraryFragment : Fragment() { if (!libraryModel.isAlreadyNavigating) { libraryModel.isAlreadyNavigating = true + Log.d(this::class.simpleName, "Navigating to the detail fragment for $baseModel.name") + findNavController().navigate( when (baseModel) { is Genre -> MainFragmentDirections.actionShowGenre(baseModel.id) 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 fc4933552..30295f944 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt @@ -11,11 +11,11 @@ import org.oxycblt.auxio.theme.SHOW_ARTISTS class LibraryViewModel : ViewModel() { var isAlreadyNavigating = false - // TODO: Move these to pref values when they're added + // TODO: Move these to prefs when they're added private val mShowMode = MutableLiveData(SHOW_ARTISTS) val showMode: LiveData get() = mShowMode - private val mSortMode = MutableLiveData(SortMode.ALPHA_UP) + private val mSortMode = MutableLiveData(SortMode.ALPHA_DOWN) val sortMode: LiveData get() = mSortMode fun updateSortMode(item: MenuItem) { diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt deleted file mode 100644 index 9ee2cbeac..000000000 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.oxycblt.auxio.library.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter -import org.oxycblt.auxio.databinding.ItemAlbumBinding -import org.oxycblt.auxio.music.Album -import org.oxycblt.auxio.recycler.BaseViewHolder -import org.oxycblt.auxio.recycler.ClickListener -import org.oxycblt.auxio.recycler.DiffCallback - -class AlbumAdapter( - private val listener: ClickListener -) : ListAdapter(DiffCallback()) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - ItemAlbumBinding.inflate(LayoutInflater.from(parent.context)) - ) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - inner class ViewHolder( - private val binding: ItemAlbumBinding - ) : BaseViewHolder(binding, listener) { - - override fun onBind(model: Album) { - binding.album = model - binding.albumName.requestLayout() - } - } -} diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt deleted file mode 100644 index 8b68d5893..000000000 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.oxycblt.auxio.library.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.oxycblt.auxio.databinding.ItemArtistBinding -import org.oxycblt.auxio.music.Artist -import org.oxycblt.auxio.recycler.BaseViewHolder -import org.oxycblt.auxio.recycler.ClickListener - -class ArtistAdapter( - private val listener: ClickListener -) : RecyclerView.Adapter() { - - private var data = listOf() - - override fun getItemCount(): Int = data.size - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - ItemArtistBinding.inflate(LayoutInflater.from(parent.context)) - ) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(data[position]) - } - - fun updateData(newData: List) { - data = newData - - notifyDataSetChanged() - } - - inner class ViewHolder( - private val binding: ItemArtistBinding - ) : BaseViewHolder(binding, listener) { - - override fun onBind(model: Artist) { - binding.artist = model - binding.artistName.requestLayout() - } - } -} diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/GenreAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/GenreAdapter.kt deleted file mode 100644 index 604754d84..000000000 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/GenreAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.oxycblt.auxio.library.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter -import org.oxycblt.auxio.databinding.ItemGenreBinding -import org.oxycblt.auxio.music.Genre -import org.oxycblt.auxio.recycler.BaseViewHolder -import org.oxycblt.auxio.recycler.ClickListener -import org.oxycblt.auxio.recycler.DiffCallback - -class GenreAdapter( - private val listener: ClickListener -) : ListAdapter(DiffCallback()) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - ItemGenreBinding.inflate(LayoutInflater.from(parent.context)) - ) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - inner class ViewHolder( - private val binding: ItemGenreBinding - ) : BaseViewHolder(binding, listener) { - - override fun onBind(model: Genre) { - binding.genre = model - binding.genreName.requestLayout() - } - } -} diff --git a/app/src/main/res/drawable/ic_sort_none.xml b/app/src/main/res/drawable/ic_sort_none.xml index 4162e16d0..47d54f7fb 100644 --- a/app/src/main/res/drawable/ic_sort_none.xml +++ b/app/src/main/res/drawable/ic_sort_none.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorPrimary"> - + \ 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 f06c3d0f7..24dbff0d8 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -17,6 +17,7 @@ android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" app:popupTheme="@style/AppThemeOverlay.Popup" + app:menu="@menu/menu_library" app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" app:title="@string/title_library_fragment" /> diff --git a/app/src/main/res/menu/menu_library.xml b/app/src/main/res/menu/menu_library.xml index ab3e2b72b..d09c64c91 100644 --- a/app/src/main/res/menu/menu_library.xml +++ b/app/src/main/res/menu/menu_library.xml @@ -4,15 +4,15 @@ android:id="@+id/sort_none" android:icon="@drawable/ic_sort_none" android:title="@string/label_sort_none" - android:contentDescription="@string/description_sort_none"/> + android:contentDescription="@string/description_sort_none" /> + android:contentDescription="@string/description_sort_alpha_down" /> + android:contentDescription="@string/description_sort_alpha_up" /> \ No newline at end of file