From c8f7419833856babd10637a0e30982ba4da84343 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 29 Aug 2020 09:03:19 -0600 Subject: [PATCH] Update RecyclerView item layouts Update the song/album items to have the cover art be loaded by a BindingAdapter, and remove unnecessary chains. --- app/build.gradle | 18 ++++------- .../java/org/oxycblt/auxio/MainActivity.kt | 3 +- .../java/org/oxycblt/auxio/MainFragment.kt | 5 +-- .../oxycblt/auxio/library/LibraryFragment.kt | 4 +-- .../org/oxycblt/auxio/music/MusicUtils.kt | 31 +++++++++++++------ .../{AlbumDataAdapter.kt => AlbumAdapter.kt} | 6 ++-- .../{SongDataAdapter.kt => SongAdapter.kt} | 2 +- .../recycler/viewholders/SongViewHolder.kt | 8 ----- .../org/oxycblt/auxio/songs/SongsFragment.kt | 5 ++- app/src/main/res/layout/album_item.xml | 6 ++-- app/src/main/res/layout/song_item.xml | 10 +++--- app/src/main/res/values/strings.xml | 8 ++--- 12 files changed, 50 insertions(+), 56 deletions(-) rename app/src/main/java/org/oxycblt/auxio/recycler/adapters/{AlbumDataAdapter.kt => AlbumAdapter.kt} (76%) rename app/src/main/java/org/oxycblt/auxio/recycler/adapters/{SongDataAdapter.kt => SongAdapter.kt} (91%) diff --git a/app/build.gradle b/app/build.gradle index b86244712..c01c37ab5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ dependencies { // Kotlin implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - // Support + // --- SUPPORT --- implementation 'androidx.core:core-ktx:1.3.1' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0' @@ -56,21 +56,15 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" + // Lifecycle + implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + // Viewpager implementation 'androidx.viewpager2:viewpager2:1.0.0' + // --- THIRD PARTY --- // Image loading - implementation("io.coil-kt:coil:0.12.0") - - /* - // Room Database - def room_version = "2.2.5" - kapt "androidx.room:room-compiler:$room_version" - implementation "androidx.room:room-runtime:$room_version" - */ - - // Lifecycle - implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + implementation 'io.coil-kt:coil:0.12.0' // Lint ktlint "com.pinterest:ktlint:0.37.2" diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 6bc1b27f7..6c3992607 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -3,7 +3,6 @@ package org.oxycblt.auxio import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate class MainActivity : AppCompatActivity() { @@ -11,7 +10,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + // AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) Log.d(this::class.simpleName, "Activity Created.") } diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 78bf9b82a..a69bc1d3a 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -47,8 +47,8 @@ class MainFragment : Fragment() { private fun getFragment(pos: Int): Fragment { if (shownFragments.contains(pos)) { return when (pos) { - 1 -> libraryFragment - 0 -> songsFragment + 0 -> libraryFragment + 1 -> songsFragment else -> libraryFragment } @@ -67,6 +67,7 @@ class MainFragment : Fragment() { override fun getItemCount(): Int = shownFragments.size override fun createFragment(position: Int): Fragment { + Log.d(this::class.simpleName, "Switching to fragment $position.") return getFragment(position) } } 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 7b819db5d..b97601742 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentLibraryBinding -import org.oxycblt.auxio.recycler.adapters.AlbumDataAdapter +import org.oxycblt.auxio.recycler.adapters.AlbumAdapter import org.oxycblt.auxio.recycler.applyDivider class LibraryFragment : Fragment() { @@ -28,7 +28,7 @@ class LibraryFragment : Fragment() { inflater, R.layout.fragment_library, container, false ) - val adapter = AlbumDataAdapter(libraryModel.albums.value!!) + val adapter = AlbumAdapter(libraryModel.albums.value!!) binding.libraryRecycler.adapter = adapter binding.libraryRecycler.applyDivider() 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 8ac69f5ef..f5d0df530 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -3,8 +3,10 @@ package org.oxycblt.auxio.music import android.content.ContentUris import android.net.Uri import android.provider.MediaStore +import android.widget.ImageView import android.widget.TextView import androidx.databinding.BindingAdapter +import coil.load import org.oxycblt.auxio.R import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.music.models.Song @@ -62,6 +64,25 @@ fun Long.toAlbumArtURI(): Uri { ) } +// Get the cover art +@BindingAdapter("coverArt") +fun ImageView.getCoverArt(any: Any) { + val uri = when (any) { + is Song -> any.album.coverUri + is Album -> any.coverUri + + // TODO: Artist images + + else -> Uri.EMPTY + } + + load(uri) { + crossfade(true) + placeholder(android.R.color.transparent) + error(android.R.color.transparent) + } +} + // Format the amount of songs in an album @BindingAdapter("songCount") fun TextView.getAlbumSongs(album: Album) { @@ -71,13 +92,3 @@ fun TextView.getAlbumSongs(album: Album) { context.getString(R.string.format_multi_song_count, album.numSongs.toString()) } } - -// Format the artist/album data for a song -@BindingAdapter("songData") -fun TextView.getSongData(song: Song) { - text = context.getString( - R.string.format_song_data, - song.album.artist.name, - song.album.title - ) -} diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumDataAdapter.kt b/app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumAdapter.kt similarity index 76% rename from app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumDataAdapter.kt rename to app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumAdapter.kt index ce129217e..f63ea33dd 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumDataAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/adapters/AlbumAdapter.kt @@ -7,13 +7,15 @@ import org.oxycblt.auxio.databinding.AlbumItemBinding import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.recycler.viewholders.AlbumViewHolder -class AlbumDataAdapter(val data: List) : RecyclerView.Adapter() { +class AlbumAdapter(private val data: List) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AlbumViewHolder { return AlbumViewHolder( - AlbumItemBinding.inflate(LayoutInflater.from(parent.context)) + AlbumItemBinding.inflate( + LayoutInflater.from(parent.context) + ) ) } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongDataAdapter.kt b/app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongAdapter.kt similarity index 91% rename from app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongDataAdapter.kt rename to app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongAdapter.kt index 5f00dc8dd..2331b580e 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongDataAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/adapters/SongAdapter.kt @@ -7,7 +7,7 @@ import org.oxycblt.auxio.databinding.SongItemBinding import org.oxycblt.auxio.music.models.Song import org.oxycblt.auxio.recycler.viewholders.SongViewHolder -class SongDataAdapter(val data: List) : RecyclerView.Adapter() { +class SongAdapter(private val data: List) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/SongViewHolder.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/SongViewHolder.kt index 8c26e084b..ec3e87ff4 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/SongViewHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/SongViewHolder.kt @@ -1,7 +1,6 @@ package org.oxycblt.auxio.recycler.viewholders import androidx.recyclerview.widget.RecyclerView -import coil.load import org.oxycblt.auxio.databinding.SongItemBinding import org.oxycblt.auxio.music.models.Song @@ -14,13 +13,6 @@ class SongViewHolder( fun bind(song: Song) { binding.song = song - // Load the album cover - binding.cover.load(song.album.coverUri) { - crossfade(true) - placeholder(android.R.color.transparent) - error(android.R.color.transparent) - } - binding.executePendingBindings() } } diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index d283d48b1..8dd85bfbe 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentSongsBinding -import org.oxycblt.auxio.recycler.adapters.SongDataAdapter +import org.oxycblt.auxio.recycler.adapters.SongAdapter import org.oxycblt.auxio.recycler.applyDivider class SongsFragment : Fragment() { @@ -28,8 +28,7 @@ class SongsFragment : Fragment() { inflater, R.layout.fragment_songs, container, false ) - val adapter = SongDataAdapter(songsModel.songs.value!!) - binding.songRecycler.adapter = adapter + binding.songRecycler.adapter = SongAdapter(songsModel.songs.value!!) binding.songRecycler.applyDivider() binding.songRecycler.setHasFixedSize(true) diff --git a/app/src/main/res/layout/album_item.xml b/app/src/main/res/layout/album_item.xml index 7119c9630..5dc35d110 100644 --- a/app/src/main/res/layout/album_item.xml +++ b/app/src/main/res/layout/album_item.xml @@ -23,20 +23,19 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + app:coverArt="@{album}" tools:src="@tools:sample/backgrounds/scenic" /> diff --git a/app/src/main/res/layout/song_item.xml b/app/src/main/res/layout/song_item.xml index e974f90f8..effaeeb8c 100644 --- a/app/src/main/res/layout/song_item.xml +++ b/app/src/main/res/layout/song_item.xml @@ -20,6 +20,7 @@ android:layout_width="@dimen/cover_size_compact" android:layout_height="@dimen/cover_size_compact" android:contentDescription="@{@string/description_cover_art + song.album.title}" + app:coverArt="@{song}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -29,27 +30,24 @@ android:id="@+id/song_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/margin_medium" android:text="@{song.title}" + android:layout_marginStart="@dimen/margin_medium" android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="?android:attr/textColorPrimary" - app:layout_constraintBottom_toTopOf="@+id/song_data" app:layout_constraintStart_toEndOf="@+id/cover" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_chainStyle="packed" tools:text="Song Name" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 156fc2933..8d214ba42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,9 @@ Auxio + Library + All Songs + No music found. Music loading failed. @@ -9,10 +12,7 @@ 1 Song %s Songs - %s / %s - - Library - All Songs + %s / %s Cover art for \ No newline at end of file