From e9ee9d1ef1377eed908c5e16219a3d3440957d75 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Mon, 7 Sep 2020 10:52:07 -0600 Subject: [PATCH] Standardize coil usage Completely switch over to use ImageRequest.Builder instead of the load extension function, spin off the Artist Image fetcher & Image BindingAdapters to a seperate module. --- app/build.gradle | 2 +- .../java/org/oxycblt/auxio/MainActivity.kt | 10 ++- .../java/org/oxycblt/auxio/MainFragment.kt | 27 +++---- .../{music => }/coil/ArtistImageFetcher.kt | 2 +- .../java/org/oxycblt/auxio/coil/CoilUtils.kt | 81 +++++++++++++++++++ .../org/oxycblt/auxio/music/MusicUtils.kt | 53 ------------ app/src/main/res/drawable/ic_exit.xml | 11 +++ .../drawable/{ic_music.xml => ic_song.xml} | 0 app/src/main/res/layout/activity_main.xml | 19 ++--- app/src/main/res/layout/fragment_songs.xml | 1 - 10 files changed, 117 insertions(+), 89 deletions(-) rename app/src/main/java/org/oxycblt/auxio/{music => }/coil/ArtistImageFetcher.kt (98%) create mode 100644 app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt create mode 100644 app/src/main/res/drawable/ic_exit.xml rename app/src/main/res/drawable/{ic_music.xml => ic_song.xml} (100%) diff --git a/app/build.gradle b/app/build.gradle index dfd19bdef..16a5472cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,7 +68,7 @@ dependencies { // --- THIRD PARTY --- // Image loading - implementation 'io.coil-kt:coil:0.12.0' + implementation 'io.coil-kt:coil:0.13.0' // Material implementation 'com.google.android.material:material:1.3.0-alpha02' diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index f0c15ea56..9906847df 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -11,12 +11,14 @@ import org.oxycblt.auxio.theme.accent class MainActivity : AppCompatActivity() { - // TODO: Collapse LoadingFragment/MainFragment into MainActivity. + // Debug placeholder so I can test dark and light modes. Ignore. + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + } override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { - // Debugging placeholder - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - // Apply the theme setTheme(accent.second) diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index bd634358e..fa39f5f3a 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -27,21 +27,9 @@ class MainFragment : Fragment() { private val libraryFragment: LibraryFragment by lazy { LibraryFragment() } private val songsFragment: SongsFragment by lazy { SongsFragment() } - private val colorSelected: Int by lazy { - accent.first.toColor(requireContext()) - } - - private val colorDeselected: Int by lazy { - getTransparentAccent( - requireContext(), - accent.first, - getInactiveAlpha(accent.first) - ) - } - private val tabIcons = listOf( R.drawable.ic_library, - R.drawable.ic_music + R.drawable.ic_song ) override fun onCreateView( @@ -56,13 +44,20 @@ class MainFragment : Fragment() { val adapter = PagerAdapter(requireActivity()) binding.viewPager.adapter = adapter + val colorActive = accent.first.toColor(requireContext()) + val colorInactive = getTransparentAccent( + requireContext(), + accent.first, + getInactiveAlpha(accent.first) + ) + // Link the ViewPager & Tab View TabLayoutMediator(binding.tabs, binding.viewPager) { tab, position -> tab.icon = ContextCompat.getDrawable(requireContext(), tabIcons[position]) // Set the icon tint to deselected if its not the default tab if (position > 0) { - tab.icon?.setTint(colorDeselected) + tab.icon?.setTint(colorInactive) } // Init the fragment @@ -74,11 +69,11 @@ class MainFragment : Fragment() { object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - tab.icon?.setTint(colorSelected) + tab.icon?.setTint(colorActive) } override fun onTabUnselected(tab: TabLayout.Tab) { - tab.icon?.setTint(colorDeselected) + tab.icon?.setTint(colorInactive) } override fun onTabReselected(tab: TabLayout.Tab?) { diff --git a/app/src/main/java/org/oxycblt/auxio/music/coil/ArtistImageFetcher.kt b/app/src/main/java/org/oxycblt/auxio/coil/ArtistImageFetcher.kt similarity index 98% rename from app/src/main/java/org/oxycblt/auxio/music/coil/ArtistImageFetcher.kt rename to app/src/main/java/org/oxycblt/auxio/coil/ArtistImageFetcher.kt index 6e0750348..4b330870f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/coil/ArtistImageFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/ArtistImageFetcher.kt @@ -1,4 +1,4 @@ -package org.oxycblt.auxio.music.coil +package org.oxycblt.auxio.coil import android.content.Context import android.graphics.Bitmap diff --git a/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt b/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt new file mode 100644 index 000000000..27a0ede33 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt @@ -0,0 +1,81 @@ +package org.oxycblt.auxio.coil + +import android.net.Uri +import android.widget.ImageView +import androidx.databinding.BindingAdapter +import coil.Coil +import coil.request.ImageRequest +import org.oxycblt.auxio.R +import org.oxycblt.auxio.music.models.Album +import org.oxycblt.auxio.music.models.Artist +import org.oxycblt.auxio.music.models.Song + +private var artistImageFetcher: ArtistImageFetcher? = null + +// Get the cover art for a song or album +@BindingAdapter("coverArt") +fun ImageView.getCoverArt(song: Song) { + val request = ImageRequest.Builder(context) + .data(song.album.coverUri) + .crossfade(true) + .placeholder(android.R.color.transparent) + .error(R.drawable.ic_artist) + .crossfade(true) + .target(this) + .build() + + Coil.imageLoader(context).enqueue(request) +} + +@BindingAdapter("coverArt") +fun ImageView.getCoverArt(album: Album) { + val request = ImageRequest.Builder(context) + .data(album.coverUri) + .crossfade(true) + .placeholder(android.R.color.transparent) + .error(R.drawable.ic_artist) + .crossfade(true) + .target(this) + .build() + + Coil.imageLoader(context).enqueue(request) +} + +// Get the artist image +@BindingAdapter("artistImage") +fun ImageView.getArtistImage(artist: Artist) { + val request = if (artist.numAlbums >= 4) { + val uris = mutableListOf() + + for (i in 0..3) { + uris.add(artist.albums[i].coverUri) + } + + // Initialize the fetcher if it hasn't been already. + if (artistImageFetcher == null) { + artistImageFetcher = ArtistImageFetcher(context) + } + + // Manually create an image request, as that's the only way to add a fetcher that + // takes a list of uris AFAIK. + ImageRequest.Builder(context) + .data(uris) + .fetcher(artistImageFetcher!!) + .crossfade(true) + .placeholder(android.R.color.transparent) + .error(R.drawable.ic_artist) + .target(this) + .build() + } else { + ImageRequest.Builder(context) + .data(artist.albums[0].coverUri) + .crossfade(true) + .placeholder(android.R.color.transparent) + .error(R.drawable.ic_artist) + .crossfade(true) + .target(this) + .build() + } + + Coil.imageLoader(context).enqueue(request) +} 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 06b7a6f08..9629e68d2 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -3,17 +3,11 @@ 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.Coil -import coil.load -import coil.request.ImageRequest import org.oxycblt.auxio.R -import org.oxycblt.auxio.music.coil.ArtistImageFetcher import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.music.models.Artist -import org.oxycblt.auxio.music.models.Song private val ID3_GENRES = arrayOf( "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", @@ -86,50 +80,3 @@ fun TextView.getArtistCounts(artist: Artist) { text = context.getString(R.string.format_double_counts, albums, songs) } - -// Get the cover art -@BindingAdapter("coverArt") -fun ImageView.getCoverArt(song: Song) { - load(song.album.coverUri) { - crossfade(true) - placeholder(android.R.color.transparent) - error(R.drawable.ic_music) - } -} - -@BindingAdapter("coverArt") -fun ImageView.getCoverArt(album: Album) { - load(album.coverUri) { - crossfade(true) - placeholder(android.R.color.transparent) - error(R.drawable.ic_album) - } -} - -@BindingAdapter("artistImage") -fun ImageView.getArtistImage(artist: Artist) { - if (artist.numAlbums >= 4) { - val uris = mutableListOf() - - for (i in 0..3) { - uris.add(artist.albums[i].coverUri) - } - - val request = ImageRequest.Builder(context) - .data(uris) - .fetcher(ArtistImageFetcher(context)) - .crossfade(true) - .placeholder(android.R.color.transparent) - .error(R.drawable.ic_artist) - .target(this) - .build() - - Coil.imageLoader(context).enqueue(request) - } else { - load(artist.albums[0].coverUri) { - crossfade(true) - placeholder(android.R.color.transparent) - error(R.drawable.ic_music) - } - } -} diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 000000000..558e773af --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_music.xml b/app/src/main/res/drawable/ic_song.xml similarity index 100% rename from app/src/main/res/drawable/ic_music.xml rename to app/src/main/res/drawable/ic_song.xml diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7501e97c8..d0e00fb87 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,19 +4,12 @@ xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> - - - - - + app:defaultNavHost="true" + app:navGraph="@navigation/nav_main" + tools:ignore="FragmentTagUsage" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_songs.xml b/app/src/main/res/layout/fragment_songs.xml index cdc07f0dd..04488231e 100644 --- a/app/src/main/res/layout/fragment_songs.xml +++ b/app/src/main/res/layout/fragment_songs.xml @@ -16,7 +16,6 @@ android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" - app:layout_constraintTop_toTopOf="parent" app:title="@string/title_all_songs" tools:titleTextColor="@color/blue" />