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
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.