@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.5895113034",
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.68",
40
- "@applicaster/quick-brick-tv-transport-controls": "12.0.0-alpha.5895113034",
41
- "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.5895113034",
42
- "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.5895113034",
43
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.5895113034",
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
- 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
 
@@ -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
- const RNPlayerManager = {
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 && !this.getPlayNextData()
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 = this.getPlayNextData() && !docked;
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
- nativeControls={!!controls}
963
+ needToShowDefaultControls={needToShowDefaultControls}
966
964
  />
967
965
  ) : null;
968
966
  };