react-native-tpstreams 0.1.8 → 0.1.9
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/LICENSE +20 -20
- package/README.md +427 -150
- package/Tpstreams.podspec +42 -42
- package/android/build.gradle +122 -122
- package/android/gradle.properties +5 -5
- package/android/src/main/AndroidManifest.xml +4 -4
- package/android/src/main/AndroidManifestNew.xml +2 -2
- package/android/src/main/java/com/tpstreams/FragmentModule.kt +190 -190
- package/android/src/main/java/com/tpstreams/PlayerFragment.kt +210 -210
- package/android/src/main/java/com/tpstreams/TpStreamsPlayerView.kt +79 -79
- package/android/src/main/java/com/tpstreams/TpStreamsPlayerViewManager.kt +40 -40
- package/android/src/main/java/com/tpstreams/TpstreamsModule.kt +161 -161
- package/android/src/main/java/com/tpstreams/TpstreamsPackage.kt +16 -16
- package/android/src/main/res/layout/fragment_player.xml +28 -28
- package/android/src/main/res/xml/network_security_config.xml +7 -7
- package/ios/Tpstreams.h +6 -6
- package/ios/Tpstreams.mm +18 -18
- package/lib/commonjs/NativeTpstreams.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/NativeTpstreams.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/package.json +203 -203
- package/android/libs/extracted-aar/META-INF/com/android/build/gradle/aar-metadata.properties +0 -4
package/LICENSE
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Bharath
|
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
-
in the Software without restriction, including without limitation the rights
|
|
7
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
-
furnished to do so, subject to the following conditions:
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in all
|
|
12
|
-
copies or substantial portions of the Software.
|
|
13
|
-
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Bharath
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,150 +1,427 @@
|
|
|
1
|
-
# react-native-tpstreams
|
|
2
|
-
|
|
3
|
-
Video Component for TPStreams
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
npm install react-native-tpstreams
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
export default App;
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
The player component accepts the following props:
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
Starts video playback
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
1
|
+
# react-native-tpstreams
|
|
2
|
+
|
|
3
|
+
Video Component for TPStreams
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install react-native-tpstreams
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Initializing TPStreams SDK
|
|
12
|
+
|
|
13
|
+
First, import the package:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import { NativeModules } from 'react-native';
|
|
17
|
+
const { Tpstreams } = NativeModules;
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Next, initialize the SDK with your organization ID:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
Tpstreams.initializeTPSPlayer("YOUR_ORGANIZATION_ID");
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Make sure to replace `YOUR_ORGANIZATION_ID` with your actual organization ID. This should be called at the entry point of your application to ensure proper initialization.
|
|
27
|
+
|
|
28
|
+
## Play a Video
|
|
29
|
+
|
|
30
|
+
To play a video using the TPStreams Player SDK, use the `TpStreamsPlayerView` component:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
import React, { useState } from 'react';
|
|
34
|
+
import { View, StyleSheet } from 'react-native';
|
|
35
|
+
import TpStreamsPlayerView from 'react-native-tpstreams';
|
|
36
|
+
|
|
37
|
+
const App = () => {
|
|
38
|
+
const [playerProps] = useState({
|
|
39
|
+
videoId: 'ASSET_ID',
|
|
40
|
+
accessToken: 'ACCESS_TOKEN',
|
|
41
|
+
enableDownload: false,
|
|
42
|
+
autoPlay: true,
|
|
43
|
+
style: { width: '100%', height: 300 },
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<View style={styles.container}>
|
|
48
|
+
<TpStreamsPlayerView {...playerProps} />
|
|
49
|
+
</View>
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const styles = StyleSheet.create({
|
|
54
|
+
container: {
|
|
55
|
+
flex: 1,
|
|
56
|
+
justifyContent: 'center',
|
|
57
|
+
alignItems: 'center',
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export default App;
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Replace `ASSET_ID` and `ACCESS_TOKEN` with the actual assetId and accessToken of the video you wish to play.
|
|
65
|
+
|
|
66
|
+
## Player Props
|
|
67
|
+
The player component accepts the following props:
|
|
68
|
+
|
|
69
|
+
| Prop | Type | Required | Default | Description |
|
|
70
|
+
|----------------|---------|----------|---------------------------------|------------------------------------------------|
|
|
71
|
+
| `videoId` | string | Yes | - | The unique identifier of the video asset. |
|
|
72
|
+
| `accessToken` | string | Yes | - | The authentication token required to access the video. |
|
|
73
|
+
| `enableDownload` | boolean | No | `true` | Enables or disables video download. |
|
|
74
|
+
| `autoPlay` | boolean | No | `true` | Controls whether the video should start playing automatically. |
|
|
75
|
+
| `style` | object | No | `{ width: '100%', height: 300 }` | Defines the player’s width and height. |
|
|
76
|
+
|
|
77
|
+
# Player Methods
|
|
78
|
+
|
|
79
|
+
To use the `Tpstreams` module, first import `NativeModules` from `react-native` and get the `Tpstreams` instance:
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
import { NativeModules } from 'react-native';
|
|
83
|
+
const { Tpstreams } = NativeModules;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The `Tpstreams` module provides several methods to control video playback and manage player states. Below is a detailed explanation of each method:
|
|
87
|
+
|
|
88
|
+
## Play
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
Tpstreams.play();
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Starts video playback. Call this method when you want the video to start playing or resume after being paused.
|
|
95
|
+
|
|
96
|
+
## Pause
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
Tpstreams.pause();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Pauses video playback, allowing it to be resumed later from the same position.
|
|
103
|
+
|
|
104
|
+
## Seek To
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
Tpstreams.seekTo(position: number);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Seeks to a specific position in the video (in milliseconds).
|
|
111
|
+
|
|
112
|
+
**Example Usage:**
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
Tpstreams.seekTo(10000); // Jump to the 10-second mark
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Get Current Time
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
Tpstreams.getCurrentTime().then(console.log);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Gets the current playback position of the video (in milliseconds). Returns a promise that resolves with the current time.
|
|
125
|
+
|
|
126
|
+
## Get Duration
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
Tpstreams.getDuration().then(console.log);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Retrieves the total duration of the currently loaded video (in milliseconds). Returns a promise that resolves with the total duration.
|
|
133
|
+
|
|
134
|
+
## Get Buffered Time
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
Tpstreams.getBufferedTime().then(console.log);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Gets the amount of video data that has been buffered (in milliseconds). Returns a promise that resolves with the buffered time.
|
|
141
|
+
|
|
142
|
+
## Get Playback State
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
Tpstreams.getPlaybackState().then(console.log);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Gets the current playback state of the player (e.g., `playing`, `paused`, `buffering`). Returns a promise that resolves with the state.
|
|
149
|
+
|
|
150
|
+
## Get Play When Ready
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
Tpstreams.getPlayWhenReady().then(console.log);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Checks if the player is set to start playback automatically. Returns a promise that resolves with a boolean value.
|
|
157
|
+
|
|
158
|
+
## Set Play When Ready
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
Tpstreams.setPlayWhenReady(true); // Enable autoplay
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Controls whether the player should start playback automatically when loaded.
|
|
165
|
+
|
|
166
|
+
## Get Playback Speed
|
|
167
|
+
|
|
168
|
+
```js
|
|
169
|
+
Tpstreams.getPlaybackSpeed().then(console.log);
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Gets the current playback speed of the video. Returns a promise that resolves with the speed value.
|
|
173
|
+
|
|
174
|
+
## Set Playback Speed
|
|
175
|
+
|
|
176
|
+
```js
|
|
177
|
+
Tpstreams.setPlaybackSpeed(1.5); // Play at 1.5x speed
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Changes the playback speed of the video.
|
|
181
|
+
|
|
182
|
+
## Release
|
|
183
|
+
|
|
184
|
+
```js
|
|
185
|
+
Tpstreams.release();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Releases the player resources, stopping playback and hiding the player UI. Once called, the player cannot be used again unless reinitialized.
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
# Player Events
|
|
192
|
+
|
|
193
|
+
`Tpstreams` provides event listeners to handle various player events. Below are the available events and how to use them:
|
|
194
|
+
|
|
195
|
+
## Listening to Events
|
|
196
|
+
|
|
197
|
+
To subscribe to player events, use the `NativeEventEmitter` from `react-native` with `TpstreamsModule`:
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
201
|
+
|
|
202
|
+
const { Tpstreams } = NativeModules;
|
|
203
|
+
const eventEmitter = new NativeEventEmitter(Tpstreams);
|
|
204
|
+
|
|
205
|
+
const subscription = eventEmitter.addListener('onPlaybackStateChanged', (state) => {
|
|
206
|
+
console.log('Playback State Changed:', state);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Remember to remove the listener when unmounting
|
|
210
|
+
subscription.remove();
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Available Events
|
|
214
|
+
|
|
215
|
+
### onPlaybackStateChanged
|
|
216
|
+
Triggered when the playback state changes.
|
|
217
|
+
|
|
218
|
+
```js
|
|
219
|
+
eventEmitter.addListener('onPlaybackStateChanged', (state) => {
|
|
220
|
+
console.log('Playback State:', state);
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### onAccessTokenExpired
|
|
225
|
+
Triggered when the access token expires (requires refresh).
|
|
226
|
+
|
|
227
|
+
```js
|
|
228
|
+
eventEmitter.addListener('onAccessTokenExpired', () => {
|
|
229
|
+
console.log('Access token expired, please refresh.');
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### onMarkerCallback
|
|
234
|
+
Triggered when a marker (timestamp) is reached during playback.
|
|
235
|
+
|
|
236
|
+
```js
|
|
237
|
+
eventEmitter.addListener('onMarkerCallback', (marker) => {
|
|
238
|
+
console.log('Marker reached:', marker);
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### onDeviceInfoChanged
|
|
243
|
+
Triggered when the device information changes.
|
|
244
|
+
|
|
245
|
+
```js
|
|
246
|
+
eventEmitter.addListener('onDeviceInfoChanged', (info) => {
|
|
247
|
+
console.log('Device info changed:', info);
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### onFullScreenChanged
|
|
252
|
+
Triggered when the fullscreen mode changes.
|
|
253
|
+
|
|
254
|
+
```js
|
|
255
|
+
eventEmitter.addListener('onFullScreenChanged', (isFullscreen) => {
|
|
256
|
+
console.log('Fullscreen mode:', isFullscreen);
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### onIsLoadingChanged
|
|
261
|
+
Triggered when the player’s loading state changes.
|
|
262
|
+
|
|
263
|
+
```js
|
|
264
|
+
eventEmitter.addListener('onIsLoadingChanged', (isLoading) => {
|
|
265
|
+
console.log('Loading state changed:', isLoading);
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### onIsPlayingChanged
|
|
270
|
+
Triggered when the player’s playing state changes.
|
|
271
|
+
|
|
272
|
+
```js
|
|
273
|
+
eventEmitter.addListener('onIsPlayingChanged', (isPlaying) => {
|
|
274
|
+
console.log('Playing state:', isPlaying);
|
|
275
|
+
});
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### onPlayerError
|
|
279
|
+
Triggered when the player encounters an error.
|
|
280
|
+
|
|
281
|
+
```js
|
|
282
|
+
eventEmitter.addListener('onPlayerError', (error) => {
|
|
283
|
+
console.log('Player Error:', error);
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### onSeekBackIncrementChanged
|
|
288
|
+
Triggered when the seek-back increment value changes.
|
|
289
|
+
|
|
290
|
+
```js
|
|
291
|
+
eventEmitter.addListener('onSeekBackIncrementChanged', (value) => {
|
|
292
|
+
console.log('Seek back increment changed:', value);
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### onSeekForwardIncrementChanged
|
|
297
|
+
Triggered when the seek-forward increment value changes.
|
|
298
|
+
|
|
299
|
+
```js
|
|
300
|
+
eventEmitter.addListener('onSeekForwardIncrementChanged', (value) => {
|
|
301
|
+
console.log('Seek forward increment changed:', value);
|
|
302
|
+
});
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### onTimelineChanged
|
|
306
|
+
Triggered when the timeline of the player changes.
|
|
307
|
+
|
|
308
|
+
```js
|
|
309
|
+
eventEmitter.addListener('onTimelineChanged', (timeline) => {
|
|
310
|
+
console.log('Timeline changed:', timeline);
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### onTracksChanged
|
|
315
|
+
Triggered when the available tracks change (e.g., audio/video/subtitles).
|
|
316
|
+
|
|
317
|
+
```js
|
|
318
|
+
eventEmitter.addListener('onTracksChanged', (tracks) => {
|
|
319
|
+
console.log('Tracks changed:', tracks);
|
|
320
|
+
});
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
# Download Module
|
|
324
|
+
|
|
325
|
+
The `Download Module` in `Tpstreams` allows users to manage offline video downloads efficiently. This includes observing download progress, pausing, resuming, canceling, and deleting downloads.
|
|
326
|
+
|
|
327
|
+
## Observing Download Data
|
|
328
|
+
|
|
329
|
+
To start observing the download data, call the `observeDownloadData` method from `FragmentModule`.
|
|
330
|
+
|
|
331
|
+
```js
|
|
332
|
+
import { NativeModules, DeviceEventEmitter } from 'react-native';
|
|
333
|
+
|
|
334
|
+
const { FragmentModule } = NativeModules;
|
|
335
|
+
FragmentModule.observeDownloadData();
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Once initialized, the module will emit events whenever the download data changes.
|
|
339
|
+
|
|
340
|
+
## Listening to Download Events
|
|
341
|
+
|
|
342
|
+
To listen for download state changes, use `DeviceEventEmitter`:
|
|
343
|
+
|
|
344
|
+
```js
|
|
345
|
+
const subscription = DeviceEventEmitter.addListener(
|
|
346
|
+
'onDownloadDataChanged',
|
|
347
|
+
(event) => {
|
|
348
|
+
console.log('Download data updated:', event.assets);
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
// Remember to remove the listener when unmounting
|
|
353
|
+
subscription.remove();
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Managing Downloads
|
|
357
|
+
|
|
358
|
+
### Pause Download
|
|
359
|
+
Pauses an active download.
|
|
360
|
+
|
|
361
|
+
```js
|
|
362
|
+
FragmentModule.pauseDownload(videoId);
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Resume Download
|
|
366
|
+
Resumes a paused download.
|
|
367
|
+
|
|
368
|
+
```js
|
|
369
|
+
FragmentModule.resumeDownload(videoId);
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Cancel Download
|
|
373
|
+
Cancels an ongoing download.
|
|
374
|
+
|
|
375
|
+
```js
|
|
376
|
+
FragmentModule.cancelDownload(videoId);
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Delete Download
|
|
380
|
+
Deletes a completed download from storage.
|
|
381
|
+
|
|
382
|
+
```js
|
|
383
|
+
FragmentModule.deleteDownload(videoId);
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Rendering a Download List
|
|
387
|
+
|
|
388
|
+
Below is a sample implementation of a download list UI using `FlatList` in React Native:
|
|
389
|
+
|
|
390
|
+
```js
|
|
391
|
+
import React, { useState, useEffect } from 'react';
|
|
392
|
+
import { SafeAreaView, Text, FlatList, View, Button, DeviceEventEmitter } from 'react-native';
|
|
393
|
+
import { NativeModules } from 'react-native';
|
|
394
|
+
|
|
395
|
+
const { FragmentModule } = NativeModules;
|
|
396
|
+
|
|
397
|
+
const DownloadListScreen = () => {
|
|
398
|
+
const [downloads, setDownloads] = useState([]);
|
|
399
|
+
|
|
400
|
+
useEffect(() => {
|
|
401
|
+
FragmentModule.observeDownloadData();
|
|
402
|
+
const subscription = DeviceEventEmitter.addListener('onDownloadDataChanged', (event) => {
|
|
403
|
+
setDownloads(event.assets);
|
|
404
|
+
});
|
|
405
|
+
return () => subscription.remove();
|
|
406
|
+
}, []);
|
|
407
|
+
|
|
408
|
+
const renderItem = ({ item }) => (
|
|
409
|
+
<View>
|
|
410
|
+
<Text>{item.title} - {item.percentage}%</Text>
|
|
411
|
+
{item.status === 'DOWNLOADING' && <Button title="Pause" onPress={() => FragmentModule.pauseDownload(item.videoId)} />}
|
|
412
|
+
{item.status === 'COMPLETE' && <Button title="Delete" onPress={() => FragmentModule.deleteDownload(item.videoId)} />}
|
|
413
|
+
{item.status === 'PAUSED' && <Button title="Resume" onPress={() => FragmentModule.resumeDownload(item.videoId)} />}
|
|
414
|
+
</View>
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
return (
|
|
418
|
+
<SafeAreaView>
|
|
419
|
+
<FlatList data={downloads} keyExtractor={(item) => item.videoId} renderItem={renderItem} />
|
|
420
|
+
</SafeAreaView>
|
|
421
|
+
);
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
export default DownloadListScreen;
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
This component observes download events and dynamically updates the list with buttons for user interactions.
|