diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt index 55d1dbd4a..772a8cc38 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt @@ -42,7 +42,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { updateTheme() hideStatusBar() super.onCreate(savedInstanceState) - println("OnCreate") setEdgeToEdgeOrImmersive() maybeSetScreenOn() setLightNavigationBarAuto() diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index ba382a678..de1b54bf7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -40,7 +40,7 @@ import org.koin.core.component.inject */ class MediaSessionCallback( - private val musicService: MusicService + private val musicService: MusicService, ) : MediaSessionCompat.Callback(), KoinComponent { private val songRepository by inject() @@ -53,7 +53,7 @@ class MediaSessionCallback( override fun onPlayFromMediaId(mediaId: String?, extras: Bundle?) { super.onPlayFromMediaId(mediaId, extras) val musicId = AutoMediaIDHelper.extractMusicID(mediaId!!) - logD(musicId) + logD("Music Id $musicId") val itemId = musicId?.toLong() ?: -1 val songs: ArrayList = ArrayList() when (val category = AutoMediaIDHelper.extractCategory(mediaId)) { @@ -90,7 +90,8 @@ class MediaSessionCallback( AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_HISTORY, AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_SUGGESTIONS, AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_TOP_TRACKS, - AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_QUEUE -> { + AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_QUEUE, + -> { val tracks: List = when (category) { AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_HISTORY -> topPlayedRepository.recentlyPlayedTracks() AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_SUGGESTIONS -> topPlayedRepository.recentlyPlayedTracks() @@ -104,8 +105,6 @@ class MediaSessionCallback( } musicService.openQueue(songs, songIndex, true) } - else -> { - } } musicService.play() } @@ -148,9 +147,15 @@ class MediaSessionCallback( musicService.play() } + override fun onPrepare() { + super.onPrepare() + if (musicService.currentSong != Song.emptySong) + musicService.restoreState(::onPlay) + } + override fun onPlay() { super.onPlay() - musicService.play() + if (musicService.currentSong != Song.emptySong) musicService.play() } override fun onPause() { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 56e707073..2c390b59b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -31,7 +31,6 @@ import android.os.Build.VERSION_CODES import android.os.PowerManager.WakeLock import android.provider.MediaStore import android.support.v4.media.MediaBrowserCompat -import android.support.v4.media.MediaDescriptionCompat import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat @@ -68,7 +67,6 @@ import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl2 import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri import code.name.monkey.retromusic.util.MusicUtil.toggleFavorite import code.name.monkey.retromusic.util.PackageValidator import code.name.monkey.retromusic.util.PreferenceUtil.crossFadeDuration @@ -114,6 +112,7 @@ class MusicService : MediaBrowserServiceCompat(), private var mPackageValidator: PackageValidator? = null private val mMusicProvider = get(AutoMusicProvider::class.java) + private lateinit var storage: PersistentStorage private var trackEndedByCrossfade = false private val serviceScope = CoroutineScope(Job() + Main) @@ -184,6 +183,9 @@ class MusicService : MediaBrowserServiceCompat(), playingNotification?.updateFavorite(isFavorite) startForegroundOrNotify() } + } else { + playingNotification?.updateFavorite(isFavorite) + startForegroundOrNotify() } appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED) @@ -304,6 +306,7 @@ class MusicService : MediaBrowserServiceCompat(), registerBluetoothConnected() mPackageValidator = PackageValidator(this, R.xml.allowed_media_browser_callers) mMusicProvider.setMusicService(this) + storage = PersistentStorage.getInstance(this) } override fun onDestroy() { @@ -608,16 +611,7 @@ class MusicService : MediaBrowserServiceCompat(), result: Result>, ) { if (parentId == AutoMediaIDHelper.RECENT_ROOT) { - val song = currentSong - val mediaItem = MediaBrowserCompat.MediaItem( - MediaDescriptionCompat.Builder() - .setMediaId(song.id.toString()) - .setTitle(song.title) - .setSubtitle(song.artistName) - .setIconUri(getMediaStoreAlbumCoverUri(song.albumId)) - .build(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE - ) - result.sendResult(listOf(mediaItem)) + result.sendResult(listOf(storage.recentSong())) } else { result.sendResult(mMusicProvider.getChildren(parentId, resources)) } @@ -658,7 +652,6 @@ class MusicService : MediaBrowserServiceCompat(), } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - startForegroundOrNotify() if (intent != null && intent.action != null) { handleIntent(mediaSession, intent) serviceScope.launch { @@ -960,6 +953,7 @@ class MusicService : MediaBrowserServiceCompat(), saveQueues() savePosition() savePositionInTrack() + storage.saveSong(currentSong) } @Synchronized @@ -973,7 +967,7 @@ class MusicService : MediaBrowserServiceCompat(), } } - // to let other apps know whats playing. i.E. last.fm (scrobbling) or musixmatch + // to let other apps know whats playing. i.e. last.fm (scrobbling) or musixmatch fun sendPublicIntent(what: String) { val intent = Intent(what.replace(RETRO_MUSIC_PACKAGE_NAME, MUSIC_PACKAGE_NAME)) val song = currentSong @@ -1251,7 +1245,7 @@ class MusicService : MediaBrowserServiceCompat(), mediaSession?.release() } - private fun restoreState() { + fun restoreState(completion: () -> Unit = {}) { shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt( SAVED_SHUFFLE_MODE, 0 ) @@ -1260,12 +1254,10 @@ class MusicService : MediaBrowserServiceCompat(), ) handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED) handleAndSendChangeInternal(REPEAT_MODE_CHANGED) - val start= System.currentTimeMillis() - serviceScope.launch(start = CoroutineStart.DEFAULT) { + serviceScope.launch { restoreQueuesAndPositionIfNecessary() - println("Time completion: ${System.currentTimeMillis() - start}") + completion() } - println("Time: ${System.currentTimeMillis() - start}") } private fun savePosition() { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PersistentStorage.kt b/app/src/main/java/code/name/monkey/retromusic/service/PersistentStorage.kt new file mode 100644 index 000000000..1d8d2351b --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/service/PersistentStorage.kt @@ -0,0 +1,46 @@ +package code.name.monkey.retromusic.service + +import android.content.Context +import android.support.v4.media.MediaBrowserCompat +import android.support.v4.media.MediaDescriptionCompat +import androidx.core.content.edit +import androidx.core.net.toUri +import code.name.monkey.retromusic.extensions.albumArtUri +import code.name.monkey.retromusic.model.Song + +class PersistentStorage(context: Context) { + + private val prefs = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + + fun saveSong(song: Song) { + prefs.edit { + putLong("song_id", song.id) + putString("song_title", song.title) + putString("song_artist", song.artistName) + putString("song_cover", song.albumArtUri.toString()) + } + } + + fun recentSong(): MediaBrowserCompat.MediaItem { + return MediaBrowserCompat.MediaItem( + MediaDescriptionCompat.Builder() + .setMediaId(prefs.getLong("song_id", 0L).toString()) + .setTitle(prefs.getString("song_title", "")) + .setSubtitle(prefs.getString("song_artist", "")) + .setIconUri(prefs.getString("song_cover", "")?.toUri()) + .build(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE + ) + } + + companion object { + const val PREFERENCES_NAME = "retro_recent" + + @Volatile + private var instance: PersistentStorage? = null + + fun getInstance(context: Context) = + instance ?: synchronized(this) { + instance ?: PersistentStorage(context).also { instance = it } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt index 915e64d04..240ac1117 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt @@ -75,6 +75,7 @@ class PlayingNotificationClassic( } override fun updateMetadata(song: Song, onUpdate: () -> Unit) { + if (song == Song.emptySong) return val notificationLayout = getCombinedRemoteViews(true, song) val notificationLayoutBig = getCombinedRemoteViews(false, song) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt index 24726bbe5..4d9302bb0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt @@ -110,6 +110,7 @@ class PlayingNotificationImpl24( } override fun updateMetadata(song: Song, onUpdate: () -> Unit) { + if (song == Song.emptySong) return setContentTitle(song.title) setContentText(song.artistName) setSubText(song.albumName)