amazon-ivs-react-native-player 1.2.0 → 1.3.0
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/amazon-ivs-react-native-player.podspec +1 -1
- package/android/build.gradle +5 -6
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/android/gradle.properties +5 -5
- package/android/gradlew +155 -104
- package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsView.kt +27 -2
- package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsViewManager.kt +6 -2
- package/ios/AmazonIvsManager.m +1 -0
- package/ios/AmazonIvsManager.swift +7 -0
- package/ios/AmazonIvsView.swift +62 -7
- package/lib/commonjs/IVSPlayer.js +6 -2
- package/lib/commonjs/IVSPlayer.js.map +1 -1
- package/lib/commonjs/types.js.flow +1 -0
- package/lib/module/IVSPlayer.js +6 -2
- package/lib/module/IVSPlayer.js.map +1 -1
- package/lib/module/types.js.flow +1 -0
- package/lib/typescript/types.d.ts +1 -0
- package/package.json +5 -5
- package/src/IVSPlayer.tsx +11 -1
- package/src/__tests__/index.test.tsx +15 -0
- package/src/types.js.flow +1 -0
- package/src/types.ts +1 -0
package/android/build.gradle
CHANGED
|
@@ -7,10 +7,13 @@ buildscript {
|
|
|
7
7
|
repositories {
|
|
8
8
|
google()
|
|
9
9
|
mavenCentral()
|
|
10
|
+
google()
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
dependencies {
|
|
13
|
-
classpath
|
|
14
|
+
classpath("com.android.tools.build:gradle:7.0.4")
|
|
15
|
+
classpath("com.facebook.react:react-native-gradle-plugin")
|
|
16
|
+
classpath("de.undercouch:gradle-download-task:4.1.2")
|
|
14
17
|
// noinspection DifferentKotlinGradleVersion
|
|
15
18
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
16
19
|
}
|
|
@@ -49,10 +52,6 @@ android {
|
|
|
49
52
|
lintOptions {
|
|
50
53
|
disable 'GradleCompatible'
|
|
51
54
|
}
|
|
52
|
-
compileOptions {
|
|
53
|
-
sourceCompatibility JavaVersion.VERSION_1_8
|
|
54
|
-
targetCompatibility JavaVersion.VERSION_1_8
|
|
55
|
-
}
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
repositories {
|
|
@@ -130,7 +129,7 @@ def ivs_version = getExtOrDefault('ivsVersion')
|
|
|
130
129
|
|
|
131
130
|
dependencies {
|
|
132
131
|
// noinspection GradleDynamicVersion
|
|
133
|
-
|
|
132
|
+
implementation 'com.facebook.react:react-native:+'
|
|
134
133
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
135
134
|
implementation "com.amazonaws:ivs-player:$ivs_version"
|
|
136
135
|
implementation "com.squareup.okhttp3:okhttp:4.2.2"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
distributionBase=GRADLE_USER_HOME
|
|
2
2
|
distributionPath=wrapper/dists
|
|
3
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-
|
|
3
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
|
4
4
|
zipStoreBase=GRADLE_USER_HOME
|
|
5
5
|
zipStorePath=wrapper/dists
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
AmazonIvs_kotlinVersion=1.
|
|
2
|
-
AmazonIvs_compileSdkVersion=
|
|
3
|
-
AmazonIvs_buildToolsVersion=
|
|
4
|
-
AmazonIvs_targetSdkVersion=
|
|
5
|
-
AmazonIvs_ivsVersion=1.
|
|
1
|
+
AmazonIvs_kotlinVersion=1.6.10
|
|
2
|
+
AmazonIvs_compileSdkVersion=31
|
|
3
|
+
AmazonIvs_buildToolsVersion=31.0.0
|
|
4
|
+
AmazonIvs_targetSdkVersion=31
|
|
5
|
+
AmazonIvs_ivsVersion=1.13.0
|
package/android/gradlew
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#!/
|
|
1
|
+
#!/bin/sh
|
|
2
2
|
|
|
3
3
|
#
|
|
4
|
-
# Copyright 2015 the original
|
|
4
|
+
# Copyright © 2015-2021 the original authors.
|
|
5
5
|
#
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
@@ -17,78 +17,113 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
##############################################################################
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
#
|
|
21
|
+
# Gradle start up script for POSIX generated by Gradle.
|
|
22
|
+
#
|
|
23
|
+
# Important for running:
|
|
24
|
+
#
|
|
25
|
+
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
|
26
|
+
# noncompliant, but you have some other compliant shell such as ksh or
|
|
27
|
+
# bash, then to run this script, type that shell name before the whole
|
|
28
|
+
# command line, like:
|
|
29
|
+
#
|
|
30
|
+
# ksh Gradle
|
|
31
|
+
#
|
|
32
|
+
# Busybox and similar reduced shells will NOT work, because this script
|
|
33
|
+
# requires all of these POSIX shell features:
|
|
34
|
+
# * functions;
|
|
35
|
+
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
|
36
|
+
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
|
37
|
+
# * compound commands having a testable exit status, especially «case»;
|
|
38
|
+
# * various built-in commands including «command», «set», and «ulimit».
|
|
39
|
+
#
|
|
40
|
+
# Important for patching:
|
|
41
|
+
#
|
|
42
|
+
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
|
43
|
+
# by Bash, Ksh, etc; in particular arrays are avoided.
|
|
44
|
+
#
|
|
45
|
+
# The "traditional" practice of packing multiple parameters into a
|
|
46
|
+
# space-separated string is a well documented source of bugs and security
|
|
47
|
+
# problems, so this is (mostly) avoided, by progressively accumulating
|
|
48
|
+
# options in "$@", and eventually passing that to Java.
|
|
49
|
+
#
|
|
50
|
+
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
|
51
|
+
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
|
52
|
+
# see the in-line comments for details.
|
|
53
|
+
#
|
|
54
|
+
# There are tweaks for specific operating systems such as AIX, CygWin,
|
|
55
|
+
# Darwin, MinGW, and NonStop.
|
|
56
|
+
#
|
|
57
|
+
# (3) This script is generated from the Groovy template
|
|
58
|
+
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
|
59
|
+
# within the Gradle project.
|
|
60
|
+
#
|
|
61
|
+
# You can find Gradle at https://github.com/gradle/gradle/.
|
|
62
|
+
#
|
|
23
63
|
##############################################################################
|
|
24
64
|
|
|
25
65
|
# Attempt to set APP_HOME
|
|
66
|
+
|
|
26
67
|
# Resolve links: $0 may be a link
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
68
|
+
app_path=$0
|
|
69
|
+
|
|
70
|
+
# Need this for daisy-chained symlinks.
|
|
71
|
+
while
|
|
72
|
+
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
|
73
|
+
[ -h "$app_path" ]
|
|
74
|
+
do
|
|
75
|
+
ls=$( ls -ld "$app_path" )
|
|
76
|
+
link=${ls#*' -> '}
|
|
77
|
+
case $link in #(
|
|
78
|
+
/*) app_path=$link ;; #(
|
|
79
|
+
*) app_path=$APP_HOME$link ;;
|
|
80
|
+
esac
|
|
37
81
|
done
|
|
38
|
-
|
|
39
|
-
cd "
|
|
40
|
-
APP_HOME="`pwd -P`"
|
|
41
|
-
cd "$SAVED" >/dev/null
|
|
82
|
+
|
|
83
|
+
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
|
42
84
|
|
|
43
85
|
APP_NAME="Gradle"
|
|
44
|
-
APP_BASE_NAME
|
|
86
|
+
APP_BASE_NAME=${0##*/}
|
|
45
87
|
|
|
46
88
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
47
89
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
|
48
90
|
|
|
49
91
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
|
50
|
-
MAX_FD=
|
|
92
|
+
MAX_FD=maximum
|
|
51
93
|
|
|
52
94
|
warn () {
|
|
53
95
|
echo "$*"
|
|
54
|
-
}
|
|
96
|
+
} >&2
|
|
55
97
|
|
|
56
98
|
die () {
|
|
57
99
|
echo
|
|
58
100
|
echo "$*"
|
|
59
101
|
echo
|
|
60
102
|
exit 1
|
|
61
|
-
}
|
|
103
|
+
} >&2
|
|
62
104
|
|
|
63
105
|
# OS specific support (must be 'true' or 'false').
|
|
64
106
|
cygwin=false
|
|
65
107
|
msys=false
|
|
66
108
|
darwin=false
|
|
67
109
|
nonstop=false
|
|
68
|
-
case "
|
|
69
|
-
CYGWIN* )
|
|
70
|
-
|
|
71
|
-
;;
|
|
72
|
-
|
|
73
|
-
darwin=true
|
|
74
|
-
;;
|
|
75
|
-
MINGW* )
|
|
76
|
-
msys=true
|
|
77
|
-
;;
|
|
78
|
-
NONSTOP* )
|
|
79
|
-
nonstop=true
|
|
80
|
-
;;
|
|
110
|
+
case "$( uname )" in #(
|
|
111
|
+
CYGWIN* ) cygwin=true ;; #(
|
|
112
|
+
Darwin* ) darwin=true ;; #(
|
|
113
|
+
MSYS* | MINGW* ) msys=true ;; #(
|
|
114
|
+
NONSTOP* ) nonstop=true ;;
|
|
81
115
|
esac
|
|
82
116
|
|
|
83
117
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|
84
118
|
|
|
119
|
+
|
|
85
120
|
# Determine the Java command to use to start the JVM.
|
|
86
121
|
if [ -n "$JAVA_HOME" ] ; then
|
|
87
122
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
|
88
123
|
# IBM's JDK on AIX uses strange locations for the executables
|
|
89
|
-
JAVACMD
|
|
124
|
+
JAVACMD=$JAVA_HOME/jre/sh/java
|
|
90
125
|
else
|
|
91
|
-
JAVACMD
|
|
126
|
+
JAVACMD=$JAVA_HOME/bin/java
|
|
92
127
|
fi
|
|
93
128
|
if [ ! -x "$JAVACMD" ] ; then
|
|
94
129
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
|
@@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
|
|
|
97
132
|
location of your Java installation."
|
|
98
133
|
fi
|
|
99
134
|
else
|
|
100
|
-
JAVACMD=
|
|
135
|
+
JAVACMD=java
|
|
101
136
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
|
102
137
|
|
|
103
138
|
Please set the JAVA_HOME variable in your environment to match the
|
|
@@ -105,79 +140,95 @@ location of your Java installation."
|
|
|
105
140
|
fi
|
|
106
141
|
|
|
107
142
|
# Increase the maximum file descriptors if we can.
|
|
108
|
-
if
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
fi
|
|
143
|
+
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
|
144
|
+
case $MAX_FD in #(
|
|
145
|
+
max*)
|
|
146
|
+
MAX_FD=$( ulimit -H -n ) ||
|
|
147
|
+
warn "Could not query maximum file descriptor limit"
|
|
148
|
+
esac
|
|
149
|
+
case $MAX_FD in #(
|
|
150
|
+
'' | soft) :;; #(
|
|
151
|
+
*)
|
|
152
|
+
ulimit -n "$MAX_FD" ||
|
|
153
|
+
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
|
154
|
+
esac
|
|
121
155
|
fi
|
|
122
156
|
|
|
123
|
-
#
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
157
|
+
# Collect all arguments for the java command, stacking in reverse order:
|
|
158
|
+
# * args from the command line
|
|
159
|
+
# * the main class name
|
|
160
|
+
# * -classpath
|
|
161
|
+
# * -D...appname settings
|
|
162
|
+
# * --module-path (only if needed)
|
|
163
|
+
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
|
127
164
|
|
|
128
165
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
129
|
-
if
|
|
130
|
-
APP_HOME
|
|
131
|
-
CLASSPATH
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
136
|
-
SEP=""
|
|
137
|
-
for dir in $ROOTDIRSRAW ; do
|
|
138
|
-
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
139
|
-
SEP="|"
|
|
140
|
-
done
|
|
141
|
-
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
142
|
-
# Add a user-defined pattern to the cygpath arguments
|
|
143
|
-
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
144
|
-
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
145
|
-
fi
|
|
166
|
+
if "$cygwin" || "$msys" ; then
|
|
167
|
+
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
|
168
|
+
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
|
169
|
+
|
|
170
|
+
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
|
171
|
+
|
|
146
172
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
173
|
+
for arg do
|
|
174
|
+
if
|
|
175
|
+
case $arg in #(
|
|
176
|
+
-*) false ;; # don't mess with options #(
|
|
177
|
+
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
|
178
|
+
[ -e "$t" ] ;; #(
|
|
179
|
+
*) false ;;
|
|
180
|
+
esac
|
|
181
|
+
then
|
|
182
|
+
arg=$( cygpath --path --ignore --mixed "$arg" )
|
|
156
183
|
fi
|
|
157
|
-
|
|
184
|
+
# Roll the args list around exactly as many times as the number of
|
|
185
|
+
# args, so each arg winds up back in the position where it started, but
|
|
186
|
+
# possibly modified.
|
|
187
|
+
#
|
|
188
|
+
# NB: a `for` loop captures its iteration list before it begins, so
|
|
189
|
+
# changing the positional parameters here affects neither the number of
|
|
190
|
+
# iterations, nor the values presented in `arg`.
|
|
191
|
+
shift # remove old arg
|
|
192
|
+
set -- "$@" "$arg" # push replacement arg
|
|
158
193
|
done
|
|
159
|
-
case $i in
|
|
160
|
-
0) set -- ;;
|
|
161
|
-
1) set -- "$args0" ;;
|
|
162
|
-
2) set -- "$args0" "$args1" ;;
|
|
163
|
-
3) set -- "$args0" "$args1" "$args2" ;;
|
|
164
|
-
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
165
|
-
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
166
|
-
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
167
|
-
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
168
|
-
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
169
|
-
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
170
|
-
esac
|
|
171
194
|
fi
|
|
172
195
|
|
|
173
|
-
#
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
196
|
+
# Collect all arguments for the java command;
|
|
197
|
+
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
|
198
|
+
# shell script including quotes and variable substitutions, so put them in
|
|
199
|
+
# double quotes to make sure that they get re-expanded; and
|
|
200
|
+
# * put everything else in single quotes, so that it's not re-expanded.
|
|
201
|
+
|
|
202
|
+
set -- \
|
|
203
|
+
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
|
204
|
+
-classpath "$CLASSPATH" \
|
|
205
|
+
org.gradle.wrapper.GradleWrapperMain \
|
|
206
|
+
"$@"
|
|
207
|
+
|
|
208
|
+
# Use "xargs" to parse quoted args.
|
|
209
|
+
#
|
|
210
|
+
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
|
211
|
+
#
|
|
212
|
+
# In Bash we could simply go:
|
|
213
|
+
#
|
|
214
|
+
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
|
215
|
+
# set -- "${ARGS[@]}" "$@"
|
|
216
|
+
#
|
|
217
|
+
# but POSIX shell has neither arrays nor command substitution, so instead we
|
|
218
|
+
# post-process each arg (as a line of input to sed) to backslash-escape any
|
|
219
|
+
# character that might be a shell metacharacter, then use eval to reverse
|
|
220
|
+
# that process (while maintaining the separation between arguments), and wrap
|
|
221
|
+
# the whole thing up as a single "set" statement.
|
|
222
|
+
#
|
|
223
|
+
# This will of course break if any of these variables contains a newline or
|
|
224
|
+
# an unmatched quote.
|
|
225
|
+
#
|
|
179
226
|
|
|
180
|
-
|
|
181
|
-
|
|
227
|
+
eval "set -- $(
|
|
228
|
+
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
|
229
|
+
xargs -n1 |
|
|
230
|
+
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
|
231
|
+
tr '\n' ' '
|
|
232
|
+
)" '"$@"'
|
|
182
233
|
|
|
183
|
-
exec "$JAVACMD" "$@"
|
|
234
|
+
exec "$JAVACMD" "$@"
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
package com.amazonaws.ivs.reactnative.player
|
|
2
2
|
|
|
3
|
+
import android.content.pm.PackageManager
|
|
3
4
|
import android.net.Uri
|
|
4
5
|
import android.widget.FrameLayout
|
|
5
6
|
import com.amazonaws.ivs.player.*
|
|
7
|
+
import android.os.Build
|
|
6
8
|
import com.facebook.react.bridge.Arguments
|
|
7
9
|
import com.facebook.react.bridge.LifecycleEventListener
|
|
8
10
|
import com.facebook.react.bridge.ReactContext
|
|
@@ -12,6 +14,10 @@ import com.facebook.react.uimanager.events.RCTEventEmitter
|
|
|
12
14
|
import java.util.*
|
|
13
15
|
import java.util.concurrent.TimeUnit
|
|
14
16
|
import kotlin.concurrent.timerTask
|
|
17
|
+
import android.app.PictureInPictureParams
|
|
18
|
+
import android.app.Activity
|
|
19
|
+
import androidx.annotation.RequiresApi
|
|
20
|
+
|
|
15
21
|
|
|
16
22
|
class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(context), LifecycleEventListener {
|
|
17
23
|
private var playerView: PlayerView? = null
|
|
@@ -283,6 +289,7 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
283
289
|
player?.seekTo(TimeUnit.SECONDS.toMillis(position))
|
|
284
290
|
}
|
|
285
291
|
|
|
292
|
+
|
|
286
293
|
fun onPlayerStateChange(state: Player.State) {
|
|
287
294
|
val reactContext = context as ReactContext
|
|
288
295
|
|
|
@@ -411,12 +418,30 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
411
418
|
}
|
|
412
419
|
}
|
|
413
420
|
|
|
414
|
-
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
fun togglePip(){
|
|
424
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
|
|
425
|
+
&& context.packageManager
|
|
426
|
+
.hasSystemFeature(
|
|
427
|
+
PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
|
|
428
|
+
val activity: Activity? = context.currentActivity
|
|
429
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
430
|
+
val params = PictureInPictureParams.Builder()
|
|
431
|
+
activity?.enterPictureInPictureMode(params.build());
|
|
432
|
+
} else {
|
|
433
|
+
activity?.enterPictureInPictureMode();
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
}
|
|
415
437
|
}
|
|
416
438
|
|
|
417
|
-
|
|
439
|
+
|
|
440
|
+
override fun onHostResume() {
|
|
418
441
|
}
|
|
419
442
|
|
|
443
|
+
override fun onHostPause() {}
|
|
444
|
+
|
|
420
445
|
override fun onHostDestroy() {
|
|
421
446
|
cleanup()
|
|
422
447
|
}
|
|
@@ -11,7 +11,8 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
11
11
|
private enum class Commands {
|
|
12
12
|
PLAY,
|
|
13
13
|
PAUSE,
|
|
14
|
-
SEEK_TO
|
|
14
|
+
SEEK_TO,
|
|
15
|
+
TOGGLE_PIP
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
override fun getName() = "AmazonIvs"
|
|
@@ -31,7 +32,9 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
31
32
|
"pause",
|
|
32
33
|
Commands.PAUSE.ordinal,
|
|
33
34
|
"seekTo",
|
|
34
|
-
Commands.SEEK_TO.ordinal
|
|
35
|
+
Commands.SEEK_TO.ordinal,
|
|
36
|
+
"togglePip",
|
|
37
|
+
Commands.TOGGLE_PIP.ordinal
|
|
35
38
|
)
|
|
36
39
|
}
|
|
37
40
|
|
|
@@ -39,6 +42,7 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
39
42
|
when (commandType) {
|
|
40
43
|
Commands.PLAY.ordinal -> view.play()
|
|
41
44
|
Commands.PAUSE.ordinal -> view.pause()
|
|
45
|
+
Commands.TOGGLE_PIP.ordinal -> view.togglePip()
|
|
42
46
|
Commands.SEEK_TO.ordinal -> {
|
|
43
47
|
args?.getInt(0)?.let { position ->
|
|
44
48
|
view.seekTo(position.toLong())
|
package/ios/AmazonIvsManager.m
CHANGED
|
@@ -18,6 +18,7 @@ RCT_EXTERN_METHOD(play:(nonnull NSNumber *)node)
|
|
|
18
18
|
RCT_EXTERN_METHOD(pause:(nonnull NSNumber *)node)
|
|
19
19
|
RCT_EXPORT_VIEW_PROPERTY(streamUrl, NSString)
|
|
20
20
|
RCT_EXTERN_METHOD(seekTo:(nonnull NSNumber *)node position:(double)position)
|
|
21
|
+
RCT_EXTERN_METHOD(togglePip:(nonnull NSNumber *)node)
|
|
21
22
|
RCT_EXPORT_VIEW_PROPERTY(onSeek, RCTDirectEventBlock)
|
|
22
23
|
RCT_EXPORT_VIEW_PROPERTY(onData, RCTDirectEventBlock)
|
|
23
24
|
RCT_EXPORT_VIEW_PROPERTY(onVideoStatistics, RCTDirectEventBlock)
|
|
@@ -26,4 +26,11 @@ class AmazonIvsManager: RCTViewManager {
|
|
|
26
26
|
component.seek(position: position)
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
|
|
30
|
+
@objc func togglePip(_ node: NSNumber) {
|
|
31
|
+
DispatchQueue.main.async {
|
|
32
|
+
let component = self.bridge.uiManager.view(forReactTag: node) as! AmazonIvsView
|
|
33
|
+
component.togglePip()
|
|
34
|
+
}
|
|
35
|
+
}
|
|
29
36
|
}
|
package/ios/AmazonIvsView.swift
CHANGED
|
@@ -35,6 +35,20 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
35
35
|
private var lastFramesDropped: Int?;
|
|
36
36
|
private var lastFramesDecoded: Int?;
|
|
37
37
|
|
|
38
|
+
|
|
39
|
+
private var _pipController: Any? = nil
|
|
40
|
+
|
|
41
|
+
@available(iOS 15, *)
|
|
42
|
+
private var pipController: AVPictureInPictureController? {
|
|
43
|
+
get {
|
|
44
|
+
return _pipController as! AVPictureInPictureController?
|
|
45
|
+
}
|
|
46
|
+
set {
|
|
47
|
+
_pipController = newValue
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
38
52
|
override init(frame: CGRect) {
|
|
39
53
|
self.muted = player.muted
|
|
40
54
|
self.liveLowLatency = player.isLiveLowLatency
|
|
@@ -58,6 +72,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
58
72
|
|
|
59
73
|
player.delegate = self
|
|
60
74
|
self.playerView.player = player
|
|
75
|
+
preparePictureInPicture()
|
|
61
76
|
}
|
|
62
77
|
|
|
63
78
|
deinit {
|
|
@@ -66,6 +81,8 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
66
81
|
self.removeTimePointObserver()
|
|
67
82
|
}
|
|
68
83
|
|
|
84
|
+
|
|
85
|
+
|
|
69
86
|
func load(urlString: String) {
|
|
70
87
|
finishedLoading = false
|
|
71
88
|
let url = URL(string: urlString)
|
|
@@ -74,6 +91,8 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
74
91
|
player.load(url)
|
|
75
92
|
}
|
|
76
93
|
|
|
94
|
+
|
|
95
|
+
|
|
77
96
|
@objc var progressInterval: NSNumber {
|
|
78
97
|
// TODO: Figure out why updatating observer does not work and results in multiple calls per second
|
|
79
98
|
didSet {
|
|
@@ -119,7 +138,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
119
138
|
player.setAutoMaxQuality(quality)
|
|
120
139
|
}
|
|
121
140
|
}
|
|
122
|
-
|
|
141
|
+
|
|
123
142
|
@objc var initialBufferDuration: Double {
|
|
124
143
|
didSet {
|
|
125
144
|
let parsedTime = CMTimeMakeWithSeconds(initialBufferDuration, preferredTimescale: 10)
|
|
@@ -149,7 +168,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
149
168
|
}
|
|
150
169
|
return value
|
|
151
170
|
}
|
|
152
|
-
|
|
171
|
+
|
|
153
172
|
@objc var streamUrl: String? {
|
|
154
173
|
didSet {
|
|
155
174
|
if let url = streamUrl, !streamUrl!.isEmpty {
|
|
@@ -186,7 +205,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
186
205
|
playerView.videoGravity = findResizeMode(mode: resizeMode)
|
|
187
206
|
}
|
|
188
207
|
}
|
|
189
|
-
|
|
208
|
+
|
|
190
209
|
private func findResizeMode(mode: String?) -> AVLayerVideoGravity {
|
|
191
210
|
switch mode {
|
|
192
211
|
case "aspectFill":
|
|
@@ -199,7 +218,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
199
218
|
return AVLayerVideoGravity.resizeAspect
|
|
200
219
|
}
|
|
201
220
|
}
|
|
202
|
-
|
|
221
|
+
|
|
203
222
|
@objc var breakpoints: NSArray {
|
|
204
223
|
didSet {
|
|
205
224
|
self.removeTimePointObserver()
|
|
@@ -220,6 +239,19 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
220
239
|
player.seek(to: parsedTime)
|
|
221
240
|
}
|
|
222
241
|
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@objc func togglePip() {
|
|
245
|
+
guard #available(iOS 15, *), let pipController = pipController else {
|
|
246
|
+
return
|
|
247
|
+
}
|
|
248
|
+
if pipController.isPictureInPictureActive {
|
|
249
|
+
pipController.stopPictureInPicture()
|
|
250
|
+
} else {
|
|
251
|
+
pipController.startPictureInPicture()
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
223
255
|
required init?(coder: NSCoder) {
|
|
224
256
|
fatalError("init(coder:) has not been implemented")
|
|
225
257
|
}
|
|
@@ -319,7 +351,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
319
351
|
onLoad?(["duration": duration ?? NSNull()])
|
|
320
352
|
finishedLoading = true
|
|
321
353
|
}
|
|
322
|
-
|
|
354
|
+
|
|
323
355
|
if state == IVSPlayer.State.ready {
|
|
324
356
|
if player.qualities != oldQualities {
|
|
325
357
|
let qualities: NSMutableArray = []
|
|
@@ -332,10 +364,10 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
332
364
|
"width": quality.width,
|
|
333
365
|
"height": quality.height
|
|
334
366
|
]
|
|
335
|
-
|
|
367
|
+
|
|
336
368
|
qualities.add(qualityData)
|
|
337
369
|
}
|
|
338
|
-
|
|
370
|
+
|
|
339
371
|
onData?(["playerData": [
|
|
340
372
|
"qualities": qualities,
|
|
341
373
|
"version": player.version,
|
|
@@ -402,4 +434,27 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
402
434
|
func player(_ player: IVSPlayer, didFailWithError error: Error) {
|
|
403
435
|
onError?(["error": error.localizedDescription])
|
|
404
436
|
}
|
|
437
|
+
|
|
438
|
+
private func preparePictureInPicture() {
|
|
439
|
+
|
|
440
|
+
guard #available(iOS 15, *), AVPictureInPictureController.isPictureInPictureSupported() else {
|
|
441
|
+
return
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
if let existingController = self.pipController {
|
|
446
|
+
if existingController.ivsPlayerLayer == playerView.playerLayer {
|
|
447
|
+
return
|
|
448
|
+
}
|
|
449
|
+
self.pipController = nil
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
guard let pipController = AVPictureInPictureController(ivsPlayerLayer: playerView.playerLayer) else {
|
|
453
|
+
return
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
self.pipController = pipController
|
|
457
|
+
pipController.canStartPictureInPictureAutomaticallyFromInline = true
|
|
458
|
+
|
|
459
|
+
}
|
|
405
460
|
}
|
|
@@ -71,6 +71,9 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
71
71
|
const seekTo = (0, _react.useCallback)(value => {
|
|
72
72
|
_reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(mediaPlayerRef.current), _reactNative.UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo, [value]);
|
|
73
73
|
}, []);
|
|
74
|
+
const togglePip = (0, _react.useCallback)(() => {
|
|
75
|
+
_reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(mediaPlayerRef.current), _reactNative.UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip, []);
|
|
76
|
+
}, []);
|
|
74
77
|
(0, _react.useEffect)(() => {
|
|
75
78
|
if (initialized.current || autoplay) {
|
|
76
79
|
if (paused) {
|
|
@@ -85,8 +88,9 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
85
88
|
(0, _react.useImperativeHandle)(ref, () => ({
|
|
86
89
|
play,
|
|
87
90
|
pause,
|
|
88
|
-
seekTo
|
|
89
|
-
|
|
91
|
+
seekTo,
|
|
92
|
+
togglePip
|
|
93
|
+
}), [play, pause, seekTo, togglePip]);
|
|
90
94
|
|
|
91
95
|
const onSeekHandler = event => {
|
|
92
96
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["IVSPlayer.tsx"],"names":["VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","React","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","UIManager","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","StyleSheet","create","flex","width","height"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n }),\n [play, pause, seekTo]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
|
1
|
+
{"version":3,"sources":["IVSPlayer.tsx"],"names":["VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","React","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","UIManager","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","StyleSheet","create","flex","width","height"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n togglePip,\n }),\n [play, pause, seekTo, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
package/lib/module/IVSPlayer.js
CHANGED
|
@@ -58,6 +58,9 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
58
58
|
const seekTo = useCallback(value => {
|
|
59
59
|
UIManager.dispatchViewManagerCommand(findNodeHandle(mediaPlayerRef.current), UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo, [value]);
|
|
60
60
|
}, []);
|
|
61
|
+
const togglePip = useCallback(() => {
|
|
62
|
+
UIManager.dispatchViewManagerCommand(findNodeHandle(mediaPlayerRef.current), UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip, []);
|
|
63
|
+
}, []);
|
|
61
64
|
useEffect(() => {
|
|
62
65
|
if (initialized.current || autoplay) {
|
|
63
66
|
if (paused) {
|
|
@@ -72,8 +75,9 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
72
75
|
useImperativeHandle(ref, () => ({
|
|
73
76
|
play,
|
|
74
77
|
pause,
|
|
75
|
-
seekTo
|
|
76
|
-
|
|
78
|
+
seekTo,
|
|
79
|
+
togglePip
|
|
80
|
+
}), [play, pause, seekTo, togglePip]);
|
|
77
81
|
|
|
78
82
|
const onSeekHandler = event => {
|
|
79
83
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["IVSPlayer.tsx"],"names":["React","useCallback","useEffect","useImperativeHandle","useRef","requireNativeComponent","StyleSheet","UIManager","findNodeHandle","View","VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","create","flex","width","height"],"mappings":"AAAA,OAAOA,KAAP,IACEC,WADF,EAEEC,SAFF,EAGEC,mBAHF,EAIEC,MAJF,QAKO,OALP;AAMA,SACEC,sBADF,EAGEC,UAHF,EAIEC,SAJF,EAKEC,cALF,EAMEC,IANF,QAQO,cARP;AAiEA,MAAMC,SAAS,GAAG,WAAlB;AAEA,MAAMC,SAAS,GAAGN,sBAAsB,CAAiBK,SAAjB,CAAxC;;AAuCA,SAASE,aAAT,CAAuBC,QAAvB,EAAgD;AAC9C,MAAIA,QAAQ,IAAI,IAAhB,EAAsB;AACpB,WAAOA,QAAP;AACD;;AACD,SAAOA,QAAQ,GAAG,CAAX,GAAeA,QAAf,GAA0BC,QAAjC;AACD;;AAED,MAAMC,kBAAkB,gBAAGf,KAAK,CAACgB,UAAN,CACzB,OAoCEC,GApCF,KAqCK;AAAA,MApCH;AACEC,IAAAA,KADF;AAEEC,IAAAA,SAFF;AAGEC,IAAAA,MAHF;AAIEC,IAAAA,KAJF;AAKEC,IAAAA,UALF;AAMEC,IAAAA,QAAQ,GAAG,IANb;AAOEC,IAAAA,cAPF;AAQEC,IAAAA,YARF;AASEC,IAAAA,QATF;AAUEC,IAAAA,gBAVF;AAWEC,IAAAA,MAXF;AAYEC,IAAAA,OAZF;AAaEC,IAAAA,cAbF;AAcEC,IAAAA,eAdF;AAeEC,IAAAA,WAAW,GAAG,EAfhB;AAgBEC,IAAAA,UAhBF;AAiBEC,IAAAA,qBAjBF;AAkBEC,IAAAA,MAlBF;AAmBEC,IAAAA,MAnBF;AAoBEC,IAAAA,iBApBF;AAqBEC,IAAAA,mBArBF;AAsBEC,IAAAA,gBAtBF;AAuBEC,IAAAA,eAvBF;AAwBEC,IAAAA,aAxBF;AAyBEC,IAAAA,WAzBF;AA0BEC,IAAAA,MA1BF;AA2BEC,IAAAA,mBA3BF;AA4BEC,IAAAA,SA5BF;AA6BEC,IAAAA,iBA7BF;AA8BEC,IAAAA,UA9BF;AA+BEC,IAAAA,OA/BF;AAgCEC,IAAAA,WAhCF;AAiCEC,IAAAA;AAjCF,GAoCG;AACH,QAAMC,cAAc,GAAG/C,MAAM,CAAC,IAAD,CAA7B;AACA,QAAMgD,WAAW,GAAGhD,MAAM,CAAC,KAAD,CAA1B;AAEA,QAAMiD,IAAI,GAAGpD,WAAW,CAAC,MAAM;AAC7BM,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAEEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDJ,IAFrD,EAGE,EAHF;AAKD,GANuB,EAMrB,EANqB,CAAxB;AAQA,QAAMK,KAAK,GAAGzD,WAAW,CAAC,MAAM;AAC9BM,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAEEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDC,KAFrD,EAGE,EAHF;AAKD,GANwB,EAMtB,EANsB,CAAzB;AAQA,QAAMC,MAAM,GAAG1D,WAAW,CAAE2D,KAAD,IAAW;AACpCrD,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAGEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDE,MAHrD,EAIE,CAACC,KAAD,CAJF;AAMD,GAPyB,EAOvB,EAPuB,CAA1B;AASA1D,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIkD,WAAW,CAACG,OAAZ,IAAuBhC,QAA3B,EAAqC;AACnC,UAAIH,MAAJ,EAAY;AACVsC,QAAAA,KAAK;AACN,OAFD,MAEO;AACLL,QAAAA,IAAI;AACL;AACF;;AACDD,IAAAA,WAAW,CAACG,OAAZ,GAAsB,IAAtB;AACD,GATQ,EASN,CAACG,KAAD,EAAQtC,MAAR,EAAgBiC,IAAhB,EAAsB9B,QAAtB,CATM,CAAT;AAWApB,EAAAA,mBAAmB,CACjBc,GADiB,EAEjB,OAAO;AACLoC,IAAAA,IADK;AAELK,IAAAA,KAFK;AAGLC,IAAAA;AAHK,GAAP,CAFiB,EAOjB,CAACN,IAAD,EAAOK,KAAP,EAAcC,MAAd,CAPiB,CAAnB;;AAUA,QAAME,aAAa,GACjBC,KADoB,IAEjB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACA7B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG4B,QAAH,CAAN;AACD,GALD;;AAOA,QAAME,0BAA0B,GAC9BH,KADiC,IAE9B;AACH,UAAM;AAAEI,MAAAA;AAAF,QAAYJ,KAAK,CAACE,WAAxB;AACA1B,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAG4B,KAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,uBAAuB,GAC3BL,KAD8B,IAE3B;AACH,UAAM;AAAEjD,MAAAA;AAAF,QAAeiD,KAAK,CAACE,WAA3B;AAEAzB,IAAAA,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAG3B,aAAa,CAACC,QAAD,CAAhB,CAAhB;AACD,GAND;;AAQA,QAAMuD,sBAAsB,GAC1BN,KAD6B,IAE1B;AACH,UAAM;AAAEjC,MAAAA,OAAO,EAAEwC;AAAX,QAA0BP,KAAK,CAACE,WAAtC;AACAxB,IAAAA,eAAe,SAAf,IAAAA,eAAe,WAAf,YAAAA,eAAe,CAAG6B,UAAH,CAAf;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBR,KADoB,IAIjB;AACH,QAAI,CAAC1C,MAAL,EAAa;AACXiC,MAAAA,IAAI;AACL,KAFD,MAEO;AACLK,MAAAA,KAAK;AACN;;AAED,UAAM;AAAE7C,MAAAA;AAAF,QAAeiD,KAAK,CAACE,WAA3B;AAEArB,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG/B,aAAa,CAACC,QAAD,CAAhB,CAAN;AACD,GAdD;;AAgBA,QAAM0D,0BAA0B,GAC9BT,KADiC,IAE9B;AACH,UAAM;AAAEU,MAAAA;AAAF,QAAkBV,KAAK,CAACE,WAA9B;AACApB,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAG4B,WAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBX,KADoB,IAEjB;AACH,UAAM;AAAEY,MAAAA;AAAF,QAAiBZ,KAAK,CAACE,WAA7B;AACA5B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAGsC,UAAH,CAAN;AACD,GALD;;AAOA,QAAMC,gBAAgB,GACpBb,KADuB,IAEpB;AACH,UAAM;AAAEc,MAAAA;AAAF,QAAcd,KAAK,CAACE,WAA1B;AACAnB,IAAAA,SAAS,SAAT,IAAAA,SAAS,WAAT,YAAAA,SAAS,CAAG+B,OAAH,CAAT;AACD,GALD;;AAOA,QAAMC,wBAAwB,GAC5Bf,KAD+B,IAE5B;AACH,UAAM;AAAEgB,MAAAA;AAAF,QAAgBhB,KAAK,CAACE,WAA5B;AACA,UAAMe,UAAqB,GAAG,EAC5B,GAAGD,SADyB;AAE5BjE,MAAAA,QAAQ,EAAED,aAAa,CAACkE,SAAS,CAACjE,QAAX;AAFK,KAA9B;AAIAwB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAG0C,UAAH,CAAjB;AACD,GATD;;AAWA,QAAMC,wBAAwB,GAC5BlB,KAD+B,IAE5B;AACH,UAAM;AAAEmB,MAAAA;AAAF,QAAsBnB,KAAK,CAACE,WAAlC;AACAlB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGmC,eAAH,CAAjB;AACD,GALD;;AAOA,QAAMC,iBAAiB,GACrBpB,KADwB,IAErB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAjB,IAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAGgB,QAAH,CAAV;AACD,GALD;;AAOA,QAAMoB,cAAc,GAAIrB,KAAD,IAAoD;AACzE,UAAM;AAAEsB,MAAAA;AAAF,QAAYtB,KAAK,CAACE,WAAxB;AACAhB,IAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAGoC,KAAH,CAAP;AACD,GAHD;;AAKA,QAAMC,kBAAkB,GACtBvB,KADyB,IAEtB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAf,IAAAA,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW,CAAGc,QAAH,CAAX;AACD,GALD;;AAOA,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE,CAACuB,MAAM,CAACC,SAAR,EAAmBrE,KAAnB,CAAb;AAAwC,IAAA,GAAG,EAAED;AAA7C,kBACE,oBAAC,SAAD;AACE,IAAA,MAAM,EAAC,WADT;AAEE,IAAA,KAAK,EAAEI,KAFT;AAGE,IAAA,cAAc,EAAEG,cAHlB;AAIE,IAAA,KAAK,EAAE8D,MAAM,CAACE,WAJhB;AAKE,IAAA,GAAG,EAAErC,cALP;AAME,IAAA,YAAY,EAAE1B,YANhB;AAOE,IAAA,SAAS,EAAEN,SAPb;AAQE,IAAA,QAAQ,EAAEO,QARZ;AASE,IAAA,UAAU,EAAEJ,UATd;AAUE,IAAA,gBAAgB,EAAEK,gBAVpB;AAWE,IAAA,MAAM,EAAEC,MAXV;AAYE,IAAA,OAAO,EAAEC,OAZX;AAaE,IAAA,qBAAqB,EAAEK,qBAbzB;AAcE,IAAA,cAAc,EAAEJ,cAdlB;AAeE,IAAA,eAAe,EAAEC,eAfnB;AAgBE,IAAA,WAAW,EAAEC,WAhBf;AAiBE,IAAA,UAAU,EAAEC,UAjBd;AAkBE,IAAA,iBAAiB,EACfI,iBAAiB,GAAGwC,wBAAH,GAA8BY,SAnBnD;AAqBE,IAAA,MAAM,EAAEhB,aArBV;AAsBE,IAAA,MAAM,EAAEZ,aAtBV;AAuBE,IAAA,eAAe,EAAEO,sBAvBnB;AAwBE,IAAA,mBAAmB,EAAEH,0BAxBvB;AAyBE,IAAA,gBAAgB,EAAEE,uBAzBpB;AA0BE,IAAA,aAAa,EAAE1B,aA1BjB;AA2BE,IAAA,WAAW,EAAEC,WA3Bf;AA4BE,IAAA,MAAM,EAAE4B,aA5BV;AA6BE,IAAA,SAAS,EAAEK,gBA7Bb;AA8BE,IAAA,iBAAiB,EAAEK,wBA9BrB;AA+BE,IAAA,UAAU,EAAEE,iBA/Bd;AAgCE,IAAA,mBAAmB,EACjBtC,mBAAmB,GAAG2B,0BAAH,GAAgCkB,SAjCvD;AAmCE,IAAA,OAAO,EAAEN,cAnCX;AAoCE,IAAA,WAAW,EAAEE;AApCf,IADF,eAuCE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACpC;AAApB,KAA+BA,QAA/B,CAvCF,CADF;AA2CD,CA1OwB,CAA3B;AA6OA,MAAMoC,MAAM,GAAGhF,UAAU,CAACoF,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,IAAI,EAAE;AADG,GADoB;AAI/BH,EAAAA,WAAW,EAAE;AACXG,IAAAA,IAAI,EAAE;AADK,GAJkB;AAO/BzC,EAAAA,QAAQ,EAAE;AACRa,IAAAA,QAAQ,EAAE,UADF;AAER6B,IAAAA,KAAK,EAAE,MAFC;AAGRC,IAAAA,MAAM,EAAE;AAHA;AAPqB,CAAlB,CAAf;AAcA,eAAe9E,kBAAf","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n }),\n [play, pause, seekTo]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
|
1
|
+
{"version":3,"sources":["IVSPlayer.tsx"],"names":["React","useCallback","useEffect","useImperativeHandle","useRef","requireNativeComponent","StyleSheet","UIManager","findNodeHandle","View","VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","create","flex","width","height"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n togglePip,\n }),\n [play, pause, seekTo, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
package/lib/module/types.js.flow
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "amazon-ivs-react-native-player",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "amazon-ivs-react-native-player",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"e2e:test:ios": "detox test --configuration ios --take-screenshots failing --loglevel verbose",
|
|
30
30
|
"e2e:build:android:release": "detox build --configuration android.emu.release",
|
|
31
31
|
"e2e:build:ios:release": "detox build --configuration ios.sim.release",
|
|
32
|
-
"e2e:test:android:release": "yarn get:testbutler && detox test --configuration android.emu.release --
|
|
32
|
+
"e2e:test:android:release": "yarn get:testbutler && detox test --configuration android.emu.release --record-logs all --loglevel trace",
|
|
33
33
|
"e2e:test:ios:release": "detox test --configuration ios.sim.release --take-screenshots failing",
|
|
34
34
|
"get:testbutler": "curl -f -o ./test-butler-app.apk https://repo1.maven.org/maven2/com/linkedin/testbutler/test-butler-app/2.2.1/test-butler-app-2.2.1.apk"
|
|
35
35
|
},
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
"@types/react": "^17.0.38",
|
|
60
60
|
"@types/react-native": "0.66.15",
|
|
61
61
|
"commitlint": "^13.1.0",
|
|
62
|
-
"detox": "^19.
|
|
63
|
-
"eslint": "^7.
|
|
62
|
+
"detox": "^19.7.1",
|
|
63
|
+
"eslint": "^7.32.0",
|
|
64
64
|
"eslint-config-prettier": "^7.0.0",
|
|
65
65
|
"eslint-plugin-detox": "^1.0.0",
|
|
66
66
|
"eslint-plugin-prettier": "^3.1.3",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"pod-install": "^0.1.0",
|
|
71
71
|
"prettier": "^2.0.5",
|
|
72
72
|
"react": "17.0.2",
|
|
73
|
-
"react-native": "0.
|
|
73
|
+
"react-native": "0.68.2",
|
|
74
74
|
"react-native-builder-bob": "^0.18.1",
|
|
75
75
|
"react-test-renderer": "17.0.1",
|
|
76
76
|
"typescript": "^4.1.3"
|
package/src/IVSPlayer.tsx
CHANGED
|
@@ -184,6 +184,15 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
184
184
|
);
|
|
185
185
|
}, []);
|
|
186
186
|
|
|
187
|
+
const togglePip = useCallback(() => {
|
|
188
|
+
UIManager.dispatchViewManagerCommand(
|
|
189
|
+
findNodeHandle(mediaPlayerRef.current),
|
|
190
|
+
|
|
191
|
+
UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,
|
|
192
|
+
[]
|
|
193
|
+
);
|
|
194
|
+
}, []);
|
|
195
|
+
|
|
187
196
|
useEffect(() => {
|
|
188
197
|
if (initialized.current || autoplay) {
|
|
189
198
|
if (paused) {
|
|
@@ -201,8 +210,9 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
201
210
|
play,
|
|
202
211
|
pause,
|
|
203
212
|
seekTo,
|
|
213
|
+
togglePip,
|
|
204
214
|
}),
|
|
205
|
-
[play, pause, seekTo]
|
|
215
|
+
[play, pause, seekTo, togglePip]
|
|
206
216
|
);
|
|
207
217
|
|
|
208
218
|
const onSeekHandler = (
|
|
@@ -18,6 +18,7 @@ jest.mock('react-native', () => {
|
|
|
18
18
|
play: 1,
|
|
19
19
|
pause: 2,
|
|
20
20
|
seekTo: 3,
|
|
21
|
+
togglePip: undefined,
|
|
21
22
|
},
|
|
22
23
|
};
|
|
23
24
|
}
|
|
@@ -211,6 +212,20 @@ test('Using seekTo on ref calls seekTo on native component', async () => {
|
|
|
211
212
|
expect(mockCommandFn.mock.calls[0][2]).toEqual([10]);
|
|
212
213
|
});
|
|
213
214
|
|
|
215
|
+
test('Using togglePip on ref calls togglePip on native component', async () => {
|
|
216
|
+
const mockCommandFn = jest.fn();
|
|
217
|
+
const ref = React.createRef<IVSPlayerRef>();
|
|
218
|
+
|
|
219
|
+
render(<IVSPlayer streamUrl={URL} ref={ref} />);
|
|
220
|
+
|
|
221
|
+
UIManager.dispatchViewManagerCommand = mockCommandFn;
|
|
222
|
+
ref.current?.togglePip();
|
|
223
|
+
|
|
224
|
+
expect(mockCommandFn).toHaveBeenCalled();
|
|
225
|
+
ref.current?.togglePip();
|
|
226
|
+
expect(mockCommandFn).toHaveBeenCalledTimes(2);
|
|
227
|
+
});
|
|
228
|
+
|
|
214
229
|
test('Autoplay when onLoad', async () => {
|
|
215
230
|
const mockCommandFn = jest.fn();
|
|
216
231
|
|
package/src/types.js.flow
CHANGED