Move LiveData away from MusicRepository
Change the LiveData in MusicRepository to just be a plain list, as MusicRepository isnt Lifecycle-Aware.
This commit is contained in:
parent
c04a90c3fa
commit
acef9550fa
6 changed files with 46 additions and 48 deletions
|
@ -12,7 +12,6 @@ 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.library.recycler.AlbumDataAdapter
|
import org.oxycblt.auxio.library.recycler.AlbumDataAdapter
|
||||||
import org.oxycblt.auxio.music.MusicRepository
|
|
||||||
|
|
||||||
class LibraryFragment : Fragment() {
|
class LibraryFragment : Fragment() {
|
||||||
|
|
||||||
|
@ -32,8 +31,7 @@ class LibraryFragment : Fragment() {
|
||||||
val adapter = AlbumDataAdapter()
|
val adapter = AlbumDataAdapter()
|
||||||
binding.libraryRecycler.adapter = adapter
|
binding.libraryRecycler.adapter = adapter
|
||||||
|
|
||||||
val repo = MusicRepository.getInstance()
|
libraryModel.albums.observe(
|
||||||
repo.albums.observe(
|
|
||||||
viewLifecycleOwner,
|
viewLifecycleOwner,
|
||||||
Observer {
|
Observer {
|
||||||
adapter.data = it
|
adapter.data = it
|
||||||
|
|
|
@ -1,11 +1,27 @@
|
||||||
package org.oxycblt.auxio.library
|
package org.oxycblt.auxio.library
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
|
import org.oxycblt.auxio.music.MusicRepository
|
||||||
|
import org.oxycblt.auxio.music.models.Album
|
||||||
|
import org.oxycblt.auxio.music.models.Artist
|
||||||
|
|
||||||
class LibraryViewModel() : ViewModel() {
|
class LibraryViewModel() : ViewModel() {
|
||||||
|
|
||||||
|
private val mArtists = MutableLiveData<List<Artist>>()
|
||||||
|
private var mAlbums = MutableLiveData<List<Album>>()
|
||||||
|
|
||||||
|
val artists: LiveData<List<Artist>> get() = mArtists
|
||||||
|
val albums: LiveData<List<Album>> get() = mAlbums
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
val repo = MusicRepository.getInstance()
|
||||||
|
|
||||||
|
mArtists.value = repo.artists
|
||||||
|
mAlbums.value = repo.albums
|
||||||
|
|
||||||
Log.d(this::class.simpleName, "ViewModel created.")
|
Log.d(this::class.simpleName, "ViewModel created.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@ import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.recyclerview.widget.ListAdapter
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
import org.oxycblt.auxio.databinding.LibraryItemBinding
|
import org.oxycblt.auxio.databinding.AlbumItemBinding
|
||||||
import org.oxycblt.auxio.music.models.Album
|
import org.oxycblt.auxio.music.models.Album
|
||||||
|
|
||||||
class AlbumDataAdapter : ListAdapter<Album, LibraryViewHolder>(DiffCallback) {
|
class AlbumDataAdapter : ListAdapter<Album, AlbumViewHolder>(DiffCallback) {
|
||||||
|
|
||||||
var data = listOf<Album>()
|
var data = listOf<Album>()
|
||||||
set(newData) {
|
set(newData) {
|
||||||
|
@ -15,16 +15,16 @@ class AlbumDataAdapter : ListAdapter<Album, LibraryViewHolder>(DiffCallback) {
|
||||||
submitList(data)
|
submitList(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LibraryViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AlbumViewHolder {
|
||||||
return LibraryViewHolder(
|
return AlbumViewHolder(
|
||||||
LibraryItemBinding.inflate(LayoutInflater.from(parent.context))
|
AlbumItemBinding.inflate(LayoutInflater.from(parent.context))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: LibraryViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: AlbumViewHolder, position: Int) {
|
||||||
val album = getItem(position)
|
val album = getItem(position)
|
||||||
|
|
||||||
holder.bindAlbum(album)
|
holder.bind(album)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object DiffCallback : DiffUtil.ItemCallback<Album>() {
|
companion object DiffCallback : DiffUtil.ItemCallback<Album>() {
|
||||||
|
|
|
@ -1,21 +1,16 @@
|
||||||
package org.oxycblt.auxio.library.recycler
|
package org.oxycblt.auxio.library.recycler
|
||||||
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.oxycblt.auxio.databinding.LibraryItemBinding
|
import org.oxycblt.auxio.databinding.AlbumItemBinding
|
||||||
import org.oxycblt.auxio.music.models.Album
|
import org.oxycblt.auxio.music.models.Album
|
||||||
import org.oxycblt.auxio.music.models.Artist
|
|
||||||
|
|
||||||
class LibraryViewHolder(
|
class AlbumViewHolder(
|
||||||
private var binding: LibraryItemBinding
|
private var binding: AlbumItemBinding
|
||||||
) : RecyclerView.ViewHolder(binding.root) {
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
|
||||||
// Bind the view w/new data
|
// Bind the view w/new data
|
||||||
fun bindAlbum(album: Album) {
|
fun bind(album: Album) {
|
||||||
binding.album = album
|
binding.album = album
|
||||||
binding.executePendingBindings()
|
binding.executePendingBindings()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun bindArtist(artist: Artist) {
|
|
||||||
// TODO: Not implemented.
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -2,10 +2,6 @@ package org.oxycblt.auxio.music
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.lifecycle.LiveData
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
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
|
||||||
|
@ -16,15 +12,11 @@ import org.oxycblt.auxio.music.processing.MusicSorter
|
||||||
// Storage for music data.
|
// Storage for music data.
|
||||||
class MusicRepository {
|
class MusicRepository {
|
||||||
|
|
||||||
private val mArtists = MutableLiveData<List<Artist>>()
|
lateinit var artists: List<Artist>
|
||||||
private var mAlbums = MutableLiveData<List<Album>>()
|
lateinit var albums: List<Album>
|
||||||
private var mSongs = MutableLiveData<List<Song>>()
|
lateinit var songs: List<Song>
|
||||||
|
|
||||||
val artists: LiveData<List<Artist>> get() = mArtists
|
fun init(app: Application): MusicLoaderResponse {
|
||||||
val albums: LiveData<List<Album>> get() = mAlbums
|
|
||||||
val songs: LiveData<List<Song>> get() = mSongs
|
|
||||||
|
|
||||||
suspend fun init(app: Application): MusicLoaderResponse {
|
|
||||||
Log.i(this::class.simpleName, "Starting initial music load...")
|
Log.i(this::class.simpleName, "Starting initial music load...")
|
||||||
|
|
||||||
val start = System.currentTimeMillis()
|
val start = System.currentTimeMillis()
|
||||||
|
@ -32,18 +24,16 @@ class MusicRepository {
|
||||||
val loader = MusicLoader(app)
|
val loader = MusicLoader(app)
|
||||||
|
|
||||||
if (loader.response == MusicLoaderResponse.DONE) {
|
if (loader.response == MusicLoaderResponse.DONE) {
|
||||||
// If the loading succeeds, then process the songs and set them
|
// If the loading succeeds, then process the songs and set them.
|
||||||
// as the values on the main thread.
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
val sorter = MusicSorter(
|
val sorter = MusicSorter(
|
||||||
loader.artists,
|
loader.artists,
|
||||||
loader.albums,
|
loader.albums,
|
||||||
loader.songs
|
loader.songs
|
||||||
)
|
)
|
||||||
|
|
||||||
mSongs.value = sorter.songs
|
songs = sorter.songs.toList()
|
||||||
mAlbums.value = sorter.albums
|
albums = sorter.albums.toList()
|
||||||
mArtists.value = sorter.artists
|
artists = sorter.artists.toList()
|
||||||
|
|
||||||
val elapsed = System.currentTimeMillis() - start
|
val elapsed = System.currentTimeMillis() - start
|
||||||
|
|
||||||
|
@ -52,7 +42,6 @@ class MusicRepository {
|
||||||
"Music load completed successfully in ${elapsed}ms."
|
"Music load completed successfully in ${elapsed}ms."
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return loader.response
|
return loader.response
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue