@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.
Files changed (61) hide show
  1. package/.github/CODEOWNERS +2 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/.github/ISSUE_TEMPLATE/question.md +11 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  6. package/CODE_OF_CONDUCT.md +128 -0
  7. package/LICENSE +21 -0
  8. package/README.md +425 -0
  9. package/RNJWPlayer.podspec +44 -0
  10. package/android/.gradle/8.1.1/checksums/checksums.lock +0 -0
  11. package/android/.gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock +0 -0
  12. package/android/.gradle/8.1.1/dependencies-accessors/gc.properties +0 -0
  13. package/android/.gradle/8.1.1/fileChanges/last-build.bin +0 -0
  14. package/android/.gradle/8.1.1/fileHashes/fileHashes.lock +0 -0
  15. package/android/.gradle/8.1.1/gc.properties +0 -0
  16. package/android/.gradle/8.2/checksums/checksums.lock +0 -0
  17. package/android/.gradle/8.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  18. package/android/.gradle/8.2/dependencies-accessors/gc.properties +0 -0
  19. package/android/.gradle/8.2/fileChanges/last-build.bin +0 -0
  20. package/android/.gradle/8.2/fileHashes/fileHashes.lock +0 -0
  21. package/android/.gradle/8.2/gc.properties +0 -0
  22. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  23. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  24. package/android/.gradle/config.properties +2 -0
  25. package/android/.gradle/vcs-1/gc.properties +0 -0
  26. package/android/.idea/gradle.xml +12 -0
  27. package/android/.idea/migrations.xml +10 -0
  28. package/android/.idea/misc.xml +10 -0
  29. package/android/.idea/vcs.xml +6 -0
  30. package/android/.idea/workspace.xml +54 -0
  31. package/android/build.gradle +110 -0
  32. package/android/local.properties +8 -0
  33. package/android/src/main/AndroidManifest.xml +25 -0
  34. package/android/src/main/java/com/jwplayer/rnjwplayer/ArrayUtil.java +129 -0
  35. package/android/src/main/java/com/jwplayer/rnjwplayer/CastOptionsProvider.java +55 -0
  36. package/android/src/main/java/com/jwplayer/rnjwplayer/MapUtil.java +136 -0
  37. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayer.java +76 -0
  38. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerAds.java +239 -0
  39. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerModule.java +526 -0
  40. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerPackage.java +30 -0
  41. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerView.java +1499 -0
  42. package/android/src/main/java/com/jwplayer/rnjwplayer/RNJWPlayerViewManager.java +171 -0
  43. package/android/src/main/java/com/jwplayer/rnjwplayer/Util.java +219 -0
  44. package/android/src/main/java/com/jwplayer/rnjwplayer/WidevineCallback.java +62 -0
  45. package/badges/license.svg +1 -0
  46. package/badges/version.svg +1 -0
  47. package/docs/legacy_readme.md +634 -0
  48. package/docs/props.md +43 -0
  49. package/docs/types.md +254 -0
  50. package/index.d.ts +564 -0
  51. package/index.js +699 -0
  52. package/ios/RNJWPlayer/RCTConvert+RNJWPlayer.swift +119 -0
  53. package/ios/RNJWPlayer/RNJWPlayer-Bridging-Header.h +5 -0
  54. package/ios/RNJWPlayer/RNJWPlayerAds.swift +260 -0
  55. package/ios/RNJWPlayer/RNJWPlayerModels.swift +149 -0
  56. package/ios/RNJWPlayer/RNJWPlayerView.swift +1837 -0
  57. package/ios/RNJWPlayer/RNJWPlayerViewController.swift +616 -0
  58. package/ios/RNJWPlayer/RNJWPlayerViewManager.m +132 -0
  59. package/ios/RNJWPlayer/RNJWPlayerViewManager.swift +500 -0
  60. package/ios/RNJWPlayer.xcodeproj/project.pbxproj +323 -0
  61. 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
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ #Fri Apr 19 13:27:57 PDT 2024
2
+ gradle.version=8.1.1
@@ -0,0 +1,2 @@
1
+ #Fri Apr 19 10:10:39 PDT 2024
2
+ java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home
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="ProjectMigrations">
4
+ <option name="MigrateToGradleLocalJavaHome">
5
+ <set>
6
+ <option value="$PROJECT_DIR$" />
7
+ </set>
8
+ </option>
9
+ </component>
10
+ </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,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
5
+ </component>
6
+ </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
+ }