@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.
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +34 -9
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +57 -17
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +33 -11
- package/ios/Browser/BrowserManager.swift +2 -17
- package/ios/CarPlay/CarPlayController.swift +75 -27
- package/ios/HybridAudioBrowser.swift +42 -12
- package/ios/TrackPlayer.swift +39 -37
- package/lib/commonjs/features/remoteControls.js +24 -1
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/web/NativeAudioBrowser.js +34 -5
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/features/remoteControls.js +22 -0
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/web/NativeAudioBrowser.js +34 -5
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/typescript/src/features/remoteControls.d.ts +26 -0
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +3 -1
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +11 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -1
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteLoadEvent.hpp +89 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +39 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +4 -0
- package/nitrogen/generated/android/c++/JRemoteLoadEvent.hpp +94 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteLoadEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteLoadEvent.kt +44 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +8 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +40 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +3 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +17 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteLoadEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +2 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +51 -0
- package/nitrogen/generated/ios/swift/RemoteLoadEvent.swift +70 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +4 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +7 -0
- package/nitrogen/generated/shared/c++/RemoteLoadEvent.hpp +85 -0
- package/package.json +1 -1
- package/src/features/remoteControls.ts +35 -0
- package/src/specs/audio-browser.nitro.ts +3 -0
- 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.
|
|
376
|
-
|
|
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.
|
|
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
|
|