diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index 92682de7..c772c320 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -10,21 +10,15 @@ import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.extensions.findNavController -import code.name.monkey.retromusic.helper.MusicPlayerRemote.openAndShuffleQueue -import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue -import code.name.monkey.retromusic.helper.MusicPlayerRemote.playFromUri -import code.name.monkey.retromusic.helper.MusicPlayerRemote.shuffleMode +import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.repository.PlaylistSongsLoader.getPlaylistSongList -import code.name.monkey.retromusic.repository.Repository +import code.name.monkey.retromusic.repository.PlaylistSongsLoader import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.AppRater.appLaunched import code.name.monkey.retromusic.util.PreferenceUtil -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject -import java.util.* class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeListener { companion object { @@ -33,7 +27,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis const val APP_UPDATE_REQUEST_CODE = 9002 } - private val repository by inject() private var blockRequestPermissions = false override fun createContentView(): View { @@ -94,61 +87,68 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis override fun onServiceConnected() { super.onServiceConnected() - handlePlaybackIntent(intent) - } - - private fun handlePlaybackIntent(intent: Intent?) { if (intent == null) { return } - val uri = intent.data - val mimeType = intent.type - var handled = false - if (intent.action != null && (intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) - ) { - val songs: List = - getSongs(intent.extras!!) - if (shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) { - openAndShuffleQueue(songs, true) - } else { - openQueue(songs, 0, true) - } - handled = true - } - if (uri != null && uri.toString().isNotEmpty()) { - playFromUri(uri) - handled = true - } else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt() - if (id >= 0) { - val position = intent.getIntExtra("position", 0) - val songs: List = - ArrayList(getPlaylistSongList(this, id)) - openQueue(songs, position, true) + handlePlaybackIntent(intent) + } + + private fun handlePlaybackIntent(intent: Intent) { + lifecycleScope.launch(IO) { + val uri = intent.data + val mimeType = intent.type + var handled = false + if (intent.action != null && + intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH + ) { + val songs: List = getSongs(intent.extras!!) + if (MusicPlayerRemote.shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) { + MusicPlayerRemote.openAndShuffleQueue(songs, true) + } else { + MusicPlayerRemote.openQueue(songs, 0, true) + } handled = true } - } else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "albumId", "album").toInt() - if (id >= 0) { - lifecycleScope.launch(Dispatchers.Main) { + if (uri != null && uri.toString().isNotEmpty()) { + MusicPlayerRemote.playFromUri(uri) + handled = true + } else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt() + if (id >= 0) { val position = intent.getIntExtra("position", 0) - openQueue(repository.albumByIdAsync(id).songs!!, position, true) + val songs: List = + PlaylistSongsLoader.getPlaylistSongList(this@MainActivity, id) + MusicPlayerRemote.openQueue(songs, position, true) + handled = true + } + } else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "albumId", "album").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + MusicPlayerRemote.openQueue( + libraryViewModel.albumById(id).songs!!, + position, + true + ) + handled = true + } + } else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "artistId", "artist").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + MusicPlayerRemote.openQueue( + libraryViewModel.artistById(id).songs, + position, + true + ) handled = true } } - } else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "artistId", "artist").toInt() - if (id >= 0) { - lifecycleScope.launch { - val position = intent.getIntExtra("position", 0) - openQueue(repository.artistById(id).songs, position, true) - handled = true - } + if (handled) { + setIntent(Intent()) } } - if (handled) { - setIntent(Intent()) - } + } private fun parseIdFromIntent( diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 5ad965b3..d21b209d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -33,7 +33,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName } - private val libraryViewModel by viewModel() + protected val libraryViewModel by viewModel() private lateinit var behavior: RetroBottomSheetBehavior private var miniPlayerFragment: MiniPlayerFragment? = null private var cps: NowPlayingScreen? = null @@ -78,6 +78,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { libraryViewModel.paletteColorLiveData.observe(this, Observer { this.paletteColor = it + miniPlayerFragment?.updateProgressBar(it) onPaletteColorChanged() }) } 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 2a2d15a5..02cb6586 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 @@ -5,7 +5,7 @@ import androidx.room.RoomDatabase @Database( entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class], - version = 19, + version = 20, exportSchema = false ) abstract class RetroDatabase : RoomDatabase() { diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToRetroPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToRetroPlaylist.kt index b604a80e..52859a57 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToRetroPlaylist.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToRetroPlaylist.kt @@ -15,15 +15,12 @@ import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.ReloadType.Playlists import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.repository.RealRepository import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel class AddToRetroPlaylist : BottomSheetDialogFragment() { - private val repository by inject() private val libraryViewModel by sharedViewModel() companion object { @@ -58,7 +55,7 @@ class AddToRetroPlaylist : BottomSheetDialogFragment() { } else { lifecycleScope.launch(Dispatchers.IO) { val songEntities = songs.toSongEntity(playlistEntities[which - 1]) - repository.insertSongs(songEntities) + libraryViewModel.insertSongs(songEntities) libraryViewModel.forceReload(Playlists) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteRetroPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteRetroPlaylist.kt index 3b024044..1888d287 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteRetroPlaylist.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteRetroPlaylist.kt @@ -5,7 +5,6 @@ import android.os.Bundle import androidx.core.os.bundleOf import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment -import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.EXTRA_PLAYLIST import code.name.monkey.retromusic.R import code.name.monkey.retromusic.db.PlaylistEntity @@ -14,14 +13,10 @@ import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.ReloadType -import code.name.monkey.retromusic.repository.Repository -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel class DeleteRetroPlaylist : DialogFragment() { - private val repository by inject() + private val libraryViewModel by sharedViewModel() companion object { @@ -63,11 +58,9 @@ class DeleteRetroPlaylist : DialogFragment() { .setMessage(message) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(R.string.action_delete) { _, _ -> - lifecycleScope.launch(Dispatchers.IO) { - repository.deleteSongsFromPlaylist(playlists) - repository.deleteRoomPlaylist(playlists) - libraryViewModel.forceReload(ReloadType.Playlists) - } + libraryViewModel.deleteSongsFromPlaylist(playlists) + libraryViewModel.deleteRoomPlaylist(playlists) + libraryViewModel.forceReload(ReloadType.Playlists) } .create() .colorButtons() diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt index 9bf9cfdf..b52e9fef 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt @@ -5,7 +5,6 @@ import android.os.Bundle import androidx.core.os.bundleOf import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment -import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R import code.name.monkey.retromusic.db.SongEntity @@ -14,14 +13,9 @@ import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.ReloadType.Playlists -import code.name.monkey.retromusic.repository.Repository -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel class RemoveSongFromPlaylistDialog : DialogFragment() { - private val repository by inject() private val libraryViewModel by sharedViewModel() companion object { @@ -65,11 +59,8 @@ class RemoveSongFromPlaylistDialog : DialogFragment() { return materialDialog(pair.first) .setMessage(pair.second) .setPositiveButton(R.string.remove_action) { _, _ -> - lifecycleScope.launch(Dispatchers.IO) { - //repository.removeSongFromPlaylist(songs) - repository.deleteSongsInPlaylist(songs) - libraryViewModel.forceReload(Playlists) - } + libraryViewModel.deleteSongsInPlaylist(songs) + libraryViewModel.forceReload(Playlists) } .setNegativeButton(android.R.string.cancel, null) .create() diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenameRetroPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenameRetroPlaylistDialog.kt index a12da522..9c2601ad 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenameRetroPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenameRetroPlaylistDialog.kt @@ -5,7 +5,6 @@ import android.os.Bundle import android.view.LayoutInflater import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment -import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.EXTRA_PLAYLIST_ID import code.name.monkey.retromusic.R import code.name.monkey.retromusic.db.PlaylistEntity @@ -15,16 +14,12 @@ import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.ReloadType -import code.name.monkey.retromusic.repository.Repository import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel class RenameRetroPlaylistDialog : DialogFragment() { - private val repository by inject() + private val libraryViewModel by sharedViewModel() companion object { @@ -50,10 +45,8 @@ class RenameRetroPlaylistDialog : DialogFragment() { .setPositiveButton(R.string.action_rename) { _, _ -> val name = inputEditText.text.toString() if (name.isNotEmpty()) { - lifecycleScope.launch(Dispatchers.IO) { - repository.renameRoomPlaylist(playlistEntity.playListId, name) - libraryViewModel.forceReload(ReloadType.Playlists) - } + libraryViewModel.renameRoomPlaylist(playlistEntity.playListId, name) + libraryViewModel.forceReload(ReloadType.Playlists) } else { nameContainer.error = "Playlist name should'nt be empty" } 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 0ff25d80..fc08d6e7 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 @@ -35,6 +35,8 @@ import code.name.monkey.retromusic.R import com.google.android.material.button.MaterialButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.progressindicator.ProgressIndicator +import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout fun Int.ripAlpha(): Int { @@ -144,6 +146,21 @@ fun TextInputLayout.accentColor() { isHintAnimationEnabled = true } +fun ProgressIndicator.accentColor() { + val accentColor = ThemeStore.accentColor(context) + indicatorColors = intArrayOf(accentColor) + trackColor = ColorUtil.withAlpha(accentColor, 0.2f) +} + +fun ProgressIndicator.applyColor(color: Int) { + indicatorColors = intArrayOf(color) + trackColor = ColorUtil.withAlpha(color, 0.2f) +} + +fun TextInputEditText.accentColor() { + +} + fun AppCompatImageView.accentColor(): Int { return ThemeStore.accentColor(context) } \ No newline at end of file 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 c0066d81..18353d23 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 @@ -4,8 +4,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistWithSongs +import code.name.monkey.retromusic.db.SongEntity import code.name.monkey.retromusic.fragments.ReloadType.* +import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.MusicServiceEventListener import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.repository.RealRepository @@ -133,6 +136,38 @@ class LibraryViewModel( println("onShuffleModeChanged") } + fun shuffleSongs() = viewModelScope.launch(IO) { + val songs = repository.allSongs() + MusicPlayerRemote.openAndShuffleQueue( + songs, + true + ) + } + + fun renameRoomPlaylist(playListId: Int, name: String) = viewModelScope.launch(IO) { + repository.renameRoomPlaylist(playListId, name) + } + + fun deleteSongsInPlaylist(songs: List) = viewModelScope.launch(IO) { + repository.deleteSongsInPlaylist(songs) + } + + fun deleteSongsFromPlaylist(playlists: List) = viewModelScope.launch(IO) { + repository.deleteSongsFromPlaylist(playlists) + } + + fun deleteRoomPlaylist(playlists: List) = viewModelScope.launch(IO) { + repository.deleteRoomPlaylist(playlists) + } + + suspend fun albumById(id: Int) = repository.albumById(id) + suspend fun artistById(id: Int) = repository.artistById(id) + suspend fun favoritePlaylist() = repository.favoritePlaylist() + suspend fun isFavoriteSong(song: SongEntity) = repository.isFavoriteSong(song) + suspend fun insertSongs(songs: List) = repository.insertSongs(songs) + suspend fun removeSongFromPlaylist(songEntity: SongEntity) = + repository.removeSongFromPlaylist(songEntity) + } enum class ReloadType { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt index 9f05dc43..9a16d656 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt @@ -11,18 +11,14 @@ import android.view.GestureDetector import android.view.MotionEvent import android.view.View import android.view.animation.DecelerateInterpolator -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.extensions.show -import code.name.monkey.retromusic.extensions.textColorPrimary -import code.name.monkey.retromusic.extensions.textColorSecondary +import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil -import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_mini_player.* import kotlin.math.abs @@ -67,7 +63,7 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p private fun setUpMiniPlayer() { setUpPlayPauseButton() - ViewUtil.setProgressDrawable(progressBar, ThemeStore.accentColor(requireContext())) + progressBar.accentColor() } private fun setUpPlayPauseButton() { @@ -129,6 +125,10 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p } } + fun updateProgressBar(paletteColor: Int) { + progressBar.applyColor(paletteColor) + } + class FlingPlayBackController(context: Context) : View.OnTouchListener { private var flingPlayBackController: GestureDetector diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt index d9f383ec..5b4a30b6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt @@ -14,8 +14,7 @@ import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.util.PreferenceUtil -class AlbumsFragment : - AbsRecyclerViewCustomGridSizeFragment(), +class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(), AlbumClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt index 6f2d91a1..30e188e6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt @@ -12,17 +12,10 @@ import code.name.monkey.retromusic.adapter.artist.ArtistAdapter import code.name.monkey.retromusic.extensions.findActivityNavController import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.util.PreferenceUtil -class ArtistsFragment : - AbsRecyclerViewCustomGridSizeFragment(), - MainActivityFragmentCallbacks, ArtistClickListener { - - override fun handleBackPress(): Boolean { - return false - } - +class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment(), + ArtistClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index b0b9c458..155d8d1d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -25,7 +25,7 @@ import code.name.monkey.retromusic.dialogs.* import code.name.monkey.retromusic.extensions.hide import code.name.monkey.retromusic.extensions.whichFragment import code.name.monkey.retromusic.fragments.LibraryViewModel -import code.name.monkey.retromusic.fragments.ReloadType.Playlists +import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.PaletteColorHolder @@ -40,7 +40,6 @@ import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koin.android.ext.android.get -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel import java.io.FileNotFoundException @@ -160,22 +159,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme return false } - protected open fun toggleFavorite(song: Song) { - lifecycleScope.launch(IO) { - val playlist: PlaylistEntity? = repository.favoritePlaylist() - if (playlist != null) { - val songEntity = song.toSongEntity(playlist.playListId) - val isFavorite = repository.isFavoriteSong(songEntity).isNotEmpty() - if (isFavorite) { - repository.removeSongFromPlaylist(songEntity) - } else { - repository.insertSongs(listOf(song.toSongEntity(playlist.playListId))) - } - } - libraryViewModel.forceReload(Playlists) - requireContext().sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED)) - } - } abstract fun playerToolbar(): Toolbar? @@ -197,25 +180,44 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme updateLyrics() } + protected open fun toggleFavorite(song: Song) { + lifecycleScope.launch(IO) { + val playlist: PlaylistEntity? = libraryViewModel.favoritePlaylist() + if (playlist != null) { + val songEntity = song.toSongEntity(playlist.playListId) + val isFavorite = libraryViewModel.isFavoriteSong(songEntity).isNotEmpty() + if (isFavorite) { + libraryViewModel.removeSongFromPlaylist(songEntity) + } else { + libraryViewModel.insertSongs(listOf(song.toSongEntity(playlist.playListId))) + } + } + libraryViewModel.forceReload(ReloadType.Playlists) + requireContext().sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED)) + } + } + fun updateIsFavorite() { lifecycleScope.launch(IO) { - val playlist: PlaylistEntity = repository.favoritePlaylist() - val song = MusicPlayerRemote.currentSong.toSongEntity(playlist.playListId) - val isFavorite = repository.isFavoriteSong(song).isNotEmpty() - withContext(Main) { - val icon = if (isFavorite) R.drawable.ic_favorite - else R.drawable.ic_favorite_border - val drawable = - RetroUtil.getTintedVectorDrawable( - requireContext(), - icon, - toolbarIconColor() - ) - if (playerToolbar() != null) { - playerToolbar()?.menu?.findItem(R.id.action_toggle_favorite) - ?.setIcon(drawable)?.title = - if (isFavorite) getString(R.string.action_remove_from_favorites) - else getString(R.string.action_add_to_favorites) + val playlist: PlaylistEntity? = libraryViewModel.favoritePlaylist() + if (playlist != null) { + val song = MusicPlayerRemote.currentSong.toSongEntity(playlist.playListId) + val isFavorite = libraryViewModel.isFavoriteSong(song).isNotEmpty() + withContext(Main) { + val icon = + if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border + val drawable = + RetroUtil.getTintedVectorDrawable( + requireContext(), + icon, + toolbarIconColor() + ) + if (playerToolbar() != null) { + playerToolbar()?.menu?.findItem(R.id.action_toggle_favorite) + ?.setIcon(drawable)?.title = + if (isFavorite) getString(R.string.action_remove_from_favorites) + else getString(R.string.action_add_to_favorites) + } } } } @@ -247,17 +249,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme open fun setLyrics(l: Lyrics?) { } - private val repository by inject() - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - lifecycleScope.launch(IO) { - if (repository.checkPlaylistExists(getString(R.string.favorites)).isEmpty()) { - repository.createPlaylist(PlaylistEntity(getString(R.string.favorites))) - } - } - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (PreferenceUtil.isFullScreenMode && diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt index e4017e57..93af4203 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt @@ -21,14 +21,8 @@ import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.GenreAdapter import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewFragment -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks -class GenresFragment : AbsRecyclerViewFragment(), - MainActivityFragmentCallbacks { - - override fun handleBackPress(): Boolean { - return false - } +class GenresFragment : AbsRecyclerViewFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index 3fa46622..20932004 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -19,7 +19,6 @@ import android.os.Bundle import android.view.View import androidx.core.os.bundleOf import androidx.lifecycle.Observer -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.retromusic.HISTORY_PLAYLIST import code.name.monkey.retromusic.LAST_ADDED_PLAYLIST @@ -31,25 +30,19 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.glide.ProfileBannerGlideRequest import code.name.monkey.retromusic.glide.UserProfileGlideRequest -import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.PreferenceUtil import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.abs_playlists.* import kotlinx.android.synthetic.main.fragment_banner_home.* import kotlinx.android.synthetic.main.home_content.* -import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel class HomeFragment : AbsMainActivityFragment(if (PreferenceUtil.isHomeBanner) R.layout.fragment_banner_home else R.layout.fragment_home) { - private val repository by inject() private val libraryViewModel: LibraryViewModel by sharedViewModel() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setStatusBarColorAuto(view) @@ -77,12 +70,7 @@ class HomeFragment : } actionShuffle.setOnClickListener { - lifecycleScope.launch { - MusicPlayerRemote.openAndShuffleQueue( - repository.allSongs(), - true - ) - } + libraryViewModel.shuffleSongs() } history.setOnClickListener { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index 41d52255..0eacbb9a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -5,7 +5,6 @@ import android.annotation.SuppressLint import android.content.res.ColorStateList import android.graphics.Color import android.graphics.PorterDuff -import android.os.AsyncTask import android.os.Bundle import android.view.View import android.view.animation.LinearInterpolator @@ -18,7 +17,6 @@ import androidx.core.view.ViewCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.RetroBottomSheetBehavior import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter @@ -61,7 +59,6 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play private var recyclerViewSwipeManager: RecyclerViewSwipeManager? = null private var recyclerViewTouchActionGuardManager: RecyclerViewTouchActionGuardManager? = null private var playingQueueAdapter: PlayingQueueAdapter? = null - private var updateIsFavoriteTask: AsyncTask<*, *, *>? = null private lateinit var linearLayoutManager: LinearLayoutManager private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { @@ -218,9 +215,8 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play override fun toggleFavorite(song: Song) { super.toggleFavorite(song) - MusicUtil.toggleFavorite(requireContext(), song) if (song.id == MusicPlayerRemote.currentSong.id) { - updateFavorite() + updateIsFavorite() } } @@ -268,6 +264,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play override fun onQueueChanged() { super.onQueueChanged() updateLabel() + playingQueueAdapter?.swapDataSet(MusicPlayerRemote.playingQueue) } private fun updateSong() { @@ -366,7 +363,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play } else { val title = MusicPlayerRemote.playingQueue[MusicPlayerRemote.position + 1].title nextSong.apply { - text = "Next: $title" + text = title show() } } @@ -472,36 +469,4 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) } - - @SuppressLint("StaticFieldLeak") - private fun updateFavorite() { - if (updateIsFavoriteTask != null) { - updateIsFavoriteTask?.cancel(false) - } - updateIsFavoriteTask = - object : AsyncTask() { - override fun doInBackground(vararg params: Song): Boolean? { - val activity = activity - return if (activity != null) { - MusicUtil.isFavorite(requireActivity(), params[0]) - } else { - cancel(false) - null - } - } - - override fun onPostExecute(isFavorite: Boolean?) { - val activity = activity - if (activity != null) { - val res = if (isFavorite!!) - R.drawable.ic_favorite - else - R.drawable.ic_favorite_border - - val drawable = TintHelper.createTintedDrawable(activity, res, Color.WHITE) - songFavourite?.setImageDrawable(drawable) - } - } - }.execute(MusicPlayerRemote.currentSong) - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt index cd3a2f60..6c094048 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt @@ -7,15 +7,8 @@ import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewFragment -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks -class PlaylistsFragment : - AbsRecyclerViewFragment(), - MainActivityFragmentCallbacks { - - override fun handleBackPress(): Boolean { - return false - } +class PlaylistsFragment : AbsRecyclerViewFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt index f829f985..6376420c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt @@ -22,7 +22,6 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager @@ -33,13 +32,7 @@ import kotlinx.android.synthetic.main.activity_playing_queue.* /** * Created by hemanths on 2019-12-08. */ -class PlayingQueueFragment : - AbsRecyclerViewFragment(), - MainActivityFragmentCallbacks { - - override fun handleBackPress(): Boolean { - return false - } +class PlayingQueueFragment : AbsRecyclerViewFragment() { private lateinit var wrappedAdapter: RecyclerView.Adapter<*> private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index e5ab4c05..b6d7783f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -9,15 +9,9 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.SongAdapter import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.util.PreferenceUtil -class SongsFragment : - AbsRecyclerViewCustomGridSizeFragment(), - MainActivityFragmentCallbacks { - override fun handleBackPress(): Boolean { - return false - } +class SongsFragment : AbsRecyclerViewCustomGridSizeFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/PlaylistSongsLoader.kt b/app/src/main/java/code/name/monkey/retromusic/repository/PlaylistSongsLoader.kt index 383785b8..96f86d37 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/PlaylistSongsLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/PlaylistSongsLoader.kt @@ -23,7 +23,6 @@ import code.name.monkey.retromusic.model.AbsCustomPlaylist import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.PlaylistSong import code.name.monkey.retromusic.model.Song -import java.util.* /** * Created by hemanths on 16/08/17. @@ -43,8 +42,8 @@ object PlaylistSongsLoader { } @JvmStatic - fun getPlaylistSongList(context: Context, playlistId: Int): ArrayList { - val songs = arrayListOf() + fun getPlaylistSongList(context: Context, playlistId: Int): List { + val songs = mutableListOf() val cursor = makePlaylistSongCursor( context, diff --git a/app/src/main/res/layout/fragment_gradient_player.xml b/app/src/main/res/layout/fragment_gradient_player.xml index 2aa519ef..6c6a3bfc 100644 --- a/app/src/main/res/layout/fragment_gradient_player.xml +++ b/app/src/main/res/layout/fragment_gradient_player.xml @@ -12,7 +12,7 @@ android:layout_height="match_parent" android:paddingBottom="48dp"> - + app:layout_constraintWidth_default="spread" + tools:background="@color/md_red_500"> + app:layout_constraintTop_toTopOf="@id/queueIcon" />