Android Navigation code refactor

This commit is contained in:
Hemanth S 2020-08-13 13:54:36 +05:30
parent 9552e617b5
commit 23f4fee872
81 changed files with 1235 additions and 919 deletions

View file

@ -15,8 +15,7 @@
package code.name.monkey.retromusic.providers
import android.content.Context
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.HomeAdapter
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.loaders.*
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.model.smartplaylist.NotRecentlyPlayedPlaylist
@ -24,6 +23,10 @@ import code.name.monkey.retromusic.network.LastFMService
import code.name.monkey.retromusic.network.model.LastFmAlbum
import code.name.monkey.retromusic.network.model.LastFmArtist
import code.name.monkey.retromusic.providers.interfaces.Repository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flow
class RepositoryImpl(
private val context: Context,
@ -39,41 +42,24 @@ class RepositoryImpl(
override suspend fun artistById(artistId: Int): Artist =
ArtistLoader.getArtist(context, artistId)
override suspend fun recentArtists(): List<Artist> =
LastAddedSongsLoader.getLastAddedArtists(context)
override suspend fun topArtists(): List<Artist> =
TopAndRecentlyPlayedTracksLoader.getTopArtists(context)
override suspend fun topAlbums(): List<Album> =
TopAndRecentlyPlayedTracksLoader.getTopAlbums(context)
override suspend fun recentAlbums(): List<Album> =
LastAddedSongsLoader.getLastAddedAlbums(context)
override suspend fun allPlaylists(): List<Playlist> = PlaylistLoader.getAllPlaylists(context)
override suspend fun allGenres(): List<Genre> = GenreLoader.getAllGenres(context)
override suspend fun allSongs(): List<Song> = SongLoader.getAllSongs(context)
override suspend fun suggestions(): Home? {
val songs = NotRecentlyPlayedPlaylist(context).getSongs(context).shuffled().apply {
if (size > 9) subList(0, 9)
}
if (songs.isNotEmpty()) {
return Home(
songs,
HomeAdapter.SUGGESTIONS,
R.drawable.ic_audiotrack
)
}
return null
}
override suspend fun homeGenres(): Home? {
val genres =
GenreLoader.getAllGenres(context)
.shuffled()
.filter { it.name.length in 5..10 }
if (genres.isNotEmpty()) {
return Home(
genres,
HomeAdapter.GENRES,
R.drawable.ic_guitar
)
}
return null
}
override suspend fun search(query: String?): MutableList<Any> =
SearchLoader.searchAll(context, query)
@ -89,52 +75,6 @@ class RepositoryImpl(
override suspend fun getGenre(genreId: Int): ArrayList<Song> =
GenreLoader.getSongs(context, genreId)
override suspend fun recentArtists(): Home? {
val artists = LastAddedSongsLoader.getLastAddedArtists(context)
return if (artists.isNotEmpty()) Home(
artists,
HomeAdapter.RECENT_ARTISTS,
R.drawable.ic_artist
) else null
}
override suspend fun recentAlbums(): Home? {
val albums = LastAddedSongsLoader.getLastAddedAlbums(context)
return if (albums.isNotEmpty()) Home(
albums,
HomeAdapter.RECENT_ALBUMS,
R.drawable.ic_album
) else null
}
override suspend fun topAlbums(): Home? {
val albums = TopAndRecentlyPlayedTracksLoader.getTopAlbums(context)
return if (albums.isNotEmpty()) Home(
albums,
HomeAdapter.TOP_ALBUMS,
R.drawable.ic_album
) else null
}
override suspend fun topArtists(): Home? {
val artists = TopAndRecentlyPlayedTracksLoader.getTopArtists(context)
return if (artists.isNotEmpty()) Home(
artists,
HomeAdapter.TOP_ARTISTS,
R.drawable.ic_artist
) else null
}
override suspend fun favoritePlaylist(): Home? {
val playlists = PlaylistLoader.getFavoritePlaylist(context)
return if (playlists.isNotEmpty()) Home(
playlists,
HomeAdapter.FAVOURITES,
R.drawable.ic_favorite
) else null
}
override suspend fun artistInfo(
name: String,
@ -148,4 +88,149 @@ class RepositoryImpl(
album: String
): LastFmAlbum = lastFMService.albumInfo(artist, album)
@ExperimentalCoroutinesApi
override suspend fun homeSectionsFlow(): Flow<Result<List<Home>>> {
val homes = MutableStateFlow<Result<List<Home>>>(value = Result.Loading)
println("homeSections:Loading")
val homeSections = mutableListOf<Home>()
val sections = listOf(
topArtistsHome(),
topAlbumsHome(),
recentArtistsHome(),
recentAlbumsHome(),
suggestionsHome(),
favoritePlaylistHome(),
genresHome()
)
for (section in sections) {
if (section.arrayList.isNotEmpty()) {
println("${section.homeSection} -> ${section.arrayList.size}")
homeSections.add(section)
}
}
if (homeSections.isEmpty()) {
homes.value = Result.Error
} else {
homes.value = Result.Success(homeSections)
}
return homes
}
override suspend fun homeSections(): List<Home> {
val homeSections = mutableListOf<Home>()
val sections = listOf(
topArtistsHome(),
topAlbumsHome(),
recentArtistsHome(),
recentAlbumsHome(),
suggestionsHome(),
favoritePlaylistHome(),
genresHome()
)
for (section in sections) {
if (section.arrayList.isNotEmpty()) {
println("${section.homeSection} -> ${section.arrayList.size}")
homeSections.add(section)
}
}
return homeSections
}
suspend fun playlists(): Home {
val playlist = PlaylistLoader.getAllPlaylists(context)
return Home(playlist, TOP_ALBUMS)
}
override suspend fun suggestionsHome(): Home {
val songs =
NotRecentlyPlayedPlaylist(context).getSongs(context).shuffled().takeUnless {
it.size > 9
}?.take(9) ?: emptyList<Song>()
return Home(songs, SUGGESTIONS)
}
override suspend fun genresHome(): Home {
val genres = GenreLoader.getAllGenres(context).shuffled()
return Home(genres, GENRES)
}
override suspend fun recentArtistsHome(): Home {
val artists = LastAddedSongsLoader.getLastAddedArtists(context).take(5)
return Home(artists, RECENT_ARTISTS)
}
override suspend fun recentAlbumsHome(): Home {
val albums = LastAddedSongsLoader.getLastAddedAlbums(context).take(5)
return Home(albums, RECENT_ALBUMS)
}
override suspend fun topAlbumsHome(): Home {
val albums = TopAndRecentlyPlayedTracksLoader.getTopAlbums(context).take(5)
return Home(albums, TOP_ALBUMS)
}
override suspend fun topArtistsHome(): Home {
val artists = TopAndRecentlyPlayedTracksLoader.getTopArtists(context).take(5)
return Home(artists, TOP_ARTISTS)
}
override suspend fun favoritePlaylistHome(): Home {
val playlists = PlaylistLoader.getFavoritePlaylist(context).take(5)
val songs = if (playlists.isNotEmpty())
PlaylistSongsLoader.getPlaylistSongList(context, playlists[0])
else emptyList<Song>()
return Home(songs, FAVOURITES)
}
override fun songsFlow(): Flow<Result<List<Song>>> = flow {
emit(Result.Loading)
val data = SongLoader.getAllSongs(context)
if (data.isEmpty()) {
emit(Result.Error)
} else {
emit(Result.Success(data))
}
}
override fun albumsFlow(): Flow<Result<List<Album>>> = flow {
emit(Result.Loading)
val data = AlbumLoader.getAllAlbums(context)
if (data.isEmpty()) {
emit(Result.Error)
} else {
emit(Result.Success(data))
}
}
override fun artistsFlow(): Flow<Result<List<Artist>>> = flow {
emit(Result.Loading)
val data = ArtistLoader.getAllArtists(context)
if (data.isEmpty()) {
emit(Result.Error)
} else {
emit(Result.Success(data))
}
}
override fun playlistsFlow(): Flow<Result<List<Playlist>>> = flow {
emit(Result.Loading)
val data = PlaylistLoader.getAllPlaylists(context)
if (data.isEmpty()) {
emit(Result.Error)
} else {
emit(Result.Success(data))
}
}
override fun genresFlow(): Flow<Result<List<Genre>>> = flow {
emit(Result.Loading)
val data = GenreLoader.getAllGenres(context)
if (data.isEmpty()) {
emit(Result.Error)
} else {
emit(Result.Success(data))
}
}
}

View file

@ -14,9 +14,11 @@
package code.name.monkey.retromusic.providers.interfaces
import code.name.monkey.retromusic.Result
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.network.model.LastFmAlbum
import code.name.monkey.retromusic.network.model.LastFmArtist
import kotlinx.coroutines.flow.Flow
/**
* Created by hemanths on 11/08/17.
@ -47,17 +49,41 @@ interface Repository {
suspend fun albumInfo(artist: String, album: String): LastFmAlbum
suspend fun artistById(artistId: Int): Artist
suspend fun recentArtists(): Home?
suspend fun topArtists(): Home?
suspend fun recentArtists(): List<Artist>
suspend fun topAlbums(): Home?
suspend fun topArtists(): List<Artist>
suspend fun recentAlbums(): Home?
suspend fun topAlbums(): List<Album>
suspend fun favoritePlaylist(): Home?
suspend fun recentAlbums(): List<Album>
suspend fun suggestions(): Home?
suspend fun recentArtistsHome(): Home
suspend fun topArtistsHome(): Home
suspend fun topAlbumsHome(): Home
suspend fun recentAlbumsHome(): Home
suspend fun favoritePlaylistHome(): Home
suspend fun suggestionsHome(): Home
suspend fun genresHome(): Home
suspend fun homeSections(): List<Home>
suspend fun homeSectionsFlow(): Flow<Result<List<Home>>>
fun songsFlow(): Flow<Result<List<Song>>>
fun albumsFlow(): Flow<Result<List<Album>>>
fun artistsFlow(): Flow<Result<List<Artist>>>
fun playlistsFlow(): Flow<Result<List<Playlist>>>
fun genresFlow(): Flow<Result<List<Genre>>>
suspend fun homeGenres(): Home?
}