@applicaster/quick-brick-player 12.0.0-alpha.5895113034 → 12.0.0-alpha.5933014273
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/quick-brick-player",
|
|
3
|
-
"version": "12.0.0-alpha.
|
|
3
|
+
"version": "12.0.0-alpha.5933014273",
|
|
4
4
|
"description": "Quick Brick Player",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
},
|
|
37
37
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@applicaster/quick-brick-mobile-transport-controls": "12.0.0-rc.
|
|
40
|
-
"@applicaster/quick-brick-tv-transport-controls": "12.0.0-
|
|
41
|
-
"@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.
|
|
42
|
-
"@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.
|
|
43
|
-
"@applicaster/zapp-react-native-utils": "12.0.0-alpha.
|
|
39
|
+
"@applicaster/quick-brick-mobile-transport-controls": "12.0.0-rc.118",
|
|
40
|
+
"@applicaster/quick-brick-tv-transport-controls": "12.0.0-rc.112",
|
|
41
|
+
"@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.5933014273",
|
|
42
|
+
"@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.5933014273",
|
|
43
|
+
"@applicaster/zapp-react-native-utils": "12.0.0-alpha.5933014273",
|
|
44
44
|
"keymirror": "^0.1.1",
|
|
45
45
|
"query-string": "7.1.3",
|
|
46
46
|
"react-native-web-linear-gradient": "1.1.2",
|
|
@@ -10,66 +10,76 @@ type Asset = string | undefined;
|
|
|
10
10
|
const isCurrentPlayer = (playerId) =>
|
|
11
11
|
LiveImageManager.instance.getCurrentlyPlaying()?.playerId === playerId;
|
|
12
12
|
|
|
13
|
+
const liveImageButtonsListenerKey = "live-image-buttons";
|
|
14
|
+
|
|
13
15
|
const usePlayPauseListeners = (playerId, player, asset, setImageUri) =>
|
|
14
16
|
useEffect(() => {
|
|
15
17
|
if (playerId && player) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
setImageUri(null);
|
|
19
|
+
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (player.playerState.isReadyToPlay) {
|
|
24
|
+
if (player.playerState.isPaused) {
|
|
25
|
+
setImageUri(asset.active);
|
|
26
|
+
} else {
|
|
27
|
+
setImageUri(asset.inactive);
|
|
22
28
|
}
|
|
29
|
+
}
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
onPlayerPause: () => {
|
|
31
|
-
setImageUri(asset.active);
|
|
32
|
-
},
|
|
33
|
-
onPlayerClose: () => {
|
|
34
|
-
setImageUri(null);
|
|
35
|
-
},
|
|
36
|
-
onLoad() {
|
|
37
|
-
setImageUri(asset.inactive);
|
|
38
|
-
},
|
|
31
|
+
return player.addListener({
|
|
32
|
+
id: liveImageButtonsListenerKey,
|
|
33
|
+
listener: {
|
|
34
|
+
onPlayerResume: () => {
|
|
35
|
+
setImageUri(asset.inactive);
|
|
39
36
|
},
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
onPlayerPause: () => {
|
|
38
|
+
setImageUri(asset.active);
|
|
39
|
+
},
|
|
40
|
+
onPlayerClose: () => {
|
|
41
|
+
setImageUri(null);
|
|
42
|
+
},
|
|
43
|
+
onLoad() {
|
|
44
|
+
setImageUri(asset.inactive);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
42
48
|
}, [player, playerId, asset]);
|
|
43
49
|
|
|
44
50
|
const useMuteUnmuteListeners = (playerId, player, asset, setImageUri) =>
|
|
45
51
|
useEffect(() => {
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
listener: {
|
|
51
|
-
onPlayerMute: () => {
|
|
52
|
-
if (isCurrentPlayer(playerId)) {
|
|
53
|
-
setImageUri(asset.active);
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
onPlayerUnmute: () => {
|
|
57
|
-
if (isCurrentPlayer(playerId)) {
|
|
58
|
-
setImageUri(asset.inactive);
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
onLoad() {
|
|
62
|
-
setImageUri(player?.getIsMuted() ? asset.active : asset.inactive);
|
|
63
|
-
},
|
|
64
|
-
onPlayerClose: () => {
|
|
65
|
-
setImageUri(null);
|
|
66
|
-
},
|
|
67
|
-
onVideoEnd: () => {
|
|
68
|
-
setImageUri(null);
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
});
|
|
52
|
+
if (!player || !playerId) {
|
|
53
|
+
setImageUri(null);
|
|
54
|
+
|
|
55
|
+
return;
|
|
72
56
|
}
|
|
57
|
+
|
|
58
|
+
// active action = muted, inactive = unmuted
|
|
59
|
+
return player.addListener({
|
|
60
|
+
id: liveImageButtonsListenerKey,
|
|
61
|
+
listener: {
|
|
62
|
+
onPlayerMute: () => {
|
|
63
|
+
if (isCurrentPlayer(playerId)) {
|
|
64
|
+
setImageUri(asset.active);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
onPlayerUnmute: () => {
|
|
68
|
+
if (isCurrentPlayer(playerId)) {
|
|
69
|
+
setImageUri(asset.inactive);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
onLoad() {
|
|
73
|
+
setImageUri(player?.getIsMuted() ? asset.active : asset.inactive);
|
|
74
|
+
},
|
|
75
|
+
onPlayerClose: () => {
|
|
76
|
+
setImageUri(null);
|
|
77
|
+
},
|
|
78
|
+
onVideoEnd: () => {
|
|
79
|
+
setImageUri(null);
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
});
|
|
73
83
|
}, [player, playerId, asset]);
|
|
74
84
|
|
|
75
85
|
const useListeners = MUTED_USAGE
|
|
@@ -21,7 +21,7 @@ const playActionCallback = (player) => {
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
const invokeAction = () => {
|
|
24
|
+
const invokeAction = (_item: ZappEntry, _object) => {
|
|
25
25
|
const actionCallback = MUTED_USAGE ? muteActionCallback : playActionCallback;
|
|
26
26
|
// We only allow one player to be present at a time
|
|
27
27
|
const player = LiveImageManager.instance.getCurrentlyPlaying()?.player;
|
|
@@ -29,6 +29,54 @@ const invokeAction = () => {
|
|
|
29
29
|
actionCallback(player);
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
// Not exported because currently the is no way
|
|
33
|
+
// to subscribe to the action availability change.
|
|
34
|
+
// We currently return a null state to disable the action.
|
|
35
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
36
|
+
const isActionAvailable = (item: ZappEntry) => {
|
|
37
|
+
return (
|
|
38
|
+
LiveImageManager.instance.getCurrentlyPlaying()?.getPlayer().entry.id ===
|
|
39
|
+
item.id
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const addListener = (
|
|
44
|
+
entryId: string,
|
|
45
|
+
listener: CellActionStateListenerFunction
|
|
46
|
+
) => {
|
|
47
|
+
const callback = (event: Record<string, any>) => {
|
|
48
|
+
if (event.entry?.id !== entryId) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const player = LiveImageManager.instance.getCurrentlyPlaying()?.getPlayer();
|
|
53
|
+
|
|
54
|
+
if (!player || player.entry?.id !== entryId) {
|
|
55
|
+
listener(null);
|
|
56
|
+
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const actionState = MUTED_USAGE ? player.getIsMuted() : player.isPaused();
|
|
61
|
+
|
|
62
|
+
listener({
|
|
63
|
+
state: actionState ? 1 : 0,
|
|
64
|
+
label: "",
|
|
65
|
+
asset: AssetComponent,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return LiveImageManager.instance.addListener({
|
|
70
|
+
id: `cell-player-${entryId}`,
|
|
71
|
+
listener: {
|
|
72
|
+
onEnd: callback,
|
|
73
|
+
onStart: callback,
|
|
74
|
+
onError: callback,
|
|
75
|
+
onDestroy: callback,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
|
|
32
80
|
const emptyState = [];
|
|
33
81
|
|
|
34
82
|
const initialEntryState = () => ({
|
|
@@ -46,6 +94,7 @@ export function ContextProvider(Component: ReactComponent<any>) {
|
|
|
46
94
|
state: emptyState,
|
|
47
95
|
invokeAction,
|
|
48
96
|
initialEntryState,
|
|
97
|
+
addListener,
|
|
49
98
|
}),
|
|
50
99
|
[invokeAction, initialEntryState]
|
|
51
100
|
);
|
|
@@ -388,6 +388,7 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
|
|
|
388
388
|
<AnimationComponent
|
|
389
389
|
animationType={ComponentAnimationType.moveUpComponent}
|
|
390
390
|
additionalData={{ saveArea: true }}
|
|
391
|
+
style={Styles.playerContainer}
|
|
391
392
|
>
|
|
392
393
|
<AnimatedScrollModal>
|
|
393
394
|
<View style={Styles.playerContainer} onLayout={onLayout}>
|
|
@@ -117,7 +117,6 @@ const playerDimensionsStyle = (
|
|
|
117
117
|
});
|
|
118
118
|
|
|
119
119
|
const animatedContainerStyle = (docked: boolean): ViewStyle => ({
|
|
120
|
-
top: docked ? 2 : null,
|
|
121
120
|
position: "absolute",
|
|
122
121
|
width: "100%",
|
|
123
122
|
zIndex: docked ? 1 : -1,
|
|
@@ -245,17 +244,19 @@ export default function DockedLayout(props: LayoutProps) {
|
|
|
245
244
|
animatedContainerStyle(isActiveGesture || layoutState.docked),
|
|
246
245
|
]}
|
|
247
246
|
>
|
|
248
|
-
{!playerState.isLive &&
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
247
|
+
{!playerState.isLive &&
|
|
248
|
+
(layoutState.docked || startComponentsAnimation) && (
|
|
249
|
+
<ProgressBar
|
|
250
|
+
content={entry}
|
|
251
|
+
value={value}
|
|
252
|
+
visible={visible}
|
|
253
|
+
layoutState={layoutState}
|
|
254
|
+
onPlayerSeek={onPlayerSeek}
|
|
255
|
+
playerState={playerState}
|
|
256
|
+
startComponentsAnimation={startComponentsAnimation}
|
|
257
|
+
docked
|
|
258
|
+
/>
|
|
259
|
+
)}
|
|
259
260
|
|
|
260
261
|
<View style={styles.content}>
|
|
261
262
|
<View
|
package/src/Player/index.tsx
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import React from "react";
|
|
5
5
|
import * as R from "ramda";
|
|
6
6
|
|
|
7
|
-
import { findNodeHandle,
|
|
7
|
+
import { findNodeHandle, StyleSheet, View } from "react-native";
|
|
8
8
|
import TransportControlsMobile from "@applicaster/quick-brick-mobile-transport-controls";
|
|
9
9
|
import TransportControlsTV from "@applicaster/quick-brick-tv-transport-controls";
|
|
10
10
|
|
|
@@ -39,14 +39,7 @@ import {
|
|
|
39
39
|
import { PlayerAnalyticsManager } from "@applicaster/zapp-react-native-utils/analyticsUtils/PlayerAnalyticsManager";
|
|
40
40
|
import { PlayerAnalyticsTrackerI } from "@applicaster/zapp-react-native-utils/analyticsUtils/playerAnalyticsTracker";
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
QuickBrickPlayerPlugin: isApplePlatform()
|
|
44
|
-
? NativeModules.PlayerModule
|
|
45
|
-
: NativeModules.QuickBrickDefaultPlayerModule,
|
|
46
|
-
KalturaPlayerPlugin: isApplePlatform()
|
|
47
|
-
? NativeModules.KalturaPlayerModule
|
|
48
|
-
: NativeModules.QBKalturaPlayerModule,
|
|
49
|
-
};
|
|
42
|
+
import { RNPlayerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/nativePlayerManager";
|
|
50
43
|
|
|
51
44
|
const styles = StyleSheet.create({
|
|
52
45
|
container: { flex: 1 },
|
|
@@ -124,8 +117,6 @@ export default class VideoPlayer extends React.Component<
|
|
|
124
117
|
}
|
|
125
118
|
|
|
126
119
|
componentWillUnmount() {
|
|
127
|
-
this.stopBackgroundPlayback();
|
|
128
|
-
|
|
129
120
|
this.playbackStarted = false;
|
|
130
121
|
|
|
131
122
|
this.analyticsTracker.handleAnalyticEvent(GENERAL_EVENT.session_end);
|
|
@@ -171,6 +162,11 @@ export default class VideoPlayer extends React.Component<
|
|
|
171
162
|
}
|
|
172
163
|
}
|
|
173
164
|
|
|
165
|
+
// For close button
|
|
166
|
+
public closeNativePlayer = () => {
|
|
167
|
+
this.stopBackgroundPlayback();
|
|
168
|
+
};
|
|
169
|
+
|
|
174
170
|
getPlayNextData = () => this.props.playNextData as PlayNextData;
|
|
175
171
|
|
|
176
172
|
/**
|
|
@@ -324,11 +320,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
324
320
|
}
|
|
325
321
|
};
|
|
326
322
|
|
|
327
|
-
|
|
328
|
-
* Sets either subtitle language, or audio language if we have a selected a new locale.
|
|
329
|
-
* If no locale is set it defaults to system language for audio, and leaves subtitles unaltered.
|
|
330
|
-
*/
|
|
331
|
-
setLanguage = (selected = null) => {
|
|
323
|
+
selectTrack = (selected) => {
|
|
332
324
|
const { trackType, id, language } = selected || {};
|
|
333
325
|
|
|
334
326
|
const isOff = language === "Off";
|
|
@@ -790,7 +782,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
790
782
|
!!this.props.controller?.supportsNativeControls?.();
|
|
791
783
|
|
|
792
784
|
const controls = isAppleTV()
|
|
793
|
-
? supportsNativeControls && !isInlineTV
|
|
785
|
+
? (supportsNativeControls && !isInlineTV) || !!this.getPlayNextData()
|
|
794
786
|
: supportsNativeControls && !this.getPlayNextData();
|
|
795
787
|
|
|
796
788
|
const shouldUseNativeControls =
|
|
@@ -920,7 +912,13 @@ export default class VideoPlayer extends React.Component<
|
|
|
920
912
|
...androidLifecyclePiPEvents,
|
|
921
913
|
};
|
|
922
914
|
|
|
923
|
-
const needToShowPlayNextOverlay =
|
|
915
|
+
const needToShowPlayNextOverlay =
|
|
916
|
+
isTV() && this.getPlayNextData() && !docked;
|
|
917
|
+
|
|
918
|
+
const needToShowDefaultControls = !(
|
|
919
|
+
(controls && !castAction?.state?.connected) ||
|
|
920
|
+
this.getPlayNextData()
|
|
921
|
+
);
|
|
924
922
|
|
|
925
923
|
const playerContainerStyles = isApplePlatform()
|
|
926
924
|
? styles.playerContainerBlack
|
|
@@ -962,7 +960,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
962
960
|
extraInfoText={castAction?.state?.friendlyStatus}
|
|
963
961
|
controlsAlwaysVisible={castAction?.state?.connected}
|
|
964
962
|
playNextData={this.getPlayNextData()}
|
|
965
|
-
|
|
963
|
+
needToShowDefaultControls={needToShowDefaultControls}
|
|
966
964
|
/>
|
|
967
965
|
) : null;
|
|
968
966
|
};
|