@5stones/react-native-audio-browser 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +34 -9
  2. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +57 -17
  3. package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +33 -11
  4. package/ios/Browser/BrowserManager.swift +2 -17
  5. package/ios/CarPlay/CarPlayController.swift +75 -27
  6. package/ios/HybridAudioBrowser.swift +42 -12
  7. package/ios/TrackPlayer.swift +39 -37
  8. package/lib/commonjs/features/remoteControls.js +24 -1
  9. package/lib/commonjs/features/remoteControls.js.map +1 -1
  10. package/lib/commonjs/web/NativeAudioBrowser.js +34 -5
  11. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
  12. package/lib/module/features/remoteControls.js +22 -0
  13. package/lib/module/features/remoteControls.js.map +1 -1
  14. package/lib/module/web/NativeAudioBrowser.js +34 -5
  15. package/lib/module/web/NativeAudioBrowser.js.map +1 -1
  16. package/lib/typescript/src/features/remoteControls.d.ts +26 -0
  17. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
  18. package/lib/typescript/src/specs/audio-browser.nitro.d.ts +3 -1
  19. package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
  20. package/lib/typescript/src/web/NativeAudioBrowser.d.ts +11 -1
  21. package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -1
  22. package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +2 -0
  23. package/nitrogen/generated/android/c++/JFunc_void_RemoteLoadEvent.hpp +89 -0
  24. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +39 -0
  25. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +4 -0
  26. package/nitrogen/generated/android/c++/JRemoteLoadEvent.hpp +94 -0
  27. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteLoadEvent.kt +80 -0
  28. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +28 -0
  29. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteLoadEvent.kt +44 -0
  30. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +8 -0
  31. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +40 -0
  32. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +3 -0
  33. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +17 -0
  34. package/nitrogen/generated/ios/swift/Func_void_RemoteLoadEvent.swift +47 -0
  35. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +2 -0
  36. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +51 -0
  37. package/nitrogen/generated/ios/swift/RemoteLoadEvent.swift +70 -0
  38. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +4 -0
  39. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +7 -0
  40. package/nitrogen/generated/shared/c++/RemoteLoadEvent.hpp +85 -0
  41. package/package.json +1 -1
  42. package/src/features/remoteControls.ts +35 -0
  43. package/src/specs/audio-browser.nitro.ts +3 -0
  44. package/src/web/NativeAudioBrowser.ts +34 -5
@@ -4,6 +4,7 @@ import type {
4
4
  StarRating,
5
5
  ThumbsRating
6
6
  } from './rating'
7
+ import type { Track } from '../types'
7
8
  import { nativeBrowser } from '../native'
8
9
  import { LazyNativeEmitter } from '../utils/LazyNativeEmitter'
9
10
 
@@ -66,6 +67,18 @@ export interface RemoteSkipEvent {
66
67
  index: number
67
68
  }
68
69
 
70
+ /**
71
+ * Remote load event, fired when a track is about to be loaded via navigateTrack.
72
+ */
73
+ export interface RemoteLoadEvent {
74
+ /** The track that will be loaded */
75
+ track: Track
76
+ /** The resolved queue of tracks */
77
+ queue: Track[]
78
+ /** The index of the track in the queue */
79
+ startIndex: number
80
+ }
81
+
69
82
  // MARK: - Default Handlers
70
83
 
71
84
  // Install remote control handlers with default behavior immediately when module loads
@@ -221,6 +234,17 @@ export function handleRemoteJumpBackward(
221
234
  nativeBrowser.handleRemoteJumpBackward = callback
222
235
  }
223
236
 
237
+ /**
238
+ * Sets a custom handler for remote load events, overriding the default track loading behavior.
239
+ * When set, navigateTrack() will call this handler instead of auto-loading/playing the track.
240
+ * @param callback - Called with the track, queue, and startIndex. Pass undefined to restore default behavior.
241
+ */
242
+ export function handleRemoteLoad(
243
+ callback: ((event: RemoteLoadEvent) => void) | undefined
244
+ ) {
245
+ nativeBrowser.handleRemoteLoad = callback
246
+ }
247
+
224
248
  // MARK: - Event Callbacks (for listening/debugging only)
225
249
  //
226
250
  // Use these functions when you want to LISTEN to remote control events without overriding
@@ -248,6 +272,17 @@ export const onRemoteJumpForward =
248
272
  (cb) => (nativeBrowser.onRemoteJumpForward = cb)
249
273
  )
250
274
 
275
+ /**
276
+ * Subscribes to remote load events.
277
+ * Fires whenever a track is about to be loaded via navigateTrack(),
278
+ * regardless of whether handleRemoteLoad is set.
279
+ * @param callback - Called with the track, queue, and startIndex
280
+ * @returns Cleanup function to unsubscribe
281
+ */
282
+ export const onRemoteLoad = LazyNativeEmitter.emitterize<RemoteLoadEvent>(
283
+ (cb) => (nativeBrowser.onRemoteLoad = cb)
284
+ )
285
+
251
286
  /**
252
287
  * Subscribes to remote next events.
253
288
  * @param callback - Called when the user presses the next track button
@@ -43,6 +43,7 @@ import type {
43
43
  RemoteJumpForwardEvent,
44
44
  RemotePlayIdEvent,
45
45
  RemotePlaySearchEvent,
46
+ RemoteLoadEvent,
46
47
  RemoteSeekEvent,
47
48
  RemoteSetRatingEvent,
48
49
  RemoteSkipEvent
@@ -138,6 +139,7 @@ export interface AudioBrowser extends HybridObject<{
138
139
  onRemoteJumpBackward: (event: RemoteJumpBackwardEvent) => void
139
140
  onRemoteJumpForward: (event: RemoteJumpForwardEvent) => void
140
141
  onRemoteLike: () => void
142
+ onRemoteLoad: (event: RemoteLoadEvent) => void
141
143
  onRemoteNext: () => void
142
144
  onRemotePause: () => void
143
145
  onRemotePlay: () => void
@@ -160,6 +162,7 @@ export interface AudioBrowser extends HybridObject<{
160
162
  | undefined
161
163
  handleRemoteJumpForward: ((event: RemoteJumpForwardEvent) => void) | undefined
162
164
  handleRemoteLike: (() => void) | undefined
165
+ handleRemoteLoad: ((event: RemoteLoadEvent) => void) | undefined
163
166
  handleRemoteNext: (() => void) | undefined
164
167
  handleRemotePause: (() => void) | undefined
165
168
  handleRemotePlay: (() => void) | undefined
@@ -17,6 +17,7 @@ import type {
17
17
  PlaybackPlayWhenReadyChangedEvent,
18
18
  RemoteJumpBackwardEvent,
19
19
  RemoteJumpForwardEvent,
20
+ RemoteLoadEvent,
20
21
  RemotePlayIdEvent,
21
22
  RemotePlaySearchEvent,
22
23
  RemoteSeekEvent,
@@ -162,6 +163,7 @@ export class NativeAudioBrowser
162
163
  onRemoteJumpBackward: (event: RemoteJumpBackwardEvent) => void = () => {}
163
164
  onRemoteJumpForward: (event: RemoteJumpForwardEvent) => void = () => {}
164
165
  onRemoteLike: () => void = () => {}
166
+ onRemoteLoad: (event: RemoteLoadEvent) => void = () => {}
165
167
  onRemoteNext: () => void = () => {}
166
168
  onRemotePause: () => void = () => {}
167
169
  onRemotePlay: () => void = () => {}
@@ -196,6 +198,7 @@ export class NativeAudioBrowser
196
198
  | ((event: RemoteJumpForwardEvent) => void)
197
199
  | undefined = undefined
198
200
  handleRemoteLike: (() => void) | undefined = undefined
201
+ handleRemoteLoad: ((event: RemoteLoadEvent) => void) | undefined = undefined
199
202
  handleRemoteNext: (() => void) | undefined = undefined
200
203
  handleRemotePause: (() => void) | undefined = undefined
201
204
  handleRemotePlay: (() => void) | undefined = undefined
@@ -349,6 +352,28 @@ export class NativeAudioBrowser
349
352
  void this.navigateTrackAsync(track, url)
350
353
  }
351
354
 
355
+ /**
356
+ * Centralizes handleRemoteLoad interception logic.
357
+ * If handleRemoteLoad is set, calls it (intercepted). Otherwise runs defaultBehavior.
358
+ * Always fires onRemoteLoad afterward.
359
+ *
360
+ * @returns true if the handler intercepted, false if defaultBehavior ran
361
+ */
362
+ private handleLoad(
363
+ track: Track, queue: Track[], startIndex: number,
364
+ defaultBehavior: () => void
365
+ ): boolean {
366
+ const event: RemoteLoadEvent = { track, queue, startIndex }
367
+ const handled = !!this.handleRemoteLoad
368
+ if (this.handleRemoteLoad) {
369
+ this.handleRemoteLoad(event)
370
+ } else {
371
+ defaultBehavior()
372
+ }
373
+ this.onRemoteLoad(event)
374
+ return handled
375
+ }
376
+
352
377
  /**
353
378
  * Attempts to skip to a track already in the current queue.
354
379
  * Used as an optimization to avoid re-expanding the queue.
@@ -372,8 +397,10 @@ export class NativeAudioBrowser
372
397
  return false
373
398
  }
374
399
 
375
- this.skip(index)
376
- this.play()
400
+ this.handleLoad(queue[index]!, queue, index, () => {
401
+ this.skip(index)
402
+ this.play()
403
+ })
377
404
  return true
378
405
  }
379
406
 
@@ -394,7 +421,9 @@ export class NativeAudioBrowser
394
421
  return false
395
422
  }
396
423
 
397
- this.setQueue(result.tracks, result.startIndex)
424
+ this.handleLoad(track, result.tracks, result.startIndex, () => {
425
+ this.setQueue(result.tracks, result.startIndex)
426
+ })
398
427
  return true
399
428
  }
400
429
 
@@ -423,7 +452,7 @@ export class NativeAudioBrowser
423
452
  }
424
453
 
425
454
  // Fallback: load single track if expansion fails
426
- this.load(track)
455
+ this.handleLoad(track, [track], 0, () => this.load(track))
427
456
  return
428
457
  }
429
458
 
@@ -437,7 +466,7 @@ export class NativeAudioBrowser
437
466
 
438
467
  // Handle playable track (has src but no URL)
439
468
  if (track.src) {
440
- this.load(track)
469
+ this.handleLoad(track, [track], 0, () => this.load(track))
441
470
  return
442
471
  }
443
472