Saving play history. The tracks are saved in the db at the time of playback and every week a list of the most played tracks is generated in the home page in grid format

This commit is contained in:
antonio 2022-12-28 14:25:59 +01:00
parent 6a1c5d2ce3
commit ff8bf4f6bf
14 changed files with 646 additions and 55 deletions

View file

@ -10,6 +10,7 @@ import androidx.media3.session.MediaBrowser;
import com.cappielloantonio.play.App;
import com.cappielloantonio.play.interfaces.MediaIndexCallback;
import com.cappielloantonio.play.model.Media;
import com.cappielloantonio.play.repository.ChronologyRepository;
import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.util.MappingUtil;
@ -289,21 +290,22 @@ public class MediaManager {
}
}
@SuppressLint("UnsafeOptInUsageError")
public static void setLastPlayedTimestamp(MediaItem mediaItem) {
if (mediaItem != null) getQueueRepository().setLastPlayedTimestamp(mediaItem.mediaId);
}
@SuppressLint("UnsafeOptInUsageError")
public static void setPlayingPausedTimestamp(MediaItem mediaItem, long ms) {
if (mediaItem != null) getQueueRepository().setPlayingPausedTimestamp(mediaItem.mediaId, ms);
}
@SuppressLint("UnsafeOptInUsageError")
public static void scrobble(MediaItem mediaItem) {
if (mediaItem != null) getSongRepository().scrobble(mediaItem.mediaMetadata.extras.getString("id"));
}
public static void saveChronology(MediaItem mediaItem) {
if (mediaItem != null) getChronologyRepository().insert(MappingUtil.mapChronology(mediaItem));
}
private static QueueRepository getQueueRepository() {
return new QueueRepository(App.getInstance());
}
@ -312,6 +314,10 @@ public class MediaManager {
return new SongRepository(App.getInstance());
}
private static ChronologyRepository getChronologyRepository() {
return new ChronologyRepository(App.getInstance());
}
private static void enqueueDatabase(List<Media> media, boolean reset, int afterIndex) {
getQueueRepository().insertAll(media, reset, afterIndex);
}

View file

@ -9,20 +9,21 @@ import android.os.Bundle
import androidx.media3.cast.CastPlayer
import androidx.media3.cast.SessionAvailabilityListener
import androidx.media3.common.*
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.*
import androidx.media3.session.MediaSession.ControllerInfo
import com.cappielloantonio.play.App
import com.cappielloantonio.play.R
import com.cappielloantonio.play.model.Media
import com.cappielloantonio.play.repository.QueueRepository
import com.cappielloantonio.play.ui.activity.MainActivity
import com.cappielloantonio.play.util.UIUtil
import com.google.android.gms.cast.framework.CastContext
import com.google.common.collect.ImmutableList
import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture
@UnstableApi
class MediaService : MediaLibraryService(), SessionAvailabilityListener {
private val librarySessionCallback = CustomMediaLibrarySessionCallback()
@ -49,7 +50,10 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
initializeMediaLibrarySession()
initializePlayerListener()
setPlayer(null, if (castPlayer.isCastSessionAvailable) castPlayer else player)
setPlayer(
null,
if (this::castPlayer.isInitialized && castPlayer.isCastSessionAvailable) castPlayer else player
)
}
override fun onGetSession(controllerInfo: ControllerInfo): MediaLibrarySession {
@ -161,7 +165,7 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
override fun onAddMediaItems(
mediaSession: MediaSession,
controller: MediaSession.ControllerInfo,
controller: ControllerInfo,
mediaItems: List<MediaItem>
): ListenableFuture<List<MediaItem>> {
val updatedMediaItems = mediaItems.map {
@ -198,8 +202,10 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
}
private fun initializeCastPlayer() {
castPlayer = CastPlayer(CastContext.getSharedInstance(this))
castPlayer.setSessionAvailabilityListener(this)
if (UIUtil.isCastApiAvailable(this)) {
castPlayer = CastPlayer(CastContext.getSharedInstance(this))
castPlayer.setSessionAvailabilityListener(this)
}
}
private fun initializeMediaLibrarySession() {
@ -224,8 +230,10 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
if (mediaItem == null) return
MediaManager.setLastPlayedTimestamp(mediaItem)
if (mediaItem.mediaMetadata.extras!!.getString("mediaType") == Media.MEDIA_TYPE_MUSIC)
if (mediaItem.mediaMetadata.extras!!.getString("mediaType") == Media.MEDIA_TYPE_MUSIC) {
MediaManager.scrobble(mediaItem)
MediaManager.saveChronology(mediaItem)
}
}
override fun onIsPlayingChanged(isPlaying: Boolean) {
@ -246,8 +254,8 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
}
private fun releasePlayer() {
castPlayer.setSessionAvailabilityListener(null)
castPlayer.release()
if (this::castPlayer.isInitialized) castPlayer.setSessionAvailabilityListener(null)
if (this::castPlayer.isInitialized) castPlayer.release()
player.release()
mediaLibrarySession.release()
}