diff --git a/README.md b/README.md index ad00d6a..757e776 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,10 @@ RadioPlayer.radioURL('https://...'); RadioPlayer.stop(); RadioPlayer.play(); -// State: loading, loadingFinished +// State: error, stopped, playing, paused, buffering RadioPlayerEvents.addEventListener('stateDidChange', (event) => { console.log(event.state); }); -// Playback State: playing, paused, stopped -RadioPlayerEvents.addEventListener('PlaybackStateDidChange', (event) => { - console.log(event.playbackState); -}); // Metadata: {"artistName": "Example Artist", "trackName": "Example Title"} RadioPlayerEvents.addListener('MetadataDidChange', (metadata) => { console.log(`Artist: ${metadata.artistName}`); diff --git a/android/src/main/java/com/reactnativeradioplayer/RadioPlayerModule.kt b/android/src/main/java/com/reactnativeradioplayer/RadioPlayerModule.kt index 71d790a..7e01068 100644 --- a/android/src/main/java/com/reactnativeradioplayer/RadioPlayerModule.kt +++ b/android/src/main/java/com/reactnativeradioplayer/RadioPlayerModule.kt @@ -13,75 +13,87 @@ import com.google.android.exoplayer2.metadata.icy.IcyInfo import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.util.EventLogger +enum class PlayerState(val state: String) { + ERROR("error"), + STOPPED("stopped"), + PLAYING("playing"), + PAUSED("paused"), + BUFFERING("buffering"), +} class RadioPlayerModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), Player.EventListener, MetadataOutput { - private val context = reactContext - private var player: SimpleExoPlayer = SimpleExoPlayer.Builder(reactContext).build() + private val context = reactContext + private var player: SimpleExoPlayer = SimpleExoPlayer.Builder(reactContext).build() + private var playbackState: Int = Player.STATE_IDLE + private var state: PlayerState? = null - override fun getName(): String { - return "RadioPlayer" - } + override fun getName(): String { + return "RadioPlayer" + } - init { - UiThreadUtil.runOnUiThread { - player.addAnalyticsListener(EventLogger(DefaultTrackSelector(this.context))) - player.addMetadataOutput(this) - player.setThrowsWhenUsingWrongThread(true) - player.setWakeMode(WAKE_MODE_NETWORK) - player.addListener(this) - } + init { + UiThreadUtil.runOnUiThread { + player.addAnalyticsListener(EventLogger(DefaultTrackSelector(this.context))) + player.addMetadataOutput(this) + player.setThrowsWhenUsingWrongThread(true) + player.setWakeMode(WAKE_MODE_NETWORK) + player.addListener(this) } + } - @ReactMethod - fun radioURL(uri: String) { - UiThreadUtil.runOnUiThread { - val item: MediaItem = MediaItem.fromUri(uri) - player.setMediaItem(item) - //play() - } + @ReactMethod + fun radioURL(uri: String) { + UiThreadUtil.runOnUiThread { + val item: MediaItem = MediaItem.fromUri(uri) + player.setMediaItem(item) + //play() } + } - @ReactMethod - fun play() { - UiThreadUtil.runOnUiThread { - if (player.isPlaying) { - player.stop() - } - player.prepare() - player.play() + @ReactMethod + fun play() { + UiThreadUtil.runOnUiThread { + if (player.isPlaying) { + player.stop() } + player.prepare() + player.play() } + } - @ReactMethod - fun stop() { - UiThreadUtil.runOnUiThread { player.stop() } - } + @ReactMethod + fun stop() { + UiThreadUtil.runOnUiThread { player.stop() } + } - override fun onPlaybackStateChanged(state: Int) { - var stateString = "unknown" - var playbackStateString = "unknown" - when (state) { + private fun computeAndSendStateEvent() { + val previousState = this.state + + when (this.playbackState) { Player.STATE_IDLE, Player.STATE_ENDED -> { - stateString = "loadingFinished" - playbackStateString = "stopped" + this.state = PlayerState.STOPPED } Player.STATE_BUFFERING -> { - stateString = "loading" - playbackStateString = "paused" + this.state = PlayerState.BUFFERING } Player.STATE_READY -> { - stateString = "loadingFinished" - playbackStateString = "playing" + this.state = PlayerState.PLAYING } } + + if (this.state === null || this.state === previousState) { + return + } + val stateMap = WritableNativeMap() - stateMap.putString("state", stateString) + stateMap.putString("state", this.state!!.state) sendEvent(this.context, "StateDidChange", stateMap) + } - val playbackStateMap = WritableNativeMap() - playbackStateMap.putString("playbackState", playbackStateString) - sendEvent(this.context, "PlaybackStateDidChange", playbackStateMap) + override fun onPlaybackStateChanged(state: Int) { + this.playbackState = state + computeAndSendStateEvent() } private fun sendEvent(reactContext: ReactContext, @@ -97,7 +109,7 @@ class RadioPlayerModule(reactContext: ReactApplicationContext) : ReactContextBas var artistName = "Unknown" var trackName = "Unknown" for (i in 1..metadata.length()) { - val entry: Metadata.Entry = metadata.get(i-1) + val entry: Metadata.Entry = metadata.get(i - 1) if (entry is IcyInfo) { if (entry.title != null) { val parts: List = entry.title!!.split(" - ") diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 7d450dc..252fc55 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -130,8 +130,8 @@ android { applicationId "com.example.reactnativeradioplayer" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" + versionCode 2 + versionName "0.2" multiDexEnabled true } splits { diff --git a/example/ios/RadioPlayerExample.xcodeproj/project.pbxproj b/example/ios/RadioPlayerExample.xcodeproj/project.pbxproj index 40ae3bf..d889c26 100644 --- a/example/ios/RadioPlayerExample.xcodeproj/project.pbxproj +++ b/example/ios/RadioPlayerExample.xcodeproj/project.pbxproj @@ -267,10 +267,11 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; INFOPLIST_FILE = RadioPlayerExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.2; OTHER_CFLAGS = ( "$(inherited)", "-DFB_SONARKIT_ENABLED=1", @@ -295,9 +296,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; INFOPLIST_FILE = RadioPlayerExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.2; OTHER_CFLAGS = ( "$(inherited)", "-DFB_SONARKIT_ENABLED=1", diff --git a/example/ios/RadioPlayerExample/Info.plist b/example/ios/RadioPlayerExample/Info.plist index 8ce4ea8..1e8e524 100644 --- a/example/ios/RadioPlayerExample/Info.plist +++ b/example/ios/RadioPlayerExample/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/example/src/App.tsx b/example/src/App.tsx index 49a7321..080d6e7 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -6,31 +6,26 @@ import RadioPlayer, { } from 'react-native-radio-player'; export default function App() { - const [playerState, setPlayerState] = React.useState(); - const [playerPlaybackState, setPlayerPlaybackState] = React.useState(); + const [playerState, setPlayerState] = React.useState('stopped'); const [metadata, setMetadata] = React.useState(); React.useEffect(() => { RadioPlayerEvents.addListener('StateDidChange', (eventObject) => { setPlayerState(eventObject.state); }); - RadioPlayerEvents.addListener('PlaybackStateDidChange', (eventObject) => { - setPlayerPlaybackState(eventObject.playbackState); - }); return () => { RadioPlayerEvents.removeListener('StateDidChange', (eventObject) => { setPlayerState(eventObject.state); }); - RadioPlayerEvents.removeListener( - 'PlaybackStateDidChange', - (eventObject) => { - setPlayerPlaybackState(eventObject.playbackState); - } - ); }; }, []); - RadioPlayerEvents.addListener('MetadataDidChange', setMetadata); + React.useEffect(() => { + RadioPlayerEvents.addListener('MetadataDidChange', setMetadata); + return () => { + RadioPlayerEvents.addListener('MetadataDidChange', setMetadata); + }; + }, []); React.useEffect(() => { RadioPlayer.radioURL('http://stream.fr.morow.com/morow_med.aacp'); @@ -59,17 +54,16 @@ export default function App() {