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 24c1f731e..23c8c6ef0 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -12,7 +12,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentLoadingBinding -import org.oxycblt.auxio.music.MusicLoaderResponse +import org.oxycblt.auxio.music.processing.MusicLoaderResponse class LoadingFragment : Fragment() { diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt index 8b318613f..7e7181de4 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.oxycblt.auxio.music.MusicLoaderResponse import org.oxycblt.auxio.music.MusicRepository +import org.oxycblt.auxio.music.processing.MusicLoaderResponse class LoadingViewModel(private val app: Application) : ViewModel() { diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt index b9c280f76..fc3730952 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -6,6 +6,9 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.Dispatchers 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.Artist import org.oxycblt.auxio.music.models.Song @@ -22,13 +25,15 @@ class MusicRepository { val songs: LiveData> 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 loader = MusicLoader(app) if (loader.response == MusicLoaderResponse.DONE) { - // If the loading succeeds, then process the songs into lists of - // songs, albums, and artists on the main thread. + // If the loading succeeds, then process the songs and set them + // as the values on the main thread. withContext(Dispatchers.Main) { val sorter = MusicSorter( loader.artists, @@ -40,7 +45,12 @@ class MusicRepository { mAlbums.value = sorter.albums mArtists.value = sorter.artists - Log.i(this::class.simpleName, "Finished initial music load.") + val elapsed = System.currentTimeMillis() - start + + Log.i( + this::class.simpleName, + "Music load completed successfully in ${elapsed}ms." + ) } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/GenreCompat.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt similarity index 87% rename from app/src/main/java/org/oxycblt/auxio/music/GenreCompat.kt rename to app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt index e4174cc3a..9a68fa214 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/GenreCompat.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -1,7 +1,10 @@ package org.oxycblt.auxio.music -// Compatibility layer to convert old int-based genres to new genres -val ID3_GENRES = arrayOf( +import android.content.ContentUris +import android.net.Uri +import android.provider.MediaStore + +private val ID3_GENRES = arrayOf( "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", @@ -28,6 +31,7 @@ val ID3_GENRES = arrayOf( const val PAREN_FILTER = "()" +// Convert legacy ID3 genres to a named genre fun intToNamedGenre(genre: String): String { // Strip the genres of any parentheses, and convert it to an int val intGenre = genre.filterNot { @@ -36,3 +40,10 @@ fun intToNamedGenre(genre: String): String { return ID3_GENRES.getOrNull(intGenre) ?: "" } + +fun Long.toURI(): Uri { + return ContentUris.withAppendedId( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + this + ) +} diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt similarity index 90% rename from app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt rename to app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt index a8f9e5a45..607069d25 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt @@ -1,4 +1,4 @@ -package org.oxycblt.auxio.music +package org.oxycblt.auxio.music.processing import android.app.Application import android.content.ContentResolver @@ -8,6 +8,7 @@ import android.provider.MediaStore.Audio.Artists import android.provider.MediaStore.Audio.Genres import android.provider.MediaStore.Audio.Media import android.util.Log +import org.oxycblt.auxio.music.intToNamedGenre import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.music.models.Artist import org.oxycblt.auxio.music.models.Genre @@ -94,16 +95,9 @@ class MusicLoader(private val app: Application) { cursor.close() } - // Remove dupes - genres = genres.distinctBy { - it.name - }.toMutableList() - Log.d( this::class.simpleName, - "Genre search finished with " + - genres.size.toString() + - " genres found." + "Genre search finished with ${genres.size} genres found." ) } @@ -159,9 +153,7 @@ class MusicLoader(private val app: Application) { Log.d( this::class.simpleName, - "Artist search finished with " + - artists.size.toString() + - " artists found." + "Artist search finished with ${artists.size} artists found." ) } @@ -171,13 +163,12 @@ class MusicLoader(private val app: Application) { albumCursor = resolver.query( Albums.EXTERNAL_CONTENT_URI, arrayOf( - Albums._ID, - Albums.ALBUM, - Albums.ARTIST, + Albums._ID, // 0 + Albums.ALBUM, // 1 + Albums.ARTIST, // 2 - // FIXME: May be an issue for albums whose songs released in multiple years - Albums.FIRST_YEAR, - Albums.NUMBER_OF_SONGS + Albums.FIRST_YEAR, // 3 + Albums.NUMBER_OF_SONGS // 4 ), null, null, Albums.DEFAULT_SORT_ORDER @@ -215,9 +206,7 @@ class MusicLoader(private val app: Application) { Log.d( this::class.simpleName, - "Album search finished with " + - albums.size.toString() + - " albums found." + "Album search finished with ${albums.size} albums found" ) } @@ -271,9 +260,7 @@ class MusicLoader(private val app: Application) { Log.d( this::class.simpleName, - "Song search finished with " + - songs.size.toString() + - " songs found." + "Song search finished with ${songs.size} found" ) } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicSorter.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt similarity index 90% rename from app/src/main/java/org/oxycblt/auxio/music/MusicSorter.kt rename to app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt index afa32ff20..f36695fc6 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicSorter.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt @@ -1,4 +1,4 @@ -package org.oxycblt.auxio.music +package org.oxycblt.auxio.music.processing import android.util.Log import org.oxycblt.auxio.music.models.Album @@ -24,7 +24,7 @@ class MusicSorter( // Find all songs that match the current album title val albumSongs = songs.filter { it.albumName == album.title } - // And then add them to the album + // Then add them to the album, along with refreshing the cover album.songs.addAll(albumSongs) unknownSongs.removeAll(albumSongs) @@ -47,7 +47,7 @@ class MusicSorter( Log.d( this::class.simpleName, - "Placed " + unknownSongs.size.toString() + " songs into an unknown album" + "${unknownSongs.size} songs were placed into an unknown album." ) } } @@ -85,7 +85,7 @@ class MusicSorter( Log.d( this::class.simpleName, - "Placed " + unknownAlbums.size.toString() + " albums into an unknown artist" + "${unknownAlbums.size} albums were placed into an unknown artist." ) } }