diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 5b3b6f942..7516ac2be 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -35,7 +35,7 @@ class MainFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner - binding.viewPager.adapter = PagerAdapter() + binding.mainViewPager.adapter = PagerAdapter() val colorActive = accent.first.toColor(requireContext()) val colorInactive = getTransparentAccent( @@ -45,7 +45,7 @@ class MainFragment : Fragment() { ) // Link the ViewPager & Tab View - TabLayoutMediator(binding.tabs, binding.viewPager) { tab, position -> + TabLayoutMediator(binding.mainTabs, binding.mainViewPager) { tab, position -> tab.icon = ContextCompat.getDrawable(requireContext(), tabIcons[position]) // Set the icon tint to deselected if its not the default tab @@ -55,7 +55,7 @@ class MainFragment : Fragment() { }.attach() // Set up the selected/deselected colors - binding.tabs.addOnTabSelectedListener( + binding.mainTabs.addOnTabSelectedListener( object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { 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 f2b3fc0f9..1884f7cc0 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -51,11 +51,13 @@ class AlbumDetailFragment : Fragment() { binding.detailModel = detailModel binding.album = detailModel.currentAlbum - binding.songRecycler.adapter = songAdapter - binding.songRecycler.applyDivider() - binding.songRecycler.setHasFixedSize(true) + binding.albumSongRecycler.apply { + adapter = songAdapter + applyDivider() + setHasFixedSize(true) + } - binding.toolbar.setNavigationOnClickListener { + binding.albumToolbar.setNavigationOnClickListener { findNavController().navigateUp() } @@ -76,12 +78,12 @@ class AlbumDetailFragment : Fragment() { } } - binding.artistName.setBackgroundResource(R.drawable.ripple) + binding.albumArtist.setBackgroundResource(R.drawable.ripple) } detailModel.albumSortMode.observe(viewLifecycleOwner) { mode -> // Update the current sort icon - binding.sortButton.setImageResource(mode.iconRes) + binding.albumSortButton.setImageResource(mode.iconRes) // Then update the sort mode of the album adapter. songAdapter.submitList( @@ -98,11 +100,11 @@ class AlbumDetailFragment : Fragment() { // Don't enable the sort button if there's only one song [or less] if (detailModel.currentAlbum!!.numSongs < 2) { - binding.sortButton.imageTintList = ColorStateList.valueOf( + binding.albumSortButton.imageTintList = ColorStateList.valueOf( R.color.inactive_color.toColor(requireContext()) ) - binding.sortButton.isEnabled = false + binding.albumSortButton.isEnabled = false } Log.d(this::class.simpleName, "Fragment created.") 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 5a79a00b6..6ba6374fe 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -51,17 +51,19 @@ class ArtistDetailFragment : Fragment() { binding.detailModel = detailModel binding.artist = detailModel.currentArtist!! - binding.albumRecycler.adapter = albumAdapter - binding.albumRecycler.applyDivider() - binding.albumRecycler.setHasFixedSize(true) + binding.artistAlbumRecycler.apply { + adapter = albumAdapter + applyDivider() + setHasFixedSize(true) + } - binding.toolbar.setNavigationOnClickListener { + binding.artistToolbar.setNavigationOnClickListener { findNavController().navigateUp() } detailModel.artistSortMode.observe(viewLifecycleOwner) { mode -> // Update the current sort icon - binding.sortButton.setImageResource(mode.iconRes) + binding.artistSortButton.setImageResource(mode.iconRes) // Then update the sort mode of the album adapter. albumAdapter.submitList( @@ -78,11 +80,11 @@ class ArtistDetailFragment : Fragment() { // Don't enable the sort button if there is only one album [Or less] if (detailModel.currentArtist!!.numAlbums < 2) { - binding.sortButton.imageTintList = ColorStateList.valueOf( + binding.artistSortButton.imageTintList = ColorStateList.valueOf( R.color.inactive_color.toColor(requireContext()) ) - binding.sortButton.isEnabled = false + binding.artistSortButton.isEnabled = false } Log.d(this::class.simpleName, "Fragment created.") 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 5fbdee57e..ac03880d1 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -51,17 +51,17 @@ class GenreDetailFragment : Fragment() { binding.detailModel = detailModel binding.genre = detailModel.currentGenre!! - binding.albumRecycler.adapter = albumAdapter - binding.albumRecycler.applyDivider() - binding.albumRecycler.setHasFixedSize(true) + binding.genreArtistRecycler.adapter = albumAdapter + binding.genreArtistRecycler.applyDivider() + binding.genreArtistRecycler.setHasFixedSize(true) - binding.toolbar.setNavigationOnClickListener { + binding.genreToolbar.setNavigationOnClickListener { findNavController().navigateUp() } detailModel.genreSortMode.observe(viewLifecycleOwner) { mode -> // Update the current sort icon - binding.sortButton.setImageResource(mode.iconRes) + binding.genreSortButton.setImageResource(mode.iconRes) // Then update the sort mode of the album adapter. albumAdapter.submitList( @@ -78,11 +78,11 @@ class GenreDetailFragment : Fragment() { // Don't enable the sort button if there is only one artist [Or less] if (detailModel.currentGenre!!.numArtists < 2) { - binding.sortButton.imageTintList = ColorStateList.valueOf( + binding.genreSortButton.imageTintList = ColorStateList.valueOf( R.color.inactive_color.toColor(requireContext()) ) - binding.sortButton.isEnabled = false + binding.genreSortButton.isEnabled = false } Log.d(this::class.simpleName, "Fragment created.") diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt index f8cf9ed9c..daec940e6 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt @@ -3,7 +3,9 @@ package org.oxycblt.auxio.detail.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter +import org.oxycblt.auxio.databinding.ItemAlbumBinding import org.oxycblt.auxio.databinding.ItemArtistAlbumBinding +import org.oxycblt.auxio.databinding.ItemArtistBinding import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.recycler.BaseViewHolder import org.oxycblt.auxio.recycler.ClickListener @@ -30,6 +32,7 @@ class DetailAlbumAdapter( override fun onBind(model: Album) { binding.album = model + binding.albumName.requestLayout() } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt index 7b6a2ac0d..bda194b11 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt @@ -3,8 +3,10 @@ package org.oxycblt.auxio.detail.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter +import org.oxycblt.auxio.databinding.ItemArtistBinding import org.oxycblt.auxio.databinding.ItemGenreArtistBinding import org.oxycblt.auxio.music.Artist +import org.oxycblt.auxio.music.bindArtistCounts import org.oxycblt.auxio.recycler.BaseViewHolder import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.DiffCallback @@ -30,6 +32,7 @@ class DetailArtistAdapter( override fun onBind(model: Artist) { binding.artist = model + binding.artistName.requestLayout() } } 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 index 3d3fd3936..a7114f4db 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt @@ -5,6 +5,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.databinding.ItemAlbumBinding import org.oxycblt.auxio.music.Album +import org.oxycblt.auxio.music.bindAlbumSongs import org.oxycblt.auxio.recycler.BaseViewHolder import org.oxycblt.auxio.recycler.ClickListener 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 index f54bafeba..155dcc5fc 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt @@ -5,6 +5,7 @@ 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.music.bindArtistCounts import org.oxycblt.auxio.recycler.BaseViewHolder import org.oxycblt.auxio.recycler.ClickListener 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 index c4e0502f4..c324d06e6 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/GenreAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/GenreAdapter.kt @@ -31,7 +31,7 @@ class GenreAdapter( override fun onBind(model: Genre) { binding.genre = model - binding.artistName.requestLayout() + binding.genreName.requestLayout() } } } diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index 418aae838..5e234e40c 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -103,7 +103,7 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { ) } else { binding.let { binding -> - binding.errorText.text = + binding.loadingErrorText.text = if (response == MusicLoaderResponse.NO_MUSIC) getString(R.string.error_no_music) else @@ -113,9 +113,9 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { // depending on which error response was given, along with a retry button binding.loadingBar.visibility = View.GONE - binding.errorText.visibility = View.VISIBLE - binding.statusIcon.visibility = View.VISIBLE - binding.retryButton.visibility = View.VISIBLE + binding.loadingErrorText.visibility = View.VISIBLE + binding.loadingErrorIcon.visibility = View.VISIBLE + binding.loadingRetryButton.visibility = View.VISIBLE } } } @@ -126,11 +126,11 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { // along with a GRANT button binding.loadingBar.visibility = View.GONE - binding.statusIcon.visibility = View.VISIBLE - binding.grantButton.visibility = View.VISIBLE - binding.errorText.visibility = View.VISIBLE + binding.loadingErrorIcon.visibility = View.VISIBLE + binding.loadingGrantButton.visibility = View.VISIBLE + binding.loadingErrorText.visibility = View.VISIBLE - binding.errorText.text = getString(R.string.error_no_perms) + binding.loadingErrorText.text = getString(R.string.error_no_perms) } private fun onRetry(retry: Boolean) { @@ -149,12 +149,12 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { } } - // Wipe views and switch back to the plain LoadingBar + // Wipe views and switch back to the plain ProgressBar private fun wipeViews() { binding.loadingBar.visibility = View.VISIBLE - binding.errorText.visibility = View.GONE - binding.statusIcon.visibility = View.GONE - binding.retryButton.visibility = View.GONE - binding.grantButton.visibility = View.GONE + binding.loadingErrorText.visibility = View.GONE + binding.loadingErrorIcon.visibility = View.GONE + binding.loadingRetryButton.visibility = View.GONE + binding.loadingGrantButton.visibility = View.GONE } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicModels.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt similarity index 73% rename from app/src/main/java/org/oxycblt/auxio/music/MusicModels.kt rename to app/src/main/java/org/oxycblt/auxio/music/Models.kt index c3ee3b3a0..9d60eafa9 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicModels.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -15,7 +15,7 @@ data class Song( override var name: String, val albumId: Long, val track: Int, - val duration: Long + val duration: Long, ) : BaseModel() { lateinit var album: Album @@ -35,13 +35,14 @@ data class Album( val songs = mutableListOf() val numSongs: Int get() = songs.size - val totalDuration: String get() { - var seconds: Long = 0 - songs.forEach { - seconds += it.seconds + val totalDuration: String + get() { + var seconds: Long = 0 + songs.forEach { + seconds += it.seconds + } + return seconds.toDuration() } - return seconds.toDuration() - } } // Artist @@ -72,18 +73,20 @@ data class Genre( val artists = mutableListOf() val numArtists: Int get() = artists.size - val numAlbums: Int get() { - var num = 0 - artists.forEach { - num += it.numAlbums + val numAlbums: Int + get() { + var num = 0 + artists.forEach { + num += it.numAlbums + } + return num } - return num - } - val numSongs: Int get() { - var num = 0 - artists.forEach { - num += it.numSongs + val numSongs: Int + get() { + var num = 0 + artists.forEach { + num += it.numSongs + } + return num } - return num - } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt index efe20b2c2..872826089 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -70,39 +70,23 @@ fun Long.toAlbumArtURI(): Uri { // Convert seconds into its string duration fun Long.toDuration(): String { - val durationString = DateUtils.formatElapsedTime(this) + var durationString = DateUtils.formatElapsedTime(this) - val durationSplit = durationString.chunked(1).toMutableList() - - // Iterate through the string and remove the first zero found - // If anything else is found, exit the loop. - for (i in 0 until durationSplit.size) { - if (durationSplit[i] == "0") { - durationSplit.removeAt(i) - - break - } else { - break - } + // If the duration begins with a excess zero [e.g 01:42], then cut it off. + if (durationString[0] == '0') { + durationString = durationString.slice(1 until durationString.length) } - return durationSplit.joinToString("") + return durationString } // --- BINDING ADAPTERS --- -fun getAlbumSongCount(album: Album, context: Context): String { - return context.resources.getQuantityString( - R.plurals.format_song_count, album.numSongs, album.numSongs - ) -} - @BindingAdapter("genreCounts") fun TextView.bindGenreCounts(genre: Genre) { val artists = context.resources.getQuantityString( R.plurals.format_artist_count, genre.numArtists, genre.numArtists ) - val albums = context.resources.getQuantityString( R.plurals.format_album_count, genre.numAlbums, genre.numAlbums ) @@ -117,6 +101,7 @@ fun TextView.bindArtistGenre(artist: Artist) { text = artist.genres[0].name } +// Get the artist counts @BindingAdapter("artistCounts") fun TextView.bindArtistCounts(artist: Artist) { val albums = context.resources.getQuantityString( @@ -135,13 +120,18 @@ fun TextView.bindAlbumDetails(album: Album) { text = context.getString( R.string.format_double_info, album.year.toString(), - getAlbumSongCount(album, context), + context.resources.getQuantityString( + R.plurals.format_song_count, + album.numSongs, album.numSongs + ), album.totalDuration ) } +@BindingAdapter("albumSongs") // Format the amount of songs in an album -@BindingAdapter("songCount") fun TextView.bindAlbumSongs(album: Album) { - text = getAlbumSongCount(album, context) + text = context.resources.getQuantityString( + R.plurals.format_song_count, album.numSongs, album.numSongs + ) } diff --git a/app/src/main/java/org/oxycblt/auxio/music/coil/CoilUtils.kt b/app/src/main/java/org/oxycblt/auxio/music/coil/CoilUtils.kt index 0051126dc..1a2ac9f4d 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/coil/CoilUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/coil/CoilUtils.kt @@ -14,7 +14,7 @@ import org.oxycblt.auxio.music.Song // Get the cover art for a song or album @BindingAdapter("coverArt") -fun ImageView.getCoverArt(song: Song) { +fun ImageView.bindCoverArt(song: Song) { val request = getDefaultRequest(context, this) .data(song.album.coverUri) .error(R.drawable.ic_song) @@ -24,7 +24,7 @@ fun ImageView.getCoverArt(song: Song) { } @BindingAdapter("coverArt") -fun ImageView.getCoverArt(album: Album) { +fun ImageView.bindCoverArt(album: Album) { val request = getDefaultRequest(context, this) .data(album.coverUri) .error(R.drawable.ic_album) @@ -35,7 +35,7 @@ fun ImageView.getCoverArt(album: Album) { // Get the artist image @BindingAdapter("artistImage") -fun ImageView.getArtistImage(artist: Artist) { +fun ImageView.bindArtistImage(artist: Artist) { val request: ImageRequest // If there are more than one albums, then create a mosaic of them. @@ -72,7 +72,7 @@ fun ImageView.getArtistImage(artist: Artist) { } @BindingAdapter("genreImage") -fun ImageView.getGenreImage(genre: Genre) { +fun ImageView.bindGenreImage(genre: Genre) { val request: ImageRequest if (genre.numArtists >= 4) { diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt index ce879b963..6557e582f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt @@ -144,7 +144,7 @@ class MusicSorter( ) for (artist in unknownArtists) { - artist.givenGenres.add(unknownGenre) + artist.genres.add(unknownGenre) unknownGenre.artists.add(artist) } genres.add(unknownGenre) diff --git a/app/src/main/res/drawable/ic_genre.xml b/app/src/main/res/drawable/ic_genre.xml index 3a4918b43..46bf0a751 100644 --- a/app/src/main/res/drawable/ic_genre.xml +++ b/app/src/main/res/drawable/ic_genre.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/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ce8bd032a..0d46882b8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - + app:layout_constraintTop_toBottomOf="@+id/album_artist" + tools:text="2020 / 10 Songs / 16:16" /> + app:layout_constraintTop_toBottomOf="@+id/album_song_count" /> + app:layout_constraintTop_toBottomOf="@+id/album_song_count" /> diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index a74e252b3..fa05a4afa 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -20,7 +20,7 @@ android:orientation="vertical"> + app:layout_constraintTop_toBottomOf="@+id/artist_counts" /> + app:layout_constraintTop_toBottomOf="@+id/artist_counts" /> + tools:listitem="@layout/item_album" /> diff --git a/app/src/main/res/layout/fragment_genre_detail.xml b/app/src/main/res/layout/fragment_genre_detail.xml index eeafc4c76..ec2644fe2 100644 --- a/app/src/main/res/layout/fragment_genre_detail.xml +++ b/app/src/main/res/layout/fragment_genre_detail.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools"> + @@ -19,7 +20,7 @@ android:orientation="vertical"> + app:layout_constraintTop_toBottomOf="@+id/genre_name" + tools:text="2 Artists, 4 Albums" /> + app:layout_constraintTop_toBottomOf="@+id/genre_song_count" /> + app:layout_constraintTop_toBottomOf="@+id/genre_song_count" /> + tools:listitem="@layout/item_artist" /> diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 406a6f57b..480ad171c 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -10,7 +10,7 @@ android:animateLayoutChanges="true">