From 0ef83c713650df1691e37e6ec474f622f07523b3 Mon Sep 17 00:00:00 2001 From: Hemanth S Date: Fri, 11 Sep 2020 00:52:10 +0530 Subject: [PATCH] Code refactor --- app/build.gradle | 4 +- .../code/name/monkey/retromusic/MainModule.kt | 5 +- .../adapter/album/AlbumCoverPagerAdapter.kt | 2 +- .../name/monkey/retromusic/db/LyricsDao.kt | 18 ++++++ .../name/monkey/retromusic/db/LyricsEntity.kt | 10 ++++ .../name/monkey/retromusic/db/PlaylistDao.kt | 9 ++- .../monkey/retromusic/db/RetroDatabase.kt | 5 +- .../retromusic/dialogs/DeleteSongsDialog.kt | 1 - .../monkey/retromusic/dialogs/LyricsDialog.kt | 17 ++++-- .../monkey/retromusic/extensions/ColorExt.kt | 10 +++- .../retromusic/fragments/LibraryViewModel.kt | 7 ++- .../playlists/PlaylistDetailsFragment.kt | 10 +--- .../playlists/PlaylistDetailsViewModel.kt | 20 +------ .../monkey/retromusic/model/CategoryInfo.java | 3 +- .../name/monkey/retromusic/network/Result.kt | 2 +- .../retromusic/network/RetrofitClient.kt | 10 +++- .../retromusic/repository/Repository.kt | 29 ++++++---- .../retromusic/repository/RoomRepository.kt | 22 ++++--- .../monkey/retromusic/util/PreferenceUtil.kt | 1 - app/src/main/res/layout/lyrics_dialog.xml | 57 ++++++++++++++----- app/src/main/res/navigation/library_graph.xml | 5 -- .../appthemehelper/util/VersionUtils.kt | 1 + build.gradle | 2 +- 23 files changed, 156 insertions(+), 94 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/db/LyricsDao.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/db/LyricsEntity.kt diff --git a/app/build.gradle b/app/build.gradle index 4725b1d8..ebb6025a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -143,7 +143,7 @@ dependencies { implementation 'com.afollestad:material-cab:0.1.12' def kotlin_coroutines_version = "1.3.8" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.0" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" @@ -171,6 +171,6 @@ dependencies { implementation 'org.jsoup:jsoup:1.11.1' implementation 'me.zhanghai.android.fastscroll:library:1.1.0' implementation 'me.jorgecastillo:androidcolorx:0.2.0' - + implementation 'org.jsoup:jsoup:1.11.1' debugImplementation 'com.amitshekhar.android:debug-db:1.0.6' } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt index fe513d50..c7296dda 100644 --- a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt +++ b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt @@ -65,6 +65,9 @@ private val roomModule = module { .fallbackToDestructiveMigration() .build() } + factory { + get().lyricsDao() + } factory { get().playlistDao() @@ -83,7 +86,7 @@ private val roomModule = module { } single { - RealRoomRepository(get(), get(), get(), get()) + RealRoomRepository(get(), get(), get(), get(), get()) } bind RoomRepository::class } private val mainModule = module { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt index 8cd40e97..1a82f465 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt @@ -92,7 +92,7 @@ class AlbumCoverPagerAdapter( albumCover = view.findViewById(R.id.player_image) albumCover.setOnClickListener { LyricsDialog().show(childFragmentManager, "LyricsDialog") - //showLyricsDialog() + showLyricsDialog() } return view } diff --git a/app/src/main/java/code/name/monkey/retromusic/db/LyricsDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/LyricsDao.kt new file mode 100644 index 00000000..a09b430a --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/db/LyricsDao.kt @@ -0,0 +1,18 @@ +package code.name.monkey.retromusic.db + +import androidx.room.* + +@Dao +interface LyricsDao { + @Query("SELECT * FROM LyricsEntity WHERE songId =:songId LIMIT 1") + fun lyricsWithSongId(songId: Int): LyricsEntity? + + @Insert + fun insertLyrics(lyricsEntity: LyricsEntity) + + @Delete + fun deleteLyrics(lyricsEntity: LyricsEntity) + + @Update + fun updateLyrics(lyricsEntity: LyricsEntity) +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/db/LyricsEntity.kt b/app/src/main/java/code/name/monkey/retromusic/db/LyricsEntity.kt new file mode 100644 index 00000000..0cec6431 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/db/LyricsEntity.kt @@ -0,0 +1,10 @@ +package code.name.monkey.retromusic.db + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +class LyricsEntity( + @PrimaryKey val songId: Int, + val lyrics: String +) \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt index 0cfe2b8a..219ca590 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt @@ -18,10 +18,10 @@ interface PlaylistDao { suspend fun playlists(): List @Query("DELETE FROM SongEntity WHERE playlist_creator_id = :playlistId") - suspend fun deleteSongsInPlaylist(playlistId: Int) + suspend fun deletePlaylistSongs(playlistId: Int) @Query("DELETE FROM SongEntity WHERE playlist_creator_id = :playlistId AND id = :songId") - suspend fun removeSongFromPlaylist(playlistId: Int, songId: Int) + suspend fun deleteSongFromPlaylist(playlistId: Int, songId: Int) @Transaction @Query("SELECT * FROM PlaylistEntity") @@ -34,7 +34,7 @@ interface PlaylistDao { suspend fun isSongExistsInPlaylist(playlistId: Int, songId: Int): List @Query("SELECT * FROM SongEntity WHERE playlist_creator_id = :playlistId") - suspend fun songsFromPlaylist(playlistId: Int): List + fun songsFromPlaylist(playlistId: Int): LiveData> @Delete suspend fun deletePlaylist(playlistEntity: PlaylistEntity) @@ -43,7 +43,7 @@ interface PlaylistDao { suspend fun deletePlaylists(playlistEntities: List) @Delete - suspend fun deleteSongsInPlaylist(songs: List) + suspend fun deletePlaylistSongs(songs: List) @Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId") @@ -53,5 +53,4 @@ interface PlaylistDao { fun favoritesSongs(playlistId: Int): List - } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt index e9b99cca..cda6eddd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt @@ -4,8 +4,8 @@ import androidx.room.Database import androidx.room.RoomDatabase @Database( - entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class], - version = 20, + entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class], + version = 21, exportSchema = false ) abstract class RetroDatabase : RoomDatabase() { @@ -13,4 +13,5 @@ abstract class RetroDatabase : RoomDatabase() { abstract fun blackListStore(): BlackListStoreDao abstract fun playCountDao(): PlayCountDao abstract fun historyDao(): HistoryDao + abstract fun lyricsDao(): LyricsDao } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt index 4398a6c6..24a67a0f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt @@ -63,7 +63,6 @@ class DeleteSongsDialog : DialogFragment() { } MusicUtil.deleteTracks(requireActivity(), songs) libraryViewModel.deleteTracks(songs) - } .create() .colorButtons() diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/LyricsDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/LyricsDialog.kt index d1f5f022..9c3b63c7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/LyricsDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/LyricsDialog.kt @@ -7,6 +7,8 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.accentTextColor +import code.name.monkey.retromusic.extensions.hide import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.network.Result import code.name.monkey.retromusic.repository.Repository @@ -34,16 +36,23 @@ class LyricsDialog : DialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val song = MusicPlayerRemote.currentSong + dialogTitle.text = song.title + syncedLyrics.accentTextColor() lifecycleScope.launch(IO) { val result: Result = repository.lyrics( - MusicPlayerRemote.currentSong.artistName, - MusicPlayerRemote.currentSong.title + song.artistName, + song.title ) withContext(Main) { + when (result) { - is Result.Error -> println("Error") + is Result.Error -> progressBar.hide() is Result.Loading -> println("Loading") - is Result.Success -> lyricsText.text = result.data + is Result.Success -> { + progressBar.hide() + lyricsText.text = result.data + } } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt index 8d2d56e4..9afbd431 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt @@ -22,8 +22,10 @@ import android.graphics.drawable.Drawable import android.widget.Button import android.widget.CheckBox import android.widget.SeekBar -import androidx.annotation.* -import androidx.appcompat.content.res.AppCompatResources +import androidx.annotation.AttrRes +import androidx.annotation.CheckResult +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat @@ -97,6 +99,10 @@ fun Button.accentTextColor() { setTextColor(ThemeStore.accentColor(App.getContext())) } +fun MaterialButton.accentTextColor() { + setTextColor(ThemeStore.accentColor(App.getContext())) +} + fun SeekBar.applyColor(@ColorInt color: Int) { thumbTintList = ColorStateList.valueOf(color) progressTintList = ColorStateList.valueOf(color) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index e3c15fb2..a60b9256 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -185,7 +185,7 @@ class LibraryViewModel( } fun deleteSongsFromPlaylist(playlists: List) = viewModelScope.launch(IO) { - repository.deleteSongsFromPlaylist(playlists) + repository.deletePlaylistSongs(playlists) } fun deleteRoomPlaylist(playlists: List) = viewModelScope.launch(IO) { @@ -209,7 +209,7 @@ class LibraryViewModel( fun importPlaylists() = viewModelScope.launch(IO) { val playlists = repository.fetchLegacyPlaylist() playlists.forEach { playlist -> - val playlistEntity = repository.checkPlaylistExists(playlist.name).firstOrNull(); + val playlistEntity = repository.checkPlaylistExists(playlist.name).firstOrNull() if (playlistEntity != null) { val songEntities = playlist.getSongs().map { it.toSongEntity(playlistEntity.playListId) @@ -228,8 +228,9 @@ class LibraryViewModel( fun deleteTracks(songs: List) = viewModelScope.launch(IO) { repository.deleteSongs(songs) + fetchPlaylists() + loadLibraryContent() } - } enum class ReloadType { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index 6cf4cb5e..8f78f518 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -5,7 +5,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.lifecycle.Observer import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -13,6 +12,7 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter import code.name.monkey.retromusic.db.PlaylistWithSongs +import code.name.monkey.retromusic.db.toSongs import code.name.monkey.retromusic.extensions.dipToPix import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper @@ -49,17 +49,13 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli setUpRecyclerView() - viewModel.getSongs().observe(viewLifecycleOwner, Observer { - songs(it) + viewModel.getSongs().observe(viewLifecycleOwner, { + songs(it.toSongs()) }) } private fun setUpRecyclerView() { recyclerView.layoutManager = LinearLayoutManager(requireContext()) - /*if (playlist is AbsCustomPlaylist) { - adapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list, null) - recyclerView.adapter = adapter - } else {*/ recyclerViewDragDropManager = RecyclerViewDragDropManager() val animator = RefactoredDefaultItemAnimator() adapter = diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt index cc13bad2..ac498b4e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt @@ -3,16 +3,11 @@ package code.name.monkey.retromusic.fragments.playlists import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import code.name.monkey.retromusic.db.PlaylistWithSongs -import code.name.monkey.retromusic.db.toSongs +import code.name.monkey.retromusic.db.SongEntity import code.name.monkey.retromusic.interfaces.MusicServiceEventListener import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.repository.RealRepository -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Dispatchers.Main -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext class PlaylistDetailsViewModel( private val realRepository: RealRepository, @@ -26,17 +21,8 @@ class PlaylistDetailsViewModel( fun getPlaylist(): LiveData = _playlist - fun getSongs(): LiveData> = _playListSongs + fun getSongs(): LiveData> = realRepository.playlistSongs(playlist.playlistEntity) - init { - loadPlaylistSongs(playlist) - } - - private fun loadPlaylistSongs(playlist: PlaylistWithSongs) = - viewModelScope.launch(Dispatchers.IO) { - val songs: List = playlist.songs.toSongs() - withContext(Main) { _playListSongs.postValue(songs) } - } override fun onMediaStoreChanged() { /*if (playlist !is AbsCustomPlaylist) { @@ -65,4 +51,4 @@ class PlaylistDetailsViewModel( override fun onPlayStateChanged() {} override fun onRepeatModeChanged() {} override fun onShuffleModeChanged() {} -} \ No newline at end of file +} diff --git a/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.java b/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.java index f8689439..5b206ba2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.java @@ -63,9 +63,8 @@ public class CategoryInfo implements Parcelable { Songs(R.id.action_song, R.string.songs, R.drawable.ic_audiotrack), Albums(R.id.action_album, R.string.albums, R.drawable.ic_album), Artists(R.id.action_artist, R.string.artists, R.drawable.ic_artist), - Playlists(R.id.action_playlist, R.string.playlists, R.drawable.ic_playlist_play), + Playlists(R.id.action_playlist, R.string.playlists, (R.drawable.ic_queue_music)), Genres(R.id.action_genre, R.string.genres, R.drawable.ic_guitar), - Queue(R.id.action_playing_queue, R.string.queue, R.drawable.ic_queue_music), Folder(R.id.action_folder, R.string.folders, R.drawable.ic_folder); public final int icon; diff --git a/app/src/main/java/code/name/monkey/retromusic/network/Result.kt b/app/src/main/java/code/name/monkey/retromusic/network/Result.kt index 05211fd3..2d155522 100644 --- a/app/src/main/java/code/name/monkey/retromusic/network/Result.kt +++ b/app/src/main/java/code/name/monkey/retromusic/network/Result.kt @@ -21,5 +21,5 @@ package code.name.monkey.retromusic.network sealed class Result { data class Success(val data: T) : Result() object Loading : Result() - object Error : Result() + data class Error(val error: Exception) : Result() } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/network/RetrofitClient.kt b/app/src/main/java/code/name/monkey/retromusic/network/RetrofitClient.kt index df75072d..719d682f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/network/RetrofitClient.kt +++ b/app/src/main/java/code/name/monkey/retromusic/network/RetrofitClient.kt @@ -4,7 +4,7 @@ import android.content.Context import code.name.monkey.retromusic.App import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.network.conversion.LyricsConverterFactory -import com.google.gson.Gson +import com.google.gson.GsonBuilder import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -14,6 +14,7 @@ import retrofit2.converter.gson.GsonConverterFactory import java.io.File import java.util.concurrent.TimeUnit + fun provideDefaultCache(): Cache? { val cacheDir = File(App.getContext().cacheDir.absolutePath, "/okhttp-lastfm/") if (cacheDir.mkdirs() || cacheDir.isDirectory) { @@ -48,7 +49,7 @@ fun headerInterceptor(context: Context): Interceptor { fun provideOkHttp(context: Context, cache: Cache): OkHttpClient { return OkHttpClient.Builder() .addNetworkInterceptor(logInterceptor()) - .addInterceptor(headerInterceptor(context)) + //.addInterceptor(headerInterceptor(context)) .connectTimeout(1, TimeUnit.SECONDS) .readTimeout(1, TimeUnit.SECONDS) .cache(cache) @@ -56,9 +57,12 @@ fun provideOkHttp(context: Context, cache: Cache): OkHttpClient { } fun provideLastFmRetrofit(client: OkHttpClient): Retrofit { + val gson = GsonBuilder() + .setLenient() + .create() return Retrofit.Builder() .baseUrl("https://ws.audioscrobbler.com/2.0/") - .addConverterFactory(GsonConverterFactory.create(Gson())) + .addConverterFactory(GsonConverterFactory.create(gson)) .callFactory { request -> client.newCall(request) } .build() } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index 06aff1c7..7ea0db79 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -42,6 +42,7 @@ interface Repository { fun favorites(): LiveData> fun observableHistorySongs(): LiveData> fun albumById(albumId: Int): Album + fun playlistSongs(playlistEntity: PlaylistEntity): LiveData> suspend fun fetchAlbums(): List suspend fun albumByIdAsync(albumId: Int): Album suspend fun allSongs(): List @@ -80,7 +81,7 @@ interface Repository { suspend fun renameRoomPlaylist(playlistId: Int, name: String) suspend fun deleteSongsInPlaylist(songs: List) suspend fun removeSongFromPlaylist(songEntity: SongEntity) - suspend fun deleteSongsFromPlaylist(playlists: List) + suspend fun deletePlaylistSongs(playlists: List) suspend fun favoritePlaylist(): PlaylistEntity suspend fun isFavoriteSong(songEntity: SongEntity): List suspend fun addSongToHistory(currentSong: Song) @@ -117,7 +118,8 @@ class RealRepository( override suspend fun lyrics(artist: String, title: String): Result = try { Success(lyricsRestService.getLyrics(artist, title)) } catch (e: Exception) { - Error + println(e) + Error(e) } override suspend fun deleteSongs(songs: List) = roomRepository.deleteSongs(songs) @@ -169,7 +171,7 @@ class RealRepository( Success(lastFMService.artistInfo(name, lang, cache)) } catch (e: Exception) { println(e) - Error + Error(e) } } @@ -182,7 +184,7 @@ class RealRepository( Success(lastFmAlbum) } catch (e: Exception) { println(e) - Error + Error(e) } } @@ -206,7 +208,7 @@ class RealRepository( } } if (homeSections.isEmpty()) { - homes.value = Error + homes.value = Error(Exception(Throwable("No items"))) } else { homes.value = Success(homeSections) } @@ -244,6 +246,9 @@ class RealRepository( it.toSong() } + override fun playlistSongs(playlistEntity: PlaylistEntity): LiveData> = + roomRepository.getSongs(playlistEntity) + override suspend fun insertSongs(songs: List) = roomRepository.insertSongs(songs) @@ -267,8 +272,8 @@ class RealRepository( override suspend fun removeSongFromPlaylist(songEntity: SongEntity) = roomRepository.removeSongFromPlaylist(songEntity) - override suspend fun deleteSongsFromPlaylist(playlists: List) = - roomRepository.deleteSongsFromPlaylist(playlists) + override suspend fun deletePlaylistSongs(playlists: List) = + roomRepository.deletePlaylistSongs(playlists) override suspend fun favoritePlaylist(): PlaylistEntity = roomRepository.favoritePlaylist(context.getString(R.string.favorites)) @@ -368,7 +373,7 @@ class RealRepository( emit(Loading) val data = songRepository.songs() if (data.isEmpty()) { - emit(Error) + emit(Error(Exception(Throwable("No items")))) } else { emit(Success(data)) } @@ -378,7 +383,7 @@ class RealRepository( emit(Loading) val data = albumRepository.albums() if (data.isEmpty()) { - emit(Error) + emit(Error(Exception(Throwable("No items")))) } else { emit(Success(data)) } @@ -388,7 +393,7 @@ class RealRepository( emit(Loading) val data = artistRepository.artists() if (data.isEmpty()) { - emit(Error) + emit(Error(Exception(Throwable("No items")))) } else { emit(Success(data)) } @@ -398,7 +403,7 @@ class RealRepository( emit(Loading) val data = playlistRepository.playlists() if (data.isEmpty()) { - emit(Error) + emit(Error(Exception(Throwable("No items")))) } else { emit(Success(data)) } @@ -408,7 +413,7 @@ class RealRepository( emit(Loading) val data = genreRepository.genres() if (data.isEmpty()) { - emit(Error) + emit(Error(Exception(Throwable("No items")))) } else { emit(Success(data)) } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index 24c9e65b..9ded5b73 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -11,16 +11,16 @@ interface RoomRepository { fun favoritePlaylistLiveData(favorite: String): LiveData> fun insertBlacklistPath(blackListStoreEntity: BlackListStoreEntity) fun observableHistorySongs(): LiveData> + fun getSongs(playlistEntity: PlaylistEntity): LiveData> suspend fun createPlaylist(playlistEntity: PlaylistEntity): Long suspend fun checkPlaylistExists(playlistName: String): List suspend fun playlists(): List suspend fun playlistWithSongs(): List suspend fun insertSongs(songs: List) - suspend fun getSongs(playlistEntity: PlaylistEntity): List suspend fun deletePlaylistEntities(playlistEntities: List) suspend fun renamePlaylistEntity(playlistId: Int, name: String) suspend fun deleteSongsInPlaylist(songs: List) - suspend fun deleteSongsFromPlaylist(playlists: List) + suspend fun deletePlaylistSongs(playlists: List) suspend fun favoritePlaylist(favorite: String): PlaylistEntity suspend fun isFavoriteSong(songEntity: SongEntity): List suspend fun removeSongFromPlaylist(songEntity: SongEntity) @@ -45,7 +45,8 @@ class RealRoomRepository( private val playlistDao: PlaylistDao, private val blackListStoreDao: BlackListStoreDao, private val playCountDao: PlayCountDao, - private val historyDao: HistoryDao + private val historyDao: HistoryDao, + private val lyricsDao: LyricsDao ) : RoomRepository { @WorkerThread override suspend fun createPlaylist(playlistEntity: PlaylistEntity): Long = @@ -66,7 +67,7 @@ class RealRoomRepository( override suspend fun insertSongs(songs: List) = playlistDao.insertSongsToPlaylist(songs) - override suspend fun getSongs(playlistEntity: PlaylistEntity): List = + override fun getSongs(playlistEntity: PlaylistEntity): LiveData> = playlistDao.songsFromPlaylist(playlistEntity.playListId) override suspend fun deletePlaylistEntities(playlistEntities: List) = @@ -75,12 +76,15 @@ class RealRoomRepository( override suspend fun renamePlaylistEntity(playlistId: Int, name: String) = playlistDao.renamePlaylist(playlistId, name) - override suspend fun deleteSongsInPlaylist(songs: List) = - playlistDao.deleteSongsInPlaylist(songs) + override suspend fun deleteSongsInPlaylist(songs: List) { + songs.forEach { + playlistDao.deleteSongFromPlaylist(it.playlistCreatorId, it.id) + } + } - override suspend fun deleteSongsFromPlaylist(playlists: List) = + override suspend fun deletePlaylistSongs(playlists: List) = playlists.forEach { - playlistDao.deleteSongsInPlaylist(it.playListId) + playlistDao.deletePlaylistSongs(it.playListId) } override suspend fun favoritePlaylist(favorite: String): PlaylistEntity { @@ -100,7 +104,7 @@ class RealRoomRepository( ) override suspend fun removeSongFromPlaylist(songEntity: SongEntity) = - playlistDao.removeSongFromPlaylist(songEntity.playlistCreatorId, songEntity.id) + playlistDao.deleteSongFromPlaylist(songEntity.playlistCreatorId, songEntity.id) override suspend fun addSongToHistory(currentSong: Song) = historyDao.insertSongInHistory(currentSong.toHistoryEntity(System.currentTimeMillis())) diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index 9b4d427e..88333684 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -35,7 +35,6 @@ object PreferenceUtil { CategoryInfo(CategoryInfo.Category.Artists, true), CategoryInfo(CategoryInfo.Category.Playlists, true), CategoryInfo(CategoryInfo.Category.Genres, false), - CategoryInfo(CategoryInfo.Category.Queue, false), CategoryInfo(CategoryInfo.Category.Folder, false) ) diff --git a/app/src/main/res/layout/lyrics_dialog.xml b/app/src/main/res/layout/lyrics_dialog.xml index 27fa8a95..47f15438 100644 --- a/app/src/main/res/layout/lyrics_dialog.xml +++ b/app/src/main/res/layout/lyrics_dialog.xml @@ -4,30 +4,57 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="16dp"> + android:background="?attr/colorSurface" + android:padding="8dp"> + + + app:layout_constraintTop_toBottomOf="@id/dialogTitle"> - + android:layout_height="wrap_content"> + + + + + - + app:layout_constraintEnd_toEndOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/library_graph.xml b/app/src/main/res/navigation/library_graph.xml index fca6df57..3d670797 100644 --- a/app/src/main/res/navigation/library_graph.xml +++ b/app/src/main/res/navigation/library_graph.xml @@ -30,11 +30,6 @@ android:name="code.name.monkey.retromusic.fragments.playlists.PlaylistsFragment" tools:layout="@layout/fragment_main_activity_recycler_view" /> - - = 28 */ + @JvmStatic fun hasQ(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q } diff --git a/build.gradle b/build.gradle index 194f9bfd..94e3964a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.72' + ext.kotlin_version = '1.4.10' repositories { jcenter() google()