amazon-ivs-react-native-player 1.0.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.
Files changed (168) hide show
  1. package/LICENSE +175 -0
  2. package/README.md +56 -0
  3. package/amazon-ivs-react-native-player.podspec +31 -0
  4. package/android/.project +17 -0
  5. package/android/.settings/org.eclipse.buildship.core.prefs +13 -0
  6. package/android/build/.transforms/1f4dbdc38179d2776be8ed38c6bd3b8d/classes/classes.dex +0 -0
  7. package/android/build/.transforms/1f4dbdc38179d2776be8ed38c6bd3b8d.bin +1 -0
  8. package/android/build/generated/source/buildConfig/debug/com/amazonaws/ivs/reactnative/player/BuildConfig.java +10 -0
  9. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +20 -0
  10. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +16 -0
  11. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +2 -0
  12. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
  13. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  14. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  15. package/android/build/intermediates/compile_symbol_list/debug/R.txt +1864 -0
  16. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  17. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  18. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  19. package/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +1 -0
  20. package/android/build/intermediates/incremental/packageDebugResources/merger.xml +2 -0
  21. package/android/build/intermediates/javac/debug/classes/com/amazonaws/ivs/reactnative/player/BuildConfig.class +0 -0
  22. package/android/build/intermediates/library_java_res/debug/res.jar +0 -0
  23. package/android/build/intermediates/library_manifest/debug/AndroidManifest.xml +20 -0
  24. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +2 -0
  25. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +28 -0
  26. package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
  27. package/android/build/intermediates/packaged_manifests/debug/output-metadata.json +16 -0
  28. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  29. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +1384 -0
  30. package/android/build/kotlin/compileDebugKotlin/build-history.bin +0 -0
  31. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab +0 -0
  32. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  33. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  34. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab.len +0 -0
  35. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  36. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab_i +0 -0
  37. package/android/build/kotlin/compileDebugKotlin/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  38. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  39. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  40. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  41. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  42. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  43. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  44. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  45. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  46. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  47. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  48. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  49. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  50. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  51. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  52. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab +0 -0
  53. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  54. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  55. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  56. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  57. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  58. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  59. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  60. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  61. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  62. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  63. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  64. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  65. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  66. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  67. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  68. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  69. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  70. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  71. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  72. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  73. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  74. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  75. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  76. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  77. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  78. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  79. package/android/build/kotlin/compileDebugKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  80. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/counters.tab +2 -0
  81. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab +0 -0
  82. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  83. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  84. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab.len +0 -0
  85. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  86. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab_i +0 -0
  87. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  88. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab +0 -0
  89. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  90. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  91. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab.len +0 -0
  92. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  93. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab_i +0 -0
  94. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  95. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab +0 -0
  96. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab.keystream +0 -0
  97. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  98. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab.len +0 -0
  99. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab.values.at +0 -0
  100. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab_i +0 -0
  101. package/android/build/kotlin/compileDebugKotlin/caches-jvm/lookups/lookups.tab_i.len +0 -0
  102. package/android/build/kotlin/compileDebugKotlin/last-build.bin +0 -0
  103. package/android/build/outputs/logs/manifest-merger-debug-report.txt +52 -0
  104. package/android/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt +2 -0
  105. package/android/build/tmp/kotlin-classes/debug/META-INF/amazonivsreactnativeplayer_debug.kotlin_module +0 -0
  106. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsPackage.class +0 -0
  107. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView$$special$$inlined$timerTask$1.class +0 -0
  108. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView$1.class +0 -0
  109. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView$Events.class +0 -0
  110. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView$WhenMappings.class +0 -0
  111. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView$mLayoutRunnable$1.class +0 -0
  112. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsView.class +0 -0
  113. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsViewManager$Commands.class +0 -0
  114. package/android/build/tmp/kotlin-classes/debug/com/amazonaws/ivs/reactnative/player/AmazonIvsViewManager.class +0 -0
  115. package/android/build.gradle +138 -0
  116. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  117. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  118. package/android/gradle.properties +5 -0
  119. package/android/gradlew +183 -0
  120. package/android/gradlew.bat +84 -0
  121. package/android/src/main/AndroidManifest.xml +11 -0
  122. package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsPackage.kt +16 -0
  123. package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsView.kt +410 -0
  124. package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsViewManager.kt +115 -0
  125. package/ios/AmazonIvs-Bridging-Header.h +3 -0
  126. package/ios/AmazonIvs.xcodeproj/project.pbxproj +283 -0
  127. package/ios/AmazonIvsManager.m +35 -0
  128. package/ios/AmazonIvsManager.swift +29 -0
  129. package/ios/AmazonIvsView.swift +414 -0
  130. package/lib/commonjs/IVSPlayer.js +245 -0
  131. package/lib/commonjs/IVSPlayer.js.flow +53 -0
  132. package/lib/commonjs/IVSPlayer.js.map +1 -0
  133. package/lib/commonjs/enums.js +27 -0
  134. package/lib/commonjs/enums.js.flow +21 -0
  135. package/lib/commonjs/enums.js.map +1 -0
  136. package/lib/commonjs/index.js +43 -0
  137. package/lib/commonjs/index.js.flow +11 -0
  138. package/lib/commonjs/index.js.map +1 -0
  139. package/lib/commonjs/types.js +2 -0
  140. package/lib/commonjs/types.js.flow +44 -0
  141. package/lib/commonjs/types.js.map +1 -0
  142. package/lib/module/IVSPlayer.js +229 -0
  143. package/lib/module/IVSPlayer.js.flow +53 -0
  144. package/lib/module/IVSPlayer.js.map +1 -0
  145. package/lib/module/enums.js +19 -0
  146. package/lib/module/enums.js.flow +21 -0
  147. package/lib/module/enums.js.map +1 -0
  148. package/lib/module/index.js +5 -0
  149. package/lib/module/index.js.flow +11 -0
  150. package/lib/module/index.js.map +1 -0
  151. package/lib/module/types.js +2 -0
  152. package/lib/module/types.js.flow +44 -0
  153. package/lib/module/types.js.map +1 -0
  154. package/lib/typescript/IVSPlayer.d.ts +41 -0
  155. package/lib/typescript/__tests__/index.test.d.ts +1 -0
  156. package/lib/typescript/enums.d.ts +13 -0
  157. package/lib/typescript/index.d.ts +4 -0
  158. package/lib/typescript/types.d.ts +37 -0
  159. package/package.json +149 -0
  160. package/src/IVSPlayer.js.flow +53 -0
  161. package/src/IVSPlayer.tsx +366 -0
  162. package/src/__tests__/index.test.tsx +226 -0
  163. package/src/enums.js.flow +21 -0
  164. package/src/enums.ts +14 -0
  165. package/src/index.js.flow +11 -0
  166. package/src/index.ts +5 -0
  167. package/src/types.js.flow +44 -0
  168. package/src/types.ts +42 -0
@@ -0,0 +1,84 @@
1
+ @rem
2
+ @rem Copyright 2015 the original author or authors.
3
+ @rem
4
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
5
+ @rem you may not use this file except in compliance with the License.
6
+ @rem You may obtain a copy of the License at
7
+ @rem
8
+ @rem https://www.apache.org/licenses/LICENSE-2.0
9
+ @rem
10
+ @rem Unless required by applicable law or agreed to in writing, software
11
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
12
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ @rem See the License for the specific language governing permissions and
14
+ @rem limitations under the License.
15
+ @rem
16
+
17
+ @if "%DEBUG%" == "" @echo off
18
+ @rem ##########################################################################
19
+ @rem
20
+ @rem Gradle startup script for Windows
21
+ @rem
22
+ @rem ##########################################################################
23
+
24
+ @rem Set local scope for the variables with windows NT shell
25
+ if "%OS%"=="Windows_NT" setlocal
26
+
27
+ set DIRNAME=%~dp0
28
+ if "%DIRNAME%" == "" set DIRNAME=.
29
+ set APP_BASE_NAME=%~n0
30
+ set APP_HOME=%DIRNAME%
31
+
32
+ @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
33
+ set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
34
+
35
+ @rem Find java.exe
36
+ if defined JAVA_HOME goto findJavaFromJavaHome
37
+
38
+ set JAVA_EXE=java.exe
39
+ %JAVA_EXE% -version >NUL 2>&1
40
+ if "%ERRORLEVEL%" == "0" goto execute
41
+
42
+ echo.
43
+ echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
44
+ echo.
45
+ echo Please set the JAVA_HOME variable in your environment to match the
46
+ echo location of your Java installation.
47
+
48
+ goto fail
49
+
50
+ :findJavaFromJavaHome
51
+ set JAVA_HOME=%JAVA_HOME:"=%
52
+ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
53
+
54
+ if exist "%JAVA_EXE%" goto execute
55
+
56
+ echo.
57
+ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
58
+ echo.
59
+ echo Please set the JAVA_HOME variable in your environment to match the
60
+ echo location of your Java installation.
61
+
62
+ goto fail
63
+
64
+ :execute
65
+ @rem Setup the command line
66
+
67
+ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
68
+
69
+ @rem Execute Gradle
70
+ "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
71
+ :end
72
+ @rem End local scope for the variables with windows NT shell
73
+ if "%ERRORLEVEL%"=="0" goto mainEnd
74
+
75
+ :fail
76
+ rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77
+ rem the _cmd.exe /c_ return code!
78
+ if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79
+ exit /b 1
80
+
81
+ :mainEnd
82
+ if "%OS%"=="Windows_NT" endlocal
83
+
84
+ :omega
@@ -0,0 +1,11 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="com.amazonaws.ivs.reactnative.player">
3
+ <application>
4
+ <meta-data
5
+ android:name="com.amazonaws.ivs.player.FRAMEWORK_NAME"
6
+ android:value="reactnativeplayer" />
7
+ <meta-data
8
+ android:name="com.amazonaws.ivs.player.FRAMEWORK_VERSION"
9
+ android:value="${sdkVersion}" />
10
+ </application>
11
+ </manifest>
@@ -0,0 +1,16 @@
1
+ package com.amazonaws.ivs.reactnative.player
2
+
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
7
+
8
+ class AmazonIvsPackage : ReactPackage {
9
+ override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
10
+ return emptyList()
11
+ }
12
+
13
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
14
+ return listOf<ViewManager<*, *>>(AmazonIvsViewManager())
15
+ }
16
+ }
@@ -0,0 +1,410 @@
1
+ package com.amazonaws.ivs.reactnative.player
2
+
3
+ import android.net.Uri
4
+ import android.widget.FrameLayout
5
+ import com.amazonaws.ivs.player.*
6
+ import com.facebook.react.bridge.Arguments
7
+ import com.facebook.react.bridge.LifecycleEventListener
8
+ import com.facebook.react.bridge.ReactContext
9
+ import com.facebook.react.bridge.ReadableMap
10
+ import com.facebook.react.uimanager.ThemedReactContext
11
+ import com.facebook.react.uimanager.events.RCTEventEmitter
12
+ import java.util.*
13
+ import java.util.concurrent.TimeUnit
14
+ import kotlin.concurrent.timerTask
15
+
16
+ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(context), LifecycleEventListener {
17
+ private var playerView: PlayerView? = null
18
+ private var player: Player? = null
19
+ private var streamUri: Uri? = null
20
+ private val playerListener: Player.Listener?
21
+
22
+ var playerObserver: Timer? = null
23
+ private var lastLiveLatency: Long? = null
24
+ private var lastBitrate: Long? = null
25
+ private var lastDuration: Long? = null
26
+ private var finishedLoading: Boolean = false
27
+
28
+ enum class Events(private val mName: String) {
29
+ STATE_CHANGED("onPlayerStateChange"),
30
+ DURATION_CHANGED("onDurationChange"),
31
+ ERROR("onError"),
32
+ QUALITY_CHANGED("onQualityChange"),
33
+ CUE("onTextCue"),
34
+ METADATA_CUE("onTextMetadataCue"),
35
+ LOAD("onLoad"),
36
+ LOAD_START("onLoadStart"),
37
+ REBUFFERING("onRebuffering"),
38
+ SEEK("onSeek"),
39
+ DATA("onData"),
40
+ LIVE_LATENCY_CHANGED("onLiveLatencyChange"),
41
+ VIDEO_STATISTICS("onVideoStatistics"),
42
+ PROGRESS("onProgress");
43
+
44
+ override fun toString(): String {
45
+ return mName
46
+ }
47
+ }
48
+
49
+ init {
50
+ playerView = PlayerView(context)
51
+ player = playerView?.player
52
+ playerView?.controlsEnabled = false
53
+
54
+ (context as ThemedReactContext).addLifecycleEventListener(this)
55
+
56
+ playerListener = object : Player.Listener() {
57
+ override fun onStateChanged(state: Player.State) {
58
+ onPlayerStateChange(state)
59
+ }
60
+
61
+ override fun onDurationChanged(duration: Long) {
62
+ onDurationChange(duration)
63
+ }
64
+
65
+ override fun onRebuffering() {
66
+ onPlayerRebuffering()
67
+ }
68
+
69
+ override fun onSeekCompleted(position: Long) {
70
+ onSeek(position)
71
+ }
72
+
73
+ override fun onQualityChanged(quality: Quality) {
74
+ onQualityChange(quality)
75
+ }
76
+
77
+ override fun onVideoSizeChanged(p0: Int, p1: Int) {
78
+ post(mLayoutRunnable)
79
+ }
80
+
81
+ override fun onCue(cue: Cue) {
82
+ if (cue is TextCue) {
83
+ onTextCue(cue)
84
+ } else if (cue is TextMetadataCue) {
85
+ onTextMetadataCue(cue)
86
+ }
87
+ }
88
+
89
+ override fun onError(e: PlayerException) {
90
+ onError(e.errorMessage)
91
+ }
92
+ }
93
+
94
+ player?.addListener(playerListener);
95
+ addView(playerView)
96
+
97
+ playerObserver = Timer("observerInterval", false)
98
+ playerObserver?.schedule(timerTask {
99
+ intervalHandler()
100
+ }, 0, 1000)
101
+ }
102
+
103
+ fun setStreamUrl(streamUrl: String) {
104
+ player?.let { player ->
105
+ val reactContext = context as ReactContext
106
+ val uri = Uri.parse(streamUrl);
107
+ this.streamUri = uri;
108
+
109
+ finishedLoading = false
110
+ player.load(uri)
111
+
112
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.LOAD_START.toString(), Arguments.createMap())
113
+ }
114
+ }
115
+
116
+ fun setMuted(muted: Boolean) {
117
+ player?.isMuted = muted
118
+ }
119
+
120
+ fun setVolume(volume: Double) {
121
+ player?.setVolume(volume.toFloat())
122
+ }
123
+
124
+ fun setLiveLowLatency(liveLowLatency: Boolean) {
125
+ player?.setLiveLowLatencyEnabled(liveLowLatency)
126
+ }
127
+
128
+ fun setPlaybackRate(playbackRate: Double) {
129
+ player?.playbackRate = playbackRate.toFloat()
130
+ }
131
+
132
+ fun setLogLevel(logLevel: Double) {
133
+ when (logLevel.toInt()) {
134
+ 0 -> player?.setLogLevel(Player.LogLevel.DEBUG)
135
+ 1 -> player?.setLogLevel(Player.LogLevel.INFO)
136
+ 2 -> player?.setLogLevel(Player.LogLevel.WARNING)
137
+ 3 -> player?.setLogLevel(Player.LogLevel.ERROR)
138
+ }
139
+ }
140
+
141
+ private fun findQuality(quality: ReadableMap?): Quality? {
142
+ val newQuality = player?.qualities?.first { x ->
143
+ x.name == quality?.getString("name") &&
144
+ x.codecs == quality.getString("codecs") &&
145
+ x.bitrate == quality.getInt("bitrate") &&
146
+ x.framerate == quality.getDouble("framerate").toFloat() &&
147
+ x.width == quality.getInt("width") &&
148
+ x.height == quality.getInt("height")
149
+ }
150
+
151
+ return newQuality
152
+ }
153
+
154
+ fun setQuality(quality: ReadableMap?) {
155
+ if (quality != null) {
156
+ player?.quality = findQuality(quality)!!
157
+ }
158
+ }
159
+
160
+ fun setAutoMaxQuality(quality: ReadableMap?) {
161
+ if (quality != null) {
162
+ player?.setAutoMaxQuality(findQuality(quality)!!)
163
+ }
164
+ }
165
+
166
+ fun setAutoQualityMode(autoQualityMode: Boolean) {
167
+ player?.isAutoQualityMode = autoQualityMode
168
+ }
169
+
170
+ fun onTextCue(cue: TextCue) {
171
+ val reactContext = context as ReactContext
172
+
173
+ val textCue = Arguments.createMap()
174
+ textCue.putString("type", cue.javaClass.name)
175
+ textCue.putDouble("line", cue.line.toDouble())
176
+ textCue.putDouble("size", cue.size.toDouble())
177
+ textCue.putDouble("position", cue.position.toDouble())
178
+ textCue.putString("text", cue.text)
179
+ textCue.putInt("textAlignment", cue.textAlign.ordinal)
180
+
181
+ val data = Arguments.createMap()
182
+ data.putMap("textCue", textCue)
183
+
184
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.CUE.toString(), data)
185
+ }
186
+
187
+ fun setMaxBitrate(bitrate: Double) {
188
+ player?.setAutoMaxBitrate(bitrate.toInt())
189
+ }
190
+
191
+ fun setInitialBufferDuration(duration: Double) {
192
+ val valueInMilliseconds = duration * 1000
193
+ player?.setInitialBufferDuration(valueInMilliseconds.toLong())
194
+ }
195
+
196
+ fun onTextMetadataCue(cue: TextMetadataCue) {
197
+ val reactContext = context as ReactContext
198
+
199
+ val textMetadataCue = Arguments.createMap()
200
+ textMetadataCue.putString("type", cue.javaClass.name)
201
+ textMetadataCue.putString("text", cue.text)
202
+ textMetadataCue.putString("description", cue.description)
203
+
204
+ val data = Arguments.createMap()
205
+ data.putMap("textMetadataCue", textMetadataCue)
206
+
207
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.METADATA_CUE.toString(), data)
208
+ }
209
+
210
+ fun onDurationChange(duration: Long) {
211
+ val reactContext = context as ReactContext
212
+ val data = Arguments.createMap()
213
+ val parsedDuration = getDuration(duration);
214
+ data.putDouble("duration", parsedDuration)
215
+
216
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.DURATION_CHANGED.toString(), data)
217
+ }
218
+
219
+ fun onError(error: String) {
220
+ val reactContext = context as ReactContext
221
+ val data = Arguments.createMap()
222
+ data.putString("error", error)
223
+
224
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.ERROR.toString(), data)
225
+ }
226
+
227
+ fun onSeek(position: Long) {
228
+ val reactContext = context as ReactContext
229
+ val data = Arguments.createMap()
230
+ data.putInt("position", TimeUnit.MILLISECONDS.toSeconds(position).toInt())
231
+
232
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.SEEK.toString(), data)
233
+ }
234
+
235
+ fun onProgress(position: Long) {
236
+ val reactContext = context as ReactContext
237
+ val data = Arguments.createMap()
238
+ data.putInt("position", TimeUnit.MILLISECONDS.toSeconds(position).toInt())
239
+
240
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.PROGRESS.toString(), data)
241
+ }
242
+
243
+ private val mLayoutRunnable = Runnable {
244
+ measure(
245
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
246
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY))
247
+ layout(left, top, right, bottom)
248
+ }
249
+
250
+ fun play() {
251
+ player?.play()
252
+ }
253
+
254
+ fun pause() {
255
+ player?.pause()
256
+ }
257
+
258
+ fun seekTo(position: Long) {
259
+ player?.seekTo(TimeUnit.SECONDS.toMillis(position))
260
+ }
261
+
262
+ fun onPlayerStateChange(state: Player.State) {
263
+ val reactContext = context as ReactContext
264
+
265
+ when (state) {
266
+ Player.State.PLAYING -> {
267
+ if (!finishedLoading) {
268
+ val onLoadData = Arguments.createMap()
269
+ val parsedDuration = getDuration(player!!.duration);
270
+ onLoadData.putDouble("duration", parsedDuration)
271
+
272
+ finishedLoading = true
273
+
274
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.LOAD.toString(), onLoadData)
275
+ }
276
+ }
277
+ Player.State.READY -> {
278
+ val data = Arguments.createMap()
279
+ val playerData = Arguments.createMap()
280
+ playerData.putString("version", player?.version)
281
+ playerData.putString("sessionId", player?.sessionId)
282
+
283
+ val qualities = Arguments.createArray()
284
+ for (quality in player!!.qualities) {
285
+ val parsedQuality = Arguments.createMap()
286
+ parsedQuality.putString("name", quality.name)
287
+ parsedQuality.putString("codecs", quality.codecs)
288
+ parsedQuality.putInt("bitrate", quality.bitrate)
289
+ parsedQuality.putDouble("framerate", quality.framerate.toDouble())
290
+ parsedQuality.putInt("width", quality.width)
291
+ parsedQuality.putInt("height", quality.height)
292
+ qualities.pushMap(parsedQuality)
293
+ }
294
+ playerData.putArray("qualities", qualities)
295
+ data.putMap("playerData", playerData)
296
+
297
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.DATA.toString(), data)
298
+ };
299
+ }
300
+
301
+ val onStateChangeData = Arguments.createMap()
302
+ onStateChangeData.putString("state", mapPlayerState(state))
303
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.STATE_CHANGED.toString(), onStateChangeData)
304
+ }
305
+
306
+ fun onQualityChange(quality: Quality) {
307
+ val reactContext = context as ReactContext
308
+
309
+ val newQuality = Arguments.createMap()
310
+ newQuality.putString("name", quality.name)
311
+ newQuality.putString("codecs", quality.codecs)
312
+ newQuality.putInt("bitrate", quality.bitrate)
313
+ newQuality.putDouble("framerate", quality.framerate.toDouble())
314
+ newQuality.putInt("width", quality.width)
315
+ newQuality.putInt("height", quality.height)
316
+
317
+ val data = Arguments.createMap()
318
+ data.putMap("quality", newQuality)
319
+
320
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.QUALITY_CHANGED.toString(), data)
321
+ }
322
+
323
+ fun onPlayerRebuffering() {
324
+ val reactContext = context as ReactContext
325
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.REBUFFERING.toString(), Arguments.createMap())
326
+ }
327
+
328
+ private fun intervalHandler() {
329
+ val reactContext = context as ReactContext
330
+
331
+ if (lastLiveLatency != player?.liveLatency) {
332
+ val liveLatencyData = Arguments.createMap()
333
+
334
+ player?.liveLatency?.let { liveLatency ->
335
+ liveLatencyData.putInt("liveLatency", liveLatency.toInt())
336
+ } ?: run {
337
+ liveLatencyData.putNull("liveLatency")
338
+ }
339
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.LIVE_LATENCY_CHANGED.toString(), liveLatencyData)
340
+
341
+ lastLiveLatency = player?.liveLatency
342
+ }
343
+
344
+
345
+ if (lastBitrate != player?.averageBitrate || lastDuration != player?.duration) {
346
+ val onVideoData = Arguments.createMap()
347
+ val videoData = Arguments.createMap()
348
+
349
+ player?.duration?.let { duration ->
350
+ val parsedDuration = getDuration(duration)
351
+ videoData.putDouble("duration", parsedDuration)
352
+ } ?: run {
353
+ videoData.putNull("duration")
354
+ }
355
+
356
+ player?.averageBitrate?.let { averageBitrate ->
357
+ videoData.putInt("bitrate", averageBitrate.toInt())
358
+ } ?: run {
359
+ videoData.putNull("bitrate")
360
+ }
361
+
362
+ onVideoData.putMap("videoData", videoData)
363
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.VIDEO_STATISTICS.toString(), onVideoData)
364
+
365
+ lastBitrate = player?.averageBitrate
366
+ lastDuration = player?.duration
367
+ }
368
+ player?.position?.let { position ->
369
+ if (position > 0 && player?.state === Player.State.PLAYING) {
370
+ onProgress(position)
371
+ }
372
+ }
373
+ }
374
+
375
+ private fun getDuration(duration: Long): Double {
376
+ val durationInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration).toInt()
377
+ return durationInSeconds.toDouble()
378
+ }
379
+
380
+ private fun mapPlayerState(state: Player.State): String {
381
+ return when(state) {
382
+ Player.State.PLAYING -> "Playing"
383
+ Player.State.BUFFERING -> "Buffering"
384
+ Player.State.READY -> "Ready"
385
+ Player.State.IDLE -> "Idle"
386
+ Player.State.ENDED -> "Ended"
387
+ }
388
+ }
389
+
390
+ override fun onHostResume() {
391
+ play()
392
+ }
393
+
394
+ override fun onHostPause() {
395
+ pause()
396
+ }
397
+
398
+ override fun onHostDestroy() {
399
+ cleanup()
400
+ }
401
+
402
+ fun cleanup() {
403
+ player?.removeListener(playerListener!!)
404
+ player?.release()
405
+ player = null
406
+
407
+ playerObserver?.cancel()
408
+ playerObserver = null
409
+ }
410
+ }
@@ -0,0 +1,115 @@
1
+ package com.amazonaws.ivs.reactnative.player
2
+
3
+ import com.facebook.react.bridge.ReadableArray
4
+ import com.facebook.react.bridge.ReadableMap
5
+ import com.facebook.react.common.MapBuilder
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.annotations.ReactProp
9
+
10
+ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
11
+ private enum class Commands {
12
+ PLAY,
13
+ PAUSE,
14
+ SEEK_TO
15
+ }
16
+
17
+ override fun getName() = "AmazonIvs"
18
+
19
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Map<String, String>>? {
20
+ val builder: MapBuilder.Builder<String, Map<String, String>> = MapBuilder.builder<String, Map<String, String>>()
21
+ for (event in AmazonIvsView.Events.values()) {
22
+ builder.put(event.toString(), MapBuilder.of("registrationName", event.toString()))
23
+ }
24
+ return builder.build()
25
+ }
26
+
27
+ override fun getCommandsMap(): Map<String, Int>? {
28
+ return MapBuilder.of(
29
+ "play",
30
+ Commands.PLAY.ordinal,
31
+ "pause",
32
+ Commands.PAUSE.ordinal,
33
+ "seekTo",
34
+ Commands.SEEK_TO.ordinal
35
+ )
36
+ }
37
+
38
+ override fun receiveCommand(view: AmazonIvsView, commandType: Int, args: ReadableArray?) {
39
+ when (commandType) {
40
+ Commands.PLAY.ordinal -> view.play()
41
+ Commands.PAUSE.ordinal -> view.pause()
42
+ Commands.SEEK_TO.ordinal -> {
43
+ args?.getInt(0)?.let { position ->
44
+ view.seekTo(position.toLong())
45
+ }
46
+ }
47
+ else -> {
48
+ }
49
+ }
50
+ }
51
+
52
+ @ReactProp(name = "streamUrl")
53
+ fun setStreamUrl(view: AmazonIvsView, streamUrl: String) {
54
+ view.setStreamUrl(streamUrl);
55
+ }
56
+
57
+ @ReactProp(name = "muted")
58
+ fun setMuted(view: AmazonIvsView, muted: Boolean) {
59
+ view.setMuted(muted)
60
+ }
61
+
62
+ @ReactProp(name = "volume")
63
+ fun setVolume(view: AmazonIvsView, volume: Double) {
64
+ view.setVolume(volume)
65
+ }
66
+
67
+ @ReactProp(name = "liveLowLatency")
68
+ fun setLiveLowLatency(view: AmazonIvsView, liveLowLatency: Boolean) {
69
+ view.setLiveLowLatency(liveLowLatency)
70
+ }
71
+
72
+ @ReactProp(name = "playbackRate")
73
+ fun setPlaybackRate(view: AmazonIvsView, playbackRate: Double) {
74
+ view.setPlaybackRate(playbackRate)
75
+ }
76
+
77
+ @ReactProp(name = "logLevel")
78
+ fun setLogLevel(view: AmazonIvsView, logLevel: Double) {
79
+ view.setLogLevel(logLevel)
80
+ }
81
+
82
+ @ReactProp(name = "quality")
83
+ fun setQuality(view: AmazonIvsView, quality: ReadableMap?) {
84
+ view.setQuality(quality)
85
+ }
86
+
87
+ @ReactProp(name = "autoMaxQuality")
88
+ fun setAutoMaxQuality(view: AmazonIvsView, quality: ReadableMap?) {
89
+ view.setAutoMaxQuality(quality)
90
+ }
91
+
92
+ @ReactProp(name = "autoQualityMode")
93
+ fun setAutoQualityMode(view: AmazonIvsView, autoQualityMode: Boolean) {
94
+ view.setAutoQualityMode(autoQualityMode)
95
+ }
96
+
97
+ @ReactProp(name = "maxBitrate")
98
+ fun setMaxBitrate(view: AmazonIvsView, bitrate: Double) {
99
+ view.setMaxBitrate(bitrate)
100
+ }
101
+
102
+ @ReactProp(name = "initialBufferDuration")
103
+ fun setInitialBufferDuration(view: AmazonIvsView, duration: Double) {
104
+ view.setInitialBufferDuration(duration)
105
+ }
106
+
107
+ override fun createViewInstance(reactContext: ThemedReactContext): AmazonIvsView {
108
+ return AmazonIvsView(reactContext)
109
+ }
110
+
111
+ override fun onDropViewInstance(view: AmazonIvsView) {
112
+ super.onDropViewInstance(view)
113
+ view.cleanup()
114
+ }
115
+ }
@@ -0,0 +1,3 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
3
+ #import "React/RCTUIManager.h"