mirror of
https://github.com/ultrasonic/ultrasonic
synced 2025-02-11 09:10:57 +01:00
Merge pull request #594 from nitehu/playback_complete
Added PlaybackComplete intent when a song playback is completed
This commit is contained in:
commit
7a6f993602
@ -536,6 +536,7 @@ class LocalMediaPlayer : KoinComponent {
|
|||||||
wakeLock.acquire(60000)
|
wakeLock.acquire(60000)
|
||||||
val pos = cachedPosition
|
val pos = cachedPosition
|
||||||
Timber.i("Ending position %d of %d", pos, duration)
|
Timber.i("Ending position %d of %d", pos, duration)
|
||||||
|
|
||||||
if (!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000) {
|
if (!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000) {
|
||||||
setPlayerState(PlayerState.COMPLETED)
|
setPlayerState(PlayerState.COMPLETED)
|
||||||
if (Settings.gaplessPlayback &&
|
if (Settings.gaplessPlayback &&
|
||||||
@ -555,6 +556,7 @@ class LocalMediaPlayer : KoinComponent {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized(this) {
|
synchronized(this) {
|
||||||
if (downloadFile.isWorkDone) {
|
if (downloadFile.isWorkDone) {
|
||||||
// Complete was called early even though file is fully buffered
|
// Complete was called early even though file is fully buffered
|
||||||
|
@ -80,6 +80,7 @@ object Util {
|
|||||||
private const val EVENT_META_CHANGED = "org.moire.ultrasonic.EVENT_META_CHANGED"
|
private const val EVENT_META_CHANGED = "org.moire.ultrasonic.EVENT_META_CHANGED"
|
||||||
private const val EVENT_PLAYSTATE_CHANGED = "org.moire.ultrasonic.EVENT_PLAYSTATE_CHANGED"
|
private const val EVENT_PLAYSTATE_CHANGED = "org.moire.ultrasonic.EVENT_PLAYSTATE_CHANGED"
|
||||||
private const val CM_AVRCP_PLAYSTATE_CHANGED = "com.android.music.playstatechanged"
|
private const val CM_AVRCP_PLAYSTATE_CHANGED = "com.android.music.playstatechanged"
|
||||||
|
private const val CM_AVRCP_PLAYBACK_COMPLETE = "com.android.music.playbackcomplete"
|
||||||
private const val CM_AVRCP_METADATA_CHANGED = "com.android.music.metachanged"
|
private const val CM_AVRCP_METADATA_CHANGED = "com.android.music.metachanged"
|
||||||
|
|
||||||
// Used by hexEncode()
|
// Used by hexEncode()
|
||||||
@ -519,61 +520,14 @@ object Util {
|
|||||||
listSize: Int,
|
listSize: Int,
|
||||||
id: Int
|
id: Int
|
||||||
) {
|
) {
|
||||||
if (!Settings.shouldSendBluetoothNotifications) {
|
if (!Settings.shouldSendBluetoothNotifications) return
|
||||||
return
|
|
||||||
}
|
|
||||||
var song: MusicDirectory.Entry? = null
|
var song: MusicDirectory.Entry? = null
|
||||||
val avrcpIntent = Intent(CM_AVRCP_METADATA_CHANGED)
|
val avrcpIntent = Intent(CM_AVRCP_METADATA_CHANGED)
|
||||||
if (currentPlaying != null) song = currentPlaying.song
|
if (currentPlaying != null) song = currentPlaying.song
|
||||||
|
|
||||||
if (song == null) {
|
fillIntent(avrcpIntent, song, playerPosition, id, listSize)
|
||||||
avrcpIntent.putExtra("track", "")
|
|
||||||
avrcpIntent.putExtra("track_name", "")
|
|
||||||
avrcpIntent.putExtra("artist", "")
|
|
||||||
avrcpIntent.putExtra("artist_name", "")
|
|
||||||
avrcpIntent.putExtra("album", "")
|
|
||||||
avrcpIntent.putExtra("album_name", "")
|
|
||||||
avrcpIntent.putExtra("album_artist", "")
|
|
||||||
avrcpIntent.putExtra("album_artist_name", "")
|
|
||||||
|
|
||||||
if (Settings.shouldSendBluetoothAlbumArt) {
|
|
||||||
avrcpIntent.putExtra("coverart", null as Parcelable?)
|
|
||||||
avrcpIntent.putExtra("cover", null as Parcelable?)
|
|
||||||
}
|
|
||||||
|
|
||||||
avrcpIntent.putExtra("ListSize", 0.toLong())
|
|
||||||
avrcpIntent.putExtra("id", 0.toLong())
|
|
||||||
avrcpIntent.putExtra("duration", 0.toLong())
|
|
||||||
avrcpIntent.putExtra("position", 0.toLong())
|
|
||||||
} else {
|
|
||||||
val title = song.title
|
|
||||||
val artist = song.artist
|
|
||||||
val album = song.album
|
|
||||||
val duration = song.duration
|
|
||||||
|
|
||||||
avrcpIntent.putExtra("track", title)
|
|
||||||
avrcpIntent.putExtra("track_name", title)
|
|
||||||
avrcpIntent.putExtra("artist", artist)
|
|
||||||
avrcpIntent.putExtra("artist_name", artist)
|
|
||||||
avrcpIntent.putExtra("album", album)
|
|
||||||
avrcpIntent.putExtra("album_name", album)
|
|
||||||
avrcpIntent.putExtra("album_artist", artist)
|
|
||||||
avrcpIntent.putExtra("album_artist_name", artist)
|
|
||||||
|
|
||||||
if (Settings.shouldSendBluetoothAlbumArt) {
|
|
||||||
val albumArtFile = FileUtil.getAlbumArtFile(song)
|
|
||||||
avrcpIntent.putExtra("coverart", albumArtFile.absolutePath)
|
|
||||||
avrcpIntent.putExtra("cover", albumArtFile.absolutePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
avrcpIntent.putExtra("position", playerPosition.toLong())
|
|
||||||
avrcpIntent.putExtra("id", id.toLong())
|
|
||||||
avrcpIntent.putExtra("ListSize", listSize.toLong())
|
|
||||||
|
|
||||||
if (duration != null) {
|
|
||||||
avrcpIntent.putExtra("duration", duration.toLong())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
context.sendBroadcast(avrcpIntent)
|
context.sendBroadcast(avrcpIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -586,54 +540,87 @@ object Util {
|
|||||||
id: Int,
|
id: Int,
|
||||||
playerPosition: Int
|
playerPosition: Int
|
||||||
) {
|
) {
|
||||||
if (!Settings.shouldSendBluetoothNotifications) {
|
if (!Settings.shouldSendBluetoothNotifications) return
|
||||||
return
|
|
||||||
}
|
|
||||||
if (newSong != null) {
|
if (newSong != null) {
|
||||||
val avrcpIntent = Intent(CM_AVRCP_PLAYSTATE_CHANGED)
|
|
||||||
|
|
||||||
val title = newSong.title
|
val avrcpIntent = Intent(
|
||||||
val artist = newSong.artist
|
if (state == PlayerState.COMPLETED) CM_AVRCP_PLAYBACK_COMPLETE
|
||||||
val album = newSong.album
|
else CM_AVRCP_PLAYSTATE_CHANGED
|
||||||
val duration = newSong.duration
|
)
|
||||||
|
|
||||||
avrcpIntent.putExtra("track", title)
|
fillIntent(avrcpIntent, newSong, playerPosition, id, listSize)
|
||||||
avrcpIntent.putExtra("track_name", title)
|
|
||||||
avrcpIntent.putExtra("artist", artist)
|
|
||||||
avrcpIntent.putExtra("artist_name", artist)
|
|
||||||
avrcpIntent.putExtra("album", album)
|
|
||||||
avrcpIntent.putExtra("album_name", album)
|
|
||||||
avrcpIntent.putExtra("album_artist", artist)
|
|
||||||
avrcpIntent.putExtra("album_artist_name", artist)
|
|
||||||
|
|
||||||
if (Settings.shouldSendBluetoothAlbumArt) {
|
if (state != PlayerState.COMPLETED) {
|
||||||
val albumArtFile = FileUtil.getAlbumArtFile(newSong)
|
when (state) {
|
||||||
avrcpIntent.putExtra("coverart", albumArtFile.absolutePath)
|
PlayerState.STARTED -> avrcpIntent.putExtra("playing", true)
|
||||||
avrcpIntent.putExtra("cover", albumArtFile.absolutePath)
|
PlayerState.STOPPED,
|
||||||
}
|
PlayerState.PAUSED -> avrcpIntent.putExtra("playing", false)
|
||||||
|
else -> return // No need to broadcast.
|
||||||
avrcpIntent.putExtra("position", playerPosition.toLong())
|
}
|
||||||
avrcpIntent.putExtra("id", id.toLong())
|
|
||||||
avrcpIntent.putExtra("ListSize", listSize.toLong())
|
|
||||||
|
|
||||||
if (duration != null) {
|
|
||||||
avrcpIntent.putExtra("duration", duration.toLong())
|
|
||||||
}
|
|
||||||
|
|
||||||
when (state) {
|
|
||||||
PlayerState.STARTED -> avrcpIntent.putExtra("playing", true)
|
|
||||||
PlayerState.STOPPED, PlayerState.PAUSED,
|
|
||||||
PlayerState.COMPLETED -> avrcpIntent.putExtra(
|
|
||||||
"playing",
|
|
||||||
false
|
|
||||||
)
|
|
||||||
else -> return // No need to broadcast.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.sendBroadcast(avrcpIntent)
|
context.sendBroadcast(avrcpIntent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun fillIntent(
|
||||||
|
intent: Intent,
|
||||||
|
song: MusicDirectory.Entry?,
|
||||||
|
playerPosition: Int,
|
||||||
|
id: Int,
|
||||||
|
listSize: Int
|
||||||
|
) {
|
||||||
|
if (song == null) {
|
||||||
|
intent.putExtra("track", "")
|
||||||
|
intent.putExtra("track_name", "")
|
||||||
|
intent.putExtra("artist", "")
|
||||||
|
intent.putExtra("artist_name", "")
|
||||||
|
intent.putExtra("album", "")
|
||||||
|
intent.putExtra("album_name", "")
|
||||||
|
intent.putExtra("album_artist", "")
|
||||||
|
intent.putExtra("album_artist_name", "")
|
||||||
|
|
||||||
|
if (Settings.shouldSendBluetoothAlbumArt) {
|
||||||
|
intent.putExtra("coverart", null as Parcelable?)
|
||||||
|
intent.putExtra("cover", null as Parcelable?)
|
||||||
|
}
|
||||||
|
|
||||||
|
intent.putExtra("ListSize", 0.toLong())
|
||||||
|
intent.putExtra("id", 0.toLong())
|
||||||
|
intent.putExtra("duration", 0.toLong())
|
||||||
|
intent.putExtra("position", 0.toLong())
|
||||||
|
} else {
|
||||||
|
val title = song.title
|
||||||
|
val artist = song.artist
|
||||||
|
val album = song.album
|
||||||
|
val duration = song.duration
|
||||||
|
|
||||||
|
intent.putExtra("track", title)
|
||||||
|
intent.putExtra("track_name", title)
|
||||||
|
intent.putExtra("artist", artist)
|
||||||
|
intent.putExtra("artist_name", artist)
|
||||||
|
intent.putExtra("album", album)
|
||||||
|
intent.putExtra("album_name", album)
|
||||||
|
intent.putExtra("album_artist", artist)
|
||||||
|
intent.putExtra("album_artist_name", artist)
|
||||||
|
|
||||||
|
if (Settings.shouldSendBluetoothAlbumArt) {
|
||||||
|
val albumArtFile = FileUtil.getAlbumArtFile(song)
|
||||||
|
intent.putExtra("coverart", albumArtFile.absolutePath)
|
||||||
|
intent.putExtra("cover", albumArtFile.absolutePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
intent.putExtra("position", playerPosition.toLong())
|
||||||
|
intent.putExtra("id", id.toLong())
|
||||||
|
intent.putExtra("ListSize", listSize.toLong())
|
||||||
|
|
||||||
|
if (duration != null) {
|
||||||
|
intent.putExtra("duration", duration.toLong())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Broadcasts the given player state as the one being set.
|
* Broadcasts the given player state as the one being set.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user