package org.moire.ultrasonic.service import android.os.Bundle import android.support.v4.media.session.MediaSessionCompat import android.view.KeyEvent import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.subjects.PublishSubject import java.util.concurrent.TimeUnit import org.moire.ultrasonic.domain.PlayerState class RxBus { companion object { var mediaSessionTokenPublisher: PublishSubject = PublishSubject.create() val mediaSessionTokenObservable: Observable = mediaSessionTokenPublisher.observeOn(AndroidSchedulers.mainThread()) .replay(1) .autoConnect(0) val mediaButtonEventPublisher: PublishSubject = PublishSubject.create() val mediaButtonEventObservable: Observable = mediaButtonEventPublisher.observeOn(AndroidSchedulers.mainThread()) val themeChangedEventPublisher: PublishSubject = PublishSubject.create() val themeChangedEventObservable: Observable = themeChangedEventPublisher.observeOn(AndroidSchedulers.mainThread()) val musicFolderChangedEventPublisher: PublishSubject = PublishSubject.create() val musicFolderChangedEventObservable: Observable = musicFolderChangedEventPublisher.observeOn(AndroidSchedulers.mainThread()) val playerStatePublisher: PublishSubject = PublishSubject.create() val playerStateObservable: Observable = playerStatePublisher.observeOn(AndroidSchedulers.mainThread()) .replay(1) .autoConnect(0) val playlistPublisher: PublishSubject> = PublishSubject.create() val playlistObservable: Observable> = playlistPublisher.observeOn(AndroidSchedulers.mainThread()) .replay(1) .autoConnect(0) val playbackPositionPublisher: PublishSubject = PublishSubject.create() val playbackPositionObservable: Observable = playbackPositionPublisher.observeOn(AndroidSchedulers.mainThread()) .throttleFirst(1, TimeUnit.SECONDS) .replay(1) .autoConnect(0) // Commands val dismissNowPlayingCommandPublisher: PublishSubject = PublishSubject.create() val dismissNowPlayingCommandObservable: Observable = dismissNowPlayingCommandPublisher.observeOn(AndroidSchedulers.mainThread()) val playFromMediaIdCommandPublisher: PublishSubject> = PublishSubject.create() val playFromMediaIdCommandObservable: Observable> = playFromMediaIdCommandPublisher.observeOn(AndroidSchedulers.mainThread()) val playFromSearchCommandPublisher: PublishSubject> = PublishSubject.create() val playFromSearchCommandObservable: Observable> = playFromSearchCommandPublisher.observeOn(AndroidSchedulers.mainThread()) val skipToQueueItemCommandPublisher: PublishSubject = PublishSubject.create() val skipToQueueItemCommandObservable: Observable = skipToQueueItemCommandPublisher.observeOn(AndroidSchedulers.mainThread()) fun releaseMediaSessionToken() { mediaSessionTokenPublisher = PublishSubject.create() } } data class StateWithTrack(val state: PlayerState, val track: DownloadFile?) } operator fun CompositeDisposable.plusAssign(disposable: Disposable) { this.add(disposable) }