react-native-nitro-player 1.4.3 → 1.5.0-alpha.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/NitroPlayer.podspec +6 -0
- package/README.md +113 -0
- package/android/build.gradle +8 -0
- package/android/src/main/AndroidManifest.xml +11 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridCast.kt +79 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/ExoPlayerCore.kt +10 -7
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCast.kt +122 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +13 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerSetup.kt +7 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/CastSessionController.kt +160 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/NitroCastConfig.kt +23 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/NitroCastOptionsProvider.kt +30 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/NitroMediaItemConverter.kt +53 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/PlaybackService.kt +33 -0
- package/ios/HybridCast.swift +63 -0
- package/ios/core/CastSessionManager.swift +367 -0
- package/ios/core/TrackPlayerCast.swift +109 -0
- package/ios/core/TrackPlayerCore.swift +28 -2
- package/ios/core/TrackPlayerPlayback.swift +32 -0
- package/ios/core/TrackPlayerQueue.swift +8 -1
- package/ios/core/TrackPlayerQueueBuild.swift +37 -2
- package/ios/core/TrackPlayerRedirectResolver.swift +150 -0
- package/lib/components/CastButton.d.ts +44 -0
- package/lib/components/CastButton.js +100 -0
- package/lib/hooks/castCallbackManager.d.ts +19 -0
- package/lib/hooks/castCallbackManager.js +43 -0
- package/lib/hooks/index.d.ts +3 -0
- package/lib/hooks/index.js +3 -0
- package/lib/hooks/useCastState.d.ts +27 -0
- package/lib/hooks/useCastState.js +49 -0
- package/lib/hooks/useIsCasting.d.ts +17 -0
- package/lib/hooks/useIsCasting.js +43 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +4 -1
- package/lib/specs/Cast.nitro.d.ts +58 -0
- package/lib/specs/Cast.nitro.js +1 -0
- package/nitro.json +10 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +3 -1
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +18 -0
- package/nitrogen/generated/android/c++/JCastState.hpp +64 -0
- package/nitrogen/generated/android/c++/JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.hpp +83 -0
- package/nitrogen/generated/android/c++/JHybridCastSpec.cpp +115 -0
- package/nitrogen/generated/android/c++/JHybridCastSpec.hpp +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CastState.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridCastSpec.kt +85 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +38 -13
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +176 -125
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +8 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +8 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +12 -0
- package/nitrogen/generated/ios/c++/HybridCastSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridCastSpecSwift.hpp +133 -0
- package/nitrogen/generated/ios/swift/CastState.swift +48 -0
- package/nitrogen/generated/ios/swift/Func_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.swift +65 -0
- package/nitrogen/generated/ios/swift/HybridCastSpec.swift +61 -0
- package/nitrogen/generated/ios/swift/HybridCastSpec_cxx.swift +254 -0
- package/nitrogen/generated/shared/c++/CastState.hpp +84 -0
- package/nitrogen/generated/shared/c++/HybridCastSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridCastSpec.hpp +75 -0
- package/package.json +3 -3
- package/src/components/CastButton.tsx +196 -0
- package/src/hooks/castCallbackManager.ts +55 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useCastState.ts +67 -0
- package/src/hooks/useIsCasting.ts +47 -0
- package/src/index.ts +9 -0
- package/src/specs/Cast.nitro.ts +72 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { Cast } from '../index';
|
|
3
|
+
import { castCallbackManager } from './castCallbackManager';
|
|
4
|
+
/**
|
|
5
|
+
* Hook to subscribe to the full Google Cast connection state.
|
|
6
|
+
*
|
|
7
|
+
* Provides the connection {@link CastState}, the connected device name, and a
|
|
8
|
+
* convenience `isCasting` flag. For a simple boolean prefer {@link useIsCasting}.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* function CastStatus() {
|
|
13
|
+
* const { state, deviceName, isCasting } = useCastState()
|
|
14
|
+
* if (!isCasting) return null
|
|
15
|
+
* return <Text>Casting to {deviceName} ({state})</Text>
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function useCastState() {
|
|
20
|
+
const [state, setState] = useState('not_connected');
|
|
21
|
+
const [deviceName, setDeviceName] = useState(null);
|
|
22
|
+
const [isReady, setIsReady] = useState(false);
|
|
23
|
+
const isMounted = useRef(true);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
isMounted.current = true;
|
|
26
|
+
// Seed from current native state.
|
|
27
|
+
try {
|
|
28
|
+
setState(Cast.getCastState());
|
|
29
|
+
setDeviceName(Cast.getCastDeviceName());
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error('[useCastState] Failed to read initial cast state:', error);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
setIsReady(true);
|
|
36
|
+
}
|
|
37
|
+
const unsubscribe = castCallbackManager.subscribeToCastState((newState, newDeviceName) => {
|
|
38
|
+
if (isMounted.current) {
|
|
39
|
+
setState(newState);
|
|
40
|
+
setDeviceName(newDeviceName);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return () => {
|
|
44
|
+
isMounted.current = false;
|
|
45
|
+
unsubscribe();
|
|
46
|
+
};
|
|
47
|
+
}, []);
|
|
48
|
+
return { state, deviceName, isCasting: state === 'connected', isReady };
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook that returns whether playback is currently routed to a Google Cast device.
|
|
3
|
+
*
|
|
4
|
+
* Updates in real time as Cast sessions start and end. Initializes synchronously
|
|
5
|
+
* from the native player's current state.
|
|
6
|
+
*
|
|
7
|
+
* @returns `true` while connected to a Cast device, otherwise `false`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function NowPlaying() {
|
|
12
|
+
* const isCasting = useIsCasting()
|
|
13
|
+
* return <Text>{isCasting ? 'Casting' : 'Playing locally'}</Text>
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function useIsCasting(): boolean;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { Cast } from '../index';
|
|
3
|
+
import { castCallbackManager } from './castCallbackManager';
|
|
4
|
+
/**
|
|
5
|
+
* Hook that returns whether playback is currently routed to a Google Cast device.
|
|
6
|
+
*
|
|
7
|
+
* Updates in real time as Cast sessions start and end. Initializes synchronously
|
|
8
|
+
* from the native player's current state.
|
|
9
|
+
*
|
|
10
|
+
* @returns `true` while connected to a Cast device, otherwise `false`.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function NowPlaying() {
|
|
15
|
+
* const isCasting = useIsCasting()
|
|
16
|
+
* return <Text>{isCasting ? 'Casting' : 'Playing locally'}</Text>
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function useIsCasting() {
|
|
21
|
+
const [isCasting, setIsCasting] = useState(() => {
|
|
22
|
+
try {
|
|
23
|
+
return Cast.isCasting();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const isMounted = useRef(true);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
isMounted.current = true;
|
|
32
|
+
const unsubscribe = castCallbackManager.subscribeToCastState((state) => {
|
|
33
|
+
if (isMounted.current) {
|
|
34
|
+
setIsCasting(state === 'connected');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return () => {
|
|
38
|
+
isMounted.current = false;
|
|
39
|
+
unsubscribe();
|
|
40
|
+
};
|
|
41
|
+
}, []);
|
|
42
|
+
return isCasting;
|
|
43
|
+
}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { PlayerQueue as PlayerQueueType, TrackPlayer as TrackPlayerType } f
|
|
|
2
2
|
import type { AndroidAutoMediaLibrary as AndroidAutoMediaLibraryType } from './specs/AndroidAutoMediaLibrary.nitro';
|
|
3
3
|
import type { AudioDevices as AudioDevicesType } from './specs/AudioDevices.nitro';
|
|
4
4
|
import type { AudioRoutePicker as AudioRoutePickerType } from './specs/AudioRoutePicker.nitro';
|
|
5
|
+
import type { Cast as CastType } from './specs/Cast.nitro';
|
|
5
6
|
import type { DownloadManager as DownloadManagerType } from './specs/DownloadManager.nitro';
|
|
6
7
|
import type { Equalizer as EqualizerType } from './specs/Equalizer.nitro';
|
|
7
8
|
export declare const PlayerQueue: PlayerQueueType;
|
|
@@ -9,9 +10,13 @@ export declare const TrackPlayer: TrackPlayerType;
|
|
|
9
10
|
export declare const AndroidAutoMediaLibrary: AndroidAutoMediaLibraryType | null;
|
|
10
11
|
export declare const AudioDevices: AudioDevicesType | null;
|
|
11
12
|
export declare const AudioRoutePicker: AudioRoutePickerType | null;
|
|
13
|
+
export declare const Cast: CastType;
|
|
12
14
|
export declare const DownloadManager: DownloadManagerType;
|
|
13
15
|
export declare const Equalizer: EqualizerType;
|
|
14
16
|
export * from './hooks';
|
|
17
|
+
export { CastButton } from './components/CastButton';
|
|
18
|
+
export type { CastButtonProps } from './components/CastButton';
|
|
19
|
+
export type { CastState } from './specs/Cast.nitro';
|
|
15
20
|
export * from './types/PlayerQueue';
|
|
16
21
|
export * from './types/AndroidAutoMediaLibrary';
|
|
17
22
|
export * from './types/DownloadTypes';
|
package/lib/index.js
CHANGED
|
@@ -15,13 +15,16 @@ export const AudioDevices = Platform.OS === 'android'
|
|
|
15
15
|
export const AudioRoutePicker = Platform.OS === 'ios'
|
|
16
16
|
? NitroModules.createHybridObject('AudioRoutePicker')
|
|
17
17
|
: null;
|
|
18
|
+
// Google Cast (iOS + Android)
|
|
19
|
+
export const Cast = NitroModules.createHybridObject('Cast');
|
|
18
20
|
// Download Manager
|
|
19
21
|
export const DownloadManager = NitroModules.createHybridObject('DownloadManager');
|
|
20
22
|
// Equalizer
|
|
21
23
|
export const Equalizer = NitroModules.createHybridObject('Equalizer');
|
|
22
24
|
// Export hooks
|
|
23
25
|
export * from './hooks';
|
|
24
|
-
// Export
|
|
26
|
+
// Export components
|
|
27
|
+
export { CastButton } from './components/CastButton';
|
|
25
28
|
export * from './types/PlayerQueue';
|
|
26
29
|
export * from './types/AndroidAutoMediaLibrary';
|
|
27
30
|
export * from './types/DownloadTypes';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
/**
|
|
3
|
+
* The current Google Cast connection state.
|
|
4
|
+
*
|
|
5
|
+
* - `no_devices_available`: No Cast devices are discoverable on the network.
|
|
6
|
+
* The Cast button is typically hidden in this state.
|
|
7
|
+
* - `not_connected`: Cast devices are available but none is connected.
|
|
8
|
+
* - `connecting`: A session is being established with a device.
|
|
9
|
+
* - `connected`: A session is active and playback is routed to the device.
|
|
10
|
+
*/
|
|
11
|
+
export type CastState = 'no_devices_available' | 'not_connected' | 'connecting' | 'connected';
|
|
12
|
+
/**
|
|
13
|
+
* Google Cast control surface.
|
|
14
|
+
*
|
|
15
|
+
* Casting is implemented as an internal playback backend swap inside the native
|
|
16
|
+
* player core: when a session is `connected`, every playback operation (play,
|
|
17
|
+
* pause, seek, skip, queue) is routed to the remote Cast device and local audio
|
|
18
|
+
* is suppressed automatically. The existing {@link TrackPlayer} API keeps
|
|
19
|
+
* working unchanged — this object only exposes the Cast-specific surface.
|
|
20
|
+
*/
|
|
21
|
+
export interface Cast extends HybridObject<{
|
|
22
|
+
android: 'kotlin';
|
|
23
|
+
ios: 'swift';
|
|
24
|
+
}> {
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the Cast framework. Must be called once early in app startup
|
|
27
|
+
* (before the first Cast interaction). Safe to call multiple times.
|
|
28
|
+
*
|
|
29
|
+
* @param receiverApplicationId Optional Web Receiver application ID registered
|
|
30
|
+
* in the Google Cast Developer Console. When omitted, the platform Default
|
|
31
|
+
* Media Receiver (`CC1AD845`) is used, which supports audio playback,
|
|
32
|
+
* metadata and queues out of the box.
|
|
33
|
+
*/
|
|
34
|
+
configure(receiverApplicationId?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Whether playback is currently routed to a Cast device.
|
|
37
|
+
* Equivalent to `getCastState() === 'connected'`.
|
|
38
|
+
*/
|
|
39
|
+
isCasting(): boolean;
|
|
40
|
+
/** The current Cast connection state. */
|
|
41
|
+
getCastState(): CastState;
|
|
42
|
+
/** The friendly name of the connected device, or `null` when not connected. */
|
|
43
|
+
getCastDeviceName(): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Present the native Cast dialog. Shows the device chooser when not connected,
|
|
46
|
+
* or the cast controls / disconnect dialog when already connected. Mirrors the
|
|
47
|
+
* behaviour of the standard platform Cast button.
|
|
48
|
+
*/
|
|
49
|
+
showCastPicker(): void;
|
|
50
|
+
/** End the current Cast session and resume local playback. No-op when not connected. */
|
|
51
|
+
endCastSession(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Register a callback fired whenever the Cast connection state changes.
|
|
54
|
+
* The callback receives the new {@link CastState} and the connected device
|
|
55
|
+
* name (or `null`).
|
|
56
|
+
*/
|
|
57
|
+
onCastStateChange(callback: (state: CastState, deviceName: string | null) => void): void;
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/nitro.json
CHANGED
|
@@ -47,6 +47,16 @@
|
|
|
47
47
|
"implementationClassName": "HybridAudioRoutePicker"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
+
"Cast": {
|
|
51
|
+
"ios": {
|
|
52
|
+
"language": "swift",
|
|
53
|
+
"implementationClassName": "HybridCast"
|
|
54
|
+
},
|
|
55
|
+
"android": {
|
|
56
|
+
"language": "kotlin",
|
|
57
|
+
"implementationClassName": "HybridCast"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
50
60
|
"DownloadManager": {
|
|
51
61
|
"ios": {
|
|
52
62
|
"language": "swift",
|
|
@@ -36,6 +36,7 @@ target_sources(
|
|
|
36
36
|
../nitrogen/generated/shared/c++/HybridAndroidAutoMediaLibrarySpec.cpp
|
|
37
37
|
../nitrogen/generated/shared/c++/HybridAudioDevicesSpec.cpp
|
|
38
38
|
../nitrogen/generated/shared/c++/HybridAudioRoutePickerSpec.cpp
|
|
39
|
+
../nitrogen/generated/shared/c++/HybridCastSpec.cpp
|
|
39
40
|
../nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp
|
|
40
41
|
../nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp
|
|
41
42
|
../nitrogen/generated/shared/c++/HybridPlayerQueueSpec.cpp
|
|
@@ -43,8 +44,9 @@ target_sources(
|
|
|
43
44
|
# Android-specific Nitrogen C++ sources
|
|
44
45
|
../nitrogen/generated/android/c++/JHybridAndroidAutoMediaLibrarySpec.cpp
|
|
45
46
|
../nitrogen/generated/android/c++/JHybridAudioDevicesSpec.cpp
|
|
46
|
-
../nitrogen/generated/android/c++/
|
|
47
|
+
../nitrogen/generated/android/c++/JHybridCastSpec.cpp
|
|
47
48
|
../nitrogen/generated/android/c++/JVariant_NullType_String.cpp
|
|
49
|
+
../nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp
|
|
48
50
|
../nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp
|
|
49
51
|
../nitrogen/generated/android/c++/JVariant_NullType_Double.cpp
|
|
50
52
|
../nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
#include "JHybridAndroidAutoMediaLibrarySpec.hpp"
|
|
19
19
|
#include "JHybridAudioDevicesSpec.hpp"
|
|
20
|
+
#include "JHybridCastSpec.hpp"
|
|
21
|
+
#include "JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.hpp"
|
|
20
22
|
#include "JHybridDownloadManagerSpec.hpp"
|
|
21
23
|
#include "JFunc_void_DownloadProgress.hpp"
|
|
22
24
|
#include "JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp"
|
|
@@ -77,6 +79,14 @@ struct JHybridAudioDevicesSpecImpl: public jni::JavaClass<JHybridAudioDevicesSpe
|
|
|
77
79
|
return javaPart->getJHybridAudioDevicesSpec();
|
|
78
80
|
}
|
|
79
81
|
};
|
|
82
|
+
struct JHybridCastSpecImpl: public jni::JavaClass<JHybridCastSpecImpl, JHybridCastSpec::JavaPart> {
|
|
83
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/HybridCast;";
|
|
84
|
+
static std::shared_ptr<JHybridCastSpec> create() {
|
|
85
|
+
static const auto constructorFn = javaClassStatic()->getConstructor<JHybridCastSpecImpl::javaobject()>();
|
|
86
|
+
jni::local_ref<JHybridCastSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
|
|
87
|
+
return javaPart->getJHybridCastSpec();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
80
90
|
struct JHybridDownloadManagerSpecImpl: public jni::JavaClass<JHybridDownloadManagerSpecImpl, JHybridDownloadManagerSpec::JavaPart> {
|
|
81
91
|
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/HybridDownloadManager;";
|
|
82
92
|
static std::shared_ptr<JHybridDownloadManagerSpec> create() {
|
|
@@ -101,6 +111,8 @@ void registerAllNatives() {
|
|
|
101
111
|
// Register native JNI methods
|
|
102
112
|
margelo::nitro::nitroplayer::JHybridAndroidAutoMediaLibrarySpec::CxxPart::registerNatives();
|
|
103
113
|
margelo::nitro::nitroplayer::JHybridAudioDevicesSpec::CxxPart::registerNatives();
|
|
114
|
+
margelo::nitro::nitroplayer::JHybridCastSpec::CxxPart::registerNatives();
|
|
115
|
+
margelo::nitro::nitroplayer::JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx::registerNatives();
|
|
104
116
|
margelo::nitro::nitroplayer::JHybridDownloadManagerSpec::CxxPart::registerNatives();
|
|
105
117
|
margelo::nitro::nitroplayer::JFunc_void_DownloadProgress_cxx::registerNatives();
|
|
106
118
|
margelo::nitro::nitroplayer::JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError__cxx::registerNatives();
|
|
@@ -145,6 +157,12 @@ void registerAllNatives() {
|
|
|
145
157
|
return JHybridAudioDevicesSpecImpl::create();
|
|
146
158
|
}
|
|
147
159
|
);
|
|
160
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
161
|
+
"Cast",
|
|
162
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
163
|
+
return JHybridCastSpecImpl::create();
|
|
164
|
+
}
|
|
165
|
+
);
|
|
148
166
|
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
149
167
|
"DownloadManager",
|
|
150
168
|
[]() -> std::shared_ptr<HybridObject> {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JCastState.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <fbjni/fbjni.h>
|
|
11
|
+
#include "CastState.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::nitroplayer {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The C++ JNI bridge between the C++ enum "CastState" and the the Kotlin enum "CastState".
|
|
19
|
+
*/
|
|
20
|
+
struct JCastState final: public jni::JavaClass<JCastState> {
|
|
21
|
+
public:
|
|
22
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/CastState;";
|
|
23
|
+
|
|
24
|
+
public:
|
|
25
|
+
/**
|
|
26
|
+
* Convert this Java/Kotlin-based enum to the C++ enum CastState.
|
|
27
|
+
*/
|
|
28
|
+
[[maybe_unused]]
|
|
29
|
+
[[nodiscard]]
|
|
30
|
+
CastState toCpp() const {
|
|
31
|
+
static const auto clazz = javaClassStatic();
|
|
32
|
+
static const auto fieldOrdinal = clazz->getField<int>("value");
|
|
33
|
+
int ordinal = this->getFieldValue(fieldOrdinal);
|
|
34
|
+
return static_cast<CastState>(ordinal);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public:
|
|
38
|
+
/**
|
|
39
|
+
* Create a Java/Kotlin-based enum with the given C++ enum's value.
|
|
40
|
+
*/
|
|
41
|
+
[[maybe_unused]]
|
|
42
|
+
static jni::alias_ref<JCastState> fromCpp(CastState value) {
|
|
43
|
+
static const auto clazz = javaClassStatic();
|
|
44
|
+
switch (value) {
|
|
45
|
+
case CastState::NO_DEVICES_AVAILABLE:
|
|
46
|
+
static const auto fieldNO_DEVICES_AVAILABLE = clazz->getStaticField<JCastState>("NO_DEVICES_AVAILABLE");
|
|
47
|
+
return clazz->getStaticFieldValue(fieldNO_DEVICES_AVAILABLE);
|
|
48
|
+
case CastState::NOT_CONNECTED:
|
|
49
|
+
static const auto fieldNOT_CONNECTED = clazz->getStaticField<JCastState>("NOT_CONNECTED");
|
|
50
|
+
return clazz->getStaticFieldValue(fieldNOT_CONNECTED);
|
|
51
|
+
case CastState::CONNECTING:
|
|
52
|
+
static const auto fieldCONNECTING = clazz->getStaticField<JCastState>("CONNECTING");
|
|
53
|
+
return clazz->getStaticFieldValue(fieldCONNECTING);
|
|
54
|
+
case CastState::CONNECTED:
|
|
55
|
+
static const auto fieldCONNECTED = clazz->getStaticField<JCastState>("CONNECTED");
|
|
56
|
+
return clazz->getStaticFieldValue(fieldCONNECTED);
|
|
57
|
+
default:
|
|
58
|
+
std::string stringValue = std::to_string(static_cast<int>(value));
|
|
59
|
+
throw std::invalid_argument("Invalid enum value (" + stringValue + "!");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
} // namespace margelo::nitro::nitroplayer
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <fbjni/fbjni.h>
|
|
11
|
+
#include <functional>
|
|
12
|
+
|
|
13
|
+
#include "CastState.hpp"
|
|
14
|
+
#include <NitroModules/Null.hpp>
|
|
15
|
+
#include <string>
|
|
16
|
+
#include <variant>
|
|
17
|
+
#include <optional>
|
|
18
|
+
#include <functional>
|
|
19
|
+
#include <NitroModules/JNICallable.hpp>
|
|
20
|
+
#include "JCastState.hpp"
|
|
21
|
+
#include "JVariant_NullType_String.hpp"
|
|
22
|
+
#include <NitroModules/JNull.hpp>
|
|
23
|
+
|
|
24
|
+
namespace margelo::nitro::nitroplayer {
|
|
25
|
+
|
|
26
|
+
using namespace facebook;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Represents the Java/Kotlin callback `(state: CastState, deviceName: Variant_NullType_String?) -> Unit`.
|
|
30
|
+
* This can be passed around between C++ and Java/Kotlin.
|
|
31
|
+
*/
|
|
32
|
+
struct JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__: public jni::JavaClass<JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__> {
|
|
33
|
+
public:
|
|
34
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/Func_void_CastState_std__optional_std__variant_nitro__NullType__std__string__;";
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
/**
|
|
38
|
+
* Invokes the function this `JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__` instance holds through JNI.
|
|
39
|
+
*/
|
|
40
|
+
void invoke(CastState state, const std::optional<std::variant<nitro::NullType, std::string>>& deviceName) const {
|
|
41
|
+
static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<JCastState> /* state */, jni::alias_ref<JVariant_NullType_String> /* deviceName */)>("invoke");
|
|
42
|
+
method(self(), JCastState::fromCpp(state), deviceName.has_value() ? JVariant_NullType_String::fromCpp(deviceName.value()) : nullptr);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* An implementation of Func_void_CastState_std__optional_std__variant_nitro__NullType__std__string__ that is backed by a C++ implementation (using `std::function<...>`)
|
|
48
|
+
*/
|
|
49
|
+
class JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx final: public jni::HybridClass<JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx, JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__> {
|
|
50
|
+
public:
|
|
51
|
+
static jni::local_ref<JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__::javaobject> fromCpp(const std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)>& func) {
|
|
52
|
+
return JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx::newObjectCxxArgs(func);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public:
|
|
56
|
+
/**
|
|
57
|
+
* Invokes the C++ `std::function<...>` this `JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx` instance holds.
|
|
58
|
+
*/
|
|
59
|
+
void invoke_cxx(jni::alias_ref<JCastState> state, jni::alias_ref<JVariant_NullType_String> deviceName) {
|
|
60
|
+
_func(state->toCpp(), deviceName != nullptr ? std::make_optional(deviceName->toCpp()) : std::nullopt);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public:
|
|
64
|
+
[[nodiscard]]
|
|
65
|
+
inline const std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)>& getFunction() const {
|
|
66
|
+
return _func;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public:
|
|
70
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/Func_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx;";
|
|
71
|
+
static void registerNatives() {
|
|
72
|
+
registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx::invoke_cxx)});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private:
|
|
76
|
+
explicit JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx(const std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)>& func): _func(func) { }
|
|
77
|
+
|
|
78
|
+
private:
|
|
79
|
+
friend HybridBase;
|
|
80
|
+
std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)> _func;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
} // namespace margelo::nitro::nitroplayer
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridCastSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "JHybridCastSpec.hpp"
|
|
9
|
+
|
|
10
|
+
// Forward declaration of `CastState` to properly resolve imports.
|
|
11
|
+
namespace margelo::nitro::nitroplayer { enum class CastState; }
|
|
12
|
+
|
|
13
|
+
#include <NitroModules/Promise.hpp>
|
|
14
|
+
#include <NitroModules/JPromise.hpp>
|
|
15
|
+
#include <NitroModules/JUnit.hpp>
|
|
16
|
+
#include "CastState.hpp"
|
|
17
|
+
#include "JCastState.hpp"
|
|
18
|
+
#include <NitroModules/Null.hpp>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <variant>
|
|
21
|
+
#include "JVariant_NullType_String.hpp"
|
|
22
|
+
#include <NitroModules/JNull.hpp>
|
|
23
|
+
#include <optional>
|
|
24
|
+
#include <functional>
|
|
25
|
+
#include "JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__.hpp"
|
|
26
|
+
#include <NitroModules/JNICallable.hpp>
|
|
27
|
+
|
|
28
|
+
namespace margelo::nitro::nitroplayer {
|
|
29
|
+
|
|
30
|
+
std::shared_ptr<JHybridCastSpec> JHybridCastSpec::JavaPart::getJHybridCastSpec() {
|
|
31
|
+
auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
|
|
32
|
+
auto castHybridObject = std::dynamic_pointer_cast<JHybridCastSpec>(hybridObject);
|
|
33
|
+
if (castHybridObject == nullptr) [[unlikely]] {
|
|
34
|
+
throw std::runtime_error("Failed to downcast JHybridObject to JHybridCastSpec!");
|
|
35
|
+
}
|
|
36
|
+
return castHybridObject;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
jni::local_ref<JHybridCastSpec::CxxPart::jhybriddata> JHybridCastSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
40
|
+
return makeCxxInstance(jThis);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
std::shared_ptr<JHybridObject> JHybridCastSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
|
|
44
|
+
auto castJavaPart = jni::dynamic_ref_cast<JHybridCastSpec::JavaPart>(javaPart);
|
|
45
|
+
if (castJavaPart == nullptr) [[unlikely]] {
|
|
46
|
+
throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridCastSpec::JavaPart!");
|
|
47
|
+
}
|
|
48
|
+
return std::make_shared<JHybridCastSpec>(castJavaPart);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void JHybridCastSpec::CxxPart::registerNatives() {
|
|
52
|
+
registerHybrid({
|
|
53
|
+
makeNativeMethod("initHybrid", JHybridCastSpec::CxxPart::initHybrid),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Properties
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
// Methods
|
|
61
|
+
std::shared_ptr<Promise<void>> JHybridCastSpec::configure(const std::optional<std::string>& receiverApplicationId) {
|
|
62
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* receiverApplicationId */)>("configure");
|
|
63
|
+
auto __result = method(_javaPart, receiverApplicationId.has_value() ? jni::make_jstring(receiverApplicationId.value()) : nullptr);
|
|
64
|
+
return [&]() {
|
|
65
|
+
auto __promise = Promise<void>::create();
|
|
66
|
+
__result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
|
|
67
|
+
__promise->resolve();
|
|
68
|
+
});
|
|
69
|
+
__result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
|
|
70
|
+
jni::JniException __jniError(__throwable);
|
|
71
|
+
__promise->reject(std::make_exception_ptr(__jniError));
|
|
72
|
+
});
|
|
73
|
+
return __promise;
|
|
74
|
+
}();
|
|
75
|
+
}
|
|
76
|
+
bool JHybridCastSpec::isCasting() {
|
|
77
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isCasting");
|
|
78
|
+
auto __result = method(_javaPart);
|
|
79
|
+
return static_cast<bool>(__result);
|
|
80
|
+
}
|
|
81
|
+
CastState JHybridCastSpec::getCastState() {
|
|
82
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JCastState>()>("getCastState");
|
|
83
|
+
auto __result = method(_javaPart);
|
|
84
|
+
return __result->toCpp();
|
|
85
|
+
}
|
|
86
|
+
std::variant<nitro::NullType, std::string> JHybridCastSpec::getCastDeviceName() {
|
|
87
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JVariant_NullType_String>()>("getCastDeviceName");
|
|
88
|
+
auto __result = method(_javaPart);
|
|
89
|
+
return __result->toCpp();
|
|
90
|
+
}
|
|
91
|
+
void JHybridCastSpec::showCastPicker() {
|
|
92
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("showCastPicker");
|
|
93
|
+
method(_javaPart);
|
|
94
|
+
}
|
|
95
|
+
std::shared_ptr<Promise<void>> JHybridCastSpec::endCastSession() {
|
|
96
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("endCastSession");
|
|
97
|
+
auto __result = method(_javaPart);
|
|
98
|
+
return [&]() {
|
|
99
|
+
auto __promise = Promise<void>::create();
|
|
100
|
+
__result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
|
|
101
|
+
__promise->resolve();
|
|
102
|
+
});
|
|
103
|
+
__result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
|
|
104
|
+
jni::JniException __jniError(__throwable);
|
|
105
|
+
__promise->reject(std::make_exception_ptr(__jniError));
|
|
106
|
+
});
|
|
107
|
+
return __promise;
|
|
108
|
+
}();
|
|
109
|
+
}
|
|
110
|
+
void JHybridCastSpec::onCastStateChange(const std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)>& callback) {
|
|
111
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string__::javaobject> /* callback */)>("onCastStateChange_cxx");
|
|
112
|
+
method(_javaPart, JFunc_void_CastState_std__optional_std__variant_nitro__NullType__std__string___cxx::fromCpp(callback));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
} // namespace margelo::nitro::nitroplayer
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridCastSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <NitroModules/JHybridObject.hpp>
|
|
11
|
+
#include <fbjni/fbjni.h>
|
|
12
|
+
#include "HybridCastSpec.hpp"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
namespace margelo::nitro::nitroplayer {
|
|
18
|
+
|
|
19
|
+
using namespace facebook;
|
|
20
|
+
|
|
21
|
+
class JHybridCastSpec: public virtual HybridCastSpec, public virtual JHybridObject {
|
|
22
|
+
public:
|
|
23
|
+
struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
|
|
24
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/HybridCastSpec;";
|
|
25
|
+
std::shared_ptr<JHybridCastSpec> getJHybridCastSpec();
|
|
26
|
+
};
|
|
27
|
+
struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
|
|
28
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitroplayer/HybridCastSpec$CxxPart;";
|
|
29
|
+
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
|
|
30
|
+
static void registerNatives();
|
|
31
|
+
using HybridBase::HybridBase;
|
|
32
|
+
protected:
|
|
33
|
+
std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
explicit JHybridCastSpec(const jni::local_ref<JHybridCastSpec::JavaPart>& javaPart):
|
|
38
|
+
HybridObject(HybridCastSpec::TAG),
|
|
39
|
+
JHybridObject(javaPart),
|
|
40
|
+
_javaPart(jni::make_global(javaPart)) {}
|
|
41
|
+
~JHybridCastSpec() override {
|
|
42
|
+
// Hermes GC can destroy JS objects on a non-JNI Thread.
|
|
43
|
+
jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public:
|
|
47
|
+
inline const jni::global_ref<JHybridCastSpec::JavaPart>& getJavaPart() const noexcept {
|
|
48
|
+
return _javaPart;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
// Properties
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
public:
|
|
56
|
+
// Methods
|
|
57
|
+
std::shared_ptr<Promise<void>> configure(const std::optional<std::string>& receiverApplicationId) override;
|
|
58
|
+
bool isCasting() override;
|
|
59
|
+
CastState getCastState() override;
|
|
60
|
+
std::variant<nitro::NullType, std::string> getCastDeviceName() override;
|
|
61
|
+
void showCastPicker() override;
|
|
62
|
+
std::shared_ptr<Promise<void>> endCastSession() override;
|
|
63
|
+
void onCastStateChange(const std::function<void(CastState /* state */, const std::optional<std::variant<nitro::NullType, std::string>>& /* deviceName */)>& callback) override;
|
|
64
|
+
|
|
65
|
+
private:
|
|
66
|
+
jni::global_ref<JHybridCastSpec::JavaPart> _javaPart;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
} // namespace margelo::nitro::nitroplayer
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// CastState.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.nitroplayer
|
|
9
|
+
|
|
10
|
+
import androidx.annotation.Keep
|
|
11
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Represents the JavaScript enum/union "CastState".
|
|
15
|
+
*/
|
|
16
|
+
@DoNotStrip
|
|
17
|
+
@Keep
|
|
18
|
+
enum class CastState(@DoNotStrip @Keep val value: Int) {
|
|
19
|
+
NO_DEVICES_AVAILABLE(0),
|
|
20
|
+
NOT_CONNECTED(1),
|
|
21
|
+
CONNECTING(2),
|
|
22
|
+
CONNECTED(3);
|
|
23
|
+
|
|
24
|
+
companion object
|
|
25
|
+
}
|