RxMusicPlayer

Additional

Language
Kotlin
Version
1.1.0 (Apr 23, 2019)
Created
Feb 21, 2019
Updated
Apr 23, 2019 (Retired)
Owner
Orfium
Contributor
Dimitris Konomis (dimkonomis)
1
Activity
Badge
Generate
Download
Source code

RxMusicPlayer

An android music player using ExoPlayer and RxJava2.

Introduction

RxMusicPlayer is a part of our music player in Orfium new android application.
Using subjects and sealed classes, media manager can emit the latest state of exoplayer, allowing views and classes to observe it and react according to its state, without the need to have a reference to the media manager or exoplayer itself.

Initialization

Before start using RxMusicPlayer you have to call the method that starts the Media Service

RxMusicPlayer.start(context)

or

RxMusicPlayer.start(context, Intent(this, MainActivity::class.java))

if you want to specify the activity you want to launch from notification

Usage

Create a Media item class that contains all the necessary data information and call playStop extension function on it.

Example:

val media = Media(
            id = 1, title = "Closer and Closer . . . 25.11.2018", artist = "Strobi-wan", duration = 7861, 
            image = "https://s3-us-west-2.amazonaws.com/orfium-public/tracks/artwork/45c4ad6b21dc4aecad4bee0bafefb613.jpg",
            streamUrl = "https://s3-us-west-2.amazonaws.com/orfium-public/tracks/8c7465df1f0c4e48af10ad4f6c17a2ef.mp3"
        )
media.playStop()

You can also check if a Media item is currently playing

if (media.isPlaying())

or add/remove it from queue

media.addQueue()

media.removeQueue()

If you wish not to use the extension functions you can use RxMusicPlayer action to emit a new action that the MediaManager will handle. Here is the full list of actions that the MediaManager can handle

Example:

RxMusicPlayer.action.onNext(Action.pause())

or

RxMusicPlayer.action.onNext(Action.seek(position))

To observe the changes on media player state just subscribe to RxMusicPlayer state, that will emit the current PlaybackState along with the current Media item on Queue. When a new observer subscribes to RxMusicPlayer state, it immediately gets notified about the current PlaybackState. You can find all states here

RxMusicPlayer.state
            .distinctUntilChanged()
            .subscribe { state ->
                when (state) {
                    is PlaybackState.Buffering -> /* Your code */
                    is PlaybackState.Playing -> showPlaying(state.media)
                }
            }

A notification is provided by default when the state gets changes. You can configure notification's icons by overriding them.

RxMusicPlayer allows you to observe changes in media queue list and the current playback position of exoplayer

RxMusicPlayer.queue
                .subscribe { queueData -> /* Your code */ }

RxMusicPlayer.position
                .observeOn(AndroidSchedulers.mainThread())
                .distinctUntilChanged()
                .subscribe { position -> /* Your code */ }

Setup

The latest library version is

Add the JitPack repository in your build.gradle (top level module):

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

And add the dependency in the build.gradle of the module:

implementation 'com.github.Orfium:RxMusicPlayer-android:LATEST_VERSION'

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.