diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/QueueDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/QueueDao.java index b799a206..e8bb4b7b 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/QueueDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/QueueDao.java @@ -40,9 +40,6 @@ public interface QueueDao { @Query("UPDATE queue SET playing_changed=:timestamp WHERE id=:id") void setPlayingChanged(String id, long timestamp); - @Query("SELECT track_order FROM queue ORDER BY last_play DESC LIMIT 1") - int getLastPlay(); - - @Query("SELECT playing_changed FROM queue ORDER BY last_play DESC LIMIT 1") - long getLastPlayedTimestamp(); + @Query("SELECT * FROM queue ORDER BY last_play DESC LIMIT 1") + Queue getLastPlayed(); } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java index 20bfaa34..f59a2c4d 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java @@ -1,13 +1,15 @@ package com.cappielloantonio.play.repository; import android.app.Application; +import android.util.Log; import androidx.lifecycle.LiveData; +import androidx.media3.common.MediaItem; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.QueueDao; -import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.Media; +import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.util.MappingUtil; import java.time.Instant; @@ -149,7 +151,8 @@ public class QueueRepository { try { thread.join(); - index = getLastPlayedMediaThreadSafe.getIndex(); + Queue lastMediaPlayed = getLastPlayedMediaThreadSafe.getQueueItem(); + index = lastMediaPlayed.getTrackOrder(); } catch (InterruptedException e) { e.printStackTrace(); } @@ -160,13 +163,14 @@ public class QueueRepository { public long getLastPlayedMediaTimestamp() { long timestamp = 0; - GetLastPlayedMediaTimestampThreadSafe getLastPlayedMediaTimestampThreadSafe = new GetLastPlayedMediaTimestampThreadSafe(queueDao); - Thread thread = new Thread(getLastPlayedMediaTimestampThreadSafe); + GetLastPlayedMediaThreadSafe getLastPlayedMediaThreadSafe = new GetLastPlayedMediaThreadSafe(queueDao); + Thread thread = new Thread(getLastPlayedMediaThreadSafe); thread.start(); try { thread.join(); - timestamp = getLastPlayedMediaTimestampThreadSafe.getTimestamp(); + Queue lastMediaPlayed = getLastPlayedMediaThreadSafe.getQueueItem(); + timestamp = lastMediaPlayed.getPlayingChanged(); } catch (InterruptedException e) { e.printStackTrace(); } @@ -174,6 +178,32 @@ public class QueueRepository { return timestamp; } + public boolean isMediaPlayingPlausible(MediaItem mediaItem) { + boolean isPlausible = true; + + GetLastPlayedMediaThreadSafe getLastPlayedMediaThreadSafe = new GetLastPlayedMediaThreadSafe(queueDao); + Thread thread = new Thread(getLastPlayedMediaThreadSafe); + thread.start(); + + try { + thread.join(); + Queue lastMediaPlayed = getLastPlayedMediaThreadSafe.getQueueItem(); + + if (mediaItem.mediaId.equals(lastMediaPlayed.getId())) { + + if (System.currentTimeMillis() > lastMediaPlayed.getLastPlay() + lastMediaPlayed.getDuration() * 1000) { + isPlausible = true; + } else { + isPlausible = false; + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return isPlausible; + } + private static class GetMediaThreadSafe implements Runnable { private final QueueDao queueDao; private List media; @@ -287,7 +317,7 @@ public class QueueRepository { private static class GetLastPlayedMediaThreadSafe implements Runnable { private final QueueDao queueDao; - private int index; + private Queue lastMediaPlayed; public GetLastPlayedMediaThreadSafe(QueueDao queueDao) { this.queueDao = queueDao; @@ -295,29 +325,11 @@ public class QueueRepository { @Override public void run() { - index = queueDao.getLastPlay(); + lastMediaPlayed = queueDao.getLastPlayed(); } - public int getIndex() { - return index; - } - } - - private static class GetLastPlayedMediaTimestampThreadSafe implements Runnable { - private final QueueDao queueDao; - private long timestamp; - - public GetLastPlayedMediaTimestampThreadSafe(QueueDao queueDao) { - this.queueDao = queueDao; - } - - @Override - public void run() { - timestamp = queueDao.getLastPlayedTimestamp(); - } - - public long getTimestamp() { - return timestamp; + public Queue getQueueItem() { + return lastMediaPlayed; } } } diff --git a/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java b/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java index 188a5e00..e6c0feae 100644 --- a/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java +++ b/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java @@ -300,12 +300,14 @@ public class MediaManager { public static void scrobble(MediaItem mediaItem) { if (mediaItem != null) - getSongRepository().scrobble(mediaItem.mediaMetadata.extras.getString("id")); + if (getQueueRepository().isMediaPlayingPlausible(mediaItem)) + getSongRepository().scrobble(mediaItem.mediaMetadata.extras.getString("id")); } public static void saveChronology(MediaItem mediaItem) { if (mediaItem != null) - getChronologyRepository().insert(MappingUtil.mapChronology(mediaItem)); + if (getQueueRepository().isMediaPlayingPlausible(mediaItem)) + getChronologyRepository().insert(MappingUtil.mapChronology(mediaItem)); } private static QueueRepository getQueueRepository() { diff --git a/app/src/main/java/com/cappielloantonio/play/service/MediaService.kt b/app/src/main/java/com/cappielloantonio/play/service/MediaService.kt index 437f9891..f8c9e2f3 100644 --- a/app/src/main/java/com/cappielloantonio/play/service/MediaService.kt +++ b/app/src/main/java/com/cappielloantonio/play/service/MediaService.kt @@ -233,11 +233,13 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener { player.addListener(object : Player.Listener { override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { if (mediaItem == null) return - MediaManager.setLastPlayedTimestamp(mediaItem) + if (mediaItem.mediaMetadata.extras!!.getString("mediaType") == Media.MEDIA_TYPE_MUSIC) { MediaManager.scrobble(mediaItem) MediaManager.saveChronology(mediaItem) } + + MediaManager.setLastPlayedTimestamp(mediaItem) } override fun onIsPlayingChanged(isPlaying: Boolean) {