@applicaster/quick-brick-player 12.0.0-alpha.7725319213 → 12.0.0-alpha.7855034103
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 +7 -6
- package/src/CellPlayer/Assets/AssetsComponent.tsx +2 -1
- package/src/Player/AudioLayer/AudioDescription.tsx +3 -3
- package/src/Player/AudioLayer/AudioPlayerWrapper.tsx +276 -58
- package/src/Player/AudioLayer/Layout/DefaultLayout.tsx +260 -71
- package/src/Player/AudioLayer/Layout/DockedLayout.tsx +71 -18
- package/src/Player/AudioLayer/Layout/defaultLayoutsConts.ts +32 -1
- package/src/Player/AudioLayer/Layout/index.tsx +9 -7
- package/src/Player/AudioLayer/MagicBG/index.tsx +96 -27
- package/src/Player/AudioLayer/utils.ts +33 -0
- package/src/Player/Utils/Utils.ts +26 -16
- package/src/Player/Utils/index.tsx +0 -2
- package/src/Player/index.tsx +106 -66
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import DefaultLayout from "./DefaultLayout";
|
|
3
|
-
import DockedLayout from "./DockedLayout";
|
|
4
3
|
import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
|
|
5
4
|
|
|
6
5
|
type Dimensions = {
|
|
@@ -24,27 +23,30 @@ type LayoutProps = {
|
|
|
24
23
|
isBuffering: boolean;
|
|
25
24
|
};
|
|
26
25
|
value: GetValue;
|
|
26
|
+
sleepTimerDate: number;
|
|
27
|
+
playbackSpeedName: string;
|
|
28
|
+
playbackSleepName: string;
|
|
27
29
|
configuration: { [key: string]: any };
|
|
28
30
|
onPlaybackButtonPress: () => void;
|
|
29
31
|
onRewindButtonPress: () => void;
|
|
30
32
|
onForwardButtonPress: () => void;
|
|
33
|
+
onSpeedButtonPress: () => void;
|
|
34
|
+
onSleepButtonPress: () => void;
|
|
31
35
|
onCloseVideoModal: () => void;
|
|
36
|
+
cancelSleepTimer: () => void;
|
|
32
37
|
onPlayerSeek: (targetTime: number) => void;
|
|
33
38
|
onSkipStart: () => void;
|
|
34
39
|
onSkipLive: () => void;
|
|
35
40
|
maximiseVideoModal: () => void;
|
|
36
41
|
dimensions: Dimensions;
|
|
42
|
+
defaultDimensions: Dimensions;
|
|
37
43
|
playNextData: PlayNextData;
|
|
44
|
+
title: string | number;
|
|
45
|
+
summary: string | number;
|
|
38
46
|
};
|
|
39
47
|
|
|
40
48
|
export default function Layout(
|
|
41
49
|
props: LayoutProps
|
|
42
50
|
): React.ReactElement<LayoutProps> {
|
|
43
|
-
const { layoutState } = props;
|
|
44
|
-
|
|
45
|
-
if (layoutState.docked) {
|
|
46
|
-
return <DockedLayout {...props} />;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
51
|
return <DefaultLayout {...props} />;
|
|
50
52
|
}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
// Disabling for now as lint can't recognise typescript definition here
|
|
2
1
|
/* eslint-disable react/prop-types */
|
|
3
2
|
import * as React from "react";
|
|
4
|
-
import { StyleSheet, View } from "react-native";
|
|
3
|
+
import { Animated, StyleSheet, View } from "react-native";
|
|
5
4
|
import LinearGradient from "../LinearGradient";
|
|
6
5
|
import { getDominantColor, getPalettes } from "../../../utils/utils";
|
|
6
|
+
import { useEffect } from "react";
|
|
7
7
|
|
|
8
8
|
type MagicBGProps = {
|
|
9
9
|
children: React.ReactNode;
|
|
10
10
|
image: string;
|
|
11
|
+
fallbackUrl?: string;
|
|
11
12
|
defaultColor: string;
|
|
13
|
+
colors: string[];
|
|
12
14
|
};
|
|
13
15
|
|
|
14
|
-
const
|
|
16
|
+
const defaultColors = {
|
|
15
17
|
overlay: "rgba(0, 0, 0, 0.35)",
|
|
16
18
|
defaultGradientStart: "rgba(0, 0, 0, 0.25)",
|
|
17
19
|
defaultGradientEnd: "rgba(0, 0, 0, 0)",
|
|
@@ -23,7 +25,7 @@ const styles = StyleSheet.create({
|
|
|
23
25
|
},
|
|
24
26
|
fullScreenOverlay: {
|
|
25
27
|
...StyleSheet.absoluteFillObject,
|
|
26
|
-
backgroundColor:
|
|
28
|
+
backgroundColor: defaultColors.overlay,
|
|
27
29
|
},
|
|
28
30
|
gradientOverlay: {
|
|
29
31
|
position: "absolute",
|
|
@@ -34,53 +36,120 @@ const styles = StyleSheet.create({
|
|
|
34
36
|
},
|
|
35
37
|
});
|
|
36
38
|
|
|
39
|
+
const fetchPaletteAndDominantColor = async (imageUrl: string) => {
|
|
40
|
+
const palette = await getPalettes(imageUrl);
|
|
41
|
+
|
|
42
|
+
const colors = palette.map(
|
|
43
|
+
(color: { r: number; g: number; b: number }) =>
|
|
44
|
+
`rgb(${color.r}, ${color.g}, ${color.b})`
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const dominant = await getDominantColor(imageUrl);
|
|
48
|
+
const dominantColor = `rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`;
|
|
49
|
+
|
|
50
|
+
return { gradientColors: colors.slice(0, 2), dominantColor };
|
|
51
|
+
};
|
|
52
|
+
|
|
37
53
|
export const MagicBG: React.FC<MagicBGProps> = ({
|
|
38
54
|
children,
|
|
39
55
|
image,
|
|
56
|
+
fallbackUrl = "",
|
|
57
|
+
colors = [],
|
|
40
58
|
defaultColor,
|
|
41
59
|
}) => {
|
|
42
60
|
const [dominantColor, setDominantColor] =
|
|
43
61
|
React.useState<string>(defaultColor);
|
|
44
62
|
|
|
45
63
|
const [gradientColors, setGradientColors] = React.useState<string[]>([
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
defaultColors.defaultGradientStart,
|
|
65
|
+
defaultColors.defaultGradientEnd,
|
|
48
66
|
]);
|
|
49
67
|
|
|
50
|
-
React.
|
|
51
|
-
|
|
52
|
-
if (image) {
|
|
53
|
-
try {
|
|
54
|
-
const palette = await getPalettes(image);
|
|
68
|
+
const [backgroundColorAnim] = React.useState(new Animated.Value(0)); // from 0 to 1
|
|
69
|
+
const [gradientOpacityAnim] = React.useState(new Animated.Value(0)); // from 0 to 1
|
|
55
70
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const animateColors = () => {
|
|
73
|
+
Animated.timing(backgroundColorAnim, {
|
|
74
|
+
toValue: 1,
|
|
75
|
+
duration: 500,
|
|
76
|
+
useNativeDriver: false,
|
|
77
|
+
}).start();
|
|
60
78
|
|
|
61
|
-
|
|
79
|
+
Animated.timing(gradientOpacityAnim, {
|
|
80
|
+
toValue: 1,
|
|
81
|
+
duration: 500,
|
|
82
|
+
useNativeDriver: false,
|
|
83
|
+
}).start();
|
|
84
|
+
};
|
|
62
85
|
|
|
63
|
-
|
|
64
|
-
|
|
86
|
+
const fetchColors = async () => {
|
|
87
|
+
if (colors && colors.length > 0) {
|
|
88
|
+
setGradientColors(colors.slice(0, 2));
|
|
89
|
+
setDominantColor(colors[0]);
|
|
90
|
+
animateColors();
|
|
91
|
+
} else if (image) {
|
|
92
|
+
try {
|
|
93
|
+
const { gradientColors, dominantColor } =
|
|
94
|
+
await fetchPaletteAndDominantColor(image);
|
|
95
|
+
|
|
96
|
+
setGradientColors(gradientColors);
|
|
97
|
+
setDominantColor(dominantColor);
|
|
98
|
+
animateColors();
|
|
65
99
|
} catch (error) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
100
|
+
try {
|
|
101
|
+
const { gradientColors, dominantColor } =
|
|
102
|
+
await fetchPaletteAndDominantColor(fallbackUrl);
|
|
103
|
+
|
|
104
|
+
setGradientColors(gradientColors);
|
|
105
|
+
setDominantColor(dominantColor);
|
|
106
|
+
animateColors();
|
|
107
|
+
} catch {
|
|
108
|
+
setGradientColors([
|
|
109
|
+
defaultColors.defaultGradientStart,
|
|
110
|
+
defaultColors.defaultGradientEnd,
|
|
111
|
+
]);
|
|
70
112
|
|
|
71
|
-
|
|
113
|
+
setDominantColor(defaultColor);
|
|
114
|
+
}
|
|
72
115
|
}
|
|
116
|
+
} else {
|
|
117
|
+
setGradientColors([
|
|
118
|
+
defaultColors.defaultGradientStart,
|
|
119
|
+
defaultColors.defaultGradientEnd,
|
|
120
|
+
]);
|
|
121
|
+
|
|
122
|
+
setDominantColor(defaultColor);
|
|
73
123
|
}
|
|
74
124
|
};
|
|
75
125
|
|
|
76
126
|
fetchColors();
|
|
77
|
-
}, [
|
|
127
|
+
}, []);
|
|
128
|
+
|
|
129
|
+
const interpolatedBackgroundColor = backgroundColorAnim.interpolate({
|
|
130
|
+
inputRange: [0, 1],
|
|
131
|
+
outputRange: ["black", dominantColor],
|
|
132
|
+
});
|
|
78
133
|
|
|
79
134
|
return (
|
|
80
|
-
<View
|
|
135
|
+
<Animated.View
|
|
136
|
+
style={[
|
|
137
|
+
styles.container,
|
|
138
|
+
{ backgroundColor: interpolatedBackgroundColor },
|
|
139
|
+
]}
|
|
140
|
+
>
|
|
81
141
|
<View style={styles.fullScreenOverlay} />
|
|
82
|
-
|
|
142
|
+
|
|
143
|
+
<Animated.View
|
|
144
|
+
style={[styles.gradientOverlay, { opacity: gradientOpacityAnim }]}
|
|
145
|
+
>
|
|
146
|
+
<LinearGradient
|
|
147
|
+
colors={gradientColors}
|
|
148
|
+
style={StyleSheet.absoluteFill}
|
|
149
|
+
/>
|
|
150
|
+
</Animated.View>
|
|
151
|
+
|
|
83
152
|
{children}
|
|
84
|
-
</View>
|
|
153
|
+
</Animated.View>
|
|
85
154
|
);
|
|
86
155
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage";
|
|
2
|
+
import { parseJsonIfNeeded } from "@applicaster/zapp-react-native-utils/functionUtils";
|
|
3
|
+
|
|
4
|
+
export const NAMESPACE = "audio-player";
|
|
5
|
+
|
|
6
|
+
export async function loadItemsFromStorage(key: string) {
|
|
7
|
+
const storedItems = await localStorage.getItem(key, NAMESPACE);
|
|
8
|
+
|
|
9
|
+
return parseJsonIfNeeded(storedItems) || null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const hasDatePassed = (timestamp: number) => {
|
|
13
|
+
// Get the current date and time
|
|
14
|
+
const currentDate = new Date();
|
|
15
|
+
|
|
16
|
+
// Compare the current date's timestamp with the given timestamp
|
|
17
|
+
return currentDate.getTime() > timestamp;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const formatSpeed = (value: number) => {
|
|
21
|
+
let formattedValue = value.toString();
|
|
22
|
+
|
|
23
|
+
// If the value ends with ".0", remove it
|
|
24
|
+
if (formattedValue.endsWith(".0")) {
|
|
25
|
+
formattedValue = formattedValue.slice(0, -2);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Replace "." with "_"
|
|
29
|
+
formattedValue = formattedValue.replace(".", "_");
|
|
30
|
+
|
|
31
|
+
// Return the formatted string with "speed_" prefix
|
|
32
|
+
return `speed_${formattedValue}`;
|
|
33
|
+
};
|
|
@@ -1,21 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
default:
|
|
8
|
-
// boolean, number, string
|
|
9
|
-
return obj.toString();
|
|
10
|
-
}
|
|
1
|
+
import queryString from "query-string";
|
|
2
|
+
import { dayjs } from "@applicaster/zapp-react-native-utils/dateUtils";
|
|
3
|
+
|
|
4
|
+
export const getLiveUrl = (url: string) => {
|
|
5
|
+
// Use the replace method with a regular expression to replace all instances of subClass with livePage
|
|
6
|
+
return url.replace(new RegExp("subClass", "g"), "livePage");
|
|
11
7
|
};
|
|
12
8
|
|
|
13
|
-
export const
|
|
14
|
-
|
|
9
|
+
export const addQueryParam = (
|
|
10
|
+
baseUrl: string,
|
|
11
|
+
paramName: string,
|
|
12
|
+
paramValue: string | number
|
|
13
|
+
) => {
|
|
14
|
+
const [urlWithoutQuery, query] = baseUrl.split("?");
|
|
15
|
+
|
|
16
|
+
const parsedQuery = queryString.parse(query);
|
|
17
|
+
|
|
18
|
+
parsedQuery[paramName] = paramValue.toString();
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
20
|
+
const updatedQueryString = queryString.stringify(parsedQuery);
|
|
21
|
+
|
|
22
|
+
return `${urlWithoutQuery}?${updatedQueryString}`;
|
|
23
|
+
};
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
export const isValidDate = (dateString: string | undefined): boolean => {
|
|
26
|
+
return (
|
|
27
|
+
typeof dateString === "string" &&
|
|
28
|
+
dateString.trim() !== "" &&
|
|
29
|
+
dayjs.utc(dateString).isValid()
|
|
30
|
+
);
|
|
21
31
|
};
|
package/src/Player/index.tsx
CHANGED
|
@@ -36,10 +36,12 @@ import { AudioPlayerWrapper } from "./AudioLayer/AudioPlayerWrapper";
|
|
|
36
36
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
37
37
|
import { getAllAccessibilityProps } from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
38
38
|
import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
|
|
39
|
-
import {
|
|
40
|
-
getTargetScreenDataFromEntry
|
|
41
|
-
} from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
|
|
39
|
+
import { getTargetScreenDataFromEntry } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
|
|
42
40
|
import { isAppleTV } from "@applicaster/zapp-react-native-ui-components/Helpers/Platform";
|
|
41
|
+
import {
|
|
42
|
+
AnimationComponent,
|
|
43
|
+
ComponentAnimationType,
|
|
44
|
+
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
43
45
|
|
|
44
46
|
const RNPlayerManager = {
|
|
45
47
|
QuickBrickPlayerPlugin: isApplePlatform()
|
|
@@ -59,6 +61,7 @@ const styles = StyleSheet.create({
|
|
|
59
61
|
position: "absolute",
|
|
60
62
|
zIndex: 1,
|
|
61
63
|
},
|
|
64
|
+
playerSize: { width: "100%", height: "100%" },
|
|
62
65
|
});
|
|
63
66
|
|
|
64
67
|
const logger = createLogger({
|
|
@@ -91,7 +94,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
91
94
|
// TODO: Can be deleted, on controller logic
|
|
92
95
|
paused: false,
|
|
93
96
|
piped: false,
|
|
94
|
-
rate: 1,
|
|
97
|
+
rate: 1.0,
|
|
95
98
|
// TODO: Hack for analytics, must br removed
|
|
96
99
|
resume: null,
|
|
97
100
|
|
|
@@ -117,8 +120,6 @@ export default class VideoPlayer extends React.Component<
|
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
componentWillUnmount() {
|
|
120
|
-
this.stopBackgroundPlayback();
|
|
121
|
-
|
|
122
123
|
this.playbackStarted = false;
|
|
123
124
|
this.handleAnalyticEvent(GENERAL_EVENT.session_end);
|
|
124
125
|
this.onPlayerClosed();
|
|
@@ -128,6 +129,11 @@ export default class VideoPlayer extends React.Component<
|
|
|
128
129
|
}
|
|
129
130
|
}
|
|
130
131
|
|
|
132
|
+
// For close button
|
|
133
|
+
public closeNativePlayer = () => {
|
|
134
|
+
this.stopBackgroundPlayback();
|
|
135
|
+
};
|
|
136
|
+
|
|
131
137
|
componentDidMount() {
|
|
132
138
|
this.playbackStarted = false;
|
|
133
139
|
this.onPlayerPresented();
|
|
@@ -372,6 +378,10 @@ export default class VideoPlayer extends React.Component<
|
|
|
372
378
|
}
|
|
373
379
|
};
|
|
374
380
|
|
|
381
|
+
setPlaybackRate = (rate = 1.0) => {
|
|
382
|
+
this.setState({ rate });
|
|
383
|
+
};
|
|
384
|
+
|
|
375
385
|
getCurrentTime = () => {
|
|
376
386
|
return this.state.currentTime;
|
|
377
387
|
};
|
|
@@ -555,6 +565,26 @@ export default class VideoPlayer extends React.Component<
|
|
|
555
565
|
this.props.listener?.onPlayerDetached?.(nativeEvent);
|
|
556
566
|
};
|
|
557
567
|
|
|
568
|
+
onVideoFullscreenPlayerDidDismiss = () => {
|
|
569
|
+
this.props.listener?.onVideoFullscreenPlayerDidDismiss?.();
|
|
570
|
+
};
|
|
571
|
+
|
|
572
|
+
onVideoFullscreenPlayerDidPresent = () => {
|
|
573
|
+
this.props.listener?.onVideoFullscreenPlayerDidPresent?.();
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
onVideoFullscreenPlayerWillDismiss = () => {
|
|
577
|
+
this.props.listener?.onVideoFullscreenPlayerWillDismiss?.();
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
onVideoFullscreenPlayerWillPresent = () => {
|
|
581
|
+
this.props.listener?.onVideoFullscreenPlayerWillPresent?.();
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
onPlayerClose = () => {
|
|
585
|
+
this.props.listener?.onPlayerClose?.();
|
|
586
|
+
};
|
|
587
|
+
|
|
558
588
|
onPiPEnter = () => {
|
|
559
589
|
this.setState({ piped: true });
|
|
560
590
|
this.props.openPiP();
|
|
@@ -758,7 +788,6 @@ export default class VideoPlayer extends React.Component<
|
|
|
758
788
|
|
|
759
789
|
render() {
|
|
760
790
|
const {
|
|
761
|
-
castAction,
|
|
762
791
|
docked,
|
|
763
792
|
entry,
|
|
764
793
|
fullscreen,
|
|
@@ -768,9 +797,15 @@ export default class VideoPlayer extends React.Component<
|
|
|
768
797
|
isTabletPortrait,
|
|
769
798
|
muted,
|
|
770
799
|
style,
|
|
800
|
+
castAction,
|
|
801
|
+
controller,
|
|
802
|
+
startComponentsAnimation,
|
|
771
803
|
} = this.props;
|
|
772
804
|
|
|
773
|
-
const
|
|
805
|
+
const supportNativeCast = controller.supportNativeCast();
|
|
806
|
+
|
|
807
|
+
const { audioTrackId, keyEvent, paused, seek, textTrackId, rate } =
|
|
808
|
+
this.state;
|
|
774
809
|
|
|
775
810
|
const isAudioItem =
|
|
776
811
|
entry?.content?.type?.includes?.("audio") ||
|
|
@@ -822,26 +857,28 @@ export default class VideoPlayer extends React.Component<
|
|
|
822
857
|
|
|
823
858
|
let platformSpecificProps: any = isApplePlatform()
|
|
824
859
|
? {
|
|
825
|
-
|
|
826
|
-
|
|
860
|
+
resizeMode: nativeResizeMode,
|
|
861
|
+
}
|
|
862
|
+
: {};
|
|
827
863
|
|
|
828
|
-
const supportsNativeControls =
|
|
864
|
+
const supportsNativeControls =
|
|
865
|
+
!!this.props.controller?.supportsNativeControls?.();
|
|
829
866
|
|
|
830
867
|
const controls = isAppleTV()
|
|
831
|
-
? supportsNativeControls && isInlineTV && !this.getPlayNextData()
|
|
868
|
+
? supportsNativeControls && !isInlineTV && !this.getPlayNextData()
|
|
832
869
|
: supportsNativeControls && !this.getPlayNextData();
|
|
833
870
|
|
|
871
|
+
const shouldUseNativeControls =
|
|
872
|
+
controls &&
|
|
873
|
+
!startComponentsAnimation &&
|
|
874
|
+
!docked &&
|
|
875
|
+
!castAction?.state?.connected;
|
|
876
|
+
|
|
834
877
|
platformSpecificProps = {
|
|
835
878
|
...platformSpecificProps,
|
|
836
|
-
controls
|
|
879
|
+
controls: shouldUseNativeControls,
|
|
837
880
|
};
|
|
838
881
|
|
|
839
|
-
console.log("Anton Player render2 ", {
|
|
840
|
-
platformSpecificProps,
|
|
841
|
-
isNotInlineTv: !isInlineTV,
|
|
842
|
-
hasNoPlayNextData: !this.getPlayNextData()
|
|
843
|
-
});
|
|
844
|
-
|
|
845
882
|
const pictureInPictureEnabled =
|
|
846
883
|
this.props.pluginConfiguration?.pictureInPictureEnabled;
|
|
847
884
|
|
|
@@ -857,6 +894,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
857
894
|
nowPlayingEnabled,
|
|
858
895
|
paused,
|
|
859
896
|
seek,
|
|
897
|
+
rate,
|
|
860
898
|
textTrackId,
|
|
861
899
|
liveSeekingEnabled,
|
|
862
900
|
liveCatchUpEnabled,
|
|
@@ -902,22 +940,17 @@ export default class VideoPlayer extends React.Component<
|
|
|
902
940
|
onVideoEnd: this.onVideoEnd, // complete
|
|
903
941
|
onVideoError: this.onVideoError, // error
|
|
904
942
|
onVideoProgress: this.onVideoProgress,
|
|
905
|
-
onVideoFullscreenPlayerDidDismiss: this.
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
onVideoFullscreenPlayerWillDismiss: this.unHandledEvent(
|
|
912
|
-
"onVideoFullscreenPlayerWillDismiss"
|
|
913
|
-
),
|
|
914
|
-
onVideoFullscreenPlayerWillPresent: this.unHandledEvent(
|
|
915
|
-
"onVideoFullscreenPlayerWillPresent"
|
|
916
|
-
),
|
|
943
|
+
onVideoFullscreenPlayerDidDismiss: this.onVideoFullscreenPlayerDidDismiss,
|
|
944
|
+
onVideoFullscreenPlayerDidPresent: this.onVideoFullscreenPlayerDidPresent,
|
|
945
|
+
onVideoFullscreenPlayerWillDismiss:
|
|
946
|
+
this.onVideoFullscreenPlayerWillDismiss,
|
|
947
|
+
onVideoFullscreenPlayerWillPresent:
|
|
948
|
+
this.onVideoFullscreenPlayerWillPresent,
|
|
917
949
|
onVideoLoad: this.onVideoLoad,
|
|
918
950
|
onVideoLoadStart: this.unHandledEvent("onVideoLoadStart"),
|
|
919
951
|
onVideoBuffer: this.onVideoBuffer,
|
|
920
952
|
onPlaybackStalled: this.onPlaybackStalled,
|
|
953
|
+
onPlayerClose: this.onPlayerClose,
|
|
921
954
|
onPlayerAttached: this.onPlayerAttached,
|
|
922
955
|
onPlayerDetached: this.onPlayerDetached,
|
|
923
956
|
};
|
|
@@ -976,8 +1009,6 @@ export default class VideoPlayer extends React.Component<
|
|
|
976
1009
|
? styles.playerContainerTransparent
|
|
977
1010
|
: styles.playerContainerBlack;
|
|
978
1011
|
|
|
979
|
-
console.log("Anton Player render", {screenData, props: this.props, nativeProps});
|
|
980
|
-
|
|
981
1012
|
const isInline = () => {
|
|
982
1013
|
if (isTV()) {
|
|
983
1014
|
return inline;
|
|
@@ -993,7 +1024,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
993
1024
|
!needToShowPlayNextOverlay &&
|
|
994
1025
|
this.props.mode !== "PIP";
|
|
995
1026
|
|
|
996
|
-
if (
|
|
1027
|
+
if (shouldUseNativeControls) {
|
|
997
1028
|
return null;
|
|
998
1029
|
}
|
|
999
1030
|
|
|
@@ -1012,6 +1043,7 @@ export default class VideoPlayer extends React.Component<
|
|
|
1012
1043
|
extraInfoText={castAction?.state?.friendlyStatus}
|
|
1013
1044
|
controlsAlwaysVisible={castAction?.state?.connected}
|
|
1014
1045
|
playNextData={this.getPlayNextData()}
|
|
1046
|
+
nativeControls={!!controls}
|
|
1015
1047
|
/>
|
|
1016
1048
|
) : null;
|
|
1017
1049
|
};
|
|
@@ -1046,29 +1078,14 @@ export default class VideoPlayer extends React.Component<
|
|
|
1046
1078
|
const renderMobilePlayer = () => {
|
|
1047
1079
|
return isFullScreenAudioPlayer && isAudioItem ? (
|
|
1048
1080
|
<View style={containerStyle}>
|
|
1049
|
-
{!castAction?.state?.connected && (
|
|
1081
|
+
{(!castAction?.state?.connected || supportNativeCast) && (
|
|
1050
1082
|
<this.props.PlayerComponent
|
|
1051
1083
|
ref={this._assignRoot}
|
|
1052
1084
|
{...nativeEvents}
|
|
1053
1085
|
{...nativeProps}
|
|
1054
1086
|
/>
|
|
1055
1087
|
)}
|
|
1056
|
-
<AudioPlayerWrapper {...sharedWrapperViewProps}
|
|
1057
|
-
<View>
|
|
1058
|
-
{
|
|
1059
|
-
<PlayNextOverlay
|
|
1060
|
-
item={entry}
|
|
1061
|
-
playerIsDocked={docked}
|
|
1062
|
-
pluginConfiguration={this.getPluginConfiguration()}
|
|
1063
|
-
playerId={this.props.playerId}
|
|
1064
|
-
playNextData={this.getPlayNextData()}
|
|
1065
|
-
setNextVideoPreloadThresholdPercentage={
|
|
1066
|
-
this.props.setNextVideoPreloadThresholdPercentage
|
|
1067
|
-
}
|
|
1068
|
-
/>
|
|
1069
|
-
}
|
|
1070
|
-
</View>
|
|
1071
|
-
</AudioPlayerWrapper>
|
|
1088
|
+
<AudioPlayerWrapper {...sharedWrapperViewProps} />
|
|
1072
1089
|
</View>
|
|
1073
1090
|
) : (
|
|
1074
1091
|
<PlayerWrapper {...sharedWrapperViewProps}>
|
|
@@ -1083,11 +1100,24 @@ export default class VideoPlayer extends React.Component<
|
|
|
1083
1100
|
<View style={styles.container}>
|
|
1084
1101
|
<View style={[playerContainerStyles, playerDimensions]}>
|
|
1085
1102
|
{isAudioItem && (
|
|
1086
|
-
<
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1103
|
+
<AnimationComponent
|
|
1104
|
+
animationType={ComponentAnimationType.player}
|
|
1105
|
+
additionalData={{
|
|
1106
|
+
...playerDimensions,
|
|
1107
|
+
inlineAudioPlayer: true,
|
|
1108
|
+
}}
|
|
1109
|
+
style={getStyle(playerDimensions)}
|
|
1110
|
+
>
|
|
1111
|
+
<AudioPlayer
|
|
1112
|
+
style={
|
|
1113
|
+
isTV()
|
|
1114
|
+
? getStyle(playerDimensions)
|
|
1115
|
+
: styles.playerSize
|
|
1116
|
+
}
|
|
1117
|
+
audio_item={entry}
|
|
1118
|
+
plugin_configuration={this.getPluginConfiguration()}
|
|
1119
|
+
/>
|
|
1120
|
+
</AnimationComponent>
|
|
1091
1121
|
)}
|
|
1092
1122
|
|
|
1093
1123
|
{shouldRenderBackground && (
|
|
@@ -1099,18 +1129,28 @@ export default class VideoPlayer extends React.Component<
|
|
|
1099
1129
|
/>
|
|
1100
1130
|
)}
|
|
1101
1131
|
|
|
1102
|
-
{!castAction?.state?.connected && (
|
|
1103
|
-
<
|
|
1104
|
-
|
|
1105
|
-
{
|
|
1106
|
-
{...nativeProps}
|
|
1107
|
-
listener={this.props.listener}
|
|
1132
|
+
{(!castAction?.state?.connected || supportNativeCast) && (
|
|
1133
|
+
<AnimationComponent
|
|
1134
|
+
animationType={ComponentAnimationType.player}
|
|
1135
|
+
additionalData={playerDimensions}
|
|
1108
1136
|
style={getStyle(playerDimensions)}
|
|
1109
|
-
pluginConfiguration={this.getPluginConfiguration()}
|
|
1110
|
-
controller={this.props.controller}
|
|
1111
1137
|
>
|
|
1112
|
-
|
|
1113
|
-
|
|
1138
|
+
<this.props.PlayerComponent
|
|
1139
|
+
ref={this._assignRoot}
|
|
1140
|
+
{...nativeEvents}
|
|
1141
|
+
{...nativeProps}
|
|
1142
|
+
listener={this.props.listener}
|
|
1143
|
+
style={
|
|
1144
|
+
isTV()
|
|
1145
|
+
? getStyle(playerDimensions)
|
|
1146
|
+
: styles.playerSize
|
|
1147
|
+
}
|
|
1148
|
+
pluginConfiguration={this.getPluginConfiguration()}
|
|
1149
|
+
controller={this.props.controller}
|
|
1150
|
+
>
|
|
1151
|
+
{this.childrenWithPlayNext()}
|
|
1152
|
+
</this.props.PlayerComponent>
|
|
1153
|
+
</AnimationComponent>
|
|
1114
1154
|
)}
|
|
1115
1155
|
</View>
|
|
1116
1156
|
|