Add album art loading

Add album art loading by decoding the album art URI into bitmaps for each album. I may use glide in the future if just using a bitmap isnt enough, but currently this works.
This commit is contained in:
OxygenCobalt 2020-08-21 17:47:56 -06:00
parent f07542fd3a
commit 37b071de0d
6 changed files with 46 additions and 4 deletions

View file

@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentLibraryBinding import org.oxycblt.auxio.databinding.FragmentLibraryBinding
import org.oxycblt.auxio.music.MusicRepository
class LibraryFragment : Fragment() { class LibraryFragment : Fragment() {
@ -28,6 +29,10 @@ class LibraryFragment : Fragment() {
libraryModel libraryModel
val albums = MusicRepository.getInstance().albums.value
binding.testAlbum.setImageBitmap(albums?.get((0..albums.size).random())?.cover)
Log.d(this::class.simpleName, "Fragment created.") Log.d(this::class.simpleName, "Fragment created.")
return binding.root return binding.root

View file

@ -6,12 +6,12 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.oxycblt.auxio.music.processing.MusicLoader
import org.oxycblt.auxio.music.processing.MusicLoaderResponse
import org.oxycblt.auxio.music.processing.MusicSorter
import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.music.models.Album
import org.oxycblt.auxio.music.models.Artist import org.oxycblt.auxio.music.models.Artist
import org.oxycblt.auxio.music.models.Song import org.oxycblt.auxio.music.models.Song
import org.oxycblt.auxio.music.processing.MusicLoader
import org.oxycblt.auxio.music.processing.MusicLoaderResponse
import org.oxycblt.auxio.music.processing.MusicSorter
// Storage for music data. // Storage for music data.
class MusicRepository { class MusicRepository {

View file

@ -47,3 +47,10 @@ fun Long.toURI(): Uri {
this this
) )
} }
fun Long.toAlbumArtURI(): Uri {
return ContentUris.withAppendedId(
Uri.parse("content://media/external/audio/albumart"),
this
)
}

View file

@ -1,10 +1,13 @@
package org.oxycblt.auxio.music.models package org.oxycblt.auxio.music.models
import android.graphics.Bitmap
// Abstraction for Song // Abstraction for Song
data class Album( data class Album(
val id: Long = 0L, val id: Long = 0L,
val title: String = "", val title: String = "",
val artistName: String = "", val artistName: String = "",
val cover: Bitmap? = null,
val year: Int = 0, val year: Int = 0,
var numSongs: Int = 0 var numSongs: Int = 0
) { ) {

View file

@ -3,6 +3,10 @@ package org.oxycblt.auxio.music.processing
import android.app.Application import android.app.Application
import android.content.ContentResolver import android.content.ContentResolver
import android.database.Cursor import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.ImageDecoder
import android.os.Build
import android.provider.MediaStore
import android.provider.MediaStore.Audio.Albums import android.provider.MediaStore.Audio.Albums
import android.provider.MediaStore.Audio.Artists import android.provider.MediaStore.Audio.Artists
import android.provider.MediaStore.Audio.Genres import android.provider.MediaStore.Audio.Genres
@ -13,6 +17,7 @@ import org.oxycblt.auxio.music.models.Album
import org.oxycblt.auxio.music.models.Artist import org.oxycblt.auxio.music.models.Artist
import org.oxycblt.auxio.music.models.Genre import org.oxycblt.auxio.music.models.Genre
import org.oxycblt.auxio.music.models.Song import org.oxycblt.auxio.music.models.Song
import org.oxycblt.auxio.music.toAlbumArtURI
enum class MusicLoaderResponse { enum class MusicLoaderResponse {
DONE, FAILURE, NO_MUSIC DONE, FAILURE, NO_MUSIC
@ -188,10 +193,23 @@ class MusicLoader(private val app: Application) {
val year = cursor.getInt(yearIndex) val year = cursor.getInt(yearIndex)
val numSongs = cursor.getInt(numIndex) val numSongs = cursor.getInt(numIndex)
val artUri = id.toAlbumArtURI()
var cover: Bitmap? = null
// Get the album art through either ImageDecoder or MediaStore depending on the
// version.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
cover = ImageDecoder.decodeBitmap(
ImageDecoder.createSource(resolver, artUri)
)
} else {
cover = MediaStore.Images.Media.getBitmap(resolver, artUri)
}
albums.add( albums.add(
Album( Album(
id, name, artist, id, name, artist,
year, numSongs cover, year, numSongs
) )
) )
} }

View file

@ -17,5 +17,14 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:title="@string/title_library_fragment" /> app:title="@string/title_library_fragment" />
<ImageView
android:id="@+id/testAlbum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</layout> </layout>