diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt index e7a2ca71..dd7af83d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt @@ -27,6 +27,8 @@ import androidx.core.text.HtmlCompat import androidx.media.app.NotificationCompat.MediaStyle import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.MainActivity +import code.name.monkey.retromusic.db.PlaylistEntity +import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.glide.SongGlideRequest import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.service.MusicService @@ -38,140 +40,149 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.animation.GlideAnimation import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.target.Target +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.koin.core.KoinComponent -class PlayingNotificationImpl : PlayingNotification() { +class PlayingNotificationImpl : PlayingNotification(), KoinComponent { private var target: Target? = null @Synchronized override fun update() { stopped = false + GlobalScope.launch { + val song = service.currentSong + val playlist: PlaylistEntity? = MusicUtil.repository.favoritePlaylist() + val isPlaying = service.isPlaying + val isFavorite = if (playlist != null) { + val songEntity = song.toSongEntity(playlist.playListId) + MusicUtil.repository.isFavoriteSong(songEntity).isNotEmpty() + } else false - val song = service.currentSong - val isPlaying = service.isPlaying - val isFavorite = MusicUtil.isFavorite(service, song) - val playButtonResId = - if (isPlaying) R.drawable.ic_pause_white_48dp else R.drawable.ic_play_arrow_white_48dp - val favoriteResId = - if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border + val playButtonResId = + if (isPlaying) R.drawable.ic_pause_white_48dp else R.drawable.ic_play_arrow_white_48dp + val favoriteResId = + if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border - val action = Intent(service, MainActivity::class.java) - action.putExtra(MainActivity.EXPAND_PANEL, PreferenceUtil.isExpandPanel) - action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - val clickIntent = - PendingIntent.getActivity(service, 0, action, PendingIntent.FLAG_UPDATE_CURRENT) + val action = Intent(service, MainActivity::class.java) + action.putExtra(MainActivity.EXPAND_PANEL, PreferenceUtil.isExpandPanel) + action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + val clickIntent = + PendingIntent.getActivity(service, 0, action, PendingIntent.FLAG_UPDATE_CURRENT) - val serviceName = ComponentName(service, MusicService::class.java) - val intent = Intent(ACTION_QUIT) - intent.component = serviceName - val deleteIntent = PendingIntent.getService(service, 0, intent, 0) + val serviceName = ComponentName(service, MusicService::class.java) + val intent = Intent(ACTION_QUIT) + intent.component = serviceName + val deleteIntent = PendingIntent.getService(service, 0, intent, 0) - val bigNotificationImageSize = service.resources - .getDimensionPixelSize(R.dimen.notification_big_image_size) - service.runOnUiThread { - if (target != null) { - Glide.clear(target) - } - target = SongGlideRequest.Builder.from(Glide.with(service), song) - .checkIgnoreMediaStore(service) - .generatePalette(service).build() - .centerCrop() - .into(object : SimpleTarget( - bigNotificationImageSize, - bigNotificationImageSize - ) { - override fun onResourceReady( - resource: BitmapPaletteWrapper, - glideAnimation: GlideAnimation + val bigNotificationImageSize = service.resources + .getDimensionPixelSize(R.dimen.notification_big_image_size) + service.runOnUiThread { + if (target != null) { + Glide.clear(target) + } + target = SongGlideRequest.Builder.from(Glide.with(service), song) + .checkIgnoreMediaStore(service) + .generatePalette(service).build() + .centerCrop() + .into(object : SimpleTarget( + bigNotificationImageSize, + bigNotificationImageSize ) { - update( - resource.bitmap, - RetroColorUtil.getColor(resource.palette, Color.TRANSPARENT) - ) - } - - override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { - super.onLoadFailed(e, errorDrawable) - update(null, Color.TRANSPARENT) - } - - fun update(bitmap: Bitmap?, color: Int) { - var bitmapFinal = bitmap - if (bitmapFinal == null) { - bitmapFinal = BitmapFactory.decodeResource( - service.resources, - R.drawable.default_audio_art + override fun onResourceReady( + resource: BitmapPaletteWrapper, + glideAnimation: GlideAnimation + ) { + update( + resource.bitmap, + RetroColorUtil.getColor(resource.palette, Color.TRANSPARENT) ) } - val toggleFavorite = NotificationCompat.Action( - favoriteResId, - service.getString(R.string.action_toggle_favorite), - retrievePlaybackAction(TOGGLE_FAVORITE) - ) - val playPauseAction = NotificationCompat.Action( - playButtonResId, - service.getString(R.string.action_play_pause), - retrievePlaybackAction(ACTION_TOGGLE_PAUSE) - ) - val previousAction = NotificationCompat.Action( - R.drawable.ic_skip_previous_round_white_32dp, - service.getString(R.string.action_previous), - retrievePlaybackAction(ACTION_REWIND) - ) - val nextAction = NotificationCompat.Action( - R.drawable.ic_skip_next_round_white_32dp, - service.getString(R.string.action_next), - retrievePlaybackAction(ACTION_SKIP) - ) + override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + update(null, Color.TRANSPARENT) + } - val builder = NotificationCompat.Builder( - service, - NOTIFICATION_CHANNEL_ID - ) - .setSmallIcon(R.drawable.ic_notification) - .setLargeIcon(bitmapFinal) - .setContentIntent(clickIntent) - .setDeleteIntent(deleteIntent) - .setContentTitle( - HtmlCompat.fromHtml( - "" + song.title + "", - HtmlCompat.FROM_HTML_MODE_LEGACY + fun update(bitmap: Bitmap?, color: Int) { + var bitmapFinal = bitmap + if (bitmapFinal == null) { + bitmapFinal = BitmapFactory.decodeResource( + service.resources, + R.drawable.default_audio_art ) - ) - .setContentText(song.artistName) - .setSubText( - HtmlCompat.fromHtml( - "" + song.albumName + "", - HtmlCompat.FROM_HTML_MODE_LEGACY - ) - ) - .setOngoing(isPlaying) - .setShowWhen(false) - .addAction(toggleFavorite) - .addAction(previousAction) - .addAction(playPauseAction) - .addAction(nextAction) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - builder.setStyle( - MediaStyle() - .setMediaSession(service.mediaSession.sessionToken) - .setShowActionsInCompactView(1, 2, 3) - ) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - if (Build.VERSION.SDK_INT <= - Build.VERSION_CODES.O && PreferenceUtil.isColoredNotification - ) { - builder.color = color } - } - if (stopped) { - return // notification has been stopped before loading was finished + val toggleFavorite = NotificationCompat.Action( + favoriteResId, + service.getString(R.string.action_toggle_favorite), + retrievePlaybackAction(TOGGLE_FAVORITE) + ) + val playPauseAction = NotificationCompat.Action( + playButtonResId, + service.getString(R.string.action_play_pause), + retrievePlaybackAction(ACTION_TOGGLE_PAUSE) + ) + val previousAction = NotificationCompat.Action( + R.drawable.ic_skip_previous_round_white_32dp, + service.getString(R.string.action_previous), + retrievePlaybackAction(ACTION_REWIND) + ) + val nextAction = NotificationCompat.Action( + R.drawable.ic_skip_next_round_white_32dp, + service.getString(R.string.action_next), + retrievePlaybackAction(ACTION_SKIP) + ) + + val builder = NotificationCompat.Builder( + service, + NOTIFICATION_CHANNEL_ID + ) + .setSmallIcon(R.drawable.ic_notification) + .setLargeIcon(bitmapFinal) + .setContentIntent(clickIntent) + .setDeleteIntent(deleteIntent) + .setContentTitle( + HtmlCompat.fromHtml( + "" + song.title + "", + HtmlCompat.FROM_HTML_MODE_LEGACY + ) + ) + .setContentText(song.artistName) + .setSubText( + HtmlCompat.fromHtml( + "" + song.albumName + "", + HtmlCompat.FROM_HTML_MODE_LEGACY + ) + ) + .setOngoing(isPlaying) + .setShowWhen(false) + .addAction(toggleFavorite) + .addAction(previousAction) + .addAction(playPauseAction) + .addAction(nextAction) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + builder.setStyle( + MediaStyle() + .setMediaSession(service.mediaSession.sessionToken) + .setShowActionsInCompactView(1, 2, 3) + ) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + if (Build.VERSION.SDK_INT <= + Build.VERSION_CODES.O && PreferenceUtil.isColoredNotification + ) { + builder.color = color + } + } + + if (stopped) { + return // notification has been stopped before loading was finished + } + updateNotifyModeAndPostNotification(builder.build()) } - updateNotifyModeAndPostNotification(builder.build()) - } - }) + }) + } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt index 645b8843..3c461400 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt @@ -15,7 +15,9 @@ import android.widget.Toast import androidx.core.content.FileProvider import androidx.fragment.app.FragmentActivity import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.db.SongEntity +import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.extensions.getLong import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue import code.name.monkey.retromusic.model.Artist @@ -24,8 +26,11 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics import code.name.monkey.retromusic.repository.RealPlaylistRepository import code.name.monkey.retromusic.repository.RealSongRepository +import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.repository.SongRepository import code.name.monkey.retromusic.service.MusicService +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import org.jaudiotagger.audio.AudioFileIO import org.jaudiotagger.tag.FieldKey import org.koin.core.KoinComponent @@ -321,16 +326,21 @@ object MusicUtil : KoinComponent { return playlist.name == context.getString(R.string.favorites) } + val repository = get() fun toggleFavorite(context: Context, song: Song) { - if (isFavorite(context, song)) { - PlaylistsUtil.removeFromPlaylist(context, song, getFavoritesPlaylist(context).id) - } else { - PlaylistsUtil.addToPlaylist( - context, song, getOrCreateFavoritesPlaylist(context).id, - false - ) + GlobalScope.launch { + 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))) + } + } + context.sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED)) } - context.sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED)) } private fun getFavoritesPlaylist(context: Context): Playlist {