@jwplayer/jwplayer-react-native 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.
- package/.github/CODEOWNERS +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/ISSUE_TEMPLATE/question.md +11 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/RNJWPlayer.podspec +44 -0
- package/android/.gradle/8.1.1/checksums/checksums.lock +0 -0
- package/android/.gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.1.1/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.1.1/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.1.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.1.1/gc.properties +0 -0
- package/android/.gradle/8.2/checksums/checksums.lock +0 -0
- package/android/.gradle/8.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.2/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.2/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.2/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.2/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/config.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/gradle.xml +12 -0
- package/android/.idea/migrations.xml +10 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/.idea/workspace.xml +54 -0
- package/android/build.gradle +110 -0
- package/android/local.properties +8 -0
- package/android/src/main/AndroidManifest.xml +25 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/ArrayUtil.java +129 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/CastOptionsProvider.java +55 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/MapUtil.java +136 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayer.java +76 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerAds.java +239 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerModule.java +526 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerPackage.java +30 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerView.java +1499 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerViewManager.java +171 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/Util.java +219 -0
- package/android/src/main/java/com/jwplayer/rnjwplayer/WidevineCallback.java +62 -0
- package/badges/license.svg +1 -0
- package/badges/version.svg +1 -0
- package/docs/legacy_readme.md +634 -0
- package/docs/props.md +43 -0
- package/docs/types.md +254 -0
- package/index.d.ts +564 -0
- package/index.js +699 -0
- package/ios/RNJWPlayer/RCTConvert+RNJWPlayer.swift +119 -0
- package/ios/RNJWPlayer/RNJWPlayer-Bridging-Header.h +5 -0
- package/ios/RNJWPlayer/RNJWPlayerAds.swift +260 -0
- package/ios/RNJWPlayer/RNJWPlayerModels.swift +149 -0
- package/ios/RNJWPlayer/RNJWPlayerView.swift +1837 -0
- package/ios/RNJWPlayer/RNJWPlayerViewController.swift +616 -0
- package/ios/RNJWPlayer/RNJWPlayerViewManager.m +132 -0
- package/ios/RNJWPlayer/RNJWPlayerViewManager.swift +500 -0
- package/ios/RNJWPlayer.xcodeproj/project.pbxproj +323 -0
- package/package.json +45 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = 'RNJWPlayer'
|
|
7
|
+
s.version = package['version']
|
|
8
|
+
s.summary = package['description']
|
|
9
|
+
s.license = package['license']
|
|
10
|
+
s.authors = package['author']
|
|
11
|
+
s.homepage = package['homepage']
|
|
12
|
+
s.platform = :ios, "14.0"
|
|
13
|
+
s.source = { :git => "https://github.com/jwplayer/jwplayer-react-native.git", :tag => "v#{s.version}" }
|
|
14
|
+
s.source_files = "ios/RNJWPlayer/*.{h,m,swift}"
|
|
15
|
+
s.dependency 'JWPlayerKit', '~> 4.18.0'
|
|
16
|
+
s.dependency 'React-Core'
|
|
17
|
+
s.static_framework = true
|
|
18
|
+
s.info_plist = {
|
|
19
|
+
'NSBluetoothAlwaysUsageDescription' => 'We will use your Bluetooth for media casting.',
|
|
20
|
+
'NSBluetoothPeripheralUsageDescription' => 'We will use your Bluetooth for media casting.',
|
|
21
|
+
'NSLocalNetworkUsageDescription' => 'We will use the local network to discover Cast-enabled devices on your WiFi network.',
|
|
22
|
+
'Privacy - Local Network Usage Description' => 'We will use the local network to discover Cast-enabled devices on your WiFi network.',
|
|
23
|
+
'NSMicrophoneUsageDescription' => 'We will use your Microphone for media casting.'
|
|
24
|
+
}
|
|
25
|
+
s.xcconfig = {
|
|
26
|
+
'OTHER_LDFLAGS': '-ObjC',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if defined?($RNJWPlayerUseGoogleCast)
|
|
30
|
+
Pod::UI.puts "RNJWPlayer: enable Google Cast"
|
|
31
|
+
s.dependency 'google-cast-sdk', '~> 4.8'
|
|
32
|
+
s.pod_target_xcconfig = {
|
|
33
|
+
'OTHER_SWIFT_FLAGS' => '$(inherited) -D USE_GOOGLE_CAST'
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
if defined?($RNJWPlayerUseGoogleIMA)
|
|
37
|
+
Pod::UI.puts "RNJWPlayer: enable IMA SDK"
|
|
38
|
+
s.dependency 'GoogleAds-IMA-iOS-SDK', '~>3.19.1'
|
|
39
|
+
s.pod_target_xcconfig = {
|
|
40
|
+
'OTHER_SWIFT_FLAGS' => '$(inherited) -D USE_GOOGLE_IMA'
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="GradleSettings">
|
|
4
|
+
<option name="linkedExternalProjectsSettings">
|
|
5
|
+
<GradleProjectSettings>
|
|
6
|
+
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
|
7
|
+
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
|
8
|
+
<option name="resolveExternalAnnotations" value="false" />
|
|
9
|
+
</GradleProjectSettings>
|
|
10
|
+
</option>
|
|
11
|
+
</component>
|
|
12
|
+
</project>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
|
4
|
+
<component name="ProjectRootManager">
|
|
5
|
+
<output url="file://$PROJECT_DIR$/build/classes" />
|
|
6
|
+
</component>
|
|
7
|
+
<component name="ProjectType">
|
|
8
|
+
<option name="id" value="Android" />
|
|
9
|
+
</component>
|
|
10
|
+
</project>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="AutoImportSettings">
|
|
4
|
+
<option name="autoReloadType" value="NONE" />
|
|
5
|
+
</component>
|
|
6
|
+
<component name="ChangeListManager">
|
|
7
|
+
<list default="true" id="daffcf00-d6d8-483c-a28f-ba2d6899d4c5" name="Changes" comment="">
|
|
8
|
+
<change beforePath="$PROJECT_DIR$/../Example/app/jsx/screens/DRMExample.js" beforeDir="false" afterPath="$PROJECT_DIR$/../Example/app/jsx/screens/DRMExample.js" afterDir="false" />
|
|
9
|
+
<change beforePath="$PROJECT_DIR$/../Example/ios/Podfile.lock" beforeDir="false" afterPath="$PROJECT_DIR$/../Example/ios/Podfile.lock" afterDir="false" />
|
|
10
|
+
<change beforePath="$PROJECT_DIR$/../Example/yarn.lock" beforeDir="false" afterPath="$PROJECT_DIR$/../Example/yarn.lock" afterDir="false" />
|
|
11
|
+
<change beforePath="$PROJECT_DIR$/../ios/RNJWPlayer/RNJWPlayerView.swift" beforeDir="false" afterPath="$PROJECT_DIR$/../ios/RNJWPlayer/RNJWPlayerView.swift" afterDir="false" />
|
|
12
|
+
</list>
|
|
13
|
+
<option name="SHOW_DIALOG" value="false" />
|
|
14
|
+
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
15
|
+
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
16
|
+
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
17
|
+
</component>
|
|
18
|
+
<component name="ClangdSettings">
|
|
19
|
+
<option name="formatViaClangd" value="false" />
|
|
20
|
+
</component>
|
|
21
|
+
<component name="Git.Settings">
|
|
22
|
+
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
|
|
23
|
+
</component>
|
|
24
|
+
<component name="ProjectColorInfo"><![CDATA[{
|
|
25
|
+
"associatedIndex": 5
|
|
26
|
+
}]]></component>
|
|
27
|
+
<component name="ProjectId" id="2fKP8rLRDpFiPXLGLH4cN1RyMXV" />
|
|
28
|
+
<component name="ProjectViewState">
|
|
29
|
+
<option name="showLibraryContents" value="true" />
|
|
30
|
+
</component>
|
|
31
|
+
<component name="PropertiesComponent"><![CDATA[{
|
|
32
|
+
"keyToString": {
|
|
33
|
+
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
|
34
|
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
35
|
+
"RunOnceActivity.cidr.known.project.marker": "true",
|
|
36
|
+
"android.gradle.sync.needed": "true",
|
|
37
|
+
"cf.first.check.clang-format": "false",
|
|
38
|
+
"cidr.known.project.marker": "true",
|
|
39
|
+
"git-widget-placeholder": "release/react-1.0.0",
|
|
40
|
+
"last_opened_file_path": "/Users/jmilham/source/repos/SDK/react/jwplayer-react-native/android"
|
|
41
|
+
}
|
|
42
|
+
}]]></component>
|
|
43
|
+
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
|
44
|
+
<component name="TaskManager">
|
|
45
|
+
<task active="true" id="Default" summary="Default task">
|
|
46
|
+
<changelist id="daffcf00-d6d8-483c-a28f-ba2d6899d4c5" name="Changes" comment="" />
|
|
47
|
+
<created>1713546640047</created>
|
|
48
|
+
<option name="number" value="Default" />
|
|
49
|
+
<option name="presentableId" value="Default" />
|
|
50
|
+
<updated>1713546640047</updated>
|
|
51
|
+
</task>
|
|
52
|
+
<servers />
|
|
53
|
+
</component>
|
|
54
|
+
</project>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
buildscript {
|
|
2
|
+
repositories {
|
|
3
|
+
google()
|
|
4
|
+
mavenCentral()
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
dependencies {
|
|
8
|
+
classpath 'com.android.tools.build:gradle:3.4.2'
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
apply plugin: 'com.android.library'
|
|
13
|
+
|
|
14
|
+
def safeExtGet(prop, fallback) {
|
|
15
|
+
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
def useIMA = safeExtGet("RNJWPlayerUseGoogleIMA", "")?.toBoolean() ?: false
|
|
19
|
+
def useCast = safeExtGet("RNJWPlayerUseGoogleCast", "")?.toBoolean() ?: false
|
|
20
|
+
|
|
21
|
+
android {
|
|
22
|
+
compileSdkVersion safeExtGet('compileSdkVersion', 28)
|
|
23
|
+
buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3')
|
|
24
|
+
|
|
25
|
+
defaultConfig {
|
|
26
|
+
minSdkVersion safeExtGet('minSdkVersion', 16)
|
|
27
|
+
targetSdkVersion safeExtGet('targetSdkVersion', 28)
|
|
28
|
+
versionCode 1
|
|
29
|
+
versionName "1.0"
|
|
30
|
+
ndk {
|
|
31
|
+
abiFilters "armeabi-v7a", "x86"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
buildTypes {
|
|
36
|
+
debug {
|
|
37
|
+
// Set the build config fields for the debug build type
|
|
38
|
+
buildConfigField "boolean", "USE_IMA", useIMA.toString()
|
|
39
|
+
buildConfigField "boolean", "USE_CAST", useCast.toString()
|
|
40
|
+
// ... other debug configurations
|
|
41
|
+
}
|
|
42
|
+
release {
|
|
43
|
+
// Set the build config fields for the release build type
|
|
44
|
+
buildConfigField "boolean", "USE_IMA", useIMA.toString()
|
|
45
|
+
buildConfigField "boolean", "USE_CAST", useCast.toString()
|
|
46
|
+
// ... other release configurations
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
lintOptions {
|
|
50
|
+
warning 'InvalidPackage'
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
allprojects {
|
|
55
|
+
repositories {
|
|
56
|
+
mavenLocal()
|
|
57
|
+
mavenCentral()
|
|
58
|
+
google()
|
|
59
|
+
maven {
|
|
60
|
+
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
|
61
|
+
url "$rootDir/../node_modules/react-native/android"
|
|
62
|
+
}
|
|
63
|
+
maven{
|
|
64
|
+
url 'https://mvn.jwplayer.com/content/repositories/releases/'
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
def jwPlayerVersion = "4.16.2"
|
|
70
|
+
def exoplayerVersion = "2.18.7" // Deprecated. Use Media3 when targeting JW SDK > 4.16.0
|
|
71
|
+
def media3ExoVersion = "1.1.1"
|
|
72
|
+
|
|
73
|
+
dependencies {
|
|
74
|
+
implementation 'com.facebook.react:react-native:+'
|
|
75
|
+
implementation 'com.google.code.gson:gson:2.9.0'
|
|
76
|
+
|
|
77
|
+
// JWPlayer SDK
|
|
78
|
+
implementation "com.jwplayer:jwplayer-core:${safeExtGet('jwPlayerVersion', jwPlayerVersion)}"
|
|
79
|
+
implementation "com.jwplayer:jwplayer-common:${safeExtGet('jwPlayerVersion', jwPlayerVersion)}"
|
|
80
|
+
implementation "com.jwplayer:jwplayer-ima:${safeExtGet('jwPlayerVersion', jwPlayerVersion)}"
|
|
81
|
+
implementation "com.jwplayer:jwplayer-chromecast:${safeExtGet('jwPlayerVersion', jwPlayerVersion)}"
|
|
82
|
+
|
|
83
|
+
// Ad dependencies
|
|
84
|
+
if (useIMA) {
|
|
85
|
+
implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.31.0'
|
|
86
|
+
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Cast dependencies
|
|
90
|
+
if (useCast) {
|
|
91
|
+
implementation 'com.google.android.gms:play-services-cast-framework:21.3.0'
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ExoPlayer dependencies
|
|
95
|
+
implementation "androidx.media3:media3-common:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
96
|
+
implementation "androidx.media3:media3-exoplayer:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
97
|
+
implementation "androidx.media3:media3-exoplayer-dash:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
98
|
+
implementation "androidx.media3:media3-exoplayer-hls:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
99
|
+
implementation "androidx.media3:media3-exoplayer-smoothstreaming:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
100
|
+
implementation "androidx.media3:media3-ui:${safeExtGet('media3ExoVersion', media3ExoVersion)}"
|
|
101
|
+
|
|
102
|
+
// JW Player Native UI dependencies
|
|
103
|
+
implementation 'com.squareup.picasso:picasso:2.71828'
|
|
104
|
+
implementation 'androidx.viewpager2:viewpager2:1.0.0'
|
|
105
|
+
implementation 'com.android.volley:volley:1.2.1'
|
|
106
|
+
implementation 'androidx.recyclerview:recyclerview:1.3.0'
|
|
107
|
+
implementation 'androidx.mediarouter:mediarouter:1.4.0'
|
|
108
|
+
implementation 'androidx.media:media:1.6.0'
|
|
109
|
+
}
|
|
110
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## This file must *NOT* be checked into Version Control Systems,
|
|
2
|
+
# as it contains information specific to your local configuration.
|
|
3
|
+
#
|
|
4
|
+
# Location of the SDK. This is only used by Gradle.
|
|
5
|
+
# For customization when using a Version Control System, please read the
|
|
6
|
+
# header note.
|
|
7
|
+
#Fri Apr 19 10:10:39 PDT 2024
|
|
8
|
+
sdk.dir=/Users/jmilham/Library/Android/sdk
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
3
|
+
package="com.jwplayer.rnjwplayer">
|
|
4
|
+
<uses-permission android:name="android.permission.INTERNET" />
|
|
5
|
+
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
6
|
+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
7
|
+
<uses-permission android:name="android.permission.BLUETOOTH"/>
|
|
8
|
+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
|
9
|
+
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
|
10
|
+
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
|
|
11
|
+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
|
12
|
+
<!-- READ_MEDIA_IMAGES, READ_MEDIA_VIDEO or READ_MEDIA_AUDIO.-->
|
|
13
|
+
|
|
14
|
+
<application>
|
|
15
|
+
<service
|
|
16
|
+
android:name="com.jwplayer.pub.api.background.MediaService"
|
|
17
|
+
android:exported="false">
|
|
18
|
+
<intent-filter>
|
|
19
|
+
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
|
20
|
+
</intent-filter>
|
|
21
|
+
</service>
|
|
22
|
+
</application>
|
|
23
|
+
|
|
24
|
+
</manifest>
|
|
25
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
package com.jwplayer.rnjwplayer;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments;
|
|
4
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
5
|
+
import com.facebook.react.bridge.ReadableType;
|
|
6
|
+
import com.facebook.react.bridge.WritableArray;
|
|
7
|
+
|
|
8
|
+
import java.util.Map;
|
|
9
|
+
|
|
10
|
+
import org.json.JSONArray;
|
|
11
|
+
import org.json.JSONObject;
|
|
12
|
+
import org.json.JSONException;
|
|
13
|
+
|
|
14
|
+
import android.util.Log;
|
|
15
|
+
|
|
16
|
+
public class ArrayUtil {
|
|
17
|
+
|
|
18
|
+
public static JSONArray toJSONArray(ReadableArray readableArray) throws JSONException {
|
|
19
|
+
JSONArray jsonArray = new JSONArray();
|
|
20
|
+
|
|
21
|
+
for (int i = 0; i < readableArray.size(); i++) {
|
|
22
|
+
ReadableType type = readableArray.getType(i);
|
|
23
|
+
|
|
24
|
+
switch (type) {
|
|
25
|
+
case Null:
|
|
26
|
+
jsonArray.put(i, null);
|
|
27
|
+
break;
|
|
28
|
+
case Boolean:
|
|
29
|
+
jsonArray.put(i, readableArray.getBoolean(i));
|
|
30
|
+
break;
|
|
31
|
+
case Number:
|
|
32
|
+
jsonArray.put(i, readableArray.getDouble(i));
|
|
33
|
+
break;
|
|
34
|
+
case String:
|
|
35
|
+
jsonArray.put(i, readableArray.getString(i));
|
|
36
|
+
break;
|
|
37
|
+
case Map:
|
|
38
|
+
jsonArray.put(i, MapUtil.toJSONObject(readableArray.getMap(i)));
|
|
39
|
+
break;
|
|
40
|
+
case Array:
|
|
41
|
+
jsonArray.put(i, ArrayUtil.toJSONArray(readableArray.getArray(i)));
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return jsonArray;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public static Object[] toArray(JSONArray jsonArray) throws JSONException {
|
|
49
|
+
Object[] array = new Object[jsonArray.length()];
|
|
50
|
+
|
|
51
|
+
for (int i = 0; i < jsonArray.length(); i++) {
|
|
52
|
+
Object value = jsonArray.get(i);
|
|
53
|
+
|
|
54
|
+
if (value instanceof JSONObject) {
|
|
55
|
+
value = MapUtil.toMap((JSONObject) value);
|
|
56
|
+
}
|
|
57
|
+
if (value instanceof JSONArray) {
|
|
58
|
+
value = ArrayUtil.toArray((JSONArray) value);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
array[i] = value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return array;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public static Object[] toArray(ReadableArray readableArray) {
|
|
68
|
+
Object[] array = new Object[readableArray.size()];
|
|
69
|
+
|
|
70
|
+
for (int i = 0; i < readableArray.size(); i++) {
|
|
71
|
+
ReadableType type = readableArray.getType(i);
|
|
72
|
+
|
|
73
|
+
switch (type) {
|
|
74
|
+
case Null:
|
|
75
|
+
array[i] = null;
|
|
76
|
+
break;
|
|
77
|
+
case Boolean:
|
|
78
|
+
array[i] = readableArray.getBoolean(i);
|
|
79
|
+
break;
|
|
80
|
+
case Number:
|
|
81
|
+
array[i] = readableArray.getDouble(i);
|
|
82
|
+
break;
|
|
83
|
+
case String:
|
|
84
|
+
array[i] = readableArray.getString(i);
|
|
85
|
+
break;
|
|
86
|
+
case Map:
|
|
87
|
+
array[i] = MapUtil.toMap(readableArray.getMap(i));
|
|
88
|
+
break;
|
|
89
|
+
case Array:
|
|
90
|
+
array[i] = ArrayUtil.toArray(readableArray.getArray(i));
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return array;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public static WritableArray toWritableArray(Object[] array) {
|
|
99
|
+
WritableArray writableArray = Arguments.createArray();
|
|
100
|
+
|
|
101
|
+
for (int i = 0; i < array.length; i++) {
|
|
102
|
+
Object value = array[i];
|
|
103
|
+
|
|
104
|
+
if (value == null) {
|
|
105
|
+
writableArray.pushNull();
|
|
106
|
+
}
|
|
107
|
+
if (value instanceof Boolean) {
|
|
108
|
+
writableArray.pushBoolean((Boolean) value);
|
|
109
|
+
}
|
|
110
|
+
if (value instanceof Double) {
|
|
111
|
+
writableArray.pushDouble((Double) value);
|
|
112
|
+
}
|
|
113
|
+
if (value instanceof Integer) {
|
|
114
|
+
writableArray.pushInt((Integer) value);
|
|
115
|
+
}
|
|
116
|
+
if (value instanceof String) {
|
|
117
|
+
writableArray.pushString((String) value);
|
|
118
|
+
}
|
|
119
|
+
if (value instanceof Map) {
|
|
120
|
+
writableArray.pushMap(MapUtil.toWritableMap((Map<String, Object>) value));
|
|
121
|
+
}
|
|
122
|
+
if (value.getClass().isArray()) {
|
|
123
|
+
writableArray.pushArray(ArrayUtil.toWritableArray((Object[]) value));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return writableArray;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
package com.jwplayer.rnjwplayer;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
|
|
5
|
+
import com.google.android.gms.cast.CastMediaControlIntent;
|
|
6
|
+
import com.google.android.gms.cast.LaunchOptions;
|
|
7
|
+
import com.google.android.gms.cast.framework.CastOptions;
|
|
8
|
+
import com.google.android.gms.cast.framework.OptionsProvider;
|
|
9
|
+
import com.google.android.gms.cast.framework.SessionProvider;
|
|
10
|
+
import com.google.android.gms.cast.framework.media.CastMediaOptions;
|
|
11
|
+
import com.google.android.gms.cast.framework.media.MediaIntentReceiver;
|
|
12
|
+
import com.google.android.gms.cast.framework.media.NotificationOptions;
|
|
13
|
+
|
|
14
|
+
import java.util.Arrays;
|
|
15
|
+
import java.util.List;
|
|
16
|
+
import java.util.Locale;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
public class CastOptionsProvider implements OptionsProvider {
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The Application Id to use, currently the Default Media Receiver.
|
|
23
|
+
*/
|
|
24
|
+
private static final String DEFAULT_APPLICATION_ID = CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID;
|
|
25
|
+
|
|
26
|
+
@Override
|
|
27
|
+
public CastOptions getCastOptions(Context context) {
|
|
28
|
+
final NotificationOptions notificationOptions = new NotificationOptions.Builder()
|
|
29
|
+
.setActions(Arrays.asList(
|
|
30
|
+
MediaIntentReceiver.ACTION_SKIP_NEXT,
|
|
31
|
+
MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
|
|
32
|
+
MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2})
|
|
33
|
+
.setTargetActivityClassName(RNJWPlayerView.class.getName())
|
|
34
|
+
.build();
|
|
35
|
+
|
|
36
|
+
final CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
|
|
37
|
+
.setNotificationOptions(notificationOptions)
|
|
38
|
+
.build();
|
|
39
|
+
|
|
40
|
+
final LaunchOptions launchOptions = new LaunchOptions.Builder()
|
|
41
|
+
.setLocale(Locale.US)
|
|
42
|
+
.build();
|
|
43
|
+
|
|
44
|
+
return new CastOptions.Builder()
|
|
45
|
+
.setReceiverApplicationId(DEFAULT_APPLICATION_ID)
|
|
46
|
+
.setCastMediaOptions(mediaOptions)
|
|
47
|
+
.setLaunchOptions(launchOptions)
|
|
48
|
+
.build();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public List<SessionProvider> getAdditionalSessionProviders(Context appContext) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
package com.jwplayer.rnjwplayer;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments;
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
5
|
+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
6
|
+
import com.facebook.react.bridge.ReadableType;
|
|
7
|
+
import com.facebook.react.bridge.WritableMap;
|
|
8
|
+
|
|
9
|
+
import java.util.Map;
|
|
10
|
+
import java.util.HashMap;
|
|
11
|
+
import java.util.Iterator;
|
|
12
|
+
|
|
13
|
+
import org.json.JSONArray;
|
|
14
|
+
import org.json.JSONObject;
|
|
15
|
+
import org.json.JSONException;
|
|
16
|
+
|
|
17
|
+
public class MapUtil {
|
|
18
|
+
|
|
19
|
+
public static JSONObject toJSONObject(ReadableMap readableMap) throws JSONException {
|
|
20
|
+
JSONObject jsonObject = new JSONObject();
|
|
21
|
+
|
|
22
|
+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
|
23
|
+
|
|
24
|
+
while (iterator.hasNextKey()) {
|
|
25
|
+
String key = iterator.nextKey();
|
|
26
|
+
ReadableType type = readableMap.getType(key);
|
|
27
|
+
|
|
28
|
+
switch (type) {
|
|
29
|
+
case Null:
|
|
30
|
+
jsonObject.put(key, null);
|
|
31
|
+
break;
|
|
32
|
+
case Boolean:
|
|
33
|
+
jsonObject.put(key, readableMap.getBoolean(key));
|
|
34
|
+
break;
|
|
35
|
+
case Number:
|
|
36
|
+
jsonObject.put(key, readableMap.getDouble(key));
|
|
37
|
+
break;
|
|
38
|
+
case String:
|
|
39
|
+
jsonObject.put(key, readableMap.getString(key));
|
|
40
|
+
break;
|
|
41
|
+
case Map:
|
|
42
|
+
jsonObject.put(key, MapUtil.toJSONObject(readableMap.getMap(key)));
|
|
43
|
+
break;
|
|
44
|
+
case Array:
|
|
45
|
+
jsonObject.put(key, ArrayUtil.toJSONArray(readableMap.getArray(key)));
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return jsonObject;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public static Map<String, Object> toMap(JSONObject jsonObject) throws JSONException {
|
|
54
|
+
Map<String, Object> map = new HashMap<>();
|
|
55
|
+
Iterator<String> iterator = jsonObject.keys();
|
|
56
|
+
|
|
57
|
+
while (iterator.hasNext()) {
|
|
58
|
+
String key = iterator.next();
|
|
59
|
+
Object value = jsonObject.get(key);
|
|
60
|
+
|
|
61
|
+
if (value instanceof JSONObject) {
|
|
62
|
+
value = MapUtil.toMap((JSONObject) value);
|
|
63
|
+
}
|
|
64
|
+
if (value instanceof JSONArray) {
|
|
65
|
+
value = ArrayUtil.toArray((JSONArray) value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
map.put(key, value);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return map;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public static Map<String, Object> toMap(ReadableMap readableMap) {
|
|
75
|
+
Map<String, Object> map = new HashMap<>();
|
|
76
|
+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
|
77
|
+
|
|
78
|
+
while (iterator.hasNextKey()) {
|
|
79
|
+
String key = iterator.nextKey();
|
|
80
|
+
ReadableType type = readableMap.getType(key);
|
|
81
|
+
|
|
82
|
+
switch (type) {
|
|
83
|
+
case Null:
|
|
84
|
+
map.put(key, null);
|
|
85
|
+
break;
|
|
86
|
+
case Boolean:
|
|
87
|
+
map.put(key, readableMap.getBoolean(key));
|
|
88
|
+
break;
|
|
89
|
+
case Number:
|
|
90
|
+
map.put(key, readableMap.getDouble(key));
|
|
91
|
+
break;
|
|
92
|
+
case String:
|
|
93
|
+
map.put(key, readableMap.getString(key));
|
|
94
|
+
break;
|
|
95
|
+
case Map:
|
|
96
|
+
map.put(key, MapUtil.toMap(readableMap.getMap(key)));
|
|
97
|
+
break;
|
|
98
|
+
case Array:
|
|
99
|
+
map.put(key, ArrayUtil.toArray(readableMap.getArray(key)));
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return map;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public static WritableMap toWritableMap(Map<String, Object> map) {
|
|
108
|
+
WritableMap writableMap = Arguments.createMap();
|
|
109
|
+
Iterator iterator = map.entrySet().iterator();
|
|
110
|
+
|
|
111
|
+
while (iterator.hasNext()) {
|
|
112
|
+
Map.Entry pair = (Map.Entry)iterator.next();
|
|
113
|
+
Object value = pair.getValue();
|
|
114
|
+
|
|
115
|
+
if (value == null) {
|
|
116
|
+
writableMap.putNull((String) pair.getKey());
|
|
117
|
+
} else if (value instanceof Boolean) {
|
|
118
|
+
writableMap.putBoolean((String) pair.getKey(), (Boolean) value);
|
|
119
|
+
} else if (value instanceof Double) {
|
|
120
|
+
writableMap.putDouble((String) pair.getKey(), (Double) value);
|
|
121
|
+
} else if (value instanceof Integer) {
|
|
122
|
+
writableMap.putInt((String) pair.getKey(), (Integer) value);
|
|
123
|
+
} else if (value instanceof String) {
|
|
124
|
+
writableMap.putString((String) pair.getKey(), (String) value);
|
|
125
|
+
} else if (value instanceof Map) {
|
|
126
|
+
writableMap.putMap((String) pair.getKey(), MapUtil.toWritableMap((Map<String, Object>) value));
|
|
127
|
+
} else if (value.getClass() != null && value.getClass().isArray()) {
|
|
128
|
+
writableMap.putArray((String) pair.getKey(), ArrayUtil.toWritableArray((Object[]) value));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
iterator.remove();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return writableMap;
|
|
135
|
+
}
|
|
136
|
+
}
|