@applicaster/quick-brick-player 12.0.0-alpha.7855034103 → 12.0.0-alpha.7990242848

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.7855034103",
3
+ "version": "12.0.0-alpha.7990242848",
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.68",
40
- "@applicaster/quick-brick-tv-transport-controls": "12.0.0-rc.62",
41
- "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.7855034103",
42
- "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.7855034103",
43
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.7855034103",
39
+ "@applicaster/quick-brick-mobile-transport-controls": "12.0.0-rc.96",
40
+ "@applicaster/quick-brick-tv-transport-controls": "12.0.0-rc.100",
41
+ "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.7990242848",
42
+ "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.7990242848",
43
+ "@applicaster/zapp-react-native-utils": "12.0.0-alpha.7990242848",
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
- if (player.playerState.isReadyToPlay) {
17
- if (player.playerState.isPaused) {
18
- setImageUri(asset.active);
19
- } else {
20
- setImageUri(asset.inactive);
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
- return player.addListener({
25
- id: "live-image-buttons",
26
- listener: {
27
- onPlayerResume: () => {
28
- setImageUri(asset.inactive);
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 (playerId && player) {
47
- // active action = muted, inactive = unmuted
48
- return player.addListener({
49
- id: "live-image-buttons",
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 && layoutState.docked && (
249
- <ProgressBar
250
- content={entry}
251
- value={value}
252
- visible={visible}
253
- layoutState={layoutState}
254
- onPlayerSeek={onPlayerSeek}
255
- playerState={playerState}
256
- docked
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
@@ -4,7 +4,7 @@
4
4
  import React from "react";
5
5
  import * as R from "ramda";
6
6
 
7
- import { findNodeHandle, NativeModules, StyleSheet, View } from "react-native";
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
 
@@ -42,15 +42,7 @@ import {
42
42
  AnimationComponent,
43
43
  ComponentAnimationType,
44
44
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
45
-
46
- const RNPlayerManager = {
47
- QuickBrickPlayerPlugin: isApplePlatform()
48
- ? NativeModules.PlayerModule
49
- : NativeModules.QuickBrickDefaultPlayerModule,
50
- KalturaPlayerPlugin: isApplePlatform()
51
- ? NativeModules.KalturaPlayerModule
52
- : NativeModules.QBKalturaPlayerModule,
53
- };
45
+ import { RNPlayerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/nativePlayerManager";
54
46
 
55
47
  const styles = StyleSheet.create({
56
48
  container: { flex: 1 },
@@ -129,11 +121,6 @@ export default class VideoPlayer extends React.Component<
129
121
  }
130
122
  }
131
123
 
132
- // For close button
133
- public closeNativePlayer = () => {
134
- this.stopBackgroundPlayback();
135
- };
136
-
137
124
  componentDidMount() {
138
125
  this.playbackStarted = false;
139
126
  this.onPlayerPresented();
@@ -169,6 +156,11 @@ export default class VideoPlayer extends React.Component<
169
156
  }
170
157
  }
171
158
 
159
+ // For close button
160
+ public closeNativePlayer = () => {
161
+ this.stopBackgroundPlayback();
162
+ };
163
+
172
164
  getPlayNextData = () => this.props.playNextData as PlayNextData;
173
165
 
174
166
  /**
@@ -343,11 +335,7 @@ export default class VideoPlayer extends React.Component<
343
335
  }
344
336
  };
345
337
 
346
- /**
347
- * Sets either subtitle language, or audio language if we have a selected a new locale.
348
- * If no locale is set it defaults to system language for audio, and leaves subtitles unaltered.
349
- */
350
- setLanguage = (selected = null) => {
338
+ selectTrack = (selected) => {
351
339
  const { trackType, id, language } = selected || {};
352
340
 
353
341
  const isOff = language === "Off";
@@ -865,7 +853,7 @@ export default class VideoPlayer extends React.Component<
865
853
  !!this.props.controller?.supportsNativeControls?.();
866
854
 
867
855
  const controls = isAppleTV()
868
- ? supportsNativeControls && !isInlineTV && !this.getPlayNextData()
856
+ ? (supportsNativeControls && !isInlineTV) || !!this.getPlayNextData()
869
857
  : supportsNativeControls && !this.getPlayNextData();
870
858
 
871
859
  const shouldUseNativeControls =
@@ -1001,7 +989,13 @@ export default class VideoPlayer extends React.Component<
1001
989
  ...androidLifecyclePiPEvents,
1002
990
  };
1003
991
 
1004
- const needToShowPlayNextOverlay = this.getPlayNextData() && !docked;
992
+ const needToShowPlayNextOverlay =
993
+ isTV() && this.getPlayNextData() && !docked;
994
+
995
+ const needToShowDefaultControls = !(
996
+ (controls && !castAction?.state?.connected) ||
997
+ this.getPlayNextData()
998
+ );
1005
999
 
1006
1000
  const playerContainerStyles = isApplePlatform()
1007
1001
  ? styles.playerContainerBlack
@@ -1043,7 +1037,7 @@ export default class VideoPlayer extends React.Component<
1043
1037
  extraInfoText={castAction?.state?.friendlyStatus}
1044
1038
  controlsAlwaysVisible={castAction?.state?.connected}
1045
1039
  playNextData={this.getPlayNextData()}
1046
- nativeControls={!!controls}
1040
+ needToShowDefaultControls={needToShowDefaultControls}
1047
1041
  />
1048
1042
  ) : null;
1049
1043
  };