diff --git a/.gitignore b/.gitignore
index f857a691..fd89a972 100644
--- a/.gitignore
+++ b/.gitignore
@@ -85,3 +85,5 @@ node_modules
expofs.md
ios/sentry.properties
android/sentry.properties
+Stremio addons refer
+trakt-docs
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 4bb7b500..d8870d1c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -95,8 +95,8 @@ android {
applicationId 'com.nuvio.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 25
- versionName "1.2.10"
+ versionCode 26
+ versionName "1.2.11"
buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
}
@@ -118,7 +118,7 @@ android {
def abiVersionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
applicationVariants.all { variant ->
variant.outputs.each { output ->
- def baseVersionCode = 25 // Current versionCode 25 from defaultConfig
+ def baseVersionCode = 26 // Current versionCode 26 from defaultConfig
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
def versionCode = baseVersionCode * 100 // Base multiplier
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index a76a5351..98e10195 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -3,5 +3,5 @@
contain
false
dark
- 1.2.10
+ 1.2.11
\ No newline at end of file
diff --git a/android/sentry.properties b/android/sentry.properties
index 8e272484..ae003a4b 100644
--- a/android/sentry.properties
+++ b/android/sentry.properties
@@ -1,4 +1,4 @@
defaults.url=https://sentry.io/
defaults.org=tapframe
defaults.project=react-native
-auth.token=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
\ No newline at end of file
+auth.token=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
diff --git a/app.json b/app.json
index a6843c69..b606a163 100644
--- a/app.json
+++ b/app.json
@@ -2,7 +2,7 @@
"expo": {
"name": "Nuvio",
"slug": "nuvio",
- "version": "1.2.10",
+ "version": "1.2.11",
"orientation": "default",
"backgroundColor": "#020404",
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
@@ -18,7 +18,7 @@
"supportsTablet": true,
"requireFullScreen": true,
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
- "buildNumber": "25",
+ "buildNumber": "26",
"infoPlist": {
"NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": true
@@ -52,7 +52,7 @@
"android.permission.WRITE_SETTINGS"
],
"package": "com.nuvio.app",
- "versionCode": 25,
+ "versionCode": 26,
"architectures": [
"arm64-v8a",
"armeabi-v7a",
@@ -105,6 +105,6 @@
"fallbackToCacheTimeout": 30000,
"url": "https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest"
},
- "runtimeVersion": "1.2.10"
+ "runtimeVersion": "1.2.11"
}
}
\ No newline at end of file
diff --git a/ios/KSPlayerManager.m b/ios/KSPlayerManager.m
index 5744e62d..708118ab 100644
--- a/ios/KSPlayerManager.m
+++ b/ios/KSPlayerManager.m
@@ -48,8 +48,8 @@ RCT_EXTERN_METHOD(showAirPlayPicker:(nonnull NSNumber *)node)
@interface RCT_EXTERN_MODULE(KSPlayerModule, RCTEventEmitter)
-RCT_EXTERN_METHOD(getTracks:(nonnull NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
-RCT_EXTERN_METHOD(getAirPlayState:(nonnull NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
-RCT_EXTERN_METHOD(showAirPlayPicker:(nonnull NSNumber *)nodeTag)
+RCT_EXTERN_METHOD(getTracks:(NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
+RCT_EXTERN_METHOD(getAirPlayState:(NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
+RCT_EXTERN_METHOD(showAirPlayPicker:(NSNumber *)nodeTag)
@end
diff --git a/ios/KSPlayerModule.swift b/ios/KSPlayerModule.swift
index 58ace7c1..27dd6142 100644
--- a/ios/KSPlayerModule.swift
+++ b/ios/KSPlayerModule.swift
@@ -25,7 +25,11 @@ class KSPlayerModule: RCTEventEmitter {
]
}
- @objc func getTracks(_ nodeTag: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ @objc func getTracks(_ nodeTag: NSNumber?, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ guard let nodeTag = nodeTag else {
+ reject("INVALID_ARGUMENT", "nodeTag must not be nil", nil)
+ return
+ }
DispatchQueue.main.async {
if let viewManager = self.bridge.module(for: KSPlayerViewManager.self) as? KSPlayerViewManager {
viewManager.getTracks(nodeTag, resolve: resolve, reject: reject)
@@ -35,7 +39,11 @@ class KSPlayerModule: RCTEventEmitter {
}
}
- @objc func getAirPlayState(_ nodeTag: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ @objc func getAirPlayState(_ nodeTag: NSNumber?, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ guard let nodeTag = nodeTag else {
+ reject("INVALID_ARGUMENT", "nodeTag must not be nil", nil)
+ return
+ }
DispatchQueue.main.async {
if let viewManager = self.bridge.module(for: KSPlayerViewManager.self) as? KSPlayerViewManager {
viewManager.getAirPlayState(nodeTag, resolve: resolve, reject: reject)
@@ -45,7 +53,11 @@ class KSPlayerModule: RCTEventEmitter {
}
}
- @objc func showAirPlayPicker(_ nodeTag: NSNumber) {
+ @objc func showAirPlayPicker(_ nodeTag: NSNumber?) {
+ guard let nodeTag = nodeTag else {
+ print("[KSPlayerModule] showAirPlayPicker called with nil nodeTag")
+ return
+ }
print("[KSPlayerModule] showAirPlayPicker called for nodeTag: \(nodeTag)")
DispatchQueue.main.async {
if let viewManager = self.bridge.module(for: KSPlayerViewManager.self) as? KSPlayerViewManager {
diff --git a/ios/Nuvio.xcodeproj/project.pbxproj b/ios/Nuvio.xcodeproj/project.pbxproj
index ce6a175d..c83f2125 100644
--- a/ios/Nuvio.xcodeproj/project.pbxproj
+++ b/ios/Nuvio.xcodeproj/project.pbxproj
@@ -413,14 +413,12 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/MobileVLCKit/MobileVLCKit.framework/MobileVLCKit",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MobileVLCKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
@@ -477,7 +475,7 @@
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
- PRODUCT_NAME = Nuvio;
+ PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -508,8 +506,8 @@
"-lc++",
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
- PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.hub;
- PRODUCT_NAME = Nuvio;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.nuvio.app";
+ PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/ios/Nuvio/Info.plist b/ios/Nuvio/Info.plist
index 40a35d5d..619dacdf 100644
--- a/ios/Nuvio/Info.plist
+++ b/ios/Nuvio/Info.plist
@@ -1,99 +1,103 @@
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Nuvio
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- 1.2.10
- CFBundleSignature
- ????
- CFBundleURLTypes
-
-
- CFBundleURLSchemes
-
- nuvio
- com.nuvio.app
-
-
-
- CFBundleURLSchemes
-
- exp+nuvio
-
-
-
- CFBundleVersion
- 25
- LSMinimumSystemVersion
- 12.0
- LSRequiresIPhoneOS
-
- LSSupportsOpeningDocumentsInPlace
-
- NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
-
- NSBonjourServices
-
- _http._tcp
- _googlecast._tcp
- _CC1AD845._googlecast._tcp
-
- RCTNewArchEnabled
-
- RCTRootViewBackgroundColor
- 4278322180
- UIBackgroundModes
-
- audio
-
- UIFileSharingEnabled
-
- UILaunchStoryboardName
- SplashScreen
- UIRequiredDeviceCapabilities
-
- arm64
-
- UIRequiresFullScreen
-
- UIStatusBarStyle
- UIStatusBarStyleDefault
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIUserInterfaceStyle
- Dark
- UIViewControllerBasedStatusBarAppearance
-
-
-
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Nuvio
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.2.11
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleURLSchemes
+
+ nuvio
+ com.nuvio.app
+
+
+
+ CFBundleURLSchemes
+
+ exp+nuvio
+
+
+
+ CFBundleVersion
+ 26
+ LSMinimumSystemVersion
+ 12.0
+ LSRequiresIPhoneOS
+
+ LSSupportsOpeningDocumentsInPlace
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ NSBonjourServices
+
+ _http._tcp
+ _googlecast._tcp
+ _CC1AD845._googlecast._tcp
+
+ NSLocalNetworkUsageDescription
+ Allow $(PRODUCT_NAME) to access your local network
+ NSMicrophoneUsageDescription
+ This app does not require microphone access.
+ RCTNewArchEnabled
+
+ RCTRootViewBackgroundColor
+ 4278322180
+ UIBackgroundModes
+
+ audio
+
+ UIFileSharingEnabled
+
+ UILaunchStoryboardName
+ SplashScreen
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UIRequiresFullScreen
+
+ UIStatusBarStyle
+ UIStatusBarStyleDefault
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIUserInterfaceStyle
+ Dark
+ UIViewControllerBasedStatusBarAppearance
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/NuvioRelease.entitlements b/ios/Nuvio/NuvioRelease.entitlements
index 903def2a..a0bc443f 100644
--- a/ios/Nuvio/NuvioRelease.entitlements
+++ b/ios/Nuvio/NuvioRelease.entitlements
@@ -1,8 +1,10 @@
-
- aps-environment
- development
-
-
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/Supporting/Expo.plist b/ios/Nuvio/Supporting/Expo.plist
index c7cf5f80..acc66a18 100644
--- a/ios/Nuvio/Supporting/Expo.plist
+++ b/ios/Nuvio/Supporting/Expo.plist
@@ -9,7 +9,7 @@
EXUpdatesLaunchWaitMs
30000
EXUpdatesRuntimeVersion
- 1.2.10
+ 1.2.11
EXUpdatesURL
https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest
diff --git a/ios/Podfile b/ios/Podfile
index 490153d6..7c61ff44 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -21,7 +21,7 @@ platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
prepare_react_native_project!
target 'Nuvio' do
- use_expo_modules!
+ use_expo_modules!(exclude: ['expo-libvlc-player'])
if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1'
config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 61b7dad7..ed449bc5 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,17 +1,17 @@
PODS:
- DisplayCriteria (1.1.0)
- - EASClient (1.0.7):
+ - EASClient (1.0.8):
- ExpoModulesCore
- - EXApplication (7.0.7):
+ - EXApplication (7.0.8):
- ExpoModulesCore
- - EXConstants (18.0.10):
+ - EXConstants (18.0.12):
- ExpoModulesCore
- EXJSONUtils (0.15.0)
- - EXManifests (1.0.8):
+ - EXManifests (1.0.10):
- ExpoModulesCore
- - EXNotifications (0.32.12):
+ - EXNotifications (0.32.15):
- ExpoModulesCore
- - Expo (54.0.23):
+ - Expo (54.0.29):
- ExpoModulesCore
- hermes-engine
- RCTRequired
@@ -36,15 +36,15 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - expo-dev-client (6.0.17):
+ - expo-dev-client (6.0.20):
- EXManifests
- expo-dev-launcher
- expo-dev-menu
- expo-dev-menu-interface
- EXUpdatesInterface
- - expo-dev-launcher (6.0.17):
+ - expo-dev-launcher (6.0.20):
- EXManifests
- - expo-dev-launcher/Main (= 6.0.17)
+ - expo-dev-launcher/Main (= 6.0.20)
- expo-dev-menu
- expo-dev-menu-interface
- ExpoModulesCore
@@ -73,7 +73,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - expo-dev-launcher/Main (6.0.17):
+ - expo-dev-launcher/Main (6.0.20):
- EXManifests
- expo-dev-launcher/Unsafe
- expo-dev-menu
@@ -104,7 +104,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - expo-dev-launcher/Unsafe (6.0.17):
+ - expo-dev-launcher/Unsafe (6.0.20):
- EXManifests
- expo-dev-menu
- expo-dev-menu-interface
@@ -134,9 +134,9 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - expo-dev-menu (7.0.16):
- - expo-dev-menu/Main (= 7.0.16)
- - expo-dev-menu/ReactNativeCompatibles (= 7.0.16)
+ - expo-dev-menu (7.0.18):
+ - expo-dev-menu/Main (= 7.0.18)
+ - expo-dev-menu/ReactNativeCompatibles (= 7.0.18)
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -159,7 +159,7 @@ PODS:
- ReactNativeDependencies
- Yoga
- expo-dev-menu-interface (2.0.0)
- - expo-dev-menu/Main (7.0.16):
+ - expo-dev-menu/Main (7.0.18):
- EXManifests
- expo-dev-menu-interface
- ExpoModulesCore
@@ -185,7 +185,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - expo-dev-menu/ReactNativeCompatibles (7.0.16):
+ - expo-dev-menu/ReactNativeCompatibles (7.0.18):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -207,38 +207,35 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - ExpoAsset (12.0.9):
+ - ExpoAsset (12.0.11):
- ExpoModulesCore
- - ExpoBlur (15.0.7):
+ - ExpoBlur (15.0.8):
- ExpoModulesCore
- - ExpoBrightness (14.0.7):
+ - ExpoBrightness (14.0.8):
- ExpoModulesCore
- - ExpoCrypto (15.0.7):
+ - ExpoCrypto (15.0.8):
- ExpoModulesCore
- - ExpoDevice (8.0.9):
+ - ExpoDevice (8.0.10):
- ExpoModulesCore
- - ExpoDocumentPicker (14.0.7):
+ - ExpoDocumentPicker (14.0.8):
- ExpoModulesCore
- - ExpoFileSystem (19.0.17):
+ - ExpoFileSystem (19.0.21):
- ExpoModulesCore
- - ExpoFont (14.0.9):
+ - ExpoFont (14.0.10):
- ExpoModulesCore
- - ExpoGlassEffect (0.1.7):
+ - ExpoGlassEffect (0.1.8):
- ExpoModulesCore
- - ExpoHaptics (15.0.7):
+ - ExpoHaptics (15.0.8):
- ExpoModulesCore
- - ExpoKeepAwake (15.0.7):
+ - ExpoKeepAwake (15.0.8):
- ExpoModulesCore
- - ExpoLibVlcPlayer (2.2.3):
+ - ExpoLinearGradient (15.0.8):
- ExpoModulesCore
- - MobileVLCKit (= 3.6.1b1)
- - ExpoLinearGradient (15.0.7):
+ - ExpoLinking (8.0.10):
- ExpoModulesCore
- - ExpoLinking (8.0.8):
+ - ExpoLocalization (17.0.8):
- ExpoModulesCore
- - ExpoLocalization (17.0.7):
- - ExpoModulesCore
- - ExpoModulesCore (3.0.25):
+ - ExpoModulesCore (3.0.29):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -263,7 +260,7 @@ PODS:
- Yoga
- ExpoRandom (14.0.1):
- ExpoModulesCore
- - ExpoScreenOrientation (9.0.7):
+ - ExpoScreenOrientation (9.0.8):
- ExpoModulesCore
- hermes-engine
- RCTRequired
@@ -286,14 +283,14 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - ExpoSharing (14.0.7):
+ - ExpoSharing (14.0.8):
- ExpoModulesCore
- - ExpoSystemUI (6.0.8):
+ - ExpoSystemUI (6.0.9):
- ExpoModulesCore
- - ExpoWebBrowser (15.0.9):
+ - ExpoWebBrowser (15.0.10):
- ExpoModulesCore
- EXStructuredHeaders (5.0.0)
- - EXUpdates (29.0.12):
+ - EXUpdates (29.0.15):
- EASClient
- EXManifests
- ExpoModulesCore
@@ -332,7 +329,7 @@ PODS:
- hermes-engine (0.81.4):
- hermes-engine/Pre-built (= 0.81.4)
- hermes-engine/Pre-built (0.81.4)
- - ImageColors (2.5.0):
+ - ImageColors (2.5.1):
- ExpoModulesCore
- KSPlayer (1.1.0):
- KSPlayer/Audio (= 1.1.0)
@@ -406,8 +403,7 @@ PODS:
- ReactNativeDependencies
- Yoga
- MMKVCore (2.2.4)
- - MobileVLCKit (3.6.1b1)
- - NitroMmkv (4.0.0):
+ - NitroMmkv (4.1.0):
- hermes-engine
- MMKVCore (= 2.2.4)
- NitroModules
@@ -432,7 +428,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - NitroModules (0.31.6):
+ - NitroModules (0.31.10):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -1758,7 +1754,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - react-native-bottom-tabs (1.0.2):
+ - react-native-bottom-tabs (1.1.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -1770,7 +1766,7 @@ PODS:
- React-graphics
- React-ImageManager
- React-jsi
- - react-native-bottom-tabs/common (= 1.0.2)
+ - react-native-bottom-tabs/common (= 1.1.0)
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
@@ -1782,7 +1778,7 @@ PODS:
- ReactNativeDependencies
- SwiftUIIntrospect (~> 1.0)
- Yoga
- - react-native-bottom-tabs/common (1.0.2):
+ - react-native-bottom-tabs/common (1.1.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -1904,30 +1900,6 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - react-native-skia (2.3.13):
- - hermes-engine
- - RCTRequired
- - RCTTypeSafety
- - React
- - React-callinvoker
- - React-Core
- - React-Core-prebuilt
- - React-debug
- - React-Fabric
- - React-featureflags
- - React-graphics
- - React-ImageManager
- - React-jsi
- - React-NativeModulesApple
- - React-RCTFabric
- - React-renderercss
- - React-rendererdebug
- - React-utils
- - ReactCodegen
- - ReactCommon/turbomodule/bridging
- - ReactCommon/turbomodule/core
- - ReactNativeDependencies
- - Yoga
- react-native-slider (5.1.1):
- hermes-engine
- RCTRequired
@@ -1973,7 +1945,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - react-native-video (6.17.0):
+ - react-native-video (6.18.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -1985,7 +1957,7 @@ PODS:
- React-graphics
- React-ImageManager
- React-jsi
- - react-native-video/Video (= 6.17.0)
+ - react-native-video/Video (= 6.18.0)
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
@@ -1996,7 +1968,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - react-native-video/Fabric (6.17.0):
+ - react-native-video/Fabric (6.18.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2018,7 +1990,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - react-native-video/Video (6.17.0):
+ - react-native-video/Video (6.18.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2463,7 +2435,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - RNReanimated (4.1.5):
+ - RNReanimated (4.2.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2485,10 +2457,10 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNReanimated/reanimated (= 4.1.5)
+ - RNReanimated/reanimated (= 4.2.0)
- RNWorklets
- Yoga
- - RNReanimated/reanimated (4.1.5):
+ - RNReanimated/reanimated (4.2.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2510,10 +2482,10 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNReanimated/reanimated/apple (= 4.1.5)
+ - RNReanimated/reanimated/apple (= 4.2.0)
- RNWorklets
- Yoga
- - RNReanimated/reanimated/apple (4.1.5):
+ - RNReanimated/reanimated/apple (4.2.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2584,7 +2556,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - RNSentry (7.6.0):
+ - RNSentry (7.7.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2606,9 +2578,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - Sentry/HybridSDK (= 8.57.2)
+ - Sentry/HybridSDK (= 8.57.3)
- Yoga
- - RNSVG (15.15.0):
+ - RNSVG (15.15.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2629,9 +2601,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNSVG/common (= 15.15.0)
+ - RNSVG/common (= 15.15.1)
- Yoga
- - RNSVG/common (15.15.0):
+ - RNSVG/common (15.15.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2675,7 +2647,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - RNWorklets (0.6.1):
+ - RNWorklets (0.7.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2697,9 +2669,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNWorklets/worklets (= 0.6.1)
+ - RNWorklets/worklets (= 0.7.1)
- Yoga
- - RNWorklets/worklets (0.6.1):
+ - RNWorklets/worklets (0.7.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2721,9 +2693,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNWorklets/worklets/apple (= 0.6.1)
+ - RNWorklets/worklets/apple (= 0.7.1)
- Yoga
- - RNWorklets/worklets/apple (0.6.1):
+ - RNWorklets/worklets/apple (0.7.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2746,9 +2718,9 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - SDWebImage (5.21.3):
- - SDWebImage/Core (= 5.21.3)
- - SDWebImage/Core (5.21.3)
+ - SDWebImage (5.21.5):
+ - SDWebImage/Core (= 5.21.5)
+ - SDWebImage/Core (5.21.5)
- SDWebImageAVIFCoder (0.11.1):
- libavif/core (>= 0.11.0)
- SDWebImage (~> 5.10)
@@ -2757,7 +2729,7 @@ PODS:
- SDWebImageWebPCoder (0.15.0):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
- - Sentry/HybridSDK (8.57.2)
+ - Sentry/HybridSDK (8.57.3)
- SwiftUIIntrospect (1.3.0)
- Yoga (0.0.0)
@@ -2785,7 +2757,6 @@ DEPENDENCIES:
- ExpoGlassEffect (from `../node_modules/expo-glass-effect/ios`)
- ExpoHaptics (from `../node_modules/expo-haptics/ios`)
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
- - ExpoLibVlcPlayer (from `../node_modules/expo-libvlc-player/ios`)
- ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`)
- ExpoLinking (from `../node_modules/expo-linking/ios`)
- ExpoLocalization (from `../node_modules/expo-localization/ios`)
@@ -2848,7 +2819,6 @@ DEPENDENCIES:
- react-native-google-cast (from `../node_modules/react-native-google-cast`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
- - "react-native-skia (from `../node_modules/@shopify/react-native-skia`)"
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
- react-native-video (from `../node_modules/react-native-video`)
- React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
@@ -2901,7 +2871,6 @@ SPEC REPOS:
- libwebp
- lottie-ios
- MMKVCore
- - MobileVLCKit
- PromisesObjC
- ReachabilitySwift
- SDWebImage
@@ -2959,8 +2928,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-haptics/ios"
ExpoKeepAwake:
:path: "../node_modules/expo-keep-awake/ios"
- ExpoLibVlcPlayer:
- :path: "../node_modules/expo-libvlc-player/ios"
ExpoLinearGradient:
:path: "../node_modules/expo-linear-gradient/ios"
ExpoLinking:
@@ -3087,8 +3054,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-community/netinfo"
react-native-safe-area-context:
:path: "../node_modules/react-native-safe-area-context"
- react-native-skia:
- :path: "../node_modules/@shopify/react-native-skia"
react-native-slider:
:path: "../node_modules/@react-native-community/slider"
react-native-video:
@@ -3178,13 +3143,13 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
DisplayCriteria:
- :commit: cbc74996afb55e096bf1ff240f07d1d206ac86df
+ :commit: 101cceed0f2d9b6833ee69cf29b65a042de720a3
:git: https://github.com/kingslay/KSPlayer.git
FFmpegKit:
:commit: d7048037a2eb94a3b08113fbf43aa92bdcb332d9
:git: https://github.com/kingslay/FFmpegKit.git
KSPlayer:
- :commit: cbc74996afb55e096bf1ff240f07d1d206ac86df
+ :commit: 101cceed0f2d9b6833ee69cf29b65a042de720a3
:git: https://github.com/kingslay/KSPlayer.git
Libass:
:commit: d7048037a2eb94a3b08113fbf43aa92bdcb332d9
@@ -3192,46 +3157,45 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS:
DisplayCriteria: bb0a90faf14b30848bc50ac0516340ce50164187
- EASClient: 68127f1248d2b25fdc82dbbfb17be95d1c4700be
- EXApplication: 296622817d459f46b6c5fe8691f4aac44d2b79e7
- EXConstants: fd688cef4e401dcf798a021cfb5d87c890c30ba3
+ EASClient: 40dd9e740684782610c49becab2643782ea1a20c
+ EXApplication: 1e98d4b1dccdf30627f92917f4b2c5a53c330e5f
+ EXConstants: 805f35b1b295c542ca6acce836f21a1f9ee104d5
EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd
- EXManifests: 224345a575fca389073c416297b6348163f28d1a
- EXNotifications: 7cff475adb5d7a255a9ea46bbd2589cb3b454506
- Expo: fb09185d798c2876a4c5ca89a5c6b8b72b6dbecf
- expo-dev-client: b6e7b4f4063ae44b5e68cc6a8bcc0c79c3037c1a
- expo-dev-launcher: c8813e0064e8768d676ee490c0f7ef1784d70b98
- expo-dev-menu: 0a1194185c9eec1da0e507b734180775363be442
+ EXManifests: a8d97683e5c7a3b026ffbd58559c64dc655b747b
+ EXNotifications: 983f04ad4ad879b181179e326bf220541e478386
+ Expo: 8fa2204bf8483fe546b4ec87c90d3ca189afc8db
+ expo-dev-client: 425ee077d6754a98cfe3a2e2410d29b440b24c9d
+ expo-dev-launcher: a4f4cdef064ab1fb8621e5b8c7c457cd6e9568c3
+ expo-dev-menu: 05b18812110c175814c6af0d09dd658abcc5e00d
expo-dev-menu-interface: 600df12ea01efecdd822daaf13cc0ac091775533
- ExpoAsset: 9ba6fbd677fb8e241a3899ac00fa735bc911eadf
- ExpoBlur: 2dd8f64aa31f5d405652c21d3deb2d2588b1852f
- ExpoBrightness: 32672952bf8b152d0cceaf8ec9f1def3a9a5e0d9
- ExpoCrypto: c1fbce112d1b6b79652bbe380b4fd4cc91676595
- ExpoDevice: 148accb4071873d19fba80a2506c58ffa433d620
- ExpoDocumentPicker: 2200eefc2817f19315fa18f0147e0b80ece86926
- ExpoFileSystem: b79eadbda7b7f285f378f95f959cc9313a1c9c61
- ExpoFont: cf9d90ec1d3b97c4f513211905724c8171f82961
- ExpoGlassEffect: 265fa3d75b46bc58262e4dfa513135fa9dfe4aac
- ExpoHaptics: 807476b0c39e9d82b7270349d6487928ce32df84
- ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe
- ExpoLibVlcPlayer: 6b4a27f54f5300550227cffcf25cc88ab4f6c7c9
- ExpoLinearGradient: a464898cb95153125e3b81894fd479bcb1c7dd27
- ExpoLinking: f051f28e50ea9269ff539317c166adec81d9342d
- ExpoLocalization: b852a5d8ec14c5349c1593eca87896b5b3ebfcca
- ExpoModulesCore: aa1a8e103d41de84baa5d7c6b98314e2230f1eef
+ ExpoAsset: 23a958e97d3d340919fe6774db35d563241e6c03
+ ExpoBlur: b90747a3f22a8b6ceffd9cb0dc41a4184efdc656
+ ExpoBrightness: 46c980463e8a54b9ce77f923c4bff0bb0c9526e0
+ ExpoCrypto: b6105ebaa15d6b38a811e71e43b52cd934945322
+ ExpoDevice: 6327c3c200816795708885adf540d26ecab83d1a
+ ExpoDocumentPicker: 7cd9e71a0f66fb19eb0a586d6f26eee1284692e0
+ ExpoFileSystem: 858a44267a3e6e9057e0888ad7c7cfbf55d52063
+ ExpoFont: 35ac6191ed86bbf56b3ebd2d9154eda9fad5b509
+ ExpoGlassEffect: 8ce45eca31f12e949e23a4ee13e2bfb59e9b0785
+ ExpoHaptics: d3a6375d8dcc3a1083d003bc2298ff654fafb536
+ ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296
+ ExpoLinearGradient: 809102bdb979f590083af49f7fa4805cd931bd58
+ ExpoLinking: f4c4a351523da72a6bfa7e1f4ca92aee1043a3ca
+ ExpoLocalization: d9168d5300a5b03e5e78b986124d11fb6ec3ebbd
+ ExpoModulesCore: f3da4f1ab5a8375d0beafab763739dbee8446583
ExpoRandom: d1444df65007bdd4070009efd5dab18e20bf0f00
- ExpoScreenOrientation: ef9ab3fb85c8a8ff57d52aa169b750aca03f0f4c
- ExpoSharing: 032c01bb034319e2374badf082ae935be866d2e9
- ExpoSystemUI: 2761aa6875849af83286364811d46e8ed8ea64c7
- ExpoWebBrowser: b973e1351fdcf5fec0c400997b1851f5a8219ec3
+ ExpoScreenOrientation: c68bd20f210d0616960638c787889e07787e5adb
+ ExpoSharing: 0d983394ed4a80334bab5a0d5384f75710feb7e8
+ ExpoSystemUI: 2ad325f361a2fcd96a464e8574e19935c461c9cc
+ ExpoWebBrowser: 17b064c621789e41d4816c95c93f429b84971f52
EXStructuredHeaders: c951e77f2d936f88637421e9588c976da5827368
- EXUpdates: ef83273afc231a627b170358c90689ac30a4429d
+ EXUpdates: f20abbc8a9f4e150656fe88126d52f52d4e7793f
EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734
FBLazyVector: 9e0cd874afd81d9a4d36679daca991b58b260d42
FFmpegKit: 3885085fbbc320745838ee4c8a1f9c5e5953dab2
google-cast-sdk: 32f65af50d164e3c475e79ad123db3cc26fbcd37
hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394
- ImageColors: 51cd79f7a9d2524b7a681c660b0a50574085563b
+ ImageColors: e12eb73e29bc1feaa3c228db8c174a1b25acb59d
KSPlayer: f163ac6195f240b6fa5b8225aeb39ec811a70c62
Libass: e88af2324e1217e3a4c8bdc675f6f23a9dfc7677
libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7
@@ -3240,9 +3204,8 @@ SPEC CHECKSUMS:
lottie-ios: a881093fab623c467d3bce374367755c272bdd59
lottie-react-native: cbe3d931a7c24f7891a8e8032c2bb9b2373c4b9c
MMKVCore: f2dd4c9befea04277a55e84e7812f930537993df
- MobileVLCKit: 2d9c7c373393ae43086aeeff890bf0b1afc15c5c
- NitroMmkv: 7fe66a61d5acab6516098a64f42af575595e7566
- NitroModules: a672a4b7470810b8dae8fc2ff91eabaa2e1eff7d
+ NitroMmkv: 4af10c70043b4c3cded3f16547627c7d9d8e3b8b
+ NitroModules: a71a5ab2911caf79e45170e6e12475b5260a12d0
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
RCTDeprecation: 7487d6dda857ccd4cb3dd6ecfccdc3170e85dcbc
RCTRequired: 54128b7df8be566881d48c7234724a78cb9b6157
@@ -3279,15 +3242,14 @@ SPEC CHECKSUMS:
React-Mapbuffer: fbe1da882a187e5898bdf125e1cc6e603d27ecae
React-microtasksnativemodule: 76905804171d8ccbe69329fc84c57eb7934add7f
react-native-blur: 1b00ef07fe0efdc0c40b37139a5268ccad73c72d
- react-native-bottom-tabs: b6459855502662d724d84b7edc937ea2b5a988ff
+ react-native-bottom-tabs: bcb70e4fae95fc9da0da875f7414acda26dfc551
react-native-device-brightness: 1a997350d060c3df9f303b1df84a4f7c5cbeb924
react-native-get-random-values: a603782b2b222a34533c66371614790282dba3f1
react-native-google-cast: 7be68a5d0b7eeb95a5924c3ecef8d319ef6c0a44
react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187
react-native-safe-area-context: 37e680fc4cace3c0030ee46e8987d24f5d3bdab2
- react-native-skia: e386a7d05f10c87d2b0f9bf0165a6b59bc0c7410
react-native-slider: f954578344106f0a732a4358ce3a3e11015eb6e1
- react-native-video: 5d9635903e562e0c5eb47c5fa401f1c807d6e068
+ react-native-video: f5982e21efab0dc356d92541a8a9e19581307f58
React-NativeModulesApple: a9464983ccc0f66f45e93558671f60fc7536e438
React-oscompat: 73db7dbc80edef36a9d6ed3c6c4e1724ead4236d
React-perflogger: 123272debf907cc423962adafcf4513320e43757
@@ -3322,20 +3284,20 @@ SPEC CHECKSUMS:
RNCPicker: c8a3584b74133464ee926224463fcc54dfdaebca
RNFastImage: 2d36f4cfed9b2342f94f8591c8be69dd047ac67c
RNGestureHandler: 723f29dac55e25f109d263ed65cecc4b9c4bd46a
- RNReanimated: 1442a577e066e662f0ce1cd1864a65c8e547aee0
+ RNReanimated: e1c71e6e693a66b203ae98773347b625d3cc85ee
RNScreens: 61c18865ab074f4d995ac8d7cf5060522a649d05
- RNSentry: be6d501966b60b30547abe59ea86626d80ad2680
- RNSVG: 99ab6158011aece12019b236f168faa7a1e41af6
+ RNSentry: 1d7b9fdae7a01ad8f9053335b5d44e75c39a955e
+ RNSVG: cf9ae78f2edf2988242c71a6392d15ff7dd62522
RNVectorIcons: 4351544f100d4f12cac156a7c13399e60bab3e26
- RNWorklets: 54d8dffb7f645873a58484658ddfd4bd1a9a0bc1
- SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
+ RNWorklets: 9eb6d567fa43984e96b6924a6df504b8a15980cd
+ SDWebImage: e9c98383c7572d713c1a0d7dd2783b10599b9838
SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57
SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
- Sentry: 83a3814c3ca042874b39c5c5bdffb6570d4d760e
+ Sentry: c643eb180df401dd8c734c5036ddd9dd9218daa6
SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d
Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1
-PODFILE CHECKSUM: 1db7b3713ca6ad8568e4bdf6b72b92b72ee8199d
+PODFILE CHECKSUM: 7c74c9cd2c7f3df7ab68b4284d9f324282e54542
COCOAPODS: 1.16.2
diff --git a/ios/sentry.properties b/ios/sentry.properties
index 8e272484..ae003a4b 100644
--- a/ios/sentry.properties
+++ b/ios/sentry.properties
@@ -1,4 +1,4 @@
defaults.url=https://sentry.io/
defaults.org=tapframe
defaults.project=react-native
-auth.token=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
\ No newline at end of file
+auth.token=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
diff --git a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
index 87e436af..0284f8e0 100644
--- a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
+++ b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
@@ -222,11 +222,13 @@ public class ReactExoplayerView extends FrameLayout implements
private ArrayList rootViewChildrenOriginalVisibility = new ArrayList();
/*
- * When user is seeking first called is on onPositionDiscontinuity -> DISCONTINUITY_REASON_SEEK
+ * When user is seeking first called is on onPositionDiscontinuity ->
+ * DISCONTINUITY_REASON_SEEK
* Then we set if to false when playback is back in onIsPlayingChanged -> true
*/
private boolean isSeeking = false;
private long seekPosition = -1;
+ private boolean hasVideoEnded = false;
// Props from React
private Source source = new Source();
@@ -291,7 +293,8 @@ public class ReactExoplayerView extends FrameLayout implements
lastPos = pos;
lastBufferDuration = bufferedDuration;
lastDuration = duration;
- eventEmitter.onVideoProgress.invoke(pos, bufferedDuration, player.getDuration(), getPositionInFirstPeriodMsForCurrentWindow(pos));
+ eventEmitter.onVideoProgress.invoke(pos, bufferedDuration, player.getDuration(),
+ getPositionInFirstPeriodMsForCurrentWindow(pos));
}
}
}
@@ -309,7 +312,7 @@ public class ReactExoplayerView extends FrameLayout implements
public double getPositionInFirstPeriodMsForCurrentWindow(long currentPosition) {
Timeline.Window window = new Timeline.Window();
- if(!player.getCurrentTimeline().isEmpty()) {
+ if (!player.getCurrentTimeline().isEmpty()) {
player.getCurrentTimeline().getWindow(player.getCurrentMediaItemIndex(), window);
}
return window.windowStartTimeMs + currentPosition;
@@ -348,9 +351,9 @@ public class ReactExoplayerView extends FrameLayout implements
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
exoPlayerView = new ExoPlayerView(getContext());
- exoPlayerView.addOnLayoutChangeListener( (View v, int l, int t, int r, int b, int ol, int ot, int or, int ob) ->
- PictureInPictureUtil.applySourceRectHint(themedReactContext, pictureInPictureParamsBuilder, exoPlayerView)
- );
+ exoPlayerView.addOnLayoutChangeListener(
+ (View v, int l, int t, int r, int b, int ol, int ot, int or, int ob) -> PictureInPictureUtil
+ .applySourceRectHint(themedReactContext, pictureInPictureParamsBuilder, exoPlayerView));
exoPlayerView.setLayoutParams(layoutParams);
addView(exoPlayerView, 0, layoutParams);
@@ -376,8 +379,10 @@ public class ReactExoplayerView extends FrameLayout implements
public void onHostPause() {
isInBackground = true;
Activity activity = themedReactContext.getCurrentActivity();
- boolean isInPictureInPicture = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null && activity.isInPictureInPictureMode();
- boolean isInMultiWindowMode = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null && activity.isInMultiWindowMode();
+ boolean isInPictureInPicture = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null
+ && activity.isInPictureInPictureMode();
+ boolean isInMultiWindowMode = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null
+ && activity.isInMultiWindowMode();
if (playInBackground || isInPictureInPicture || isInMultiWindowMode) {
return;
}
@@ -396,7 +401,7 @@ public class ReactExoplayerView extends FrameLayout implements
viewHasDropped = true;
}
- //BandwidthMeter.EventListener implementation
+ // BandwidthMeter.EventListener implementation
@Override
public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) {
if (mReportBandwidth) {
@@ -404,7 +409,8 @@ public class ReactExoplayerView extends FrameLayout implements
eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, null);
} else {
Format videoFormat = player.getVideoFormat();
- boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
+ boolean isRotatedContent = videoFormat != null
+ && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0;
int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0;
String trackId = videoFormat != null ? videoFormat.id : null;
@@ -419,7 +425,8 @@ public class ReactExoplayerView extends FrameLayout implements
* Toggling the visibility of the player control view
*/
private void togglePlayerControlVisibility() {
- if (player == null) return;
+ if (player == null)
+ return;
if (exoPlayerView.isControllerVisible()) {
exoPlayerView.hideController();
} else {
@@ -429,7 +436,7 @@ public class ReactExoplayerView extends FrameLayout implements
private void initializePlayerControl() {
exoPlayerView.setPlayer(player);
-
+
exoPlayerView.setControllerVisibilityListener(visibility -> {
boolean isVisible = visibility == View.VISIBLE;
eventEmitter.onControlsVisibilityChange.invoke(isVisible);
@@ -443,26 +450,28 @@ public class ReactExoplayerView extends FrameLayout implements
}
private void updateControllerConfig() {
- if (exoPlayerView == null) return;
-
+ if (exoPlayerView == null)
+ return;
+
exoPlayerView.setControllerShowTimeoutMs(5000);
-
+
exoPlayerView.setControllerAutoShow(true);
exoPlayerView.setControllerHideOnTouch(true);
-
+
updateControllerVisibility();
}
private void updateControllerVisibility() {
- if (exoPlayerView == null) return;
-
+ if (exoPlayerView == null)
+ return;
+
exoPlayerView.setUseController(controls && !controlsConfig.getHideFullscreen());
}
private void openSettings() {
AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
builder.setTitle(R.string.settings);
- String[] settingsOptions = {themedReactContext.getString(R.string.playback_speed)};
+ String[] settingsOptions = { themedReactContext.getString(R.string.playback_speed) };
builder.setItems(settingsOptions, (dialog, which) -> {
if (which == 0) {
showPlaybackSpeedOptions();
@@ -472,7 +481,7 @@ public class ReactExoplayerView extends FrameLayout implements
}
private void showPlaybackSpeedOptions() {
- String[] speedOptions = {"0.5x", "1.0x", "1.5x", "2.0x"};
+ String[] speedOptions = { "0.5x", "1.0x", "1.5x", "2.0x" };
AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
builder.setTitle(R.string.select_playback_speed);
@@ -490,8 +499,10 @@ public class ReactExoplayerView extends FrameLayout implements
speed = 2.0f;
break;
default:
- speed = 1.0f;;
- };
+ speed = 1.0f;
+ ;
+ }
+ ;
setRateModifier(speed);
});
builder.show();
@@ -503,24 +514,30 @@ public class ReactExoplayerView extends FrameLayout implements
/**
* Update the layout
- * @param view view needs to update layout
+ *
+ * @param view view needs to update layout
*
- * This is a workaround for the open bug in react-native: ...
+ * This is a workaround for the open bug in react-native: ...
*/
private void reLayout(View view) {
- if (view == null) return;
+ if (view == null)
+ return;
view.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY));
view.layout(view.getLeft(), view.getTop(), view.getMeasuredWidth(), view.getMeasuredHeight());
}
private void refreshControlsStyles() {
- if (exoPlayerView == null || player == null || !controls) return;
+ if (exoPlayerView == null || player == null || !controls)
+ return;
updateControllerVisibility();
}
- // Note: The following methods for live content and button visibility are no longer needed
- // as PlayerView handles controls automatically. Some functionality may need to be
+ // Note: The following methods for live content and button visibility are no
+ // longer needed
+ // as PlayerView handles controls automatically. Some functionality may need to
+ // be
// reimplemented using PlayerView's APIs if custom behavior is required.
private void reLayoutControls() {
@@ -557,6 +574,7 @@ public class ReactExoplayerView extends FrameLayout implements
private class RNVLoadControl extends DefaultLoadControl {
private final int availableHeapInBytes;
private final Runtime runtime;
+
public RNVLoadControl(DefaultAllocator allocator, BufferConfig config) {
super(allocator,
config.getMinBufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt()
@@ -567,7 +585,7 @@ public class ReactExoplayerView extends FrameLayout implements
: DefaultLoadControl.DEFAULT_MAX_BUFFER_MS,
config.getBufferForPlaybackMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt()
? config.getBufferForPlaybackMs()
- : DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS ,
+ : DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
config.getBufferForPlaybackAfterRebufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt()
? config.getBufferForPlaybackAfterRebufferMs()
: DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS,
@@ -578,10 +596,12 @@ public class ReactExoplayerView extends FrameLayout implements
: DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS,
DefaultLoadControl.DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME);
runtime = Runtime.getRuntime();
- ActivityManager activityManager = (ActivityManager) themedReactContext.getSystemService(ThemedReactContext.ACTIVITY_SERVICE);
- double maxHeap = config.getMaxHeapAllocationPercent() != BufferConfig.Companion.getBufferConfigPropUnsetDouble()
- ? config.getMaxHeapAllocationPercent()
- : DEFAULT_MAX_HEAP_ALLOCATION_PERCENT;
+ ActivityManager activityManager = (ActivityManager) themedReactContext
+ .getSystemService(ThemedReactContext.ACTIVITY_SERVICE);
+ double maxHeap = config.getMaxHeapAllocationPercent() != BufferConfig.Companion
+ .getBufferConfigPropUnsetDouble()
+ ? config.getMaxHeapAllocationPercent()
+ : DEFAULT_MAX_HEAP_ALLOCATION_PERCENT;
availableHeapInBytes = (int) Math.floor(activityManager.getMemoryClass() * maxHeap * 1024 * 1024);
}
@@ -599,13 +619,15 @@ public class ReactExoplayerView extends FrameLayout implements
}
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
long freeMemory = runtime.maxMemory() - usedMemory;
- double minBufferMemoryReservePercent = source.getBufferConfig().getMinBufferMemoryReservePercent() != BufferConfig.Companion.getBufferConfigPropUnsetDouble()
- ? source.getBufferConfig().getMinBufferMemoryReservePercent()
- : ReactExoplayerView.DEFAULT_MIN_BUFFER_MEMORY_RESERVE;
+ double minBufferMemoryReservePercent = source.getBufferConfig()
+ .getMinBufferMemoryReservePercent() != BufferConfig.Companion.getBufferConfigPropUnsetDouble()
+ ? source.getBufferConfig().getMinBufferMemoryReservePercent()
+ : ReactExoplayerView.DEFAULT_MIN_BUFFER_MEMORY_RESERVE;
long reserveMemory = (long) minBufferMemoryReservePercent * runtime.maxMemory();
long bufferedMs = bufferedDurationUs / (long) 1000;
if (reserveMemory > freeMemory && bufferedMs > 2000) {
- // We don't have enough memory in reserve so we stop buffering to allow other components to use it instead
+ // We don't have enough memory in reserve so we stop buffering to allow other
+ // components to use it instead
return false;
}
if (runtime.freeMemory() == 0) {
@@ -639,13 +661,13 @@ public class ReactExoplayerView extends FrameLayout implements
// Initialize core configuration and listeners
initializePlayerCore(self);
pipListenerUnsubscribe = PictureInPictureUtil.addLifecycleEventListener(themedReactContext, this);
- PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, this.enterPictureInPictureOnLeave);
+ PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder,
+ this.enterPictureInPictureOnLeave);
}
if (!source.isLocalAssetFile() && !source.isAsset() && source.getBufferConfig().getCacheSize() > 0) {
RNVSimpleCache.INSTANCE.setSimpleCache(
this.getContext(),
- source.getBufferConfig().getCacheSize()
- );
+ source.getBufferConfig().getCacheSize());
useCache = true;
} else {
useCache = false;
@@ -653,7 +675,8 @@ public class ReactExoplayerView extends FrameLayout implements
if (playerNeedsSource) {
// Will force display of shutter view if needed
exoPlayerView.invalidateAspectRatio();
- // DRM session manager creation must be done on a different thread to prevent crashes so we start a new thread
+ // DRM session manager creation must be done on a different thread to prevent
+ // crashes so we start a new thread
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> {
// DRM initialization must run on a different thread
@@ -662,7 +685,8 @@ public class ReactExoplayerView extends FrameLayout implements
}
if (activity == null) {
DebugLog.e(TAG, "Failed to initialize Player!, null activity");
- eventEmitter.onVideoError.invoke("Failed to initialize Player!", new Exception("Current Activity is null!"), "1001");
+ eventEmitter.onVideoError.invoke("Failed to initialize Player!",
+ new Exception("Current Activity is null!"), "1001");
return;
}
@@ -715,8 +739,7 @@ public class ReactExoplayerView extends FrameLayout implements
DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE);
RNVLoadControl loadControl = new RNVLoadControl(
allocator,
- source.getBufferConfig()
- );
+ source.getBufferConfig());
long initialBitrate = source.getBufferConfig().getInitialBitrate();
if (initialBitrate > 0) {
@@ -724,15 +747,15 @@ public class ReactExoplayerView extends FrameLayout implements
this.bandwidthMeter = config.getBandwidthMeter();
}
- DefaultRenderersFactory renderersFactory =
- new DefaultRenderersFactory(getContext())
- .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
- .setEnableDecoderFallback(true)
- .forceEnableMediaCodecAsynchronousQueueing();
+ DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(getContext())
+ .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
+ .setEnableDecoderFallback(true)
+ .forceEnableMediaCodecAsynchronousQueueing();
DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory);
if (useCache && !disableCache) {
- mediaSourceFactory.setDataSourceFactory(RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)));
+ mediaSourceFactory
+ .setDataSourceFactory(RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)));
}
mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView.getPlayerView());
@@ -759,7 +782,7 @@ public class ReactExoplayerView extends FrameLayout implements
player.setPlaybackParameters(params);
changeAudioOutput(this.audioOutput);
- if(showNotificationControls) {
+ if (showNotificationControls) {
setupPlaybackService();
}
}
@@ -771,8 +794,7 @@ public class ReactExoplayerView extends FrameLayout implements
Uri adTagUrl = adProps.getAdTagUrl();
if (adTagUrl != null) {
// Create an AdsLoader.
- ImaAdsLoader.Builder imaLoaderBuilder = new ImaAdsLoader
- .Builder(themedReactContext)
+ ImaAdsLoader.Builder imaLoaderBuilder = new ImaAdsLoader.Builder(themedReactContext)
.setAdEventListener(this)
.setAdErrorListener(this);
@@ -804,7 +826,8 @@ public class ReactExoplayerView extends FrameLayout implements
}
try {
- // First check if there's a custom DRM manager registered through the plugin system
+ // First check if there's a custom DRM manager registered through the plugin
+ // system
DRMManagerSpec drmManager = ReactNativeVideoManager.Companion.getInstance().getDRMManager();
if (drmManager == null) {
// If no custom manager is registered, use the default implementation
@@ -813,11 +836,13 @@ public class ReactExoplayerView extends FrameLayout implements
DrmSessionManager drmSessionManager = drmManager.buildDrmSessionManager(uuid, drmProps);
if (drmSessionManager == null) {
- eventEmitter.onVideoError.invoke("Failed to build DRM session manager", new Exception("DRM session manager is null"), "3007");
+ eventEmitter.onVideoError.invoke("Failed to build DRM session manager",
+ new Exception("DRM session manager is null"), "3007");
}
// Allow plugins to override the DrmSessionManager
- DrmSessionManager overriddenManager = ReactNativeVideoManager.Companion.getInstance().overrideDrmSessionManager(source, drmSessionManager);
+ DrmSessionManager overriddenManager = ReactNativeVideoManager.Companion.getInstance()
+ .overrideDrmSessionManager(source, drmSessionManager);
return overriddenManager != null ? overriddenManager : drmSessionManager;
} catch (UnsupportedDrmException ex) {
// Unsupported DRM exceptions are handled by the calling method
@@ -835,7 +860,8 @@ public class ReactExoplayerView extends FrameLayout implements
}
/// init DRM
DrmSessionManager drmSessionManager = initializePlayerDrm();
- if (drmSessionManager == null && runningSource.getDrmProps() != null && runningSource.getDrmProps().getDrmType() != null) {
+ if (drmSessionManager == null && runningSource.getDrmProps() != null
+ && runningSource.getDrmProps().getDrmType() != null) {
// Failed to initialize DRM session manager - cannot continue
DebugLog.e(TAG, "Failed to initialize DRM Session Manager Framework!");
return;
@@ -892,7 +918,8 @@ public class ReactExoplayerView extends FrameLayout implements
} catch (UnsupportedDrmException e) {
int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported
: (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME
- ? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown);
+ ? R.string.error_drm_unsupported_scheme
+ : R.string.error_drm_unknown);
eventEmitter.onVideoError.invoke(getResources().getString(errorStringId), e, "3003");
}
}
@@ -937,7 +964,8 @@ public class ReactExoplayerView extends FrameLayout implements
if (playbackServiceBinder != null) {
playbackServiceBinder.getService().unregisterPlayer(player);
}
- } catch (Exception ignored) {}
+ } catch (Exception ignored) {
+ }
playbackServiceBinder = null;
}
@@ -969,21 +997,22 @@ public class ReactExoplayerView extends FrameLayout implements
private void cleanupPlaybackService() {
try {
- if(player != null && playbackServiceBinder != null) {
+ if (player != null && playbackServiceBinder != null) {
playbackServiceBinder.getService().unregisterPlayer(player);
}
playbackServiceBinder = null;
- if(playbackServiceConnection != null) {
+ if (playbackServiceConnection != null) {
themedReactContext.unbindService(playbackServiceConnection);
}
- } catch(Exception e) {
+ } catch (Exception e) {
DebugLog.w(TAG, "Cloud not cleanup playback service");
}
}
- private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager, long cropStartMs, long cropEndMs) {
+ private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager,
+ long cropStartMs, long cropEndMs) {
if (uri == null) {
throw new IllegalStateException("Invalid video uri");
}
@@ -1004,23 +1033,23 @@ public class ReactExoplayerView extends FrameLayout implements
if (customMetadata != null) {
mediaItemBuilder.setMediaMetadata(customMetadata);
}
-
+
// Add external subtitles to MediaItem
List subtitleConfigurations = buildSubtitleConfigurations();
if (subtitleConfigurations != null) {
mediaItemBuilder.setSubtitleConfigurations(subtitleConfigurations);
}
-
+
if (source.getAdsProps() != null) {
Uri adTagUrl = source.getAdsProps().getAdTagUrl();
if (adTagUrl != null) {
mediaItemBuilder.setAdsConfiguration(
- new MediaItem.AdsConfiguration.Builder(adTagUrl).build()
- );
+ new MediaItem.AdsConfiguration.Builder(adTagUrl).build());
}
}
- MediaItem.LiveConfiguration.Builder liveConfiguration = ConfigurationUtils.getLiveConfiguration(source.getBufferConfig());
+ MediaItem.LiveConfiguration.Builder liveConfiguration = ConfigurationUtils
+ .getLiveConfiguration(source.getBufferConfig());
mediaItemBuilder.setLiveConfiguration(liveConfiguration.build());
MediaSource.Factory mediaSourceFactory;
@@ -1032,29 +1061,26 @@ public class ReactExoplayerView extends FrameLayout implements
drmProvider = new DefaultDrmSessionManagerProvider();
}
-
switch (type) {
case CONTENT_TYPE_SS:
- if(!BuildConfig.USE_EXOPLAYER_SMOOTH_STREAMING) {
+ if (!BuildConfig.USE_EXOPLAYER_SMOOTH_STREAMING) {
DebugLog.e("Exo Player Exception", "Smooth Streaming is not enabled!");
throw new IllegalStateException("Smooth Streaming is not enabled!");
}
mediaSourceFactory = new SsMediaSource.Factory(
new DefaultSsChunkSource.Factory(mediaDataSourceFactory),
- buildDataSourceFactory(false)
- );
+ buildDataSourceFactory(false));
break;
case CONTENT_TYPE_DASH:
- if(!BuildConfig.USE_EXOPLAYER_DASH) {
+ if (!BuildConfig.USE_EXOPLAYER_DASH) {
DebugLog.e("Exo Player Exception", "DASH is not enabled!");
throw new IllegalStateException("DASH is not enabled!");
}
mediaSourceFactory = new DashMediaSource.Factory(
new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
- buildDataSourceFactory(false)
- );
+ buildDataSourceFactory(false));
break;
case CONTENT_TYPE_HLS:
if (!BuildConfig.USE_EXOPLAYER_HLS) {
@@ -1069,13 +1095,14 @@ public class ReactExoplayerView extends FrameLayout implements
}
mediaSourceFactory = new HlsMediaSource.Factory(
- dataSourceFactory
- ).setAllowChunklessPreparation(source.getTextTracksAllowChunklessPreparation());
+ dataSourceFactory)
+ .setAllowChunklessPreparation(source.getTextTracksAllowChunklessPreparation());
break;
case CONTENT_TYPE_OTHER:
if ("asset".equals(uri.getScheme())) {
try {
- DataSource.Factory assetDataSourceFactory = DataSourceUtil.buildAssetDataSourceFactory(themedReactContext, uri);
+ DataSource.Factory assetDataSourceFactory = DataSourceUtil
+ .buildAssetDataSourceFactory(themedReactContext, uri);
mediaSourceFactory = new ProgressiveMediaSource.Factory(assetDataSourceFactory);
} catch (Exception e) {
throw new IllegalStateException("cannot open input file:" + uri);
@@ -1083,12 +1110,10 @@ public class ReactExoplayerView extends FrameLayout implements
} else if ("file".equals(uri.getScheme()) ||
!useCache) {
mediaSourceFactory = new ProgressiveMediaSource.Factory(
- mediaDataSourceFactory
- );
+ mediaDataSourceFactory);
} else {
mediaSourceFactory = new ProgressiveMediaSource.Factory(
- RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true))
- );
+ RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)));
}
break;
@@ -1107,20 +1132,19 @@ public class ReactExoplayerView extends FrameLayout implements
if (cmcdConfigurationFactory != null) {
mediaSourceFactory = mediaSourceFactory.setCmcdConfigurationFactory(
- cmcdConfigurationFactory::createCmcdConfiguration
- );
+ cmcdConfigurationFactory::createCmcdConfiguration);
}
mediaSourceFactory = Objects.requireNonNullElse(
ReactNativeVideoManager.Companion.getInstance()
.overrideMediaSourceFactory(source, mediaSourceFactory, mediaDataSourceFactory),
- mediaSourceFactory
- );
+ mediaSourceFactory);
mediaItemBuilder.setStreamKeys(streamKeys);
@Nullable
- final MediaItem.Builder overridenMediaItemBuilder = ReactNativeVideoManager.Companion.getInstance().overrideMediaItemBuilder(source, mediaItemBuilder);
+ final MediaItem.Builder overridenMediaItemBuilder = ReactNativeVideoManager.Companion.getInstance()
+ .overrideMediaItemBuilder(source, mediaItemBuilder);
MediaItem mediaItem = overridenMediaItemBuilder != null
? overridenMediaItemBuilder.build()
@@ -1129,8 +1153,7 @@ public class ReactExoplayerView extends FrameLayout implements
MediaSource mediaSource = mediaSourceFactory
.setDrmSessionManagerProvider(drmProvider)
.setLoadErrorHandlingPolicy(
- config.buildLoadErrorHandlingPolicy(source.getMinLoadRetryCount())
- )
+ config.buildLoadErrorHandlingPolicy(source.getMinLoadRetryCount()))
.createMediaSource(mediaItem);
if (cropStartMs >= 0 && cropEndMs >= 0) {
@@ -1164,32 +1187,36 @@ public class ReactExoplayerView extends FrameLayout implements
label += " (" + track.getLanguage() + ")";
}
}
-
- MediaItem.SubtitleConfiguration.Builder configBuilder = new MediaItem.SubtitleConfiguration.Builder(track.getUri())
+
+ MediaItem.SubtitleConfiguration.Builder configBuilder = new MediaItem.SubtitleConfiguration.Builder(
+ track.getUri())
.setId(trackId)
.setMimeType(track.getType())
.setLabel(label)
.setRoleFlags(C.ROLE_FLAG_SUBTITLE);
-
+
// Set language if available
if (track.getLanguage() != null && !track.getLanguage().isEmpty()) {
configBuilder.setLanguage(track.getLanguage());
}
-
- // Set selection flags - make first track default if no specific track is selected
+
+ // Set selection flags - make first track default if no specific track is
+ // selected
if (trackIndex == 0 && (textTrackType == null || "disabled".equals(textTrackType))) {
configBuilder.setSelectionFlags(C.SELECTION_FLAG_DEFAULT);
} else {
configBuilder.setSelectionFlags(0);
}
-
+
MediaItem.SubtitleConfiguration subtitleConfiguration = configBuilder.build();
subtitleConfigurations.add(subtitleConfiguration);
-
- DebugLog.d(TAG, "Created subtitle configuration: " + trackId + " - " + label + " (" + track.getType() + ")");
+
+ DebugLog.d(TAG,
+ "Created subtitle configuration: " + trackId + " - " + label + " (" + track.getType() + ")");
trackIndex++;
} catch (Exception e) {
- DebugLog.e(TAG, "Error creating SubtitleConfiguration for URI " + track.getUri() + ": " + e.getMessage());
+ DebugLog.e(TAG,
+ "Error creating SubtitleConfiguration for URI " + track.getUri() + ": " + e.getMessage());
}
}
@@ -1202,7 +1229,7 @@ public class ReactExoplayerView extends FrameLayout implements
private void releasePlayer() {
if (player != null) {
- if(playbackServiceBinder != null) {
+ if (playbackServiceBinder != null) {
playbackServiceBinder.getService().unregisterPlayer(player);
themedReactContext.unbindService(playbackServiceConnection);
}
@@ -1252,7 +1279,8 @@ public class ReactExoplayerView extends FrameLayout implements
case AudioManager.AUDIOFOCUS_LOSS:
view.hasAudioFocus = false;
view.eventEmitter.onAudioFocusChanged.invoke(false);
- // FIXME this pause can cause issue if content doesn't have pause capability (can happen on live channel)
+ // FIXME this pause can cause issue if content doesn't have pause capability
+ // (can happen on live channel)
if (activity != null) {
activity.runOnUiThread(view::pausePlayback);
}
@@ -1273,16 +1301,12 @@ public class ReactExoplayerView extends FrameLayout implements
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
// Lower the volume
if (!view.muted) {
- activity.runOnUiThread(() ->
- view.player.setVolume(view.audioVolume * 0.8f)
- );
+ activity.runOnUiThread(() -> view.player.setVolume(view.audioVolume * 0.8f));
}
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Raise it back to normal
if (!view.muted) {
- activity.runOnUiThread(() ->
- view.player.setVolume(view.audioVolume * 1)
- );
+ activity.runOnUiThread(() -> view.player.setVolume(view.audioVolume * 1));
}
}
}
@@ -1355,7 +1379,8 @@ public class ReactExoplayerView extends FrameLayout implements
/**
* Returns a new DataSource factory.
*
- * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener to the new
+ * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener
+ * to the new
* DataSource factory.
* @return A new DataSource factory.
*/
@@ -1367,12 +1392,14 @@ public class ReactExoplayerView extends FrameLayout implements
/**
* Returns a new HttpDataSource factory.
*
- * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener to the new
- * DataSource factory.
+ * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener
+ * to the new
+ * DataSource factory.
* @return A new HttpDataSource factory.
*/
private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMeter) {
- return DataSourceUtil.getDefaultHttpDataSourceFactory(this.themedReactContext, useBandwidthMeter ? bandwidthMeter : null, source.getHeaders());
+ return DataSourceUtil.getDefaultHttpDataSourceFactory(this.themedReactContext,
+ useBandwidthMeter ? bandwidthMeter : null, source.getHeaders());
}
// AudioBecomingNoisyListener implementation
@@ -1389,11 +1416,13 @@ public class ReactExoplayerView extends FrameLayout implements
@Override
public void onEvents(@NonNull Player player, Player.Events events) {
- if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) {
+ if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED)
+ || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) {
int playbackState = player.getPlaybackState();
boolean playWhenReady = player.getPlayWhenReady();
String text = "onStateChanged: playWhenReady=" + playWhenReady + ", playbackState=";
- eventEmitter.onPlaybackRateChange.invoke(playWhenReady && playbackState == ExoPlayer.STATE_READY ? 1.0f : 0.0f);
+ eventEmitter.onPlaybackRateChange
+ .invoke(playWhenReady && playbackState == ExoPlayer.STATE_READY ? 1.0f : 0.0f);
switch (playbackState) {
case Player.STATE_IDLE:
text += "idle";
@@ -1411,6 +1440,7 @@ public class ReactExoplayerView extends FrameLayout implements
break;
case Player.STATE_READY:
text += "ready";
+ hasVideoEnded = false;
eventEmitter.onReadyForDisplay.invoke();
onBuffering(false);
clearProgressMessageHandler(); // ensure there is no other message
@@ -1429,7 +1459,10 @@ public class ReactExoplayerView extends FrameLayout implements
case Player.STATE_ENDED:
text += "ended";
updateProgress();
- eventEmitter.onVideoEnd.invoke();
+ if (!hasVideoEnded) {
+ hasVideoEnded = true;
+ eventEmitter.onVideoEnd.invoke();
+ }
onStopPlayback();
setKeepScreenOn(false);
break;
@@ -1446,9 +1479,11 @@ public class ReactExoplayerView extends FrameLayout implements
}
/**
- * The progress message handler will duplicate recursions of the onProgressMessage handler
- * on change of player state from any state to STATE_READY with playWhenReady is true (when
- * the video is not paused). This clears all existing messages.
+ * The progress message handler will duplicate recursions of the
+ * onProgressMessage handler
+ * on change of player state from any state to STATE_READY with playWhenReady is
+ * true (when
+ * the video is not paused). This clears all existing messages.
*/
private void clearProgressMessageHandler() {
progressHandler.removeMessages(SHOW_PROGRESS);
@@ -1467,7 +1502,8 @@ public class ReactExoplayerView extends FrameLayout implements
setSelectedTextTrack(textTrackType, textTrackValue);
}
Format videoFormat = player.getVideoFormat();
- boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
+ boolean isRotatedContent = videoFormat != null
+ && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0;
int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0;
String trackId = videoFormat != null ? videoFormat.id : null;
@@ -1476,19 +1512,20 @@ public class ReactExoplayerView extends FrameLayout implements
long duration = player.getDuration();
long currentPosition = player.getCurrentPosition();
ArrayList