@@ -23,6 +23,7 @@ import androidx.core.app.NotificationCompat
2323import androidx.media.MediaBrowserServiceCompat
2424import androidx.media.session.MediaButtonReceiver
2525import `is`.xyz.mpv.MPVLib
26+ import `is`.xyz.mpv.MPVNode
2627import live.mehiz.mpvkt.R
2728import live.mehiz.mpvkt.preferences.GesturePreferences
2829import org.koin.android.ext.android.inject
@@ -45,21 +46,25 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
4546 private val binder = MediaPlaybackBinder ()
4647 private var mediaTitle = " "
4748 private var mediaArtist = " "
48- private var positionMs: Long
49- get() = ( MPVLib .getPropertyDouble(" time-pos" ) * 1000L ).toLong()
50- set(value) = MPVLib .command(arrayOf( " seek" , (value / 1000f ).toString(), " absolute" ) )
51- private val durationMs: Long
52- get() = (MPVLib .getPropertyDouble(" duration" ) * 1000L ).toLong()
53- private var paused: Boolean
49+ private var positionMs: Long?
50+ get() = MPVLib .getPropertyDouble(" time-pos" )?.times( 1000L )? .toLong()
51+ set(value) = MPVLib .command(" seek" , (value!! / 1000f ).toString(), " absolute" )
52+ private val durationMs: Long?
53+ get() = (MPVLib .getPropertyDouble(" duration" )?.times( 1000L ))? .toLong()
54+ private var paused: Boolean?
5455 get() = MPVLib .getPropertyBoolean(" pause" )
55- set(value) = MPVLib .command(arrayOf( " set" , " pause" , if (value) " yes" else " no" ) )
56+ set(value) = MPVLib .command(" set" , " pause" , if (value == true ) " yes" else " no" )
5657
5758 private lateinit var mediaSession: MediaSessionCompat
5859
5960 private lateinit var audioManager: AudioManager
6061 private var audioFocusRequest: AudioFocusRequest ? = null
6162 private var audioFocusCallback: AudioManager .OnAudioFocusChangeListener ? = null
6263
64+ init {
65+ MPVLib .addObserver(this )
66+ }
67+
6368 @Suppress(" EmptyFunctionBlock" )
6469 override fun eventProperty (property : String ) {
6570 }
@@ -86,6 +91,7 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
8691 updateMediaSessionMetadata()
8792 updateNotification()
8893 }
94+
8995 " media-title" -> {
9096 mediaTitle = value
9197 updateMediaSessionMetadata()
@@ -98,6 +104,10 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
98104 override fun eventProperty (property : String , value : Double ) {
99105 }
100106
107+ @Suppress(" EmptyFunctionBlock" )
108+ override fun eventProperty (property : String , value : MPVNode ) {
109+ }
110+
101111 @Suppress(" EmptyFunctionBlock" )
102112 override fun event (eventId : Int ) {
103113 }
@@ -111,8 +121,17 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
111121 override fun onCreate () {
112122 super .onCreate()
113123
114- audioManager = getSystemService(Context . AUDIO_SERVICE ) as AudioManager
124+ audioManager = getSystemService(AUDIO_SERVICE ) as AudioManager
115125 MPVLib .addObserver(this )
126+ mapOf (
127+ " pause" to MPVLib .mpvFormat.MPV_FORMAT_FLAG ,
128+ " duration" to MPVLib .mpvFormat.MPV_FORMAT_DOUBLE ,
129+ " time-pos" to MPVLib .mpvFormat.MPV_FORMAT_DOUBLE ,
130+ " media-title" to MPVLib .mpvFormat.MPV_FORMAT_STRING ,
131+ " metadata/artist" to MPVLib .mpvFormat.MPV_FORMAT_STRING ,
132+ ).onEach {
133+ MPVLib .observeProperty(it.key, it.value)
134+ }
116135
117136 setupMediaSession()
118137 setupAudioFocus()
@@ -213,7 +232,7 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
213232 when (focusChange) {
214233 AudioManager .AUDIOFOCUS_LOSS -> pauseMedia()
215234 AudioManager .AUDIOFOCUS_LOSS_TRANSIENT -> pauseMedia()
216- AudioManager .AUDIOFOCUS_GAIN -> if (! paused) playMedia()
235+ AudioManager .AUDIOFOCUS_GAIN -> if (paused == false ) playMedia()
217236 }
218237 }
219238
@@ -284,19 +303,19 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
284303 }
285304
286305 private fun seekForward () {
287- positionMs + = gesturePreferences.doubleTapToSeekDuration.get() * 1000L
306+ positionMs = positionMs?.plus( gesturePreferences.doubleTapToSeekDuration.get() * 1000L )
288307 }
289308
290309 private fun seekBackward () {
291- positionMs - = gesturePreferences.doubleTapToSeekDuration.get() * 1000L
310+ positionMs = positionMs?.minus( gesturePreferences.doubleTapToSeekDuration.get() * 1000L )
292311 }
293312
294313 private fun updateMediaSessionMetadata () {
295314 try {
296315 val metadataBuilder = MediaMetadataCompat .Builder ()
297316 .putString(MediaMetadataCompat .METADATA_KEY_TITLE , mediaTitle)
298317 .putString(MediaMetadataCompat .METADATA_KEY_ARTIST , mediaArtist)
299- .putLong(MediaMetadataCompat .METADATA_KEY_DURATION , durationMs)
318+ .putLong(MediaMetadataCompat .METADATA_KEY_DURATION , durationMs ? : 0L )
300319 .putString(MediaMetadataCompat .METADATA_KEY_DISPLAY_TITLE , mediaTitle)
301320 .putString(MediaMetadataCompat .METADATA_KEY_MEDIA_ID , mediaTitle.hashCode().toString())
302321
@@ -316,7 +335,15 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
316335 try {
317336 val stateBuilder = PlaybackStateCompat .Builder ()
318337 .setActions(getAvailableActions())
319- .setState(if (paused) PlaybackStateCompat .STATE_PAUSED else PlaybackStateCompat .STATE_PLAYING , positionMs, 1.0f )
338+ .setState(
339+ if (paused == true ) {
340+ PlaybackStateCompat .STATE_PAUSED
341+ } else {
342+ PlaybackStateCompat .STATE_PLAYING
343+ },
344+ positionMs ? : 0 ,
345+ 1.0f ,
346+ )
320347
321348 mediaSession.setPlaybackState(stateBuilder.build())
322349 } catch (e: Exception ) {
@@ -374,12 +401,12 @@ class MediaPlaybackService : MediaBrowserServiceCompat(), MPVLib.EventObserver {
374401 .setContentIntent(pendingOpenAppIntent)
375402 .setVisibility(NotificationCompat .VISIBILITY_PUBLIC )
376403 .setOnlyAlertOnce(true )
377- .setOngoing(! paused)
404+ .setOngoing(paused == false )
378405 .addAction(R .drawable.baseline_fast_rewind_24, getString(R .string.notification_rewind), pendingSkipBackwardIntent)
379406 .addAction(
380- if (! paused) R .drawable.baseline_pause_24 else R .drawable.baseline_play_arrow_24,
381- if (! paused) getString(R .string.notification_pause) else getString(R .string.notification_play),
382- if (! paused) pendingPauseIntent else pendingPlayIntent,
407+ if (paused == false ) R .drawable.baseline_pause_24 else R .drawable.baseline_play_arrow_24,
408+ if (paused == false ) getString(R .string.notification_pause) else getString(R .string.notification_play),
409+ if (paused == false ) pendingPauseIntent else pendingPlayIntent,
383410 )
384411 .addAction(
385412 R .drawable.baseline_fast_forward_24,
0 commit comments